開源是免費的,維護也是免費的

贊 回覆發表於2014-11-28

五金店

最近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裡,有JPAXQJ之類的軟體,可以避免被綁在一種資源庫上。
  • 最近一次的重要提交是在什麼時候?整個專案存活了多長時間?
  • 有相應的使用者社群嗎?有郵件列表嗎?
  • 我正在編寫的程式碼的預計使用週期和危險程度怎麼樣?

一旦你考慮清楚了這些問題,你將對所使用的資源庫繼承下來的風險有更好的理解,還有專案的極有可能的未來方向。如果你決定採用了,那麼我建議你加入郵件列表,在GitHub上關注它,以隨時關注更新變化。

可替代的依賴項的選擇

拉取一個依賴項應該是經過深思熟慮的,可以先看看其它選擇:

  • 如果你僅僅需要非常少量的、相對簡單的程式碼,在license允許的前提下,只把程式碼拷貝到你的專案就可以了。
  • 確保標準資源庫沒有提供類似的功能。如果它只是另一種依賴項的包裝庫,那麼你可以直接使用那種依賴項嗎?
  • 如果為了某種資料結構而在拉取另一種依賴項,那麼是否存在一種可替代的演算法,你可以使用不需要這種資料結構的演算法嗎?
  • 存在一些應該你自己編寫的程式碼嗎?雖然這不總是最好的選擇,有時候為了滿足你的質量標準,也沒有其它選擇了,你需要自己來構建。
  • 有一個商業化的選擇嗎?開源是免費的【注1】,維護它也是免費的。給維護軟體的其他人員支付費用,將增加他們繼續為你維護的動力,這可能是很多公司最好的選擇。

最後

開源軟體對於程式設計師的生產力是一種巨大的恩惠,節約了人類數個世紀的努力。但是請記住,正如你擁有自己的可用性,你還擁有你的軟體和與此相關的一切。

相關文章