近日,在 Quora(類(lèi)似知乎)網(wǎng)站上,有 Po 主提出了一個(gè)問(wèn)題:“要使操作系統(tǒng)獲得 Unix 認(rèn)證,需要做些什么?”答主 Terry Lambert 給出了非常精彩的回答,鑒于他的身份——前蘋(píng)果工程師,曾負(fù)責(zé) Mac OS X 內(nèi)核的大部分工作,該回答很快就獲得廣泛關(guān)注并獲得了上萬(wàn)贊。
這是一個(gè)引人入勝的故事。早年蘋(píng)果公司推出 Mac OS X 操作系統(tǒng)的時(shí)候,經(jīng)常利用“兼容操作系統(tǒng)的 UNIX 內(nèi)核”作為宣傳手段。比如,在其網(wǎng)站上,就專(zhuān)門(mén)有一頁(yè)介紹 Mac OS X 的 UNIX 的文章。
The Open Group(國(guó)際開(kāi)放標(biāo)準(zhǔn)組織)對(duì)此提出了訴訟,稱(chēng)其未經(jīng)授權(quán)便擅自使用 Unix 名稱(chēng)。一旦蘋(píng)果敗訴,就需要賠償 2 億美元。
不過(guò),蘋(píng)果公司堅(jiān)持自己可以自由使用 Unix 的名稱(chēng),認(rèn)為自己沒(méi)有進(jìn)行虛假宣傳。但為了應(yīng)付這場(chǎng)訴訟,據(jù) Lambert 回憶,當(dāng)時(shí)蘋(píng)果對(duì)于此事主要有兩個(gè)解決方案,要么以大約 10 億美元的代價(jià)收購(gòu)國(guó)際開(kāi)放標(biāo)準(zhǔn)組織,要么趕緊獲得 Unix 兼容認(rèn)證,從而化解這場(chǎng)訴訟。
史蒂夫·喬布斯將這個(gè)認(rèn)證的“秘密”任務(wù)交到了前蘋(píng)果技術(shù)負(fù)責(zé)人 Lambert 手上,需要針對(duì)現(xiàn)有的 Mac OS 源代碼運(yùn)行合規(guī)性測(cè)試,邊測(cè)試邊修改,完成時(shí)間只給了一年。這也意味著 Lambert 需要在短時(shí)間內(nèi)對(duì) Mac OS X 內(nèi)核的 1300 萬(wàn)行代碼了如指掌,技術(shù)難度非常大。
Lambert 被承諾在任務(wù)完成之后,團(tuán)隊(duì)將會(huì)獲得 2000 萬(wàn)美元的股權(quán),Lambert 個(gè)人將得到 1000 萬(wàn)美元。實(shí)際上,這種任務(wù)如果是針對(duì) Linux 的,那么需要一個(gè)二三十人的團(tuán)隊(duì)工作五年,但 Lambert 帶著一支五人團(tuán)隊(duì)在一年內(nèi)就完成了,期間還為數(shù)百個(gè)開(kāi)源項(xiàng)目貢獻(xiàn)了大約 200 萬(wàn)行的代碼。只不過(guò),Lambert 最終沒(méi)有得到這 1000 萬(wàn)美元的報(bào)酬,他的股權(quán)被其領(lǐng)導(dǎo)獨(dú)吞了。
有些人說(shuō)不存在 10x 程序員,但我認(rèn)為他們是沒(méi)有遇到像你這樣的 100x 程序員。雖然我們都知道最終 Mac OS X 已經(jīng)通過(guò) UNIX 認(rèn)證,不過(guò)這并不影響我們跟著 Lambert 的回憶去了解這段有趣過(guò)往的細(xì)節(jié)。
讓 Mac OS X 成為真正的 UNIX
按照 Lambert 的說(shuō)法,為了讓 Mac OS X 通過(guò) UNIX 認(rèn)證,這里面要做的工作可太多了。
讓 Mac OS X 成為真正的 UNIX?,這樣就可以化解這場(chǎng)訴訟了,這對(duì)在 Linux 日益普及的情況下逐漸失去市場(chǎng)的國(guó)際開(kāi)放標(biāo)準(zhǔn)組織來(lái)說(shuō)是件好事。以大約 10 億美元的代價(jià)收購(gòu)國(guó)際開(kāi)放標(biāo)準(zhǔn)組織,這樣蘋(píng)果公司就可以自由地使用該商標(biāo);但是,這并不能使他們免除與 Sun Microsystems、IBM 和其他公司的現(xiàn)有合同義務(wù),因?yàn)檫@些公司都已經(jīng)獲得了 UNIX 商標(biāo)的使用許可。當(dāng)時(shí)有人問(wèn) Lambert 是否可以帶領(lǐng)一支團(tuán)隊(duì)去做第一個(gè)選項(xiàng)的工作,他表示,同意的前提是,可以基于這個(gè)項(xiàng)目,指導(dǎo)整個(gè)組織的其他部分都在自己的代碼庫(kù)上進(jìn)行相應(yīng)的修改,并且可以對(duì)提交規(guī)則進(jìn)行相當(dāng)寬松的處理。
隨之,Lambert 獲得批準(zhǔn)并開(kāi)展認(rèn)證工作。他們首先針對(duì)現(xiàn)有的 Mac OS 源代碼運(yùn)行合規(guī)性測(cè)試套件,由于頭文件的緣故,測(cè)試套件立即顯示出錯(cuò)。
他和同事 Ed Moy 做了兩行更改,將類(lèi)型定義從 <stdio.h> 移到它應(yīng)該在的位置。在 <stdio.h> 中有一行更改,而另一行的更改是在該類(lèi)型實(shí)際上應(yīng)當(dāng)存在的文件中。
接著再次運(yùn)行測(cè)試,發(fā)現(xiàn)首次測(cè)試中的其中一個(gè)頭文件錯(cuò)誤消失了。因此,Lambert 等人做了一次“世界構(gòu)建”(world build),將 Mac OS X 中的一切,包括 iTunes 都進(jìn)行了重建。這一更改之下,有接近 150 個(gè)項(xiàng)目未能順利重建,iTunes 也在其中。
于是 Lambert 和 Ed 對(duì)這些項(xiàng)目進(jìn)行了認(rèn)真的研究,并修復(fù)了其中的每一個(gè)項(xiàng)目,以讓它們都能夠進(jìn)行構(gòu)建。他們接著又進(jìn)行了一次“世界構(gòu)建”,所有東西都建立起來(lái)了。
也正是在那個(gè)時(shí)候, Lambert 才有機(jī)會(huì)接觸到蘋(píng)果的所有源代碼。然后他們向項(xiàng)目提交了高優(yōu)先級(jí)的錯(cuò)誤修復(fù),但其中一些立即被降低了優(yōu)先級(jí),另一些只需要做簡(jiǎn)單修復(fù),因?yàn)樗麄儙椭峁┝搜a(bǔ)丁。接著工程副總裁 Bertrand Serlet 重新提升了那些被降級(jí)的項(xiàng)目的優(yōu)先級(jí)。然后,Lambert 他們提交了頭文件更改。
項(xiàng)目甚至“驚動(dòng)”喬布斯
事已至此,Lambert 他們?cè)谶@時(shí)候不得不重新評(píng)估一下整個(gè)項(xiàng)目的可行性??紤]到他為這個(gè)項(xiàng)目設(shè)定的先決條件,他和 Ed 都認(rèn)為,這在時(shí)間范圍內(nèi)是可以繼續(xù)下去的。
該項(xiàng)目還升級(jí)到喬布斯那里。Lambert 繼續(xù)獲得執(zhí)行批準(zhǔn),畢竟,這樣做能讓蘋(píng)果公司節(jié)約大量資金,而且還改進(jìn)了所有 Mac OS X 服務(wù)器的營(yíng)銷(xiāo)宣傳資料。
他們被承諾在完成之后將會(huì)獲得 2000 萬(wàn)美元的股權(quán)。Lambert 將得到 1000 萬(wàn)美元,Ed 和 Karen Crippes 將分別得到 500 萬(wàn)美元。
Lambert 表示,當(dāng)時(shí)他戴了很多“帽子”,不只是一個(gè)技術(shù)負(fù)責(zé)人,而且還是事實(shí)上的項(xiàng)目經(jīng)理。
這個(gè)過(guò)程也是肉眼可見(jiàn)地漫長(zhǎng)。Lambert 估算需要約一年的時(shí)間,這是一支由 5 個(gè)人組成的項(xiàng)目團(tuán)隊(duì):三名 mousekateers(并非拼寫(xiě)錯(cuò)誤),兩名承包人:是 Len Lattanzi,負(fù)責(zé)用戶(hù)空間的代碼;Jaime Delgadillo,負(fù)責(zé)全職的自動(dòng)化測(cè)試和 Bug 歸檔,并且盡量提供一些補(bǔ)丁。
項(xiàng)目組還有兩名臨時(shí)承包人,一名負(fù)責(zé)工具的合規(guī)性,另一名則負(fù)責(zé)手冊(cè)頁(yè)面。另外,他們還可以根據(jù)情況從蘋(píng)果的其他部門(mén)抽調(diào)員工進(jìn)行短期的工作。
漫長(zhǎng)的一年
第一個(gè)大喜進(jìn)展是,所有的頭文件都通過(guò)了測(cè)試,這樣測(cè)試套件中的其他測(cè)試就可以開(kāi)始運(yùn)行。在那個(gè)時(shí)候,Lambert 實(shí)際上已經(jīng)將所有的頭文件的修改提交給了 Mac OS X 的其他部分。當(dāng) Tiger(指 Mac OS X v10.4)版本發(fā)布時(shí),頭文件就已經(jīng)符合標(biāo)準(zhǔn)了。但是,這影響了 CodeWarrior(Mac 的 IDE)的正常運(yùn)行。Lambert 說(shuō)自己一直想要解決這一問(wèn)題,但一直沒(méi)有機(jī)會(huì),而且 CodeWarrior 或多或少都受到了影響。
對(duì)于蘋(píng)果公司的其他部門(mén)而言,Lambert 剛剛解決了“修復(fù)頭文件”的 Bug,它包含了許多其他針對(duì)單個(gè)頭文件的 Bug,這用了三個(gè)月左右的時(shí)間。
Lambert 曾承諾過(guò)一年的時(shí)間,那么他將怎樣實(shí)現(xiàn)這一年的預(yù)期呢?
Lambert 回憶道,“我知道,對(duì)頭文件進(jìn)行強(qiáng)制性的更改,以及與之相關(guān)的項(xiàng)目更改,將會(huì)成為項(xiàng)目中最大的單個(gè)部分。一旦我們能夠進(jìn)行其他的測(cè)試,那么在其他方面將會(huì)有大量的‘可輕松實(shí)現(xiàn)的目標(biāo)’等著我們?nèi)ソ鉀Q。這個(gè)過(guò)程用了兩個(gè)多月的時(shí)間,我們?cè)谔峤灰?guī)則時(shí)總是猶豫不決,但很快就完成了。Ed 在我的協(xié)助下完成了 libSystem 的大多數(shù)工作(libc + 其他系統(tǒng)庫(kù)),并把它們合并到一起,從命名空間中移除某些內(nèi)容;這也是為什么在 /usr/include/sys 中,頭文件以"_"開(kāi)頭?!?/p>
“在等待提交的過(guò)程中,你可以并行地做其他工作,我們就是這樣做的。在實(shí)現(xiàn)這些可輕松實(shí)現(xiàn)的目標(biāo)之后,還有許多工作要做,例如重寫(xiě)內(nèi)核中的信號(hào)系統(tǒng),但這并不是那么容易實(shí)現(xiàn)?!?/p>
不過(guò) Lambert 等人已經(jīng)把 Umesh(我不會(huì)告訴大家他的姓)給說(shuō)服了,“因?yàn)樗幌M覀內(nèi)ビ|碰他的 pthreads 代碼,不管怎么說(shuō),他還是想要在那里做出一些改動(dòng),有了這個(gè)項(xiàng)目作為反復(fù)推敲這些更改的手段,讓他感到非常高興?!焙髞?lái),他們還從 Mike Smith(Michael Smith,蘋(píng)果高級(jí)工程師)那里得到了“勉為其難”的支持,讓他重寫(xiě)文件鎖定代碼。
項(xiàng)目組最終還通過(guò)詢(xún)問(wèn)有關(guān)陷阱路徑的問(wèn)題以及圍繞信號(hào)系統(tǒng)堆棧幀保存的問(wèn)題“收買(mǎi)”了 Joe Sokol。不過(guò) Lambert 強(qiáng)調(diào),在這些人當(dāng)中,Umesh 對(duì)他們的 deadline 有著最大的幫助。
扣動(dòng)扳機(jī)
萬(wàn)事俱備,Lambert 正準(zhǔn)備“扣動(dòng)扳機(jī)”,意外隨之而來(lái)。
“他們引入了英特爾的代碼更改,讓我們?cè)俚壬蟽蓚€(gè)星期,但一切都亂了套。所以我花了三天的時(shí)間,將一致性分支上所有的補(bǔ)丁都重新整合到英特爾的內(nèi)核代碼中。到了那時(shí)候,我已經(jīng)對(duì) Mac OS X 內(nèi)核的 1300 萬(wàn)行代碼了如指掌?!?/p>
然后大家又回到了通過(guò)測(cè)試的狀態(tài)。后來(lái)有人告訴 Lambert,不能為 Tiger 做整合。但這樣會(huì)錯(cuò)過(guò)已設(shè)定好的 deadline。Tiger 的發(fā)布時(shí)間被再次延遲了 6 個(gè)月,一次又一次地延遲。這個(gè)問(wèn)題不在內(nèi)核,而是在英特爾。
Lambert 說(shuō),“我們本來(lái)可以輕松地在 Tiger 上發(fā)布,和我們自己設(shè)定的 deadline 保持一致?!钡绻o Linux 做相同的工作,可能要花五年的時(shí)間,而且還得需要二三十人。畢竟 Linux 發(fā)行版過(guò)多,產(chǎn)生了大量的陣營(yíng)。
Lambert 最后提到,團(tuán)隊(duì)為開(kāi)源社區(qū)做了很多貢獻(xiàn),“我們從開(kāi)源社區(qū)收獲了許多感謝,尤其是讓 bash 順利通過(guò)測(cè)試的修復(fù)。你絕對(duì)不會(huì)知道,作為這個(gè)項(xiàng)目的一部分,蘋(píng)果公司為開(kāi)源社區(qū)做出了多少貢獻(xiàn),至少對(duì)于非蘋(píng)果公司的人而言,這是一個(gè)秘密項(xiàng)目,因此我們并沒(méi)有將這一事實(shí)宣揚(yáng)出去。但是我估計(jì),當(dāng)年我們?yōu)閿?shù)百個(gè)開(kāi)源項(xiàng)目貢獻(xiàn)了大約 200 萬(wàn)行的代碼。雖然感激之情有很多,但這種感激并非歸于集體,因此,蘋(píng)果公司總是被人詬病為‘使用開(kāi)源代碼,但從不回饋’。但,我們修復(fù)了至少 15 個(gè) GCC 的 Bug。而你根本不知道。”
因此,整體來(lái)說(shuō)這是一項(xiàng)規(guī)模不小的工程,尤其是在為了獲得合規(guī)性的情況下。Lambert 感慨道,這真是一個(gè)漫長(zhǎng)的過(guò)程。
盡管如此,Lambert 在評(píng)論區(qū)透露,自己由于一些原因 ,最終并未獲得預(yù)期的 1000 萬(wàn)美元股權(quán)。
原文鏈接:
https://www.quora.com/What-goes-into-making-an-OS-to-be-Unix-compliant-certified