<< 返回文章列表

关于开源的7大理念 (上)

2019年8月14日
wei-sir
763


软件正在慢条斯理地吞噬世界,开源正在慢条斯理地吞噬软件业。
软件正在吞噬世界?是的,对于购物、吃饭、健身、交停车费都需要使用软件的年代,对于平均每人每天都要花费5到6个小时使用手机软件的年代,有什么理由不相信软件正在吞噬整个世界呢。

开源正在吞噬软件业?是的,因为在软件越来越富裕的年代(也即软件不再稀缺),不开源的软件,最终是没法和开源软件竞争的。举个简单例子,如果有人要在很多个文件加密软件中选择一个使用,在功能和价格都差不多的情况下,选择开源的还是闭源的?当然要选择开源的,因为谁知道闭源的软件中,会不会有后门?


前言


开源的成功程度,或者说开源的渗透程度,从中国银行业的广泛采用就可以看出来,银行作为一个在IT方面相当谨慎和保守的行业,在2012年(一个大约的年限)之前对开源基本上不屑一顾,使用的基本上全是商业软件(这里是指专有软件),他们认为商业软件更专业、质量更高、更可信赖、更有保障,他们中不少人视开源软件为异类,对其功能、性能、安全性表示担忧,最重要的是,他们担心开源软件出问题后找不到“原厂”解决问题和“承担责任”。

然而就在2012年以后,银行业逐渐增加了开源的使用比例,这里面有很多原因,最重要的一个原因是,在Linux面世20年后,很多开源软件已经成为比商业软件更好的存在,以至于咨询商、集成商、开发商们在为银行提供解决方案时,所拿出的最佳方案已经是基于开源的方案,银行(作为甲方)已经无力拒绝。比如,如今当一个银行要建设其自用的云平台时,在咨询和调研一大圈下来,他几乎一定会选择基于openstack的方案,如果想使用容器技术,就几乎一定会选择容器编排软件kubernetes,这时,已经顾不上有没有“原厂”了(事实上还是有服务商兜底),因为没有太多更好的选择了。

银行虽然还在使用Vmware、Oracle、Websphere、Weblogic,但是KVM、Mysql、Apache、nginx的渗透已经越来越严重,多数银行的Linux主机数量早已超过了Windows服务器,因为Linux早已成为整个世界的主流的服务器操作系统,而且还有像Redhat这样的商业支持,为什么不使用呢。

如果有条件,你可以实地调查一下,各家银行的IT部门,在最近5年内,已经不得不正面开源这种“新事物”给他们带来的“问题”,因为对开源的引入、使用和运维,显然和以往闭源软件有明显不同,他们开始写出开源软件使用管理办法,并指定专门处室来负责管理。

而那些有先见之明的企业(尤其是互联网企业),早已组建了开源办公室,早已把自己的整个系统建立在开源软件之上,并且早已在开源世界投入了大量的资金和人员,毫无疑问,他们也早已从开源中获得了巨大的收益。

那么,开源到底依靠什么,让自己大获成功?

本文分析了开源的7大理念,有助于读者更好理解开源的本质要素,这些理念为“完全自主”、“高度开放”、“自发自治”、“自下而上”、“自由竞争”、“赢在声誉”、“社区赋能”。

注:在读这篇文章的时候,你会发现,这些理念事实上是交织在一起的,很多事例同时命中多个理念。因为开源本身就是一件事,我只是从不同侧面对其进行了描绘。

注:本文所称的“黑客”采用的是黑客(hacker)的原始含义,也即黑客是热衷于计算机软硬件的技术高手,而不是媒体上所说的计算机犯罪分子。在一定程度上,本文不再区分“黑客”、“程序员”这两个概念,你可以认为他们是一回事,也可以把黑客看作是技术高超的程序员,总之,黑客是一个正面概念。另外,本文也不再区分“企业”和“公司”,不再区分“开源项目”和“开源软件”,而认为它们是一回事。

1、完全自主

开源之所以能够大行其道,是因为所有程序员都喜欢源码。

这就是开源的原生动力。

黑客希望自己有完全自主和完全可控的世界,这和其他人没有两样,但黑客有可能在计算机软件领域实现这一点。

没有源代码就无法掌控世界吗?是的,如果一个操作系统是闭源的,黑客在使用操作系统时遇到bug而无法修改,遇到需求而不被采纳,试图研究而无从下手,遇到垄断、高价、霸王条款而无可奈何,哪里还谈得上掌控世界。

再如,黑客写程序,他希望有一个自己能够控制或者是能让自己放心的编辑器,不仅仅需要这个编辑器足够好用,而且最好不会有后续的麻烦,比如不会有license的麻烦,不会有厂商停止服务的麻烦。黑客希望这个编辑器能尽在掌握之中,遇到bug,自己或者有人能将其修复,一些想要的功能,自己或者有人能将其实现,而且最好是,自己怎么折腾这个软件,也不会陷入法律方面的麻烦。

也就是说,黑客喜欢在一个无拘无束的、自由自在的环境下,干自己喜欢做的事,这是多么美妙!

黑客想要开源的操作系统,想要开源的编辑器,还想要开源的编译器、开源的浏览器、开源的数据库、开源的web server、开源的云环境、开源的虚拟机软件、开源的大数据工具、开源的人工智能软件。。。总之,如果一切都开源了,这就是黑客感觉最自由和最自主的环境,这就是黑客的理想。

如果很多人都有这样的需求,而又有人能把它实现,那这件事就必然会发生。

人类社会是很有意思的,一些人的需求,会成为另一些人的动力,当程序员们渴望源码的时候,自然就会有黑客奉上自己精心打造的源码,不管他们是否意识到,在所有的需求满足背后,都暗藏着丰厚的回报。

当黑客们想要开源操作系统的时候,Tanenbaum带着MINIX出现了,当人们希望它有更多的特性时,Linus拿出了Linux,当人们需要web server时,NCSA拿出了Apache,作者一开始开源自己的代码时,并没有想太多,可能仅仅就是想说:“兄弟们,看看我写的这个东西怎么样?你们试试用一下?有啥问题,或者有什么新想法,欢迎给我发邮件!”

时至今日,在企业越来越多主导开源的年代里,这种原始的动机仍然存在,前段时间开源的TDengine,其主要作者陶建辉在文章(1)中写道:

“要是有程序员仔细研究我们源码,看我们是怎么做到的,我会特别的开心。要是有程序员能把我这套方法借鉴过去,把他现在臃肿的系统大幅裁剪,把性能大幅提升,那我更会心花怒放。昨天有人在微信群里告诉我,说RPC模块写的高效简洁,准备采纳,真让我有点得意忘形。”

“两年多的时间,近二十万行代码,放在了GitHub上。好多朋友关切的问我,开源怎么赢利?抛开开源的商业模式不提,我想,只要我们开源的代码真正创造了价值,有人用,那我和团队就是最大的赢家。如果30年后,还有人在用TDengine,哪怕只是其中一个模块,其中一个函数,那就是对我们两年多日夜奋战的最大肯定,就是给我这个程序员的最大回报。”

“如果你发现什么问题,我只会高兴,不睡觉都想尽快去解决它。如果喜欢,更欢迎参与到我们这个项目中来。五年之内,世界上90%以上的数据都将是物联网采集的数据,如果我们一起开发出一个极为高效的数据处理引擎来处理这些数据,而且为全球开发者所使用,你是贡献者之一,那是一个多么自豪的事情。”

就这样,在需求和供应的动力下,开源从底层的操作系统开始,充满了整个开发环境和中间件,一直到最上层应用,只要是人们想要的东西,黑客就会把它们实现,如果有一样东西还没有开源,那一定还不是黑客很想要的东西,或者是,他们认为这个东西没有必要开源(比如赖以赚钱和生存的东西,比如比较客户化的东西)。

所以,我们看到,操作系统Linux、Android;编辑器Vim、Emacs、Atom、Brackets、VS code,版本管理系统SVN、Git;数据库MySQL、MongoDB、Redis、Postgres;大数据平台Hadoop、Elasticsearch、Hbase、Spark;Web服务器Apache、Nginx、Node.js、Tomcat;DevOps工具Jenkins、Maven、Ansible、Chef;虚拟化软件KVM、Xen、Docker、Kubernetes,如雨后春笋般应运而生,这些列出的和没有列出的开源软件,形成了一个完整的软件生态环境,黑客们已经生活在一个很幸福的时代,他几乎是想要什么就有什么,而几乎在所有的IT企业和大型非IT企业里,你都能看到这些开源软件的身影。

看到这里,你可能会有所明白,开源,其实是程序员送给程序员的礼物。

因为真正需要源码的人,是程序员,真正能写出源码的人,也是程序员。

2、高度开放

对软件而言,源码都开放了,还有什么不能开放?

这要看情况,软件开放到什么程度,完全取决于其许可证(license)。(关于许可证的基本知识,建议看一下阮一峰的文章《开源许可证基础知识扫盲》(2)

最开放的情况莫过于“任何人能干任何事”(anyone can hack anything),也即没有任何事情可以阻止人们运行该产品,获取其源码、复制其源码、修改其源码,推进其向不同方向演进,并声称是该产品。

这可是太过开放了,以至于拿到他人源码后,“克隆”或者“山寨”出一个产品将没有任何法律层面的压力,为什么开源会开放到如此地步?

一方面,在源码已经开放的前提下,你事实上很难阻止别人克隆、修改你的代码并换个名字发布。虽然程序员通常不会这么做,但他们不愿意有限制,在一个普遍宽松的环境下,如果你限制太多,程序员就不太会参与你的项目。

另一方面,这是一个鼓励充分竞争的世界,如果黑客们就项目的方向产生分歧,而又无法达成一致,异见者就可以分叉出来自立门户。比如,EGCS分叉自GCC,OpenSSH脱胎于走向商业化前的SSH,Veracrypt派生自Truecrypt,再如近年来比较著名的事件:一些人不认可BTC的方向,分叉出来BCH,然后又有人不认可BCH,分叉出来BSV,虽然这个过程中有很多争吵,但没有人可以阻止这些。

为了更好地理解开源所给予用户的高度开放,下面我们看看自由软件是如何定义它所赋予用户的自由(3):(虽然开源软件和自由软件并不是一回事,但只有很少的开源软件不是自由软件,而几乎所有自由软件都是开源软件(4) ,所以这里我们不去纠结自由软件和开源软件的种种区别,而是统一思考为FOSS(Free and Open Source Software),并去理解其背后的初衷。)

如果一个软件是自由软件,那么它必须为用户提供以下四项基本自由:

自由度0:用户可以按照自己的意愿,自由地运行该软件,而不论出自何种目的。

自由度1:用户可以自由地学习该软件,可以按照自己的意愿修改该软件,所以,用户首先要能得到源码。

自由度2:用户可以自由地分发该软件的拷贝,这样就可以帮助他人。

自由度3:用户可以自由地分发该软件修改后的拷贝,借此,用户可以将其修改分享给整个社区,令他人也从中受益。

“自由软件”不等于“非商业软件”。一个自由软件必须允许商业用户、商业开发和商业发布。商业开发自由软件早就司空见惯了,这样的自由软件非常重要。你可能需要花钱购买自由软件,也可能免费拿到。但是无论你如何获得你的拷贝,作为用户,你的四大自由都会被保证,你可以自由地运行、修改、发布,甚至出售自由软件。

你(即,软件用户)可以把软件原版或修改版再发布给其他用户。你可以免费发布,也可以收取费用(注:市场经济下,别人免费发布,你收费发布,你要考虑提供如何好处才能让人买单)。软件可以发布给任何地方的任何人。所谓“自由”,意味着你的这些行为不必事先征得任何人的许可,也不必为此额外支付任何费用。

从以上对自由度的定义可以看出,FOSS的初心是让人们能够更好地学习他人代码、复用他人代码,完善他人代码、并可以将软件分发给需要的人,从而尽可能让更多的人从软件和源码中受益。

但开源的这种自由开放精神,会不会受到国家的限制?比如受到美国出口管理条例(Export Administration Regulation, EAR)的管制?这个问题曾经成为今年(2019年5月)的关注焦点,参考有关专家解读(5),这里汇总解释如下。

依EAR,美国人、美国公司将软件出口至美国境外,或在美国境内提供给外国人作为出口的预备行为,必须申请取得许可。

但符合“公开可获取(Publicly available)”定义的软件,不在 EAR 管制范围(EAR 734.7 (a)),也就是说,多数开源软件,出口上不需要申请许可。

但 EAR 734.7 (b) 同时说明,公开可获取软件虽不需许可,但若涉及加解密技术,仍然必须申请许可,除非是这个加解密技术本身也是公开可获取的,那就可以采用EAR 742.15(b) 款提供源代码或揭露源代码来源的方式,来登录备查。

Apache基金会(ASF)在2019年5月22日通过官博发表声明(6),称:

经美国商务部工业和安全局(BIS)重新分类(于2016年9月20日生效),开源公开可获取的加密软件源代码,因已是“公开可获取”和“已发布”,不再受 EAR 约束。

涉及加密软件源代码的开源项目,仍然需要向 BIS 和 NSA 发送项目 URL 的通知(notice),以满足 EAR 742.15(b) 中的“公开可获取”通知要求。

 ASF 继续与 Apache 项目及其社区合作,以确保他们的通知是最新的,并在未来得到维护。

所以,开源软件是否会被美国出口管制,这个问题基本上不用多虑,源码已经在你的手里,许可证又给予了你如此高度的自由,你还担心什么呢,你最需要担心的问题可能只是:能否读懂源码?

3、自发自治

所谓开源社区,指的是所有关心、参与、支持、帮助某个开源项目的人的集合。

社区里的人,是自发组织在一起的。“其中90%是用户,他们只是搭顺风车或是凑凑热闹,9%的人积极参与、提交bug、回答问题,这是‘贡献者’,1% 的人指导并控制项目的走向,委派任务和做决策,这是‘维护者’,或者简单的说,他们是领导者。” (7)

Eric Raymond在著名的《大教堂与集市》(8)一文中说:“谁能想到,几千名散布在全球各地的程序员,利用业余时间,仅仅通过Internet,就鬼斧神工般地造就一个世界级的操作系统?”

他接着说:“多年以来。。。我相信大多数重要软件(操作系统和真正大型工具如Emacs编辑器)需要像建造大教堂那样,在与世隔绝的环境下,由天才式专家或几个行家里手精心打造,。。。而Linus Torvalds委托所有能委托的事、开放到几乎混乱的程度,这实在令人惊讶不已,在Linux社区,没有建筑大教堂那样的安静和虔诚,倒更像是一个乱糟糟的大集市,充满了各种不同的计划和方法。”

Eric提出的问题是,一个大的项目里,大家平时连面都见不上,那么,如何把社区里的人们组织起来,尤其是把编写代码的黑客们组织起来?一个“乱糟糟的大集市”,真的能搭建起一个宏大而精妙的软件吗?书中并没有给出明确答案。

在一个传统的软件公司里,“组织”并不是问题:确定立项,设立项目组,明确角色和分工,明确需求、目标和计划,给程序员们分配任务,想方设法调动他们的积极性,分配资源、保障进度,检查质量。在一个理性的公司里面,有大把的流程和制度在做这些事情,即便在开发中采取了敏捷方法,也是在命令体系下按照既定方法开展的。

但是,在一个完全基于兴趣而结合的开源社区里(这里先不考虑公司雇佣人全职做开源的情况),你所面对的都是自由人,你只能通过他(她)的自愿来获取合作,如果他(她)愿意,他(她)就可以贡献代码,不愿意,完全可以不写任何代码(使用就好了),如果他(她)有能力,他(她)的代码就可以被采纳,如果能力不足,他(她)的代码大约就不会采纳。

这完全基于个人的意愿和能力,一个开源项目的领导者,他所需要组织的,就是发现有能力的志愿者,并予以相应的代码提交权力。

在一个大型的社区,通常会有以下几种不同的角色9:

1、领导者(Leader):比如 Linus Torvalds,作为内核的创始人,毫无疑问是该项目的最高领导者,在理论上,对Linux内核的任何事务都拥有最终话语权。在另外的一些项目中,可能有一个或多个人共同负责,如 Node.js 项目采用的是核心技术委员会机制(the Core Technical Committee)。

2、维护者(Maintainer):领导者会将一些决策和模块直接委托给维护者,维护者还可以将其中部分工作再委托给下一个层级的维护者。例如,Linus Torvalds 手下就有若干位内核的维护者,负责不同的模块。

3、提交者(committer):有些开源项目会设置一组可以直接提交代码到主干的人,他们已经证明了自己可以胜任工作并且靠谱,而且不再需要提交维护者去进行审核。但提交者对代码没有最终的决定权,维护者或项目的领导者如果发现了什么,可以将提交的内容打回去。

4、贡献者(Developer或Contributor):贡献者可以做很多事,比如帮助解答用户的问题,贡献代码或文档,在邮件列表中参与讨论,也可以提交代码committer。与前面的角色相比,贡献者对于代码的权力要小一些。

5、使用者(User):用户为项目提供了目标,并帮助项目持续进化,作为社区成员,他们最有价值的部分是提出需求、报告缺陷、提出建议。

虽然Eric用“集市”一词来描述开源模式,但社区里的程序员可绝不是乌合之众,黑客可绝不会让自己的代码失控,代码永远要清晰、干净、简洁、优美。只有能做到这些的程序员才可以被赋予维护代码的权限,所以,这是一个典型的能力带来权力的社会,或者说的更直白一些,这是一个精英引领的社会。

那么,集市模式和大教堂模式有相通之处?

是的,这二者并不是截然对立的。

Linux内核在第一次发布之前,必然凝结着Linus的精心设计(大教堂模式),虽然它是自下而上写出来的,虽然它只是一个大学生的暑期作品,虽然它只有大约10000 行代码(Linux 0.01 版本)。

然后,Linux走向了开源并吸引了大量程序员参与,开发进入了集市模式。如今,参与Linux内核开发的已经有100多家企业和接近4000名开发人员,内核源文件达到5.3万个、源代码达到2100万行,Linux每天会新增1万行代码,删除5000行代码,修改1800行代码,Linux每一小时就会发生8次变化10。在外人看来,这的确像是一个乱糟糟的集市,但这并不代表项目失控。

Linus对接十余名核心维护者,每个人都有自己负责的具体领域和项目内容(例如网络、无线、USB驱动、ext2或vfat文件系统都有相应的最高负责人),每次有新的开发任务时,Linus会将它分配给对应的人,而这十余位核心贡献者又有各自的熟知并信赖的高手小团队。

Linus不会也不可能亲自审核每个设计和变更,而是按照这样层级化的结构(大教堂模式?),最终由数百名维护人员负责代码审查和整合。在Linus看来,一切都在有条不紊的控制之中(为了更好控制代码,Linus还专门开发了代码管理工具git)。

这很像是一大群能工巧匠(包括一些建筑公司的团队),不管出自何种利益考虑,为了一个共同的目标,从世界各地自发参加一个大教堂群的设计和建设,Linux内核就是这样一个大教堂群,每个子系统都是一个大教堂,每个大教堂都有着负责设计和建造的领导人,其下有有着数百名建造高手,他们在共识和规则之下,使用着像git、gcc、邮件列表这样的设计、建造和协同工具,利用集体的力量(他们会讨论,也会投票),把这些美轮美奂的大教堂建造出来。Linus作为最高领导人,不会强制他们,更不会发薪水,一切都是这些高手自发自愿自带干粮,不管是个人还是公司。

集市模式和大教堂模式的本质区别只是在于:前者是自发的,也是自治的。

4、自下而上

自下而上是大自然最普遍的法则,开源作为一个从草根社会发展起来的事物,必然会遵循这个法则。

在开源世界里,至少可以从技术、生态、成就三个层面来观察这一现象。

从技术上看,纵观开源历史,那些非常富有创意的软件,一开始都是作者脑海中一个不太清晰、朦朦胧胧的想法,然后在作者能力和经验的基础上,通过代码一步步明晰起来的,中间经过了若干次大大小小的架构调整,经历过两三次重写,然后才终于成型。开源项目在第一次露面时,大多数情况下只是初步可以运行,然后通过其富有创意的特性和前景,吸引更多的程序员关注和贡献。

一开始,Linus只是在Minix上编写一个阅读学校网络上Usenet新闻组的终端仿真器,他把自己之前写的用于测试任务切换能力的两个进程加以修改,一个进程从键盘读入信息并发给调制解调器,另一个进程从调制解调器读取数据,然后发送到屏幕上;为了实现这些功能,他又写下了键盘和显示器的驱动程序;为了从学校网络下载文件,他写出了磁盘驱动程序,然后又在Minix文件系统的基础上写了一个自己的新的文件系统;也就是说,他使用Minix作为脚手架,逐步构建了自己的Linux。芬兰学校的暑假有点长,1991年的暑假更是从5月中旬放到了10月中旬,Linus完全将时间投入到了编程之中,一周7天,一天10个小时,全都在写代码。1991年9月,Linux的0.01版就这么一点一点地做出来了11。

从生态上看,开源软件之间形成的关系,也是自下而上的,先有了语言、编译器、操作系统,然后在操作系统提供的各种功能的基础上(比如文件系统、内存系统、硬件驱动等),黑客做出了实用工具(binutils),做出外壳(Shell),做出了代码管理工具、集成开发环境,做出了数据库、Webserver、浏览器,做出了虚拟机,做出了javascript,做出了包管理工具,做出各种应用开发框架和组件,做出了大数据、云技术,做出了各种面向最终用户的应用。黑客总是先做出底层的东西,然后才做出上层的东西,而且总是先有实践,才有了理论,总是先有代码,才有了设计模式、架构体系、软件工程这些东西。

从成就上看,绝大多数黑客,一开始都是小打小闹,从简陋的程序开始起家,并没有什么宏大的想法,Linus一开始也只是自己玩玩看(《Just For Fun》),并没有想着要怎么改变世界,说自己“如果当时真的知道从头建立一个操作系统的难度,肯定是不会有勇气去做的”12。而到了1999年,Linus在"The Linux Edge"一文中提到:“Linux现在有数百万用户、数千名开发者和正在增长的市场,Linux被用在嵌入式系统中,用在机器人系统中,用在航天飞机上,我想说我知道这些都会发生,这些都是统领世界计划的一部分(that it's all part of the plan for world domination.)”,虽然,这也许只是一种诙谐的表达。

扎克伯格一开始做的仅仅是一个让学生们可以在一堆照片中选择最佳外貌的程序(Facemash),他做这个也只是因为好玩,后来才开始做了一个用于哈佛大学学生交流的网站:Facebook,随着Facebook的壮大,在收购WhatsApp、Instagram之后,扎克伯格的成就和抱负也逐渐升级,2017年2月,扎克伯格在一篇宣言中称“过去10年中,Facebook一直专注于帮用户连接家人和朋友。下一步我们要成为新的社会基础设施,保证社群安全、提升每个人在社会事务中的参与度并提高社会的包容性。”,2019年6月,Facebook提出Libra计划,要“重新创造货币,重塑全球经济,让世界各地的人们过上更美好的生活”。谁能想象,一个程序员,居然就这样自下而上,做出如此的成就。

顺便提一下,开源软件进入财富500强的方式,并不是Eric所倡导的自顶而下方式(《黑客的反击》一文),开源并不是因为CEO和CTO的倡导和命令而进入企业,开源仍然以其一贯的方式,以其不慌不忙的态度,以其不可抵挡的实力,自下而上地推入了财富500强。