导入
软件正在慢条斯理地吞噬世界,开源正在慢条斯理地吞噬软件业。
软件正在吞噬世界?是的,对于购物、吃饭、健身、交停车费都需要使用软件的年代,对于平均每人每天都要花费 5 到 6 个小时使用手机软件的年代,有什么理由不相信软件正在吞噬整个世界呢。
开源正在吞噬软件业?是的,因为在软件越来越富裕的年代(也即软件不再稀缺),不开源的软件,最终是没法和开源软件竞争的。举个简单例子,如果有人要在很多个文件加密软件中选择一个使用,在功能和价格都差不多的情况下,选择开源的还是闭源的?当然要选择开源的,因为谁知道闭源的软件中,会不会有后门?
例子
开源的成功程度,或者说开源的渗透程度,从中国银行业的广泛采用就可以看出来,银行作为一个在 IT 方面相当谨慎和保守的行业,在 2012 年(一个大约的年限)之前对开源基本上不屑一顾,使用的基本上全是商业软件(这里是指专有软件),他们认为商业软件更专业、质量更高、更可信赖、更有保障,他们中不少人视开源软件为异类,对其功能、性能、安全性表示担忧,最重要的是,他们担心开源软件出问题后找不到 “原厂” 解决问题和 “承担责任”。
然而就在 2012 年以后,银行业逐渐增加了开源的使用比例,这里面有很多原因,最重要的一个原因是,在 Linux 面世 20 年后,很多开源软件已经成为比商业软件更好的存在,以至于咨询商、集成商、开发商们在为银行提供解决方案时,所拿出的最佳方案已经是基于开源的方案,银行(作为甲方)已经无力拒绝。比如,如今当一个银行要建设其自用的云平台时,在咨询和调研一大圈下来,他几乎一定会选择基于 OpenStack 的方案,如果想使用容器技术,就几乎一定会选择容器编排软件 kubernetes,这时,已经顾不上有没有 “原厂” 了(事实上还是有服务商兜底),因为没有太多更好的选择了。
银行虽然还在使用 Vmware、Oracle、Websphere、Weblogic,但是 KVM、Mysql、Apache、Nginx 的渗透已经越来越严重,多数银行的 Linux 主机数量早已超过了 Windows 服务器,因为 Linux 早已成为整个世界的主流的服务器操作系统,而且还有像 Redhat 这样的商业支持,为什么不使用呢。
如果有条件,你可以实地调查一下,各家银行的 IT 部门,在最近 5 年内,已经不得不正面开源这种 “新事物” 给他们带来的 “问题”,因为对开源的引入、使用和运维,显然和以往闭源软件有明显不同,他们开始写出开源软件使用管理办法,并指定专门处室来负责管理。
而那些有先见之明的企业(尤其是互联网企业),早已组建了开源办公室,早已把自己的整个系统建立在开源软件之上,并且早已在开源世界投入了大量的资金和人员,毫无疑问,他们也早已从开源中获得了巨大的收益。
开源取得成功的七大理念
- 完全自主
程序员想要开源的操作系统,想要开源的编辑器,还想要开源的编译器、开源的浏览器、开源的数据库、开源的 web server、开源的云环境、开源的虚拟机软件、开源的大数据工具、开源的人工智能软件。。。总之,如果一切都开源了,这就是程序员感觉最自由和最自主的环境,这就是程序员的理想。
如果很多人都有这样的需求,而又有人能把它实现,那这件事就必然会发生。
当程序员们想要开源操作系统的时候,Tanenbaum 带着 Minix 出现了,当人们希望它有更多的特性时,Linus 拿出了 Linux,当人们需要 web server 时,NCSA 拿出了 Apache,作者一开始开源自己的代码时,并没有想太多,可能仅仅就是想说:“兄弟们,看看我写的这个东西怎么样?你们试试用一下?有啥问题,或者有什么新想法,欢迎给我发邮件!”
在需求和供应的动力下,开源从底层的操作系统开始,充满了整个开发环境和中间件,一直到最上层应用,只要是人们想要的东西,黑客就会把它们实现,如果有一样东西还没有开源,那一定还不是黑客很想要的东西,或者是,他们认为这个东西没有必要开源(比如赖以赚钱和生存的东西,比如比较客户化的东西)。
所以,我们看到,操作系统 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. 高度开放
最开放的情况莫过于 “任何人能干任何事”(anyone can hack anything),也即没有任何事情可以阻止人们运行该产品,获取其源码、复制其源码、修改其源码,推进其向不同方向演进,并声称是该产品。
这可是太过开放了,以至于拿到他人源码后,“克隆” 或者 “山寨” 出一个产品将没有任何法律层面的压力,为什么开源会开放到如此地步?
一方面,在源码已经开放的前提下,你事实上很难阻止别人克隆、修改你的代码并换个名字发布。虽然程序员通常不会这么做,但他们不愿意有限制,在一个普遍宽松的环境下,如果你限制太多,程序员就不太会参与你的项目。
另一方面,这是一个鼓励充分竞争的世界,如果程序员们就项目的方向产生分歧,而又无法达成一致,异见者就可以分叉出来自立门户。比如,EGCS 分叉自 GCC,OpenSSH 脱胎于走向商业化前的 SSH,Veracrypt 派生自 Truecrypt,再如近年来比较著名的事件:一些人不认可 BTC 的方向,分叉出来 BCH,然后又有人不认可 BCH,分叉出来 BSV,虽然这个过程中有很多争吵,但没有人可以阻止这些。
3. 自发自治
所谓开源社区,指的是所有关心、参与、支持、帮助某个开源项目的人的集合。
社区里的人,是自发组织在一起的。“其中 90% 是用户,他们只是搭顺风车或是凑凑热闹,9% 的人积极参与、提交 bug、回答问题,这是‘贡献者’,1% 的人指导并控制项目的走向,委派任务和做决策,这是‘维护者’,或者简单的说,他们是领导者。”
1、领导者(Leader):比如 Linus Torvalds,作为内核的创始人,毫无疑问是该项目的最高领导者,在理论上,对 Linux 内核的任何事务都拥有最终话语权。在另外的一些项目中,可能有一个或多个人共同负责,如 Node.js 项目采用的是核心技术委员会机制(the Core Technical Committee)。
2、维护者(Maintainer):领导者会将一些决策和模块直接委托给维护者,维护者还可以将其中部分工作再委托给下一个层级的维护者。例如,Linus Torvalds 手下就有若干位内核的维护者,负责不同的模块。
3、提交者(Committer):有些开源项目会设置一组可以直接提交代码到主干的人,他们已经证明了自己可以胜任工作并且靠谱,而且不再需要提交维护者去进行审核。但提交者对代码没有最终的决定权,维护者或项目的领导者如果发现了什么,可以将提交的内容打回去。
4、贡献者(Developer 或 Contributor):贡献者可以做很多事,比如帮助解答用户的问题,贡献代码或文档,在邮件列表中参与讨论,也可以提交代码 committer。与前面的角色相比,贡献者对于代码的权力要小一些。
5、使用者(User):用户为项目提供了目标,并帮助项目持续进化,作为社区成员,他们最有价值的部分是提出需求、报告缺陷、提出建议。
- 自下而上
自下而上是大自然最普遍的法则,开源作为一个从草根社会发展起来的事物,必然会遵循这个法则。
在开源世界里,至少可以从技术、生态、成就三个层面来观察这一现象。
- 技术
纵观开源历史,那些非常富有创意的软件,一开始都是作者脑海中一个不太清晰、朦朦胧胧的想法,然后在作者能力和经验的基础上,通过代码一步步明晰起来的。开源项目在第一次露面时,大多数情况下只是初步可以运行,然后通过其富有创意的特性和前景,吸引更多的程序员关注和贡献。 - 生态
开源软件之间形成的关系,也是自下而上的,先有了语言、编译器、操作系统,然后在操作系统提供的各种功能的基础上(比如文件系统、内存系统、硬件驱动等),黑客做出了实用工具(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)”,虽然,这也许只是一种诙谐的表达。
- 自由竞争
开源,是一个靠实力说话的世界。
开源软件在竞争什么?竞争的是谁的软件好使,谁的评价更高,以及,最终,是谁获得了更多的市场份额。
软件在竞争,个人也在竞争。
个人竞争的法则很简单,如果你的贡献 —— 当然主要是指代码的贡献 —— 得到了同侪认可,你就会获得声誉和权力。
6. 赢在声誉
7. 社区赋能
开源?盈利?
开源怎么赢利?抛开开源的商业模式不提,我想,只要我们开源的代码真正创造了价值,有人用,那我和团队就是最大的赢家。如果 30 年后,还有人在用 TDengine, 哪怕只是其中一个模块,其中一个函数,那就是对我们两年多日夜奋战的最大肯定,就是给我这个程序员的最大回报。
如果你发现什么问题,我只会高兴,不睡觉都想尽快去解决它。如果喜欢,更欢迎参与到我们这个项目中来。五年之内,世界上 90% 以上的数据都将是物联网采集的数据,如果我们一起开发出一个极为高效的数据处理引擎来处理这些数据,而且为全球开发者所使用,你是贡献者之一,那是一个多么自豪的事情。”
关于开源
开源软件在追求 “自由” 的同时,不能牺牲程序员的利益,否则将会影响程序员的创造激情,因此世界上现在有 60 多种被开源促进组织(Open Source Initiative)认可的开源许可协议来保证开源工作者的权益。
开源协议规定了你在使用开源软件时的权利和责任,也就是规定了你可以做什么,不可以做什么。
开源协议虽然不一定具备法律效力,但是当涉及软件版权纠纷时,开源协议也是非常重要的证据之一。
对于准备编写一款开源软件的开发人员,也非常建议先了解一下当前最热门的开源许可协议,选择一个合适的开源许可协议来最大限度保护自己的软件权益。
常见开源协议
- GNU GPL(GNU General Public License,GNU 通用公共许可证)
只要软件中包含了遵循 GPL 协议的产品或代码,该软件就必须也遵循 GPL 许可协议,也就是必须开源免费,不能闭源收费,因此这个协议并不适合商用软件。
遵循 GPL 协议的开源软件数量极其庞大,包括 Linux 系统在内的大多数的开源软件都是基于这个协议的。
GPL 开源协议的主要特点:
- 复制自由:允许把软件复制到任何人的电脑中,并且不限制复制的数量。
- 传播自由:允许软件以各种形式进行传播。
- 收费传播:允许在各种媒介上出售该软件,但必须提前让买家知道这个软件是可以免费获得的;因此,一般来讲,开源软件都是通过为用户提供有偿服务的形式来盈利的。
- 修改自由:允许开发人员增加或删除软件的功能,但软件修改后必须依然基于 GPL 许可协议授权。
- BSD(Berkeley Software Distribution,伯克利软件发布版)协议
BSD 协议基本上允许用户 “为所欲为”,用户可以使用、修改和重新发布遵循该许可的软件,并且可以将软件作为商业软件发布和销售,前提是需要满足下面三个条件:
- 如果再发布的软件中包含源代码,则源代码必须继续遵循 BSD 许可协议。
- 如果再发布的软件中只有二进制程序,则需要在相关文档或版权文件中声明原始代码遵循了 BSD 协议。
- 不允许用原始软件的名字、作者名字或机构名称进行市场推广。
BSD 对商业比较友好,很多公司在选用开源产品的时候都首选 BSD 协议,因为可以完全控制这些第三方的代码,甚至在必要的时候可以修改或者二次开发。
3. Apache 许可证版本(Apache License Version)协议
Apache 和 BSD 类似,都适用于商业软件。Apache 协议在为开发人员提供版权及专利许可的同时,允许用户拥有修改代码及再发布的自由。
现在热门的 Hadoop、Apache HTTP Server、MongoDB 等项目都是基于该许可协议研发的,程序开发人员在开发遵循该协议的软件时,要严格遵守下面的四个条件:
- 该软件及其衍生品必须继续使用 Apache 许可协议。
- 如果修改了程序源代码,需要在文档中进行声明。
- 若软件是基于他人的源代码编写而成的,则需要保留原始代码的协议、商标、专利声明及其他原作者声明的内容信息。
- 如果再发布的软件中有声明文件,则需在此文件中标注 Apache 许可协议及其他许可协议。
- MIT(Massachusetts Institute of Technology)协议
目前限制最少的开源许可协议之一(比 BSD 和 Apache 的限制都少),只要程序的开发者在修改后的源代码中保留原作者的许可信息即可,因此普遍被商业软件所使用。
使用 MIT 协议的软件有 PuTTY、X Window System、Ruby on Rails、Lua 5.0 onwards、Mono 等。
5. GUN LGPL(GNU Lesser General Public License,GNU 宽通用公共许可证)
LGPL 是 GPL 的一个衍生版本,也被称为 GPL V2,该协议主要是为类库设计的开源协议。
LGPL 允许商业软件通过类库引用(link)的方式使用 LGPL 类库,而不需要开源商业软件的代码。这使得采用 LGPL 协议的开源代码可以被商业软件作为类库引用并发布和销售。
但是如果修改 LGPL 协议的代码或者衍生品,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用 LGPL 协议。因此 LGPL 协议的开源代码很适合作为第三方类库被商业软件引用,但不适合希望以 LGPL 协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。
如何选择开源协议
世界上的开源协议有上百种(有兴趣的读者请猛击这里了解),很少有人能彻底搞清它们之间的区别,即使在最流行的六种开源协议 ——GPL、BSD、MIT、Mozilla、Apache 和 LGPL—— 之中做选择,也很复杂。
乌克兰程序员 Paul Bagwell 画了一张分析图,说明应该怎么选择开源协议,大家看了一目了然,真是清爽。
开源等于免费吗
首先,开源软件和免费软件是两个概念:
开源软件是指公开源代码的软件。开源软件在发行的时候会附上软件的源代码,并授权允许用户更改、传播或者二次开发。
免费软件就是免费提供给用户使用的软件。但是在免费的同时,通常也会有一些限制,比如源代码不公开,用户不能随意修改、不能二次发布等。
- 免费软件的例子比比皆是,QQ、微信、迅雷、酷狗、360 等都是免费软件,你可以随意使用,尽情蹂躏;但是,如果你嫌弃它们复杂,自己删除了一些无用的功能,然后在网上发布了一个精简版本供大家下载,那么你就离法院的传票不远了。
- 开源软件是不抵触商业的,开源的目的也不是做慈善事业,而是通过更多人的参与,减少软件的缺陷,丰富软件的功能,同时也避免了少数人在软件里留一些不正当的后门。开源软件最终还会反哺商业,让商业公司为用户提供更好的产品。
Android 就是大众最熟知的一款开源操作系统,它除了用在手机上,还用在汽车、平板电脑、电视、智能手表等其它硬件平台,小米、华为、OPPO、三星等都是 Android 的受益者,他们都赚得盆满钵满。
很多著名的开源项目背后都有商业公司支撑,它们的开发者也都有正式的工作,享受和我们一样的社会福利;如果一个成功的开源项目背后没有商业公司,这反而是不健康的,社会需要开源和商业之间的互补来促进技术的革新。
不可忽视的安全隐患
就在刚刚过去的 2021 年,技术圈传出了一个爆炸性的新闻,Log4j 安全漏洞影响了上亿家公司,造成了无法计量的损失,使无数的程序员度过了一个难熬的不眠夜。
1 | Log4J 是一个应用非常广泛的Java库,就在前两天的2021年12月10日,Log4J的一个安全漏洞被公布了。那天正好是周五,很多程序员都在计划着怎么度过一个愉快的周末,不料这个安全漏洞的公开,使得全世界很多程序员不得不周末加班,有的甚至通宵达旦紧急应对。 |
正是因为开源技术 “开放” 和 “自由” 的特点,它也更容易成为居心叵测之人下手的目标。黑客们有机会对项目的源代码进行分析、修改,并使用各种方法来遮盖对开源项目做出的恶意更改。再加上代码审查的严格程度因项目而异, 如果没有严格的审查措施来检测这些恶意更改,它们很容易就会被忽视,直到它们扩散开来,被使用在众多公司的软件中。
与 Log4j 类似的情况比比皆是。EspoCRM,Pimcore,Akaunting 作为三个被数千家公司使用的开源软件,在企业的用户关系管理、客户数据管理、数字资产管理以及财会方面发挥着至关重要的作用。它们也曾被爆出致命漏洞,成功利用这些漏洞可以使绕过身份验证的攻击者执行任意 JavaScript 代码,控制底层操作系统并发起额外的恶意攻击,还可以通过特制的 HTTP 请求触发拒绝服务,甚至更改与用户账户关联的公司,且无需任何授权。
在 2014 年席卷整个互联网世界的 OpenSSL Heartbleed(心脏出血)漏洞,不仅让整个中国互联网为之一颤,而且导致全球超过三分之二的网站 “心脏出血”,使全球互联网大量私钥和其他加密信息处于暴露危险下,受影响严重的系统甚至可以从服务器中直接获取用户密码。这一起起的开源安全事故,无不在印证着开源技术的安全风险。
虽然开源技术确实很容易成为黑客们攻击的目标,但是我们还是可以通过一些手段,来中和使用开源技术带来的安全风险,把可能的损失降到最低。
- 测试和制度
首先,完善的测试和应急响应制度可以让企业更早的发现开源技术中的漏洞,更快的对其进行响应。 这主要分为三个部分:代码扫描和测试,建立一个明确的流程来解决和修复出现的漏洞、将解决安全问题的规则包含在公司策略中 bing。 - 开源技术安全需要行业共同努力
其实,目前包括 Linux,Apache 这样的顶级开源基金会都在呼吁大家重视开源技术的安全,并也付出了努力。包括资金的支持、开发安全工具、培训、研究和最佳实践。
除了全行业努力保护基于开源代码构建的软件免受威胁外,企业也要对其防御战略有一个积极的态度。包括积极的为他们所依赖的开源代码实施测试并将数据积极向上游反馈。企业也应该制定合理的内部政策和指南,来识别使用开源软件的风险。如此做可以让企业继续利用开源代码的优势,同时也能创建一个能够预防可能威胁的环境。