搜尋引擎的出現,大幅改善程式人收集資訊、解決問題的速度及品質。而這也正是「程式設計2.0」所帶來的重大改變之一。而另一項重大改變,則是程式人於網路上廣為分享流通的開放源碼。
開放源碼的系統,將所有的程式碼都公諸於世,可為所有的程式人取用,或者於其中鑽研學習其他高手長久以來的經驗累積及心得。
摸索開放源碼,提升軟體設計功能功力
我在大學一年級的時候,架設一個MUD(Multi-User Dimension,即文字形式的線上多人角色扮演遊戲)。最初只是單純地利用一套開放源碼系統架設。漸漸的,因為想要擴充系統功能,所以試著修改這套系統。在修改系統的過程中,剛開始只是從一些基本的修改開始,例如將英文訊息修改成為中文訊息。接著,由於對系統越來越了解,所以開始增加新的技能、職業,到後來整套職業技能系統全部改寫。
雖然MUD在很多人的印象中,只是個讓人玩物喪志的玩意。但從架設、修改,到越改幅度越大的過程中,我從只是皮毛式地摸索,到完全能夠掌握骨子裡的精髓,對我的軟體設計功力來說,有了很大幅度的提升。
探索這套系統的過程中,我學習到很多東西。大到如何規畫系統的架構,小到如何巧妙地運用函式指標,達到具彈性及擴充性的目標。從一些小型通用函式的設計,到特定的技術如Socket Programming等,我都大有斬獲。
成為參與者,超越旁觀者,收獲最大
從學習的角度來看,讓自己鑽研在開放源碼的專案,尤其是中大型的專案,是個很好的切入點。首先,因為你得從原始碼建構出最後系統要部署的所有檔案,所以會學習到在開發時,這一整套建構、安裝、部署的程序,高手都是怎麼處理的。有些高手,光是寫Makefile就比別人優雅巧妙。
再來,你可以觀察到高手是怎麼規畫系統中的子系統,藉此了解到:系統如何進行初始化的架構、如何管理記錄檔(Log)、如何處理錯誤和異常、如何管理永續性的資料(如何處理檔案和資料庫)、如何管理記憶體中的物件,以及如何處理本身與系統外的通訊等。
有許多特定的技術,也可以從開放源碼系統中學習。以前我們在開發一套網路電話系統時,就從一套叫做VOCAL的開放源碼專案中,了解SIP這個通訊協定的相關技術及架構。
這樣的學習,要有真正的成效,就不能只是當個局外人或讀者,要把原始碼當做書本來看。而且你要把系統建構起來,然後讓它能夠運行。更重要的是,要嘗試修改它。在修改的過程中,你會對整個系統有更深一層的了解,也才能從中對技術有更踏實的認識。
當你在修改與調整系統的時候,會遭遇到許多「光是閱讀程式碼」無法想像的問題和情境,也只有經歷過這些問題及情境,才能夠超越「旁觀者」的角色,而讓自己和這些程式碼之間的關係,變得更加緊密,進而成為「參與者」。當你能夠自在地修改這些開放源碼的專案時,就代表對專案中所運用的技術,有一定程度的了解。
搜尋引擎輔助下,開放源碼一一浮現
雖然開放源碼的風潮已經流行許久,但長期以來,對整個軟體產業生態造成的衝擊,還是遠多過於對程式人的影響。開放源碼對程式人來說是很好的修煉方式,但是,能讓開放源碼產生另一個躍進式的化學效應,是因為輔以搜尋引擎的力量。
雖然受自由或開放精神感召的程式人越來越多,也有越來越多的程式人樂於分享程式碼,但就和大家樂於在網路上撰寫文章、提供各式資訊,卻缺乏統整及連結的情況一樣,仍是散落在四處的片段。
透過搜尋引擎,我們能更容易地找到需要的開放源碼專案。
在前些日子,我們在一個專案裡,需要發展運用UPnP(Universal Plug and Play)的系統。倘若自己從規格開始讀起,再重新開始實作,勢必曠日費時。不過,在Google的協助之下,輸入「upnp library open source」搜尋之後,搜尋列表中的第一個結果,就是一個叫做「libupnp」的開放源碼專案,而這個專案正好能滿足我們的需求。
這正是開放源碼真正讓我們進到程式設計2.0的重要關鍵。不僅可取用原始碼的專案變多了,而且能夠很有效率、準確地找到符合需求的專案。
除了做為學習和探索新的技術之外,開放源碼的另一個大作用,就是扮演巨人的肩膀,讓我們得以踏在既定的基礎上繼續發展,這對軟體開發來說,成了提供大量生產力的來源。
整合問題可能會抵銷開放源碼的挹注
公開的原始碼,當然可以省去不少重新撰寫的力氣。只是,當你試著運用別人已經開發好的一整個專案時,你時常會遇上整合上的問題。這些問題多半來自於開放源碼專案:一、功能太多,二、功能太少,三、提供的整合介面和預期的不同。
開放源碼專案有可能提供多於你所需的功能,倘若你不在乎最後程式碼的大小,這倒不成問題。但倘若你的程式被限制了大小,例如要運行於嵌入式系統中,而不能占太多的容量時,就會遇上問題。
開放源碼專案當然也可能只提供部分所需功能,你得自己補齊缺乏的部分,或者再尋找其他專案彌補。另外,由於可取得的專案,並不是為了你而量身打造的,這些專案所提供的整合介面,也許會和預期的不同,這也會形成另一個運用開放源碼專案時的障礙。
我們一方面想要藉由既有的開放源碼專案,以大幅獲得生產力,但另一方面又會遭遇到上述的種種困難。對2.0時代的程式人來說,越是懂得如何克服上述困難,就越能得到開放源碼專案對生產力的挹注。反之,或許未蒙其利先蒙其害,為了克服這些困難反而被所付出的成本所吞蝕。
再生利用和重新建立,需要不同的技能
程式設計2.0的時代,因為網路生態及文化的改變,導致我們在「新技術學習」、「現成程式碼」與「問題解決」各方面,都有了全新的途徑和方式。也因為新途徑的產生,導致程式人需要的技能屬性有所變化。
善用現有的開放源碼專案、再輔以適度加工,滿足軟體專案開發上的需求,以得到生產力的提升,這一門學問我把它稱之為「開放源碼的回收與再利用」。在過去,我曾經這麼比喻:「再生利用和重新建立,需要的是不同的技能。」
就好比對工匠而言,重頭製作一張木頭椅子,與回收一張既有的木頭茶几,然後將這張茶几重新修整,再添加新的材料,而成為一張具有新面貌的椅子,需要的技巧雖有重複,但也有諸多不同之處。
如何盡可能地利用既有的資源,施以最小幅度的心力,達成相同的目的,就成了這門技巧的藝術。
在2.0時代,或許重頭打造程式碼的能力依舊重要,但找到既有程式碼並且加以回收再利用的這項技能,重要性也日漸升高。因為,可用而且品質良好的開放源碼越來越多,只要懂得善用,就能發揮槓桿效應,得到生產力的回報。
作者簡介:
王建興
清華大學資訊工程系的博士研究生,研究興趣包括電腦網路、點對點網路、分散式網路管理、以及行動式代理人,專長則是Internet應用系統的開發。曾參與過的開發專案性質十分廣泛而且不同,從ERP、PC Game到P2P網路電話都在他的涉獵範圍之內。
相關閱讀:
程式設計2.0 (1)善用優質網站資源,快速上手新技術
程式設計2.0 (2)強化網路搜尋力,迅速找到解答
熱門新聞
2025-12-12
2025-12-15
2025-12-12
2025-12-15
2025-12-12
2025-12-15