谈起“开源”,我相信各位可以说出目前非常火热的很多开源产品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化”?》)。

      拥抱开源、利用开源、贡献开源,让我们的技术生活更加丰富多彩!

---From:杨中科CSDN博客