近日,在 Quora(类似知乎)网站上,有 Po 主提出了一个问题:“要使操作系统获得 UNIX 认证,需要做些什么?”答主 Terry Lambert 给出了非常精彩的回答,鉴于他的身份——前苹果工程师,曾负责 Mac OS X 内核的大部分工作,该回答很快就获得广泛关注并获得了上万赞。
这是一个引人入胜的故事。早年苹果公司推出 Mac OS X 操作系统的时候,经常利用“兼容操作系统的 UNIX 内核”作为宣传手段。比如,在其网站上,就专门有一页介绍 Mac OS X 的 UNIX 的文章。
The Open Group(国际开放标准组织)对此提出了诉讼,称其未经授权便擅自使用 Unix 名称。一旦苹果败诉,就需要赔偿 2 亿美元。
不过,苹果公司坚持自己可以自由使用 Unix 的名称,认为自己没有进行虚假宣传。但为了应付这场诉讼,据 Lambert 回忆,当时苹果对于此事主要有两个解决方案,要么以大约 10 亿美元的代价收购国际开放标准组织,要么赶紧获得 Unix 兼容认证,从而化解这场诉讼。
史蒂夫·乔布斯将这个认证的“秘密”任务交到了前苹果技术负责人 Lambert 手上,需要针对现有的 Mac OS 源代码运行合规性测试,边测试边修改,完成时间只给了一年。这也意味着 Lambert 需要在短时间内对 Mac OS X 内核的 1300 万行代码了如指掌,技术难度非常大。
Lambert 被承诺在任务完成之后,团队将会获得 2000 万美元的股权,Lambert 个人将得到 1000 万美元。实际上,这种任务如果是针对 Linux 的,那么需要一个二三十人的团队工作五年,但 Lambert 带着一支五人团队在一年内就完成了,期间还为数百个开源项目贡献了大约 200 万行的代码。只不过,Lambert 最终没有得到这 1000 万美元的报酬,他的股权被其领导独吞了。
有些人说不存在 10x 程序员,但我认为他们是没有遇到像你这样的 100x 程序员。虽然我们都知道最终 Mac OS X 已经通过 UNIX 认证,不过这并不影响我们跟着 Lambert 的回忆去了解这段有趣过往的细节。
让 Mac OS X 成为真正的 UNIX
按照 Lambert 的说法,为了让 Mac OS X 通过 UNIX 认证,这里面要做的工作可太多了。
让 Mac OS X 成为真正的 UNIX™,这样就可以化解这场诉讼了,这对在 Linux 日益普及的情况下逐渐失去市场的国际开放标准组织来说是件好事。
以大约 10 亿美元的代价收购国际开放标准组织,这样苹果公司就可以自由地使用该商标;但是,这并不能使他们免除与 Sun Microsystems、IBM 和其他公司的现有合同义务,因为这些公司都已经获得了 UNIX 商标的使用许可。当时有人问 Lambert 是否可以带领一支团队去做第一个选项的工作,他表示,同意的前提是,可以基于这个项目,指导整个组织的其他部分都在自己的代码库上进行相应的修改,并且可以对提交规则进行相当宽松的处理。
随之,Lambert 获得批准并开展认证工作。他们首先针对现有的 Mac OS 源代码运行合规性测试套件,由于头文件的缘故,测试套件立即显示出错。
他和同事 Ed Moy 做了两行更改,将类型定义从 <stdio.h> 移到它应该在的位置。在 <stdio.h> 中有一行更改,而另一行的更改是在该类型实际上应当存在的文件中。
接着再次运行测试,发现首次测试中的其中一个头文件错误消失了。因此,Lambert 等人做了一次“世界构建”(world build),将 Mac OS X 中的一切,包括 iTunes 都进行了重建。这一更改之下,有接近 150 个项目未能顺利重建,iTunes 也在其中。
于是 Lambert 和 Ed 对这些项目进行了认真的研究,并修复了其中的每一个项目,以让它们都能够进行构建。他们接着又进行了一次“世界构建”,所有东西都建立起来了。
也正是在那个时候, Lambert 才有机会接触到苹果的所有源代码。然后他们向项目提交了高优先级的错误修复,但其中一些立即被降低了优先级,另一些只需要做简单修复,因为他们帮助提供了补丁。接着工程副总裁 Bertrand Serlet 重新提升了那些被降级的项目的优先级。然后,Lambert 他们提交了头文件更改。
项目甚至“惊动”乔布斯
事已至此,Lambert 他们在这时候不得不重新评估一下整个项目的可行性。考虑到他为这个项目设定的先决条件,他和 Ed 都认为,这在时间范围内是可以继续下去的。
该项目还升级到乔布斯那里。Lambert 继续获得执行批准,毕竟,这样做能让苹果公司节约大量资金,而且还改进了所有 Mac OS X 服务器的营销宣传资料。
他们被承诺在完成之后将会获得 2000 万美元的股权。Lambert 将得到 1000 万美元,Ed 和 Karen Crippes 将分别得到 500 万美元。
Lambert 表示,当时他戴了很多“帽子”,不只是一个技术负责人,而且还是事实上的项目经理。
这个过程也是肉眼可见地漫长。Lambert 估算需要约一年的时间,这是一支由 5 个人组成的项目团队:三名 mousekateers(并非拼写错误),两名承包人:是 Len Lattanzi,负责用户空间的代码;Jaime Delgadillo,负责全职的自动化测试和 Bug 归档,并且尽量提供一些补丁。
项目组还有两名临时承包人,一名负责工具的合规性,另一名则负责手册页面。另外,他们还可以根据情况从苹果的其他部门抽调员工进行短期的工作。
漫长的一年
第一个大喜进展是,所有的头文件都通过了测试,这样测试套件中的其他测试就可以开始运行。在那个时候,Lambert 实际上已经将所有的头文件的修改提交给了 Mac OS X 的其他部分。当 Tiger(指 Mac OS X v10.4)版本发布时,头文件就已经符合标准了。但是,这影响了 CodeWarrior(Mac 的 IDE)的正常运行。Lambert 说自己一直想要解决这一问题,但一直没有机会,而且 CodeWarrior 或多或少都受到了影响。
对于苹果公司的其他部门而言,Lambert 刚刚解决了“修复头文件”的 Bug,它包含了许多其他针对单个头文件的 Bug,这用了三个月左右的时间。
Lambert 曾承诺过一年的时间,那么他将怎样实现这一年的预期呢?
Lambert 回忆道,“我知道,对头文件进行强制性的更改,以及与之相关的项目更改,将会成为项目中最大的单个部分。一旦我们能够进行其他的测试,那么在其他方面将会有大量的‘可轻松实现的目标’等着我们去解决。这个过程用了两个多月的时间,我们在提交规则时总是犹豫不决,但很快就完成了。Ed 在我的协助下完成了 libSystem 的大多数工作(libc + 其他系统库),并把它们合并到一起,从命名空间中移除某些内容;这也是为什么在 /usr/include/sys 中,头文件以"_"开头。”
“在等待提交的过程中,你可以并行地做其他工作,我们就是这样做的。在实现这些可轻松实现的目标之后,还有许多工作要做,例如重写内核中的信号系统,但这并不是那么容易实现。”
不过 Lambert 等人已经把 Umesh(我不会告诉大家他的姓)给说服了,“因为他不希望我们去触碰他的 pthreads 代码,不管怎么说,他还是想要在那里做出一些改动,有了这个项目作为反复推敲这些更改的手段,让他感到非常高兴。”后来,他们还从 Mike Smith(Michael Smith,苹果高级工程师)那里得到了“勉为其难”的支持,让他重写文件锁定代码。
项目组最终还通过询问有关陷阱路径的问题以及围绕信号系统堆栈帧保存的问题“收买”了 Joe Sokol。不过 Lambert 强调,在这些人当中,Umesh 对他们的 deadline 有着最大的帮助。
扣动扳机
万事俱备,Lambert 正准备“扣动扳机”,意外随之而来。
“他们引入了英特尔的代码更改,让我们再等上两个星期,但一切都乱了套。所以我花了三天的时间,将一致性分支上所有的补丁都重新整合到英特尔的内核代码中。到了那时候,我已经对 Mac OS X 内核的 1300 万行代码了如指掌。”
然后大家又回到了通过测试的状态。后来有人告诉 Lambert,不能为 Tiger 做整合。但这样会错过已设定好的 deadline。Tiger 的发布时间被再次延迟了 6 个月,一次又一次地延迟。这个问题不在内核,而是在英特尔。
Lambert 说,“我们本来可以轻松地在 Tiger 上发布,和我们自己设定的 deadline 保持一致。”但如果要他给 Linux 做相同的工作,可能要花五年的时间,而且还得需要二三十人。毕竟 Linux 发行版过多,产生了大量的阵营。
Lambert 最后提到,团队为开源社区做了很多贡献,“我们从开源社区收获了许多感谢,尤其是让 bash 顺利通过测试的修复。你绝对不会知道,作为这个项目的一部分,苹果公司为开源社区做出了多少贡献,至少对于非苹果公司的人而言,这是一个秘密项目,因此我们并没有将这一事实宣扬出去。但是我估计,当年我们为数百个开源项目贡献了大约 200 万行的代码。虽然感激之情有很多,但这种感激并非归于集体,因此,苹果公司总是被人诟病为‘使用开源代码,但从不回馈’。但,我们修复了至少 15 个 GCC 的 Bug。而你根本不知道。”
因此,整体来说这是一项规模不小的工程,尤其是在为了获得合规性的情况下。Lambert 感慨道,这真是一个漫长的过程。
尽管如此,Lambert 在评论区透露,自己由于一些原因 ,最终并未获得预期的 1000 万美元股权。
原文链接:https://www.quora.com/What-goes-into-making-an-OS-to-be-Unix-compliant-certified
编译:头条号 @InfoQ