作者 | Terry Lambert
译者 | Sambodhi、燕珊
策划 | Tina
“Mac OS X 内核一共 1300 万行代码,SVN 显示我写了其中 7%。”
近日,在 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,负责全职测试自动化和错误归档,还尽可能地提供了一些补丁。
项目组还有两个临时承包人,一个负责工具的合规性,另一个负责手册页面。另外,他们还可以根据情况从苹果的其他部门拉来一些人做短期工作。
漫长的一年
第一个大喜进展是,所有的头文件都通过了测试,这样测试套件中的其他测试就可以开始运行。在那个时候,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 在发布之前又推迟了六个月,一次又一次地推迟。这是英特尔的问题,而非内核的问题。
Lambert 说,“我们本来可以轻松地在 Tiger 上发布,和我们自己设定的 deadline 保持一致。”但如果要他给 Linux 做相同的工作,可能要花五年的时间,而且还得有二三十人。毕竟 Linux 发行版过多,产生了大量的阵营。
Lambert 最后提到,团队为开源社区做了很多贡献,“我们从开源社区收获了许多感谢,尤其是让 bash 顺利通过测试的修复。你绝对不会知道,作为这个项目的一部分,苹果公司为开源社区做出了多大的贡献,至少对于非苹果公司的人而言,这是一个秘密项目,因此我们并没有宣传这一事实。但是我估计,当年我们为数百个开源项目贡献了大约 200 万行的代码。虽然感激之情很多,但这种感激并非归于集体,因此,苹果公司依然一直被指责‘使用开源代码,但从不回馈’。但,我们修复了至少 15 个 GCC 的 Bug。而你根本不知道。”
因此,整体来说这是一项规模不小的工程,尤其是为了获得合规性。“在 Karen 所做的一切工作之前,有关于自我认证、合同、基于 OSF/1 Mach 的现有例外获得测试例外,等等。”Lambert 感慨,这的确是一个漫长的过程。
尽管如此,Lambert 在评论区透露,自己由于一些原因最终并未获得预期中的 1000 万美元股份。
参考链接:
https://www.quora.com/What-goes-into-making-an-OS-to-be-Unix-compliant-certified