“开源”是什么,能吃吗?

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

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

你可能感兴趣的:(开源)