【CSDN引言】一个好的开源项目,才能成长为一个全球性的开源项目,肯定有它的奇特魅力所在。Linux内核守护者吴峰光博士非常为《新程序员001:开发者的黄金六年》撰文,生动细致地分享了他早年为LinuxKernel递交I/O预读取算法补丁的经历,过程颇为坎坷有趣,从中可以一窥Linux成为全球最大开源项目的关键。
作者|吴峰光责编|张红月
出品|《新程序员》编辑部
Linux内核开发者社区普遍被觉得是一个高手云集、充满挑战的社区,除了是这个社区对于代码质量的高度挑剔,也由于网路上盛传这一项目的发起人——LinusTorvalds,是一个性子不太好的“独裁者”:每一次他在电邮列表里发怒“骂人”,就会成为不大不小的新闻风波linux内核 中国,让每一位好奇Linux项目的开发者们交头接耳。
LinusTorvalds,图片来始于2022年开源年会活动
这些饱含骄傲的黑客们,到处传诵着他那句“Talkischeap,showmethecode”,昂然挺胸地穿行在各个社区之间。
与此同时,尽管开源社区早已发展了那么多年,但要说是否有另外一个开源项目达到了Linux这样的成就,其答案至今依然是否定的,Linux仍是软件领域最为成功的开源项目,没有之一。
1991年的那种夏季,当时就读于圣彼得堡学院的LinusTorvalds21岁,在Usenet上发布了那篇知名的贴子,开启了他的奇妙人生,也改变了更多年青人的未来。1999年,在Linux诞生的8年后,还在中科大手动化系读大三的我第一次接触到Linux,成为一名Linux用户。6年后,读到博士的我向Linux内核社区递交了人生中第一个内核补丁。原本,只是为了完成自己的论文,本着实用化的看法,将补丁递交给社区。但是,这个对I/O预读取算法进行改进的补丁却是一块超出我预估的硬骨头。从一开始丢入社区中无人问津,到经受挑战,再到反复更改,差不多每位月都递交一两次迭代版本,历经将近三年的时间,在迭代了十多个版本以后总算被社区接受。
不打不相恋,结业后,我即将走上了Linux内核开发这条职业公路。
吴峰光,博士结业于中国科学技术学院手动化系。先后工作于Intel与华为。开源贡献包括:2007LinuxKernelI/O预读算法、2010LinuxKernel回写算法、2013LKP(LinuxKernelPerformance)内核性能测试、2018Memory-optimizer冷热显存测量与透明迁移解决方案、2020Compass-CI开源软件全栈测试平台、2021openEuler开源操作系统技术委员会成员等。
初见Linux内核
我第一次近距离接触Linux比较有意思,是有人拿着一张Linux光碟来让我帮忙安装。我沿着安装程序的一步步英语提示的指引,竟然成功了,但是重启后就抓瞎了,不晓得该如何用。
然后,我的朋友弓岱伟就充当了我的Linux导师,他在Linux控制台里噼里噼啪打命令,满屏幕的英语输入输出让人目不暇接——真真Linux大玩家!我很喜欢搬一个板凳默默坐在他一旁,跟随他在这个新世界里漫步。
我是辛运的:这可能是最为轻松而有趣的一种Linux入门形式了!对于不玩游戏的我来说,GNU/Linux系统就是我的“游戏世界”:探求、挑战,新鲜感、成就感。通常游戏的引人之处,Linux亦可带来相像的满足感。更让人激动的是,身边有志同道合的人一起交流学习,将来能够对接实验室、学校、社会的需求。这符合人的本性,如同是小孩子热衷于追着大一点的儿子求带着玩一样,跟志同道合的人一起玩Linux,比独乐乐有意思太多。
自此,我与Windows下的OWL/MFC拜拜了。以后很自然地,我也以类似的方法影响了身边的有缘人。这是属于程序员的美丽新世界——Shell/Vim等命令行工具一旦把握,就效率飞起;GNU/Linux开放源代码,工具链齐全,对开发者的可玩性太高了;UNIX系统小而美工具集的组合设计理念,经受了历史考验,一旦学会终生受用。
那时侯我们跑Slackware,两个教室之间拉一根网线,外网互联,尝试各类服务。后来我们在瀚海星云BBS找到了LUG组织,就玩得更嗨,还在校园里玩Debian安装峰会。进实验室后,我们搭起了PXE网路启动服务,校园网各处的笔记本,可以免安装启动步入KNOPPIX等Linux系统。我们独家优化的FTP服务器,百倍提速,开启了全校的文件分享盛会。
在又一次机缘巧合之下,我开始触碰LinuxKernel代码。
2005年读博期间,我在实验室做的流媒体服务器项目,遭到了并发能力不足的问题。随着排查的深入,我闯进了内核I/O领域:原先是其中的I/O预读取(readahead)算法代码没有按预期测量出的次序读,造成大量低效的小I/O。
我尝试自己更改内核代码后,问题被修补,疗效令人激奋!好东西要分享呀!于是我屁颠屁颠地去给Linux社区递交补丁。
本文节选自《新程序员001:开发者的黄金六年》
几经磨难的填坑之路
那时我早已十分认可开源的理念:自由使用、分发,更改、回馈。当Linux用户碰到了问题,能够以Bugreport或Bugfix的方法,回馈上游社区,因而产生一个越用越好的正向循环。所以,搭了多年免费班车的我,如今亲历一个坑,责任感油但是生:是时侯帮忙填坑了!(只不过当时的我还没有意识到这是个多么庞大的坑!)
要填坑,第一件要做的事情是啥?是转变角度:不能仅仅以服务自己单位项目为目标,草草搬个木板,让项目之车能快速通过就了事——那叫Hack,其实上不了台面。须要正儿八经地研究I/O预读取周边代码,研究过去的电邮讨论,认清楚它的设计目标、思路、来龙去脉,还有十分重要的:各类场景下的行为表现。这意味着大量测试和假定/验证迭代,在此基础上产生新的方案(Linux社区主要在Mailinglist展开公开讨论,这就为我这些潜水爱好者提供了极好的观摩学习机会)。
但是当时的我还不懂太多道理,只知其二,不知其一。小心怀激动与惶恐,敲下短信发送命令以后,首先面对的第一重考验就是:沉默。
电邮如泥牛入海,没有收到任何反馈。
我想没关系,没有收到反馈一定是由于代码还不够好,咱继续测试和改进代码。就这样,V2、V3、……补丁集越发越庞大。在默默发了几个版本以后,总算,来自AndrewMorton的一份电邮打破了静谧:
(备注:AndrewMorton是内核社区-mmtree的maintainer,主管质量的二号人物。他短信大意是:这个补丁可真大!并且预读这个事情本身就超级复杂。我已然找了两位兄弟RamPao和StevePratt帮忙一起审查和测试了,然而这要花时间。)
从这儿可以看出,Linux社区最稀缺的资源是两个:代码审查(Review)和测试(Testing)。我也是那种时侯才晓得,社区鼓励死党而美的补丁——抛出一大坨令人望而生畏的补丁集,很容易劝退查看者(起码会让人形成“等我有大块空闲时间了再来消化”的看法)。
新人发补丁最害怕哪些?有人挑战、挑毛病?或则更糟,无人理会?而更深层次的问题,是面对一个新社区,发懵没底,没觉得,没品味。解决办法,一是潜水学习,二是涉足其中。新人发补丁的最佳策略,是从小修补开始:“这儿有个缺陷,这个小补丁可以修补”linux内核 中国,接出来社区的交互就会比较顺,不容易遭受重大磨难。
在这一点上,我恐怕错事了。
但我又非常辛运,由于不久以后,AndrewMorton开始即将审查我的补丁。自此,我与他结下了不解之缘,可以说他正是我在LinuxKernel的领路人。
我渐渐学会了从社区视角来看问题:LinusTorvalds及其维护者(Maintainer)团队,她们须要哪些样的补丁?不欢迎哪些样的补丁?
“我们公司/项目须要xxx,所以写了这个配套补丁希望合入Linux。”这是一种以公司为中心的视角。抱歉,在社区看来,上述描述是一种政治不正确。
Linux现今的主要贡献都来自各家公司的雇员,这可能是世界上最广泛的一个跨公司合作开源项目。这么,Linux社区怎样协调和引导这么诸多的公司完成协作,防止冲突?这是个不小的挑战,尤其是其中有不少互为竞争对手的公司,在一些热点问题上可能希望竞争主导权、话语权,以及有利于自身的实现。
对此,LinusTorvalds作为“独裁者”的作用就彰显下来了:大家都乐意投人来做xxx,挺好!选择做哪些,是大家的自由。并且!最终如何做,我的地盘我做主,要遵照社区的原则来做。
最大的原则就是:所有开发者/贡献者,摘掉大家所属公司的围巾,戴上“独立贡献者”的围巾,根据技术原本的最佳实践,去做设计与实现。你们都以“独立贡献者”的角度参与审查。
换言之,公司从商业竞争力角度,选择“做正确的事”;社区从技术通用性角度,确保“把事情做正确”。这就是开源社区与商业公司的基本合作共识。不仅提倡你们做“独立贡献者”,Linux社区还有“看门人”的逻辑。Linux社区人来人往linux deepin,每晚补丁与话题无数,像是个热闹的市集;开放的电邮列表,谁都可以订阅,观摩;谁都可以冲进来,发布一个补丁,或则对一个补丁发表自己的见解。在这纷纷纭纭之中,对补丁贡献的质量控制,必须极为严格。
在Linux社区,质量控制的核心在于“代码合入”(GitMerge)这一动作,这是属于“看门人”的惟一权利。合入是一个重要的门槛和分水岭。在合入之前,守门人有是否接受、何时合入的决断权,以及在此基础上衍生的关于补丁实现原则/方案的建议权。此时守门人的权威一面,想必给贡献者们留下了深刻印象。而且在合入以后,强势的守门人,随后化身为命苦的维护者,这是由于开源社区有一个基本假定:在开源市集里,贡献者们进进出出,随时可能飞走,不再响应。这意味着合入代码所降低的系统复杂性,其常年维护责任,要由社区与维护者来兜底。
“Linux有xxx问题,影响了xxx用户/场景。这个补丁疗效好,副作用小,通用,是常年演化方向。”这,才是打更人喜闻乐见的补丁。
I/O预读取补丁集前后发了十几个版本,AndrewMorton十分认真地给了一百多份审查电邮,就连LinusTorvalds也回复了十来封短信,甚至还跃跃欲试,亲手奉上了一个一百多行代码的补丁。
当时我信心满满,以为功能逐渐建立,很快会被合入主线。
但是,经历了一年多的开发迭代,到第16个版本发出后,我收到了Andrew的一份电邮,大意是:
我把你的补丁集除去了,由于它太复杂了!
那一刻就像阴天霹雳!我整个人都傻了。回过味来,我总算刻骨铭心地感受到了KISS原则的重要性。这然而真正的刻骨铭心!
从一开始,Linux就是简单的。当初Linus第一次发布Linux的时侯,并不健全,而且简单能用。及早发布,这是Linux取得成功的一个重要诱因。时至今日,尽管Linux日趋庞大和建立,但对于任何一个功能项,这一原则一直适用,并被守门人坚持。
于是,我决定抛开原先的代码,重新写一份大大简化了的方案,包括功能与算法,这又花了我几个月的时间。在AndrewMorton的审查下linux下载,这种代码又经过了几轮改进。总算,到了2007年的7月19日,那三天我收到了很壮丽的几十封短信,那是AndrewMorton把补丁集发给Linus,之后从-mmtree里移除消息!
这种补丁集总算被合并了!这可真是兴奋人心的时刻!步入开源世界交互,如同是打开一扇房门。整个过程中,先后有140多位来自世界各地、各种背景的人帮忙审查、测试,在自己的网站上试用并反馈疗效;还有人在网上发贴子、晒贴自己的性能数据、图表;有人约请我在刊物刊物写文章,去技术会议讲,甚至出书……如此广泛和全方位的协作,有效支撑了代码的改进。
这样的支持力度,在一家虽然很大的公司里,可能也仅限于重点项目。并且在Linux社区,这样的事情就是日常协作!基于开源协作,任何一个模块都能吸收全世界的能量,而且是自由选择,让最适宜的人做最适宜的事,让最利益相关的个人与组织做最对口的测试和反馈,进而达到《大修道院与市集》里描述的:市集实质上拥有了压倒性的资源优势,产生对大修道院开发模式的碾压。
这大约就是Linux才能发展为全世界最大的开源项目的生命力源泉吧!
Sai对本文亦有贡献。
本文节选自《新程序员001:开发者黄金六年》,该书非常企划十万亿开发者新生态、家家都是技术公司、人人都是开发者三大版块,为所有开发者带来有技术、有深度、有质量的高品质内容。