昨天回答了知乎问题《开源(open source)是什么?为什么要开源?》[1],搬运过来混一天。
关于开源的定义和名词讨论,可以参考下面两份材料。
The Open Source Definition (Annotated)[2]
Why “Free Software” is better than “Open Source”[3]
里面的内容从定义上讲清楚了开源是什么。显然了解词汇本身的定义是不足以形成完整的认识的,我不是训诂学家,也不是考古学家,而是实验主义者。下面从为什么要开源以及怎么做开源反过来侧面介绍开源是什么。
我所关注的“开源”集中在围绕开源软件建立起来的开源社区当中的开源协同的软件开发方式。目前的共识是基础软件必然被开源吞噬,即所有基础软件都将收敛到开源开发的方式。同时,大家直觉的认为开源协同的软件开发方式将会导致质量更好的代码,因为集体的力量是强大的。这当中其实有一个很高的推理门槛。
从开源作为一种软件开发方式的角度切入。它之所以能够提供强大的研发效能,是因为这是一种能够激发人的主动思考和参与,同时允许跨越组织包括公司边界合作开发的协同模式。
对于前者,可以阅读红帽公司的经验之谈《开放式组织》[4]及其背后的理论基础《企业的人性面》[5]这两本书。
我在 COSCon'21 的演讲上也展开过这一点。开源社区 contributor 参与的动机之一是自我驱动,这是由于 contributor 认可开源文化乃至自由软件文化对自己或对社会带来的价值,同时开源软件本身创造了足够多的价值。这种主动思考和参与,比起作为打工人的心态打卡码代码,其生产力差距是以数倍乃至十倍拉开的。
《Why Contributors Stay and Grow》[6]
对于后者,可以阅读《协同》[7]这一本书来了解。
互联网时代带来的沟通便利,以及基础软件根本性的复杂度的演化,带来了强个体的价值崛起,影响组织绩效的因素由内部转向外部,以及驾驭不确定性成为组织的核心挑战三个关键变化。在这一背景下,组织想要开发出高水平的基础软件,不可能依赖一个人或者招聘一群人来完成,专家往往在组织之外。
传统的专有软件乃至闭源软件的开发方式,无法竞争开源协同开发模式下生产出来的软件。编译器几乎没有专有软件,Windows 在服务端被 Linux 击溃,关起门来的前端框架 Web 框架被开源框架逐一替换,开源大数据技术正面对抗云厂商专有服务,开源数据库不断挑战专有数据库。开源协同的开发方式是生产力竞争中的胜者,因此传统公司、大公司才开始拥抱开源,以期改变自己的组织效率。
除了开源软件的开发者以外,其使用者尤其是公司使用者为何要拥抱开源,我在个人公众号的一篇文章上已经有具体讨论。
在这个拥抱开源的过程中,思维的转变总不是一蹴而就的。遵循 OSD 的开源软件和专有软件对抗期间产生了时代的混血儿,源码可得(Source Available)的专有软件。我以四个“开源”软件举例
•Timely Dataflow[8]•Apache Spark[9]•OceanBase[10]•MongoDB[11]
Timely Dataflow 是纯粹的开源项目,以 MIT License 许可。
Apache Spark 是归属于 ASF 的开源项目,以 Apache License 2.0 许可。但是在开发和维护很大程度上受到 Databricks 公司的影响。不过由于项目已经捐给 ASF 了,Databricks 公司或其他实体并不能改变项目的许可证,Apache Spark 能够确保一直是开源项目。
OceanBase 是以木兰许可证许可的,但是 contributor 在贡献时需要签署一份 iCLA 即个人贡献者许可协议,里面写到
著作权许可的授予。受限于本协议的条款和条件,您在此授予奥星贝斯以及奥星贝斯发布文档和软件的接收方永久性的、全球范围内的、非排他的、完全无须许可费的、完全无须版权费的和不可撤销的著作权许可,以复制、衍生、公开展示、公开执行、转授权和发布您的贡献内容和该等衍生作品。
也就是说奥星贝斯公司可以把 contributor 提交的代码类似 MongoDB 那样换成 SSPL 等限制性协议。
MongoDB 曾经以 AGPL 3.0 License 许可,后来换成 SSPL 许可。这就是前面提到的源码可得的专有软件。
SSPL 也许还有暧昧的空间,但是类似 Business Source License 等明确写明不可以集群形式部署,或者提供服务的协议,就无可置疑地是源码可得的专有软件了。MariaDB 的部分组件和 Materialize 项目都是这一类。
这里提到这种形式,不是为了咬文嚼字,而是强调开源运动浪潮下井喷的开源软件里有这么一批浑水摸鱼的混血儿。Contribute 这些项目,并不能保证自己的努力始终以原来的形式存在,乃至于自己都不能享受到 contribute 带来的改善。这种源码可得的专有软件的开发模式,实际上仍未摆脱一个组织一家公司雇一拨人写一个软件本身就是产品拿来盈利的思路。随着 contributor 逐渐发现这类软件协议上的不平等以及时不时出现的改换协议的案例,最终源码可得的专有软件会像传统专有软件一样无法获得开源协同带来的生产力提升。
另外一个常见的说法是开源项目及其“主导公司”或者“背后的商业公司”,对于这种说法带来的问题,我在分享运行开源社区的计划 FLOSSWAY 上有一个讨论专门做了介绍。
The relationship between community and company[12]
CLA or DCO for an open-source software[13]
回到为什么要开源的问题上来,我想这个问题有两个答案。
第一个是前文已经介绍过的开源协同作为一种高能效的跨越组织边界的软件开发模式,当代基础软件采用这种模式获得人才优势是自然的。
必须要强调的是,从专有软件开发转换过来开发开源软件的开发者,总会问开源协同的模式能否引入更多的控制,榨取 contributor 的价值。对此我的回答一向是,专有软件可以提供你想要的控制,但是开源软件从软件质量和生态整合上正面击溃了专有软件,不得已你才来了解参与开源软件的开发,不是吗?作为战败方哪那么多要求。
第二个是技术以外的开源软件多少还有从自由软件运动沿袭下来的社会理念,即开发软件应当是为了公众的利益。通过开发开源软件提升整个软件行业的水平,甚至改善人民的生活质量,应该是开发者的终极目标。为此,开源项目应当形成一个强大的技术核心,这个技术核心对怀有梦想追求的开发者产生引力,形成开源社区并支持参与者在其中的各个部分创造自己的价值。每个人都从别人乃至自己创造出来的价值当中获益,这是开源的理想。
最后,开源社区的运行对维护者包括技术水平在内的多方面能力都提出了挑战。上面提到的生产力放大建立在开源软件的引力和维护者的组织协调能力之上。大体上,对于一个维护者来说,你需要释放出两倍的生产力,再付出一倍的精力,才能撬动社区协同模式十倍的生产力。社区不会自动地运行,始终需要维护者群体指引方向和全力投入。
References
[1]
《开源(open source)是什么?为什么要开源?》: https://www.zhihu.com/question/343707546/answer/2204771631[2]
The Open Source Definition (Annotated): https://opensource.org/osd-annotated[3]
Why “Free Software” is better than “Open Source”: https://www.gnu.org/philosophy/free-software-for-freedom.en.html[4]
《开放式组织》: https://book.douban.com/subject/26894636[5]
《企业的人性面》: https://book.douban.com/subject/27125968/[6]
《Why Contributors Stay and Grow》: https://www.bilibili.com/video/BV1Tg411K7KS/[7]
《协同》: https://book.douban.com/subject/34834429/[8]
Timely Dataflow: https://github.com/TimelyDataflow/timely-dataflow[9]
Apache Spark: https://github.com/apache/spark[10]
OceanBase: https://github.com/oceanbase/oceanbase[11]
MongoDB: https://github.com/mongodb/mongo[12]
The relationship between community and company: https://github.com/flossway/flossway/discussions/2[13]
CLA or DCO for an open-source software: https://github.com/flossway/flossway/discussions/4