现实中,很多人对开源这个词抱有各类想当然的理解。有人说开源就是免费,有人说开源代码谁都能改,有人说开源项目更安全,也有人说既然你开源了,我提了需求就一定会有人满足。这些说法流传很广,但它们离事情的本来面目差了很远。
Part I: 创世
要谈清楚开源,得先回到计算机还属于实验室小众爱好的年代。
那时候的编程社区如同早期的互联网精神一样,以互助和共享为底色。大家写代码、传代码、改代码,几乎没有谁把软件锁进柜子里当私有财产。但计算机进入商用领域之后,局面迅速改变。闭源软件成了主流,你买到的软件本质上是一份使用许可,而不是你真正控制了这份代码。
来自MIT人工智能实验室的理查德·斯托曼遭遇的打印机驱动事件是这种转变最直白的缩影。他在实验室里碰到卡纸问题——硬件上他能修,但需要修改驱动代码来适配环境。他向商业公司索要源码,得到的答复是不给。卡纸问题就此卡死。他当然可以等厂商更新,也可能永远等不到。他想做一件事,却被一纸许可挡住了去路。
斯托曼的反应是重新发明一套规则。他提出”自由软件”概念,这个”自由”不是价格上的零元购,而是用户拥有四项基本权利:任意运行软件,研究并修改源码,分发原版,分发你自己改过的版本。为了把这些权利在法律上锁死,他发明了GPL许可证——一种带有强传染性的版权设计:你只要用了GPL代码,你的衍生作品也必须以GPL方式开放。同时,他发起GNU计划,从零开始造一套完整的自由操作系统,配套的自由软件基金会和Emacs编辑器也在那个时期诞生。
GNU项目的进展一度势如破竹,gcc、gdb、bash、emacs 等各种工具软件把当时所有商业替代品打得节节败退。但走到最核心的操作系统内核时,他们卡住了。计划一再推迟,仿佛永远够不到终点。
Part II: 崛起
这时候林纳斯·托瓦兹带着Linux内核闯进了舞台。他的理念跟斯托曼不太一样。斯托曼把”自由”当作信仰,林纳斯更在意”开源”这件事本身——代码公开、协作开发、快速迭代。两拨人一个重精神纲领,一个重工程实践,但内核的空缺恰好和Linux形成了互补。GNU的工具链加上Linux的内核,拼成了GNU/Linux这个庞然大物。后面的故事众所周知:它成了服务器市场的绝对霸主,把微软的Windows Server逼得一退再退。
微软在这个过程中扮演了一个很戏剧化的角色。早期它们把Linux叫作”癌症”,在内部各种报告里把开源社区形容成知识产权毒瘤。后来呢?服务器市场失守,云服务掉头,Azure需要拉拢Linux用户,于是”微软爱Linux”的标语就挂出来了。这不是爱,这是打不过就加入。商业公司那一套务实逻辑从来不会跟钱过不去。
相似的剧本在编程语言战场上又演了一遍。微软当年推.NET Framework对抗Java,原本想靠闭源加锁死Windows的策略巩固自家生态,结果在服务器端被Java逐步蚕食。开源的Mono项目虽然实现了.NET跨平台,却长期笼罩在微软专利的阴影之下,自由软件基金会多次警告开发者面临诉讼风险。云计算时代到来之后,微软发现再闭源下去连云服务的门都进不去了。于是他们搞出了开源的.NET Core,甚至把Mono的母公司Xamarin直接收购了。一个当年用专利大棒恐吓开源社区的公司,最后亲自把开源对手买回家供了起来。
商业公司这套务实的转向并不只体现在战略投降上。他们也渐渐发现,把代码放出来不一定是坏事。有些项目放出去之后,社区能帮忙修bug、加功能,甚至衍生出新用法反向输送价值。Kubernetes从Google内部项目变成全球容器编排标准,靠的就是开源之后的社区共建。微软的VSCode开源之后,社区贡献的插件生态反过来巩固了它的统治力。Android开放给全世界的手机厂商,谁出力最多谁受益最大,而不是Google一家闷头造完再卖。这些例子说明,开源这件事在工程层面确实能带来真实的效率提升和生态扩张。
于是各种对商业更友好的许可证冒了出来。LGPL允许动态链接而不传染,BSD和MIT更是近乎”你随便用、随便改、闭源卖了也行”的态度。到今天,大量闭源软件的肚子里都塞满了开源组件:FFmpeg处理音视频,Skia渲染图形,SDL做跨平台游戏开发。你手机里装着的大多数商业软件,背后都养着少则几十多则上百个开源库。商业公司一边靠开源社区共建做大生态,一边把开源组件当成免费零件装进自家产品,这两件事同时发生着。
Part III: 转折点
但事情走到这一步,裂痕也随之浮出水面。商业公司可以尽情利用这些开源组件来构建产品、赚取利润,而维护这些组件的人——往往只是几个志愿者或者拿着微薄薪水的工程师——却在承受越来越沉重的负担。
Log4j事件把这种荒诞推到了极致。这是一个Java日志库,小到不值一提,但大到全球数以亿计的应用程序都在用。2021年底爆出的漏洞让整个互联网行业陷入了恐慌,安全团队连夜排查,公司管理层焦头烂额,各国政府发安全预警。而全世界都在等待的那几个人——Log4j的核心维护者——几乎是熬夜免费打补丁。他们不欠任何人,他们只是业余时间维护了一个大家离不开的东西。那一刻你发现,全球数字基础设施的地基,居然是由几个没有合同、没有保险、没有工资的人在一铲子一铲子地撑着。
这种荒诞反过来又给了一些公司钻空子的机会。近些年,开源这个词在营销端的价值被重新定义了。有的公司从庞大的代码库里拆出一小撮边角料开源,然后举着”我们是开源公司”的旗号到处宣传,试图消解用户对商业公司的天然警惕,把自己打扮成社区友好的模样。还有的套路是开源一套框架,看起来随便用,但框架的每一处设计都暗暗朝着自家商业服务的方向牵引,开发者和用户只要入了这个坑,后面想迁移出去的代价高得吓人。
这两种行为的共同点是:开源只是个标签,贴在门口招揽顾客,店里卖的还是原来那套东西。
Part IV: 大火收汁
谈到这里,我想说的很简单。对于做软件的人,不要为了开源而开源。你应该想清楚开源对你、对你的项目、对你的用户到底意味着什么,而不是看见别人挂了个标签也跟着挂。对于使用开源软件的人,你要明白一件事:开源项目是一群人在共建,而不是一群人在向你供货。如果你有需求并且这个需求没有被满足,你应该自己动手——动手写代码也好,动手写文档也好,动手资助维护者也好,动手发起一个有理有据的议题也好——总之是主动参与进去,而不是坐在那里等着别人来伺候你。
这两句话可以合并成一句更直白的:
我爱开源就开源,有需求你自己做。