开源的那些事儿 (一)- 如何看待开源
前言
其实想写写关于开源的文章已经好久了,从在2010年开始接触Hadoop到现在已经有六个年头了,从最早的Hadoop用户和Contributor,再成为Committer,最后成为PMC (Product Management Committee,项目管理委员会) 委员,挫折、 欣喜都在交替在我跟开源打交道的每一天,这里想分享个人的一些想法。
本文仅为个人意见,不代表我的雇主Hortonworks以及Apache Software Foundation的观点。
版权声明:本文由leftnoteasy发布于 http://leftnoteasy.cnblogs.com, 本文可以部分或者全部的被引用,转载请保留版权声明全文,有问题可以联系wheeleast (at) gmail.com, 也可以加我微博 @leftnoteasy
什么是开源呢?
相信很多人对于开源这个概念很模糊,我在之前的一篇博客里面也略微谈了一下,这里想展开说一下。
开源心态
首先要清楚的是,开源是一种精神,这种精神是,我希望把我的东西能够分享出去让更多的人去使用它。对于开源者来说,能够从中获得什么东西各有不同,有些人为了金钱利益,有些人为了兴趣。但是清楚的第一点是,一旦你开源出去,别人怎么用它就跟你没有任何关系了。
所以有在我之前的博客上有评论说,我不想开源主要是不希望别人拿我的代码出去卖钱,对于这种心态我只能说可能开源未必适合你。
开源协议
对于开源软件来说,需要选择一个合适的协议(License),不同的协议之间差别很大,具体可以参考:如何选择开源许可证。如果上面的这些开源许可证都不适合你,那么你也可以写一个自己的许可证。
这里拿一个比较流行的协议,MIT协议来举个例子来说里面要求了什么东西,由于协议的英文比较冗长,这里摘录部分已经加上了注释
…including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software
你拿我的代码去怎么改,怎么打包卖掉都可以!
…THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED…
代码就这样了,不提供任何的质量保证!
…IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY…
用坏了我不负责!
MIT协议属于比较宽松的协议,也会有些更严格的协议比如说GPL:如果你程序用了我定义的接口,那么你也必须用GPL协议开源,之前小米就卷入了一些关于GPL协议的纠纷。所以根据不同的情况选择不同的协议比较重要,同时当你引用了别人的开源程序的时候,也要注意是否违反了作者的开源协议。
开源社区
开源社区是开源软件赖以生存的生态系统,所谓社区是由用户和开发者组成了。
开源社区用户
用户一般会来自于五湖四海,他们会使用、抱怨(可能会非常尖酸刻薄)和贡献开源软件,比如说Hadoop社区里面就有很多的用户会把自己碰到的问题发布到用户\开发者邮件列表以及JIRA(bug数据库)中,这样的话,社区的开发者就能够有机会看到并且修复这个问题了。有些对于开源软件理解深刻的用户会尝试从代码里面看到到底是哪里出了Bug并且能够提出解决方案,这种用户是最受欢迎的用户了。
开源社区开发者
开发者可能来自于不同的公司也可能来自于同一个公司,取决于不同的目的。比如说Hadoop的核心开发者都是来自于不同的深度使用或者卖Hadoop相关产品的公司,比如说Yahoo、微软、Hortonworks、Cloudera之类的。也有一些开源软件不希望别的公司的人来参与,比如说Google开源的产品一般很少有来自其他公司的贡献。比如说Tensorflow、Android。
一个良好的开源社区里面会非常的良性循环:用户用软件,找到Bug和提出改进的方案;开发者通过用户的反馈来不断的改进产品;不断有新的开发者来加入到社区里面进行开发,这样就算是有老的开发者不做了项目也能够继续往前发展。
而相对的,一个坏的开源社区会很少有人参与,对于用户的反馈置之不理,没有办法发布新的版本,最后彻底成为一个死掉的项目。
开源社区的开发者都是哪些人?
开源社区的开发者都是不拿工资的吗?
对于开源开发者来说,有很多人的认识是:开源社区里面的人都是技术大牛,视技术如生命,视金钱如粪土,上班干着公司的活,下班干着开源项目的活。
其实这个是一个很大的误解,其实开源社区里面绝大部分的开发者是在工作的时候贡献代码的,因为这些开源项目就是公司IT的基础架构之一。当然里面有很多大大牛是能够凭着自己的兴趣就可以创立最牛的软件,个人最佩服Linus,完全凭着自己的技术、经验和兴趣创立了Linux和Git。
开源社区是一片技术的净土吗?
另外一个普遍的误解是认为开源社区就是一片净土,里面的程序员都活在自己的技术世界里,两耳不闻窗外事,一心只会码程序。其实有人的地方就有江湖,朋友志杰写过一篇关于Hadoop两党制的文章,非常值得读一下。
跟一般的公司一样,开源社区的开发者有着一些不那么好的个体:
- 干活不行只会去抢别人的功劳的
- 爱拉帮结派搞政治,在各个不同的讨论主题上面嚼舌根的
- 对于自己不同意的意见出口成脏人身攻击的
但是不得不说,好的开源社区里面还有有着比一般公司更多的技术大牛和更好的氛围,所以希望上面的言论不要把你给吓到:虽然它不是一片净土,但是它比一般的地方干净纯粹得多。
开源项目怎么挣钱呢?
开源项目的挣钱方式也很多,不是因为开放了源代码你就变成了一无所有为别人做嫁衣裳了(当然有时候还是有点这种感觉)。对于公司而言(除开纯粹个人兴趣开源的),开源最主要的原因是没办法继续卖闭源的产品了。
举个例子来说,如果没有IOS,Android会开源吗?没有Unix、Windows,也很难说Linux是否会开源。所以作为老二,如果要打败老大,最好的方式就是把老大的最重要的技术开源出去。
一旦开源出去,挣钱的门路就多了,比如说:
- 卖技术支持,你用我的开源软件,但是里面出了问题我可以帮你解决,我也可以帮你把你需要的功能给加进去。这个是最普遍的盈利方式,但是最大的问题是利润率相对低,因为技术支持的人力成本比较大。
- 卖培训,跟上面差不多,因为只有我最懂这个开源软件了,你想要学习当然得找我了。
- 卖高级功能,一些开源软件会在开源的基础之上提供更多的高级功能,这些功能往往是闭源的。这方面做得比较成功的是Redhat,但是问题主要有几个
- 1)用户可能会担心被你给困住(lock-in),对于选择开源软件的企业用户而言,很多情况是希望不要困在某一个软件提供商的软件里面,以防这个软件提供商倒闭或者漫天要价。
- 2)这个高级的功能带来的价值是多少,有没有类似的开源免费的软件能够做到这些功能。
- 卖云服务:现在很多的公司也会把开源的软件作为云服务提供,比如说Tensorflow就能够在Google Cloud Platform上面,Docker也能在Docker自己的云上跑。这个也是现在比较火的开源软件盈利方向。
不管怎么说,开源项目相关的产品比之前的相似的闭源产品一般会便宜很多,如果有一个健康的社区,在几年之类就会越来越少有人去用那些闭源的软件了。举个例子来说:Teradata由于各种开源项目的冲击,在这个上一个季度的收入比全年同期下降了不少,见Teradata Reports 2016 First Quarter Results。
开源项目代表着最高的代码质量吗?
简单来说不是。
这种事情经常发生在大部分的开源社区:有些开发者更新了代码后发现”我擦居然这个东西都能够被提交进代码库“,然后就发起一个新的讨论主题开启骂战模式。
开源社区的代码质量主要是由下面的几个原因导致的:
1)虽然说好的开源项目都有非常严格的代码检查(Code review)政策,所有进到版本库里面的代码都需要有相关领域的负责人来检查通过后才能够被Commit,但是很多时候,一些开发者的经验不足和Code reviewer的疏忽会导致一些不那么好的代码被提交。
2)此外开源社区有时会进行很多低效的讨论,在不同的需求情况下,有时做出最后的决策是妥协了的结果。
所以如果看现在的IT领域,一般来说开源的项目并不是最好的,比如说分布式系统里面Google的内部GFS应该远远领先Hadoop HDFS;Google Borg比YARN、Mesos、K8S领先了好多年。
但是还是得说一下,有些东西不能只看点,如果你能够在Hadoop里面找到一些弱鸡的问题并不代表所有的代码都是一坨狗屎,里面大的代码架构设计、用户接口设计和那些很核心的代码都是由大牛主导,通过很多的思维碰撞而得到的。
另外由于在开源社区里面,由于你的每一行代码都会经过别人的眼睛,从个人的名誉来说,一般人会更加重视进入了开源社区的代码;同时,那些老是把低质量代码提交进去的开发者来说,会被打上”不靠谱“的标签,之后就很难在社区里面混了。
所以总的来说:
虽然开源项目代码质量不是最好的,但是也是相当不错的,而且由于开源社区是由众人拾材火焰高,所以好的项目会活得更久,因为就算是之前做这个项目的负责人、公司不做了,项目还是能够继续活下去的。
好吧作为科普文,先写到这里了,之后准备谈谈关于开源更深入的一些主题。