選定專案之後,從最小規模出發,建立第一個里程碑。首先試著編譯一小部分程式碼,編譯通過之後,再追求執行的正確性。另外,在心理層面上,也需克服心理障礙,視混亂如無物,才能增加生產力。
回收、再利用開放源碼的專案時,首先要做的,是盡可能搜尋滿足需求的開放源碼專案,接著依照專案的版權類型、程式語言、執行平臺及作業系統、採用度、專案規模及專案相依性來進行評估。
採用度、專案規模及專案相依性,是相對而言影響力較小的三個條件。一般來說,經由前3個條件篩選,已經能去除大多數的選項。倘若還有多個專案在伯仲之間時,你可以盡量選擇其中採用度較高者、專案規模和你所需程式碼較接近者、以及專案相依性較低者。
相依性越高,拆解難度也越高
採用度越高的專案,代表越多人使用,通常品質較好,因為這樣子的專案,不僅運行過各式各樣的環境及組態,同時也已經久歷使用者的考驗,品質及穩定度會有一定的水準。
專案規模和你所需程式碼越接近,代表需要拆解掉及額外組裝的程式碼越少。專案規模過大,就得投注更多的心力才能了解它的內容。
專案的相依性也關係到拆解時需要耗費的功夫。許多專案都會使用其他專案的產出,例如使用這些專案所開發出來的程式庫,或應用程式框架。當一個專案使用越多其他專案的產出時,它們之間的相依性就越高。
當你使用相依性高於其他專案的專案,意謂著你的專案也得一併將這些專案納入。那麼你的專案不僅會多出許多不需要的東西,同時體積也會變得龐大。因此,挑選專案相依性越低的,不僅可以減少體積的浪費,同時也省去拆解的力氣。
綜合上述的條件,不見得有一個專案能夠以壓倒性的優勢雀屏中選。每個專案總是有優點也有缺點。不過,魚與熊掌不可兼得,還是得從中取捨,最後從眾多符合標準的專案中挑選出一個。而這個專案,就成了我們回收再利用的基礎專案。
了解程式架構,拆掉不需要的部分
在再利用時,有7個大原則是必須牢記於心的:
● 了解程式架構,拆解出自己所需的部分
● 訂定不同的階段,從最小的里程碑開始
● 先求能編譯,再求正確執行
● 暫時忽略那些非第一個里程碑的內容
● 適度的斬斷關聯性,尋找適當的替代品
● 整理介面,去除不必要的元素
● 做好心理建設,面對混亂
找到基礎專案做為修改的標的後,程式人得投入更多的心力,了解該專案的程式架構。了解架構的目的,最主要還是希望在接下來的工作中,能夠了解全貌。
你得更明確地界定那些部分是你要的、那些是不需要的,有些你需要的部分,又會相依於不想要的部分。這閱讀及了解的動作,或許不是一次到位。在整個回收再利用的過程中,你會持續地回頭檢視,提高閱讀時的「粒度」,或觸及之前未曾閱讀過的程式碼區域。
通常,我們的目的是拆掉基礎專案中不需要的部分。但實務上,我們在了解程式架構後,會把基礎專案當做是一個資源池(Resource Pool),另外建一個新的專案,挑出基礎專案中所需的原始檔,逐一放入新的專案。
從最小規模出發,建立第一個里程碑
當我們從「資源池」中挑出需要的原始檔後,就會面臨到最嚴酷的挑戰,也就是讓原始碼得以編譯。然而你所挑出來的原始檔,通常無法在一開始就能通過編譯。
只憑藉這些挑選出來的原始檔,是很難一次就編譯過關的,因為在挑選的過程中,會捨棄掉一些看起來不會用到的原始檔,卻又得倚靠它們才能編譯成功。所以,把原始檔挑到新專案的籃子裡後,首要之務便是試著編譯。
如果你嘗試著把籃子裡所有的原始碼湊在一塊兒編譯,那麼通常只會收到數之不盡的錯誤。當你面對這麼多的編譯錯誤時,恐怕都會有一股不知從何著手的無奈心情,油然而生。
我的建議是,不要嘗試一次將所有的東西整合起來,相反的,應該盡可能從最小的規模出發,先試著編譯一小部分的程式碼。這正是我所謂「訂定不同的階段,並且從最小的里程碑開始」。你可以為自己訂下不同階段的目標,分批從籃子中取出原始檔加至編譯中的專案。每次加入一批,也只解決這批衍生的編譯錯誤。如此,就不會遭遇到成千上萬的編譯錯誤,同時又不知如何解的困境。
為自己設定的第一個可編譯的範圍,就是第一個里程碑。事實上,要達到它是最關鍵的。在完成的過程中,你會為接下來其他階段的目標打好基礎建設。所以應該把完成第一個里程碑當做是最重要的一件事。
許多和其他階段有關,但在第一個階段可以忽略的事物,你可以直接忽略,等進到其他的階段時再處理。例如許多可能會造成編譯錯誤的地方,而這些在第一個階段卻又是用不著的,直接將它們「註解掉」也無妨。
總而言之,盡可能先求第一階段的範圍能通過編譯,即使執行不見得正確也無妨。編譯通過是第一階段最重要的工作,之後,你便有實際可以執行的程式碼,這個時候,再來追求執行的正確性。
去除不必要的元素,降低複雜性
在追求成功編譯的過程中,大多數情況是缺少材料。這材料若不是回到原始的專案中去找尋並切割出,就是要自製填補或是尋找其他的替代品。通常,需要自行製造或是尋找其他替代品的情況,多半都是因為在原始專案中存在的程式碼片段有著極高的相依性。例如,某段動用到GList(跨平臺程式庫GLib中的一個資料結構)的程式碼,倘若直接含入整個GLib,便會增加編譯時的複雜性,也會使得專案中多出了許多不必要的東西。
倘若所需的部分,並沒有大量引用到GLib中所提供的功能,那麼,適度於此刻斬斷與GLib的關聯性,看起來就像是個不得不為的壯士斷腕。以GList所提供的功能來說,其實很容易自行實作,或是找到其他相依性低的實作品。
在追求通過第一階段的編譯時,你將持續地添加東西、也持續地移除或暫時移除某些東西。有時,由於基礎專案提供多於你所需的功能,所以取自基礎專案的函式、資料結構定義、介面,都多於所需。在這來來回回,既增加又移除的過程,倘若心有餘力,不妨整理這些函式或定義的介面、去除不必要的元素。使介面變得更清爽簡潔,可讀性提高,也更容易編譯成功。
克服心理障礙,視混亂如無物
除了技巧之外,心理層面的建設也同樣的重要。越是優秀的程式人,越難克服心理障礙,就是看不慣別人的程式碼。從排名、命名慣例、到程式架構設計等。因為看不慣,所以常常會忍不住動手修改。
在再利用程式碼時,請務必克服這個心魔。畢竟,我們想追求的是生產力,倘若還得幫別人的程式碼重新美容,那麼生產力則大打折扣。此時,面對混亂的程式碼,要能視如無物。等到日後時間允許,再利用重構的方法,漸漸修正你覺得有問題的地方。
作者簡介:
王建興
清華大學資訊工程系的博士研究生,研究興趣包括電腦網路、點對點網路、分散式網路管理、以及行動式代理人,專長則是Internet應用系統的開發。曾參與過的開發專案性質十分廣泛而且不同,從ERP、PC Game到P2P網路電話都在他的涉獵範圍之內。
相關連結:
開放源碼的回收與再利用(1)選擇開放源碼的3個關鍵考量
最新主題
‧ 5名女子借排污管偷渡欲赴香港從事色情業(圖) (chengbengdan)
‧ Skype 企業總機系統 89元 包月打到飽,免通話費。神擎科技 與 PChome線上購物 全球同步上市 (morgeorge)
‧ AMD 和 Intel 的瀏覽器戰爭 - AMD LIVE! Explorer vs. Intel Mash Maker (guruchin)
‧ 什麼是"H.M.D."? (urainbow)
‧ 旺角金魚街 Lifestyle Management Group Limited (jsjsjj)
‧ 從事資訊業的感想 (mygoca)
‧ iT邦幫忙推出針對回答的「回應」功能 (ithelp)
‧ TODO (aliceyeh)
‧ Sharp Series drum Cartridge chip resetter (blueera)
‧ 用Javascript試作Memento Pattern (fillano)
‧ 【好康】試用Gogrok軟體寫心得短文,就送POLO衫! (plus318)
‧ 假防毒公司之名、行病毒散布之實 (come2)
‧ 點部落推薦- 瓶水相逢.Net C#練習題系列 (dotjum)
‧ HSDc. 公佈六月份完整的系統分析課程 (Kenming)
‧ Blog開張測試...絕對值 (kupin)
‧ 有社區警衛就代表安全嗎?李恕權家宅遭匪入侵案的慘痛教訓~CoolBid購物情報-13-2008-04-21 (mrjones)
‧ UML互助會,會員招募中! (271080)
‧ 小孩生活-苦哈哈 (cenhhh)
‧ VIA CN700 規格 (superstanwu)
‧ 東京CCIE-Lab攻略(2008),心理建設篇 (kunnan0618)
‧ Barracuda Networks 為Salesforce.com全球用戶抵禦最新釣魚惡意軟體威脅 (chinamost)
‧ 《High Performance Web Sites 》網頁加速的14條黃金法則 (aone)
‧ 策略和營運(完) (yinshih)
‧ [下載][Blog]zomplog-3.8.2繁體中文 (hanklu)
‧ 數字轉國字 (aqr199)
‧ 善用PGP加密工具的七大法寶 (pgp)
‧ 取得免費的McAfee防毒軟體 (ataru)
‧ 五朵金花V.S老油條 (ya0932324421)
‧ 歡迎體驗學校知識庫系統 (neo_lin_42)
‧ PHP語言創造者Gutmans炮轟Java已經輸掉Web之戰 (flynetcn)
沒有留言:
張貼留言