經常遇到一些好的.NET項目開放源代碼之后,便很少更新。即使是大名鼎鼎的CodeProject中的文章中的代碼項目,遇到問題時,留言或是主動給作者發郵件,都像石沉大海一樣,得不到回復或解決,只好自力更生。
Codeplex中的項目,更新的速度就更慢了。從First release算起,三個月之外,就很少有更新了。我指的項目不是指官方的一些項目,駐留在這里。比如SQL Server的Sample Database駐留在這里,更新速度當然頻繁,有官方的背景,各方面的更新工作肯定不會馬虎。
1 項目已經成熟,滿足作者設定的需求范圍,不再需要更新
這種情況比較多。項目的開發人員,在設定目標后,會花費很多時間來完成它,業余時間都會充分利用上。我自己也經常這樣,一旦認為添加某個Feature對項目非常重要時,會把業余時間都利用上,加班加點的把它完成。
舉例說明,一個數據庫工具,一開始作者設定只需要連接到SQL Server進行數據操作即可。這樣的需求設計,你很難要求作者去為你添加Oracle,MySQL的支持。一個代碼生成工具,起初的目標是支持SQL Server, Access, Oracle,MySQL四種類型的數據庫,但是后來作者發現,大部分的時候,只需要滿足一個常見的數據庫類型即可,要能支持其它類型的數據庫,測試和編碼的工作量要多很多。寫出來的功能,就應該充分測試,要么就沒有,要么就測試充分以滿足各種情況和場景。我的一個代碼生成器曾經也有這樣的思考,只要求支持SQL Server,但是后來一直想加入對Access,Oracle的支持,一直沒有動力,最后不了了之。項目中遇不到的使用場景,很難有動力去虛擬一個環境,做出連自己都不需要的功能。
2 遇到技術瓶頸 現在項目停止開發或轉向新的架構和需求
每個開源項目是為解決特定領域的問題,如果滿足第一條,可以滿足該領域的需求,便不再需要精進。另一方面,遇到不可解決的技術瓶頸,也會導致項目無法繼續深入下去,現在已經做的最好了,再深入下去會無從下手。
前段時間,我想找一個項目中代碼重復的檢測工具,判斷一下,我的項目中有哪些代碼是通過拷貝的方法做出來的,而不是進行代碼重用。代碼重復給項目的維護帶來麻煩,所幸運的時,在CodePlex上面找到一個開源工具,Clone Detective, 只支持VS2008,之后就沒有更新。2010年4月微軟發布Visual Studio 2010,至今已有三年,也沒有更新過這個小工具。VS2012內置了代碼重復的檢查工具,但是依照目前的情況來看,.NET 4.5的普及程度不高,拒絕對XP和Windows Server 2003的支持,要花錢買正版的企業,一般都不會為此買單。Resharper 有一個插件工具,也可以檢測代碼重復,但是只支持5.1版的Resharper。以我的理解,這兩個工具,可能是因為面對新的API變化,技術阻礙,而停止更新。能做出這樣工具的開發人員,技術瓶頸是需要適應新的開發工具接口,但無力去維護更新。
3 作者或公司轉向新的研究領域,原有的代碼不再維護更新
這種情況曾經發生在Borland公司身上。Borland公司曾經是世界一流的開發工具供應商。曾經的一個時代,世界上的絕大多數的控件,是用Delphi開發的。后來是.NET的崛起,Delphi控件供應商逐漸減少,或是無法贏利的時候,直接把控件拋給開源社區,開源社區因為沒有贏利的驅動,又不以把握市場需求為目的,憑借個人興趣愛好,難以成體系的發展。到現在,世界上流行的控件或組件包,幾乎都是.NET開發的。Infragistics NetAdvantage系列,Dev Express系列,ComponetOne系列,Synfusction系列,Krypton系列,全是為了.NET市場而生的商業組件包。
Java世界也發生過這種現象,順應市場的發展,開源只是為了放下過去,更好的擁抱未來。
留下一堆的組件包在開源世界,幾乎無人問津。
4 失去促進開源項目發展的動力,有心無力
這一點應該是符合中國國情的一點。設計一個流行的開源項目,可以增加自己的知名度,為自己鍍金。但功成名就之后,這個敲門磚便不再有作用,失去繼續維護的動力。再者,IT這一行逐漸走向平民化,薪水和待遇不再遠遠高於其它行業,有時候甚至低於金融,會計這些行業。
俗話說飽飯思淫欲,在沒有吃飽飯的情況下,積極的促進開源事業的發展,有點背道而遲。如果有基金扶持,項目肯定會做的很好,很有特色。但是這一項待遇只屬於各大院校。把研究出來的東西,再鎖進抽屜里面,如果想看論文,需要再次付款,誰會再次去為此付款。作為納稅人,我們已經為他們的科研工作提供支持,用稅收給他們研究動力,我想看一下他們研究的成果卻不行,這可是花我的錢研究出來的東西。
公司則永遠不可能為開源而開源,公司要贏利才能生存,每個月的水電費,租金,人員開支都需要錢。公司開放項目的源代碼也是為了贏利。曾經看到一個公司把ERP項目都開源了,后來發現原來是賺個吆喝,真正的核心組件沒有開源。
5 項目被公司看中,進行定制 開源停止更新 閉源發展的更好
如果一個開源項目被公司看中,公司聘請到這個項目的開發人員,探討這個項目的發展,或轉向新的商業領域。這是開源項目中,我以為最好的一種結局。典型的例子是.NET Reflector,大名鼎鼎的.NET反編譯工具,在.NET開發領域幾乎無人不知,無人不曉。后來被Red Gate收購了,版本更新更快了,功能也更強大。
曾經有朋友問,是不是增加了更霸道的功能才收費。我的回答是Yes。
舊的版本的.NET Reflector,反編譯后有幾個問題沒有處理好:
1 屬性 比如代碼中一個Name的屬性, 代碼如下所示
public string Name { set;get;}
反編譯后的結果是是get_Name,set_Name,要手動修改才能編譯成功。
事件也是一樣,舊版本反編譯后的源碼生成了Delegate.Add和Delegate.Remove兩個方法的調用版本,也需要調整。
新版本解決了這個問題,
2 對於一些常見的編程模式,新版本的.NET Reflector 可以正確識別,並為你重寫代碼。
這個例子,最簡單的當屬於foreach和using。試一下,新版本的.NET Reflector可以為你生成這兩個句式的代碼。而舊版本中,這是沒有的。這里的using我是指using(Stream stream=File.OpenRead(“file.txt”))
這種情況也有另一種發展方向,開源項目被公司看中,但是公司不向作者購買,而是直接用它的開源版本,在上面直接修改,做出一個自己需要的版本,或是進行增強。在各種盜版軟件泛濫的情況下,開源協議相當於一紙空文。公司的目的是以最小的開支,創造最大的利潤,可以理解這種情況。