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