2016年,Linux内核社区迎来了它的25周年纪念。很多人好奇,这个项目为何能如此长寿且持续繁荣?说实话,每次被问及这个问题,我都不禁莞尔一笑,然后半开玩笑地说:我真不觉得已经过去了25年——毕竟,这一路走来,分歧与挑战从未间断。但认真说来,内核能够跨越四分之一个世纪,并且仍在不断进化,最根本的底气在于社区具备一种罕见的反思与自我纠错能力。
大约16年前,绝大多数内核开发者彼此素未谋面,完全依赖邮件沟通。为了让协作更顺畅,Ted T'so提议举办一次“内核峰会”。如今,内核开发者每年都会聚会,不仅探讨技术,更重要的是进行复盘:过去一年,哪些决策正确,哪些又走了弯路。大家坦诚交流,讨论如何优化沟通方式与工作流程,并随之改进——比如Git工具的诞生,就是这种反思精神的直接产物。简而言之,开发模式变了,合作方式也随之进化。
言归正传。尽管我们至今尚未完全洞悉Linux内核成功的所有奥秘,但以下九条经验,确实值得深入探讨。
发布节奏至关重要,是项目稳健发展的核心。回顾Linux早期,一个主版本往往要酝酿数年才能发布。这对用户和经销商来说无疑是种煎熬:新功能遥遥无期,等待令人焦灼。更糟糕的是,长周期意味着最终必须一次性集成海量代码——压力巨大、风险极高、调试难度陡增。后来调整为短发布周期,局面立刻改观:新代码能够更快落地,每次集成都基于相对稳定的基线,即使是根本性的改动,也能在不引发大规模连锁反应的前提下完成。开发人员也心中有数:这次赶不上?没关系,两个月后还有机会。因此,大家反而不再急躁,不会为了赶窗口而强行塞入有问题的代码。
从单点到网络:分布式分层模型是破解之道。很久以前,所有变更请求都直接涌向Linus Torvalds本人。很快,事实证明此路不通——没有人能凭一己之力完全掌控一个操作系统内核级别的复杂项目。于是,很早的时候,内核不同领域的维护者就提出方案:将内核拆分成若干模块,由最熟悉该领域的人专门负责。例如,网络部分由网络专家管理,无线协议归无线专家,PCI或USB等驱动程序子系统各有其维护者,ext2、vfat等文件系统也各有“守护者”。后来,这一体系进一步扩展,成百上千名维护者负责代码审查与合入。结果是,每个发布版本都能包含成千上万的变更,而产品质量始终未受影响。
工具重塑协作——从BitKeeper到Git的深刻启示。内核开发一直致力于吸引更多开发者参与,但真正带来质变的,是引入BitKeeper这套源代码管理系统。它几乎一夜之间改变了社区的开发习惯。而Git的出现,更是带来了一次飞跃。没有合适的工具,像内核这样的庞然大物根本无法正常运转,迟早会被自身的复杂性压垮。
共识机制:不是谁说了算,而是谁说得对。通常,如果一位核心开发者拒绝了某次提交的变更,那么这个变更就不会被合并。你可能会觉得,自己几个月前提交的代码,突然在邮件列表中被否决,确实令人沮丧。但保护机制的另一面是保障:内核开发必须在不同用户群体和应用场景之间保持平衡。不会有哪个用户社区为了自身利益而牺牲其他群体的需求。最终结果是我们拥有一套能够同时支持从微型嵌入式系统到超级计算机的代码库——其适用场景之广泛,远超想象。
一个无法推翻的承诺:不回归原则。大约十年前,内核开发社区做出了一个硬性承诺:如果一个内核版本能在某个特定环境中正常运行,那么后续所有内核版本也必须在同样的环境中正常运行。一旦发现某个变更导致原有功能出错,团队会立即做出反应,快速解决。这条规则给用户吃下了一颗定心丸:系统升级不会破坏现有的工作环境。因此,维护者非常乐意在延续旧内核稳定性的基础上,再去开发新功能。
公司可以贡献,但不能占山为王。自2014年12月发布版本号3.18的内核以来,有将近500家公司、约5062名个人开发者参与了内核贡献。其中绝大多数开发者是带薪工作的,他们编写的代码变更自然服务于所在公司的具体需求。但关键是,没有任何一家公司能主导内核的开发方向,做出损害他人或限制内核功能的事情。你可以为自己的硬件优化、业务需求而改动内核,但你不能绑架整个社区。
没有禁区:任何人都可以改动任何地方的代码。内核开发者确实需要专注于自己擅长的领域,但只要是合理的修改,任何人都可以对内核的任意部分下手。这意味着,问题在产生的当下就能被直面解决,而不是回避或拖延。开发者对整个内核拥有多种视角和见解,即使是最固执的维护者,也不能无限期地压下某个子系统里必要的改进。
大事从小事起:10万行代码的史诗。最初的0.01版内核,满打满算只有1万行代码。可现在呢?每两天新增的代码量就超过1万行。很多今天看来基础、微小、不起眼的功能,当年就是这样一点一滴累积起来的——没人知道哪一块会在日后长成关键子系统。
25年下来,内核开发证明了什么?一句话:持续合作能够创造出共享的资源,而这种资源,是任何单一小组都无法独立打造出来的。自2005年以来,有来自1300多家公司的约14000名个人开发者,源源不断向内核贡献代码。也正因如此,Linux内核才能在众多相互之间存在激烈竞争关系的公司共同努力下,长成一株参天大树,成为一个真正意义上规模庞大的公共资源。这大概就是它成功的终极答案——开放、协作、且永不停止进化。
