開源是免費的,維護也是免費的
五金店
最近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之類的軟體,可以避免被綁在一種資源庫上。
- 最近一次的重要提交是在什麼時候?整個專案存活了多長時間?
- 有相應的使用者社群嗎?有郵件列表嗎?
- 我正在編寫的程式碼的預計使用週期和危險程度怎麼樣?
一旦你考慮清楚了這些問題,你將對所使用的資源庫繼承下來的風險有更好的理解,還有專案的極有可能的未來方向。如果你決定採用了,那麼我建議你加入郵件列表,在GitHub上關注它,以隨時關注更新變化。
可替代的依賴項的選擇
拉取一個依賴項應該是經過深思熟慮的,可以先看看其它選擇:
- 如果你僅僅需要非常少量的、相對簡單的程式碼,在license允許的前提下,只把程式碼拷貝到你的專案就可以了。
- 確保標準資源庫沒有提供類似的功能。如果它只是另一種依賴項的包裝庫,那麼你可以直接使用那種依賴項嗎?
- 如果為了某種資料結構而在拉取另一種依賴項,那麼是否存在一種可替代的演算法,你可以使用不需要這種資料結構的演算法嗎?
- 存在一些應該你自己編寫的程式碼嗎?雖然這不總是最好的選擇,有時候為了滿足你的質量標準,也沒有其它選擇了,你需要自己來構建。
- 有一個商業化的選擇嗎?開源是免費的【注1】,維護它也是免費的。給維護軟體的其他人員支付費用,將增加他們繼續為你維護的動力,這可能是很多公司最好的選擇。
最後
開源軟體對於程式設計師的生產力是一種巨大的恩惠,節約了人類數個世紀的努力。但是請記住,正如你擁有自己的可用性,你還擁有你的軟體和與此相關的一切。
相關文章
- 開源不是免費的
- 開源=免費?
- 為什麼免費代理是“免費”的?
- 開源免費的建站系統
- EacooPHP框架【開源、免費、好用】OOPPHP框架
- Mind elixir 一個免費開源的思維導圖核心
- 共享、免費還是公有?開源軟體的真正定義
- 10款免費開源PHP框架PHP框架
- 免費的FTP工具,免費的FTP工具下載!FTP
- 免費開源的速度測試軟體:openspeedtest
- 免費好用的開源威脅狩獵工具!
- 一個免費開源專業的CRM――openCRX
- Github上的7款免費開源軟體Github
- 免費資源網站網站
- 熱門好用的免費API資源API
- 開源≠免費 常見開源協議介紹協議
- 開篇:免費開源的趣講 ZooKeeper 教程(連載)
- 推薦七個超酷的免費開源軟體
- .NET下免費開源的PDF類庫(PDFSharp)
- 開源免費介面管理平臺eoLinker AMS 開源版3.1.5同步線上版!免費增加大量功能!
- 可免費使用的免費API分享API
- 免費的桌布APIAPI
- 什麼是免費SSL證書?免費SSL證書能用嗎?
- 本月,八駿推出免費CRM系統,真的是永久免費哦!
- python是免費的語言嗎?Python
- 開源精神就意味著免費嗎?
- 開源免費繪畫軟體 - Krita for MacMac
- 免費開源Blazor線上Ico轉換工具Blazor
- GitHub 上 10 款免費開源 Windows 工具GithubWindows
- 免費開源網站系統有哪些網站
- 企業免費建站-免費響應式網站-免費釋出資訊網站
- 45本免費的JavaScript書籍資源JavaScript
- 25個免費的iOS設計資源iOS
- 開源/免費的敏捷工具:Scrum團隊的增效秘訣敏捷Scrum
- 38 個免費開源的 CSS 下拉導航選單CSS
- 10個開源免費的電子商務平臺
- 100個開源或免費的功能測試工具
- 免費才最貴:揭露「免費」Windows 10 的真實成本Windows