談起“開源”,我相信各位可以說出目前非常火熱的很多開源產品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最新課程