開源是免費的,維護也是免費的
英文原文:While open source is free as in beer, it’s also free as in baby
譯文/臘八粥
最近 Zach Tellman 和 Factual 開源了一些資源庫,他們想處理根本不存在的具體需求。在 Reddit 的評論里,有人發牢騷,因為這個軟件可能在1-2 年內被拋棄,如果他們依賴這個軟件,他們將陷入困境。我認為這種想法源于對開源軟件的誤導和自私的視角。
做為軟件工程師,應對開軟資源庫、應用程序和框架,就像在一家五金店,這是非常有吸引力的。如果你有問題,而標準資源庫無法解決,就拉取一個依 賴項。需要工具集函數?在 GitHub 搜索一下,并增加一個依賴項。想發揮最近瘋狂流行的單頁應用程序?那就拉取另一個依賴項。需要用 Ruby 處理 XML?只需瞬間安裝 Nokogiri,你可以笑到最后。
或許這可以應付一段時間,但是漏掉了軟件工程中最關鍵的地方:軟件隨著時間而衰落,也叫熵。軟件不是以獨立系統的 形式存在的,它與其它隨著時間而變化的軟件交互,包括你的操作系統、內存、其它外部服務、數據庫、CPU、網絡、IO 設備(打印機、顯示器)和最重要的因素—用戶。這些系統被新的系統取代或更新。有時候變化是向后兼容的,有時候卻不是。因此,代碼被一次寫完、而終身維 護。使用某人的開源代碼對你是個巨大幫助,因為你不必去寫了。然而,隨著時間的流逝,狀況有所改變,熵就起了作用,代碼需要維護和更新了。
一個資源庫的供養需要一個村子的努力
除了把開源軟件看做五金店,我認為更好的比喻應該是,加入一個村子去供養一個孩子。你拉取的每個依賴項需要隨著時間一直維護,還有它所依賴的依賴項,如此往復。這里的問題不是關于維護是否需要去做,而是誰來做。較大的社區有更多的資源和時間來做,成熟的項目已經經過了優化、良好的測試以及具有穩定的 API。如果你正忙于新生的、模糊的或快速變化的語言中,那么更多的維護將要壓到你的身上。
我認為,把開源軟件做為禮物獻給世界的某個人,不會覺得負有為你維護軟件的責任。一些項目的確聲明了責任,但是不能僅僅因為有人在 GitHub 上發布了項目就說明責任被自動授予了。我想,更多的責任應該在于使用該項目的人。將要使用它的是你的代碼,你的代碼需要更新、你的代碼將要崩潰。在你開始 使用一個資源庫或框架之前,你應該考慮以下問題:
- 這個軟件取決于誰?它的依賴的依賴項是什么?它們更新合理嗎?資源庫在用類加載器、字節碼做著奇怪的操作、搞亂了運行時嗎?這些情況更有可能出現在你的語言或運行時的新版本里。
- 除了使用另一個或自己寫,我使用這個資源庫或框架能得到多少好處?
- 這個資源庫寫得不錯嗎?有對代碼做全面測試嗎?通過測試了嗎?
- 作者建議你用在生產環境中了嗎,或者它只是概念驗證(proof of concept)或探索型想法?
- 作者有過維護開源軟件的經歷嗎?他們自己使用嗎?如果我想增加一個特性或修復 bug,作者樂于接受,或者它是“沒有開啟 pull request 的開源”?順便說一句,這是不錯的,意味著當你的需求偏離時,你需要維護自己的 fork。
- 如果它是一個數據庫驅動器,它能夠及時地為數據庫新版本更新嗎?例如,Netflix 的 Cassandra 驅動器 Astynax 就落后于Cassandra 的最新版本。
- 我和老板的風險容忍度怎么樣?
- 我有時間、且征得了老板的許可、有能力來自己維護或優化這個資源庫嗎?
- 如果有必要,這個資源庫通過安全審查了嗎?
- 作者有談到 API 的穩定性嗎?
- 項目的 issure tracker 執行情況怎么樣?作者有響應,或者他們不再參與了?
- license 和軟件的其它部分兼容嗎?
- 如果它由一家商業公司提供支持和發布,他們傾向于修改 license 或者為將來的企業客戶保留重要特性嗎?
- 具有多個資源庫實現的通用 API 嗎,我可以在它們之間切換。在 Java 里,有 JPA 和 XQJ 之類的軟件,可以避免被綁在一種資源庫上。
- 最近一次的重要提交是在什么時候?整個項目存活了多長時間?
- 有相應的用戶社區嗎?有郵件列表嗎?
- 我正在編寫的代碼的預計使用周期和危險程度怎么樣? </ul>
- 如果你僅僅需要非常少量的、相對簡單的代碼,在 license 允許的前提下,只把代碼拷貝到你的項目就可以了。
- 確保標準資源庫沒有提供類似的功能。如果它只是另一種依賴項的包裝庫,那么你可以直接使用那種依賴項嗎?
- 如果為了某種數據結構而在拉取另一種依賴項,那么是否存在一種可替代的算法,你可以使用不需要這種數據結構的算法嗎?
- 存在一些應該你自己編寫的代碼嗎?雖然這不總是最好的選擇,有時候為了滿足你的質量標準,也沒有其它選擇了,你需要自己來構建。
- 有一個商業化的選擇嗎?開源是免費的【注1】,維護它也是免費的。給維護軟件的其他人員支付費用,將增加他們繼續為你維護的動力,這可能是很多公司最好的選擇。 </ul>
一旦你考慮清楚了這些問題,你將對所使用的資源庫繼承下來的風險有更好的理解,還有項目的極有可能的未來方向。如果你決定采用了,那么我建議你加入郵件列表,在 GitHub 上關注它,以隨時關注更新變化。
可替代的依賴項的選擇
拉取一個依賴項應該是經過深思熟慮的,可以先看看其它選擇:
最后
開源軟件對于程序員的生產力是一種巨大的恩惠,節約了人類數個世紀的努力。但是請記住,正如你擁有自己的可用性,你還擁有你的軟件和與此相關的一切。
<span id="shareA4" class="fl">
</span>