談起“開源”,我相信各位可以說出目前非常火熱的很多開源產品Linux、MYSQL、MangoDB、Memcached、Redis、JQuery、Hadoop、android……,就連曾經對開源持敵對態度的微軟都開始擁抱“開源”:ASP.Net MVC中把開源的JQuery做為預設的JS庫、ASP.Net MVC開源、支援Mono(可以看做“開源的.Net”)的發展、嵌入式系統.Net MF開源。要知道微軟曾經把“禁止參與任何開源專案”做為員工規範的,可見“開源”的影響力和作用已經越來越大。
但是很多人對“開源”有著誤解:
- 有人在部落格上釋出一款自己開發的軟體,底下評論就有人喊“強烈要求開源”;
- 有人在部落格上把自己開發的一個產品的原始碼釋出出來,標題就是“某某某開源啦!”;
- 有人在部落格上寫一篇一款非開源產品和同類的開源產品對比的時候,底下評論也經常會說“開不開源對你有啥影響,所有原始碼你都能看到,可你修改過這些原始碼?”;
- 有人認為“開源就是免費”;
- 有人說“開源軟體都是網民開發的,質量沒有保障,還是商業性大公司開發的軟體放心”;
- 有人說“不敢用開源的東西,原始碼大家都可以看到,那系統的漏洞不也就被人看到了?”。
那麼什麼是“開源”呢?通俗的講,“開源”就是“功能大家一起完善,Bug大家一起改”的眾包協作開發模式。以最著名開源作業系統Linux為例,“Linux之父”Linus開發出了Linux的初始版本,然後就把Linux以開源的形式交給開源社群去共同維護。沒有一個像微軟的Windows團隊那樣的大公司來維護Linux作業系統,都是開源社群的各位愛好者以及廠商去發展和維護Linux:
- 某個數學牛人A感覺Linux應該有科學計算的功能,因此就自己開發了科學計算的軟體包提交到Linux,這樣Linux中就有了科學計算的軟體包;
- 另外一個人B用了A開發的這個科學計算軟體包,發現還缺少一個自己需要的功能,就把這個功能加到這個科學計算軟體包中,然後程式碼提交到Linux;
- 微軟發現需要給Linux增加訪問Windows檔案系統的能力,就開發了Linux訪問Windows檔案系統的功能,提交到Linux,這樣我們就可以使用Linux訪問Windows檔案系統了;
- Novell公司想讓.Net開發的程式能夠執行在Linux平臺下,就開發了開源的Mono;
- Unity公司使用Mono開發跨平臺的遊戲引擎Unity3d,他們發現了Mono的改進點,就修改了Mono的程式碼,並且把修改後的程式碼提交回Mono;
參與Linux的開發者中,有微軟、Novell、RedHat之類的大公司,也有一些小公司及非營利性組織,更有很多的個人愛好者參與;有的貢獻者可能貢獻了上萬行程式碼,有的貢獻者可能僅僅提交了幾行程式碼;有的貢獻者增加了重要的功能,有的貢獻者也許只是改了幾個Bug……也許單個組織或者個人的貢獻都不大,但是成千上萬的水滴則匯聚成了大海,成就了Linux等這樣偉大的開源產品。
如果沒有開源,那麼系統的所有的功能都要等著它的開發廠商來提供;如果沒有開源,系統的Bug只能等著開發廠商來修復;因為Windows不開源,所以除非微軟提供,否則我們無法把Windows裝到智慧電視裡;因為Linux開源,所以我們可以把Linux移植到手機中執行;因為.Net Framework不開源(真正的),所以無法在Linux下執行.Net程式;而因為Mono是開源的,我們可以藉助Mono來實現使用C#/.Net開發Android、IOS應用(MonoTouch是使用C#/.Net開發IOS應用的技術,Mono For Android是使用C#/.Net開發Android應用的技術,而Unity3d則是使用C#開發跨IOS、Android、Windows等平臺的遊戲開發技術);因為Android開源,所以不需要谷歌提供,就有人把Android移植到X86架構CPU下,這樣我們就可以在x86 PC機上安裝執行Android作業系統。
開源最大的魅力就在於不依賴於某個廠商,大眾都可以修改程式碼以滿足自己的需要,千萬個“自己的需要”就匯聚成了偉大的產品,任何違背這個理念的開源都是“偽開源”。
如果只是可以“看到程式碼”並不是真正的開源。某個人把自己開發的軟體原始碼在網上公佈出來了,但並沒有通過git、svn等把原始碼管理起來,更沒有人負責對其他人對這個軟體的修改程式碼進行彙總、管理,只能是有的人感興趣下載下來“自己修改自己用”並沒有把修改貢獻給社群,因此並沒有體現出開源的社群價值。比如微軟釋出.NET Framework 原始碼採用的就是Microsoft Reference License協議,這個協議最明顯的特點是“允許使用者看原始碼,但不許修改和分發,只許參考”,因此不能算作真正意義上的開源。而微軟的ASP.NET MVC則是基於Apache協議釋出的,“社群中的所有人都能夠參與進來,對簽入的程式碼、缺陷修正、新特性開發提供反饋,並且可以使用每日構建的最新版本原始碼和測試來構建和測試這個產品”因此ASP.Net MVC才是真正的開源專案。
以一個我的親身例子來說,多年前,我在網上發現了一款Eclipse的反編譯工具JodeEclipse很好用,但是升級到新版本Eclipse以後這個JodeEclipse就無法使用了,因此我就下載了JodeEclipse的原始碼,修改了程式碼使其能夠執行在新版本Eclipse下,把修改後的程式碼提交上去並且釋出了一個Release,後來發現很多人都在用我釋出的這個新版本。再比如前兩年我用的一款軟體(名字已經忘了),發現它沒有中文版,因此我就根據它的多語言的實現機制製作了中文語言包,並且提交了上去,新版本就有中文版了。
開源是一種所謂“眾包”的工作模式,因為有了開源我們才有了這樣精彩的技術世界。曾經和開源格格不入的.Net社群現在也已經因為開源理念的加入而變得豐富多彩起來,Log4Net、Json.Net、lucene.net、NPOI、Spring.Net、NHibernate、ASP.Net MVC等成熟的老牌開源技術自然不用說,Mono 系更是大放異彩讓.Net開發者過了一把跨平臺的癮,包括使用Mono在.Net下執行ASP.Net網站、開源的遊戲開發引擎MonoGame以及基於Mono的商業引擎Mono For Android/MonoTouch/Unity3D。當然更希望.Net開發者不要把自己的視野侷限在微軟社群,MYSQL、Memcached、Redis、Nginx、Linux、MongoDB等優秀的開源技術同樣是可以被.net技術社群的人靈活運用在解決方案中(參考我之前寫的一篇文章《哪個傢伙說“網站去.Net化”?》)。
擁抱開源、利用開源、貢獻開源,讓我們的技術生活更加豐富多彩!
如鵬網.Net培訓班正在報名,有網路的地方就可以參加如鵬網的學習,學完就能高薪就業,點選此處瞭解
三年前只要懂“三層架構”就可以說“精通分層架構”;現在則需要懂IOC(AutoFac等)、CodeFirst、lambda、DTO等才值錢;
三年前只要會SQLServer就可以說自己“精通資料庫開發”;現在則需還需要掌握MySQL等開源資料庫才能說是“.Net開源”時代的程式設計師;
三年前只要會進行使用者上傳內容的安全性處理即可;現在則需要熟悉雲端儲存、CDN等才能在雲端計算時代遊刃有餘;
三年前只要掌握Lucene.Net就會說自己“熟悉站內搜尋引擎開發”;現在大家都用ElasticSearch了,你還用Lucene.Net就太老土了;
三年前發郵件還是用SmtpClient;現在做大型網站發郵件必須用雲郵件引擎;
三年前快取就是Context.Cache;現在則是Redis、Memcached的天下;
如鵬網再次引領.Net社群技術潮流!點選此處瞭解如鵬網.Net最新課程