十個步驟:將你的封閉軟件轉(zhuǎn)化為開源
譯文【51CTO精選譯文】Difio是一款基于Django的應(yīng)用程序,旨在追蹤軟件包狀態(tài)并在其發(fā)生變化時通知用戶。它提供多種變更分析選項,因此大家可以根據(jù)當(dāng)前掌握的情況決定何時或者如何實施軟件包升級。Difio本身是一款標(biāo)準(zhǔn)的封閉軟件,我決定把它轉(zhuǎn)化為開源項目以實現(xiàn)家庭開發(fā)并為其吸引到更多技術(shù)社區(qū)參與者。
簡化
任何一款已經(jīng)面世數(shù)年的應(yīng)用程序當(dāng)中都必然積累下一些不會再被用到的代碼以及功能。將這些無關(guān)緊要的部分加以清除能夠保證需要共享的代碼內(nèi)容更純粹也更簡潔。Difio開源化工作的第一步正在于此--將現(xiàn)有代碼庫的規(guī)模降低約20%。
具體工作內(nèi)容包括:
- 未使用或者已經(jīng)過時的設(shè)置
- Django應(yīng)用
- 靜態(tài)文件與模板
- 模型類
- 遺留URL
- 不建議使用的功能
- 其它Python公用工具
舉例來說,在處理額外的依賴關(guān)系以及一次性代碼時,我過去一直習(xí)慣于將其記錄在某些模板以及純HTML當(dāng)中。我也設(shè)置過一些只使用過一、兩次的自定義模板標(biāo)簽。這一切都屬于被刪除的對象,最終保留下來的模板彼此之間都保持著較高的一致性。
對路徑、值以及URL等要素進(jìn)行硬編碼無疑是快速原型設(shè)計工作中無法回避的組成部分。在某些情況下,閉源應(yīng)用程序會繼承其開發(fā)環(huán)境所遺留下來的某些特征,而這些也需要加以調(diào)整。我曾經(jīng)在必要時使用過一部分自定義模板標(biāo)簽與設(shè)置。
創(chuàng)建自包含模塊
換句話來說,對文件結(jié)構(gòu)的重新構(gòu)建也在實現(xiàn)簡化的同時讓應(yīng)用本身顯得更加自然。創(chuàng)建自包含與獨立模塊使我們今后能夠更輕松地將它們彼此拆分開來。
Difio的web后端被部署在OpenShift之上,其中針對模板與狀態(tài)文件使用了不同的目錄層。我需要移動這些文件并更新Django設(shè)置,從而讓它們能夠更為恰當(dāng)?shù)剡M(jìn)行載入。這也迫使我重新思考該如何將原始靜態(tài)文件發(fā)送至CDN后端。
將內(nèi)部與外部代碼劃分開來
在應(yīng)用程序當(dāng)中使用一部分內(nèi)部代碼以提供更多信息可謂理所當(dāng)然。舉例來說,我們在實現(xiàn)使用情況及其它指標(biāo)追蹤、計費乃至其它功能時,內(nèi)部代碼可謂不可或缺。在web服務(wù)方面,這些代碼往往會被整合到核心功能當(dāng)中,因此作為開源轉(zhuǎn)化工作的重要部分、我們需要將其劃分出來。
著手轉(zhuǎn)化的過程也讓我們得以判斷哪些內(nèi)容需要被劃分出去、哪些最好繼續(xù)保留其中。舉例來說,Difio不會將測試實例劃分出去,這是為了減少將其從CI環(huán)境中明確劃分以及完全以web服務(wù)或者獨立應(yīng)用方式運行所帶來的額外工作量。
Difio當(dāng)中包含五大獨立模塊:
1. difio/ (核心用戶體驗所在)
2. 配置文件子系統(tǒng)
3. 計費模塊
4. 擴(kuò)展管理員界面
5. 相關(guān)模塊部署(大部分設(shè)置來源于此)
以上模塊彼此之間被明確區(qū)分開來且保持相互隔離,所有輸入與內(nèi)部依賴關(guān)系都被移除。目前difio/依賴于多個配置文件API以提供正確的缺省值。
這一步驟還能幫助大家將操作組件(例如定制化電子郵件模板)從核心用戶體驗當(dāng)中拆分出來。
代碼重構(gòu)
無需贅言,代碼重構(gòu)與測試也應(yīng)當(dāng)作為一項需要持續(xù)關(guān)注的工作內(nèi)容。不過到現(xiàn)在為止,大家可能已經(jīng)對全套現(xiàn)有源代碼(或者其中的大部分)進(jìn)行了快速審查,而且初步明確了其中哪些部分需要加以改進(jìn)。開源轉(zhuǎn)移也是提升軟件水準(zhǔn)的好機(jī)會,我們應(yīng)當(dāng)好好把握。
此外,我們也可以借此機(jī)會構(gòu)建起一套短期路線圖,其中包含需要修復(fù)的漏洞等之前收集到的公共問題信息。這套路線圖能幫助大家的新生項目在誕生之初表現(xiàn)出更為旺盛的活力與改進(jìn)態(tài)勢,這些特性是吸引更多貢獻(xiàn)者加入進(jìn)來的關(guān)鍵所在。
在Difio當(dāng)中,我對一部分方法以及大部分內(nèi)部代碼進(jìn)行了重構(gòu),旨在使其更好地與新應(yīng)用程序結(jié)構(gòu)相吻合。外部方法則姑且放在一邊、等待今后修復(fù),畢竟這部分改進(jìn)屬于"錦上添花"而非"雪中送炭"。
法律工作
根據(jù)軟件規(guī)模與復(fù)雜程度的不同,大家在對其進(jìn)行開源化整理與遷移時所需要付出的時間周期也會出現(xiàn)巨大差異。從選擇合適的開源許可、塑造品牌、在產(chǎn)品中注明作者、進(jìn)行法律審查并尋找可能存在專利侵權(quán)可能性的風(fēng)險代碼等等,這一切都是我們需要提前考慮的問題。
不過在Difio方面,這部分工作就簡單得多了。我選擇的是Apache 2.0許可,將許可標(biāo)題添加到全部源文件當(dāng)中,并妥善解決了自己能在互聯(lián)網(wǎng)上找到的全部與外部代碼相關(guān)的著作權(quán)與版權(quán)問題(在大部分情況下,應(yīng)用本身不會就此提出任何特定條款)。
更新并羅列外部依賴關(guān)系
作為一名軟件開發(fā)人員,大家必須要采取額外的處理步驟來應(yīng)對其它應(yīng)用程序的最新版本升級,同時確保自己的軟件能夠與它們保持順暢協(xié)作(或者至少要保持合理的協(xié)作效果)。沒人愿意為了運行大家的代碼而被迫使用舊有依賴關(guān)系,而且在大多數(shù)情況下這也是根本不可能的。
另外,大家還需要制訂一份依賴關(guān)系列表(例如requirements.txt文件),用于幫助使用者了解如何在運行軟件之前安裝其它必要程序。幸運的是,Difio是一款基于Django的應(yīng)用,因此升級問題很少、對外部方案的依賴關(guān)系也不是太強(qiáng)。
提供說明文檔與示例
對于任何一位剛剛接觸我們開源項目的新人來說,說明文檔的意義都可謂至關(guān)重要。畢竟我們的目的是建立起一套極具吸引力的社區(qū),因此保持其開放性是實現(xiàn)目標(biāo)的必要前提。而在這方面,撰寫說明文檔與示例就成了重中之重。
在Difio這邊,我編寫了一份README文件,其中詳細(xì)描述了與設(shè)置相關(guān)的各項內(nèi)容--這是考慮到該應(yīng)用擁有多套子系統(tǒng)(包括消息傳遞層以及計劃任務(wù)調(diào)度等),而這些子系統(tǒng)可以通過多種方式實現(xiàn)配置。我編寫的第二份文檔則是《內(nèi)容管理指南》,很明顯并不是每項工作都能夠以自動化方式完成、手動機(jī)制偶而也需要參與進(jìn)來。這兩份文檔涵蓋了Difio當(dāng)中最為重要的全部設(shè)計與部署特性--不過除此之外,大家可能還需要為自己的項目準(zhǔn)備更多說明文檔。
創(chuàng)建一套公共代碼庫
現(xiàn)在是時候創(chuàng)建一套公共代碼庫并著手進(jìn)行軟件交付了。
在Difio開源項目中,我決定把整個difio/目錄從原有位置復(fù)制出來作為最初的提交內(nèi)容。這樣做的弊端在于此前所有歷史提交內(nèi)容都將不再可用,但我選擇這種作法是為了避免已經(jīng)被以硬編碼方式添加到代碼片段中的密鑰與密碼遭到泄露。
在生產(chǎn)過程中,我利用git子模塊取代了difio/目錄;這一方面是為了加快發(fā)布/部署周期,另一方面則因為我的云環(huán)境選擇了git作為部署機(jī)制。
從現(xiàn)在開始,大家對源代碼進(jìn)行的一切調(diào)試及修改都將以公開方式進(jìn)行。
在全新環(huán)境下測試單機(jī)部署
截至目前,大家的注意力可能一直集中在對現(xiàn)有本地副本的調(diào)試以及對應(yīng)用程序前續(xù)版本遺留下來的內(nèi)容--例如依賴關(guān)系、環(huán)境配置等等--進(jìn)行遍歷上。不過接下來我們需要轉(zhuǎn)換思路,從外部用戶的視角出發(fā)在全新環(huán)境下著手測試--這能夠幫助我們進(jìn)一步完善說明文檔并清理遺留問題。
在對Difio進(jìn)行測試時,我發(fā)現(xiàn)了幾項之前忽略掉的或者剛剛出現(xiàn)的運行要求、缺少或者未經(jīng)恰當(dāng)處理的設(shè)置方式外加一些存在錯誤或者內(nèi)容不夠完整的說明文檔。
在這部分工作完成之后,別急著休息、從頭開始再進(jìn)行一次,直到每個步驟都擁有正確的解釋并適用于作為運行基礎(chǔ)的全新設(shè)備。這至少能夠確保未來的項目貢獻(xiàn)者及用戶能夠順利地將軟件安裝在自己的計算機(jī)上。
發(fā)布
終于迎來了最后一項工作!寫下屬于自己的宣傳稿件,并向全世界介紹自己的這款新軟件。祝賀各位,從這一刻時你已經(jīng)正式步入開源陣營!
原文鏈接:http://opensource.com/business/14/5/10-steps-migrate-closed-to-open-source






























