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