作者 | OneFlow 社群
根據計算機領域的摩爾定律,如果在 18 個月內都還沒有釋出產品,幾乎意味著專案要流產了。Windows NT 作業系統的最初計劃也是 18 個月,但現在,他們已經整整研發三年了。
好在,這個大製作已經進入測試和 Bug 修復階段,只差臨門一腳。還有不到兩個月,他們將最終交付這個計算機系統領域具有劃時代意義的作業系統核心。“記住這美好的舊日時光吧”,大衛·卡特勒(David Cutler)希望工程師們再鼓一把勁。
如果這是美好時光,Windows NT 的締造者們會覺得有點不幸。
經歷一次次延期釋出,所有人身心俱疲,單調和乏味充斥著日常工作,而卡特勒這個暴躁工頭還在催趕工期,如果有工程師在家扎小人詛咒卡特勒,也不會讓人感到意外。畢竟,在這個 1993 年的 6 月,為了解壓和洩憤,他們就隨手完成了一次集體性反動惡作劇。
一天,辦公室上方掉下了一條百葉窗的繩子,落在了走廊上形成了一個圓環。不久這個環出現了一些硬幣,隨後又有人放入了一支玫瑰花,一些賭博用的籌碼,奇怪的是,沒有人清理掉這些東西。
很快,圓環裡多了一個裝糖果的盒子,還加入了一張卡特勒的滑稽大頭照。兩根蠟燭也隨後出現在圓環外面,儘管沒有點燃,但氣氛似乎恰到好處,給卡特勒照片營造了一種詭異的肅穆感。
沒錯,那是獻給卡特勒的祭壇。根據《觀止:微軟建立 NT 和未來的奪命狂奔》一書的描述,這些東西好幾周都沒有人移動,直到一天,卡特勒停下來問身邊的同事那些鬼東西像什麼,知道真相的他憤怒地走開了,也許是假裝憤怒。
大多數工程師跟著他過著一維的生活,工作就是他們的全部。對下屬,他更多展現的是粗魯、嚴厲、蠻橫、好鬥、無情的暴君形象,甚至在招聘女秘書時會問怎麼看 F 打頭的那個詞。然而,很少有人會質疑他對待工作的態度,專注、嚴謹、激情十足、不拘一格,具有天生領導力,而且有女性工程師看出他有時暴怒的背後只是虛張聲勢。
這些混雜的印象讓很多人對他產生了一種微妙的情感,怨恨中帶有絲絲仰慕,用當代比較時髦的詞來形容,有些人說不準就會討伐這個中年男是在“PUA”了。
有些牛人就是這樣,厲害到能讓別人忍受他身上的種種缺陷,更不用說卡特勒這種被譽為 engineer‘s engineer(“公雞中的戰鬥雞”)式的人物。
戈登·貝爾和比爾·蓋茨是他職業生涯中最重要的兩個伯樂。大學畢業後的卡特勒先在杜邦公司自學程式設計,而後入職 DEC,1970 年代後期在時任 DEC 副總裁的貝爾支援下,開創性地開發了 VMS 作業系統,
貝爾稱他是世界上最好的作業系統編寫者。
1988 年,在蓋茨的招募下,他來到微軟,歷時 5 年花費 1。5 億美元,領導 200 多位工程師開發出有 430 萬行程式碼的 Windows NT。其技術革命性嚴重衝擊了 Novell 的 Netware 和 UNIX 作業系統的地位,為微軟帶來不可估量的商業價值,影響著超過 20 億人的計算體驗。也因此,他成為迄今為止唯一一位享有微軟 Senior Technical Fellow 頭銜的工程師,待遇比肩集團 VP。微軟前 CEO 鮑爾默更是直言,
沒有他,就沒有今天的微軟。
不過,相比對這個世界產生的影響,他在外界的知名度卻不如同級別的 Linus Torvalds,Jeff Dean 那樣響亮。但他對此毫不在意,只專注於高質量地完成工作,奉行行勝於言。他會強勢向你展示一種讓可能性變成現實的決心:
我就是喜歡做這件事,我就要做成這件事。
Windows NT 就是卡特勒決心要實現的那件事。
“雙非”工程師的逆襲
不同於大多數有著顯赫經歷的牛人,卡特勒既非計算機科班出身,也非名校畢業生。在奧利韋特學院(Olivet College)上大學時,他拿的是數學學士,對電腦一竅不通,畢業也並不想從事程式設計這種“似乎非常缺乏創造力且枯燥的工作”。
後來,他進入杜邦公司從事材料測試,但工作任務無可避免地需要程式設計來建模,卡特勒只好去 IBM 開辦的學校去學習程式設計,並將他寫的程式碼執行在 DEC 的小型機上,假以時日,竟然不小心成了 DEC 計算機專家。
這段經歷讓他在 1971 年順利進入 DEC 公司編寫軟體。在那裡,他為 DEC 的 PDP-11 計算機構建實時作業系統 RSX-11M 時發揮了關鍵作用,透過結合總體概念和設計原則,利用匯編語言在非常有限的記憶體空間內實現了多項系統功能,比如樹型檔案系統、交換應用程式、實時排程和一整套開發工具等。過硬的技術和積極工作贏得了讚譽,儘管他的暴脾氣沒給任何人留下好印象。
還好有貴人識才。有 DEC 技術靈魂之稱的貝爾發現卡特勒是個一流工程師,還讓他主導為新的產品線 Vax 編寫 VMS 作業系統,這個系統需要滿足向後相容已有應用,同時要能在不同配置的 Vax 計算機上執行。巨大壓力之下,他花兩年時間完成了這一任務,35 歲的卡特勒一戰成名。
(左為戈登·貝爾,右為大衛·卡特勒)
當打之年的卡特勒有著遠大抱負。但 DEC 日益增長的官僚氣息讓他無法忍受,並威脅要離開公司,貝爾挽留了他。1985 年,DEC 給他約 200 人的軟硬體工程師來設計一個全新的計算機系列 Prism,其作業系統叫 Mica。
起初,這個團隊幾乎像一個獨立的公司那樣運作。可好景不長,期間貝爾離開後沒人罩著,DEC 其他部門對卡特勒團隊的業務下手了。
1988 年 6 月,DEC 總部告訴他專案完全取消。心灰意冷的卡特勒準備離開。幾年過後,當一個類 Mica 的作業系統問世之際,DEC 管理層會為當初放掉這員猛將而付出“代價”。
彼時,計算機產業正處在激情澎湃的技術革新期,新的軟硬體創業公司層出不窮,如 OneFlow 此前寫過的思維機器和 Multiflow 公司。
正如日中天的卻是微軟,DOS 系統的成功讓蓋茨邁向美國首富,但他卻嗅到了面臨的危機。微軟的現金牛 DOS 可能面臨潛在威脅:一是 RISC 晶片的出現可能取代英特爾晶片,DOS 卻與英特爾的晶片高度繫結;二是許多公司開始銷售裝有 UNIX 的電腦。要應對這一難題,他想要微軟開發一個可移植的作業系統執行在任一 RISC 晶片上,成為個人計算的通行標準,這個新系統叫 Windows New Technology,也就是 Windows NT。
卡特勒要離開 DEC 的訊息傳到了蓋茨那裡,相約見面後,這個看起來很自負的工程師從上到下噴了一頓微軟的產品,但後者認定,他將是領導新作業系統團隊的最佳領導人選。大把股票、自主選擇研發團隊和開發新作業系統的機會,以及蓋茨表現出的誠懇態度最終將卡特勒這個狂人收入麾下,入職後還順便招募了不少他在 DEC 時的死忠。
躊躇滿志卻狀況百出
初來乍到,卡特勒團隊與“微軟人”一度互相看不上,他把團隊搞成了前 DEC 工程師的小圈子。
為了讓新人融入微軟體系,蓋茨將足智多謀的骨幹工程師 Steve Wood 派到了這個團隊。Wood 曾接手被微軟最大的客戶 IBM 大力支援的 OS/2 系統,這是個 16 位作業系統,只能在英特爾硬體上執行且不可移植。他對卡特勒沒有盲目崇拜,但發現與其他團隊成員倒是“臭味相投”。
經過幾個月的持續招募,在 1989 年 4 月,一個較為完整的 NT 團隊就緒,帶著失意、憤懣的復仇情緒,卡特勒準備大幹一場。
NT 作業系統的目標既具挑戰性又雄心勃勃:
1
可移植且可用於多個目標(MIPS、Alpha、PowerPc、x64)
2
可以在多個作業系統(POSIX (UNIX)、OS/2 和 Windows 32)上執行
3
安全性和 C2 認證(受信任的計算機認證)
4
在具有多個處理器的系統上執行,並且能同時執行多個程式,這在當時 PC 市場上獨有
高可靠性的要求使得卡特勒將 NT 分成了兩個部分:一個是核心,不與程式發生關聯,不會被它執行失敗時所影響,另一個是作業系統的圖形化部分。這個模式的最大問題是會犧牲系統執行的效率。蓋茨也表達了質疑,但卡特勒堅稱,他們會以高超的程式設計技巧彌補效能不足。
根據日程表,他們打算在 1990 年 7 月寫完 NT 的所有程式碼,並在 1991 年 3 月 30 日交出最終版本。很快,那些預料之中和始料未及的挑戰會讓他一次次食言。
首先是技術上的難題。一方面,支援和測試 NT 系統的機器還沒製造出來,在英特爾的 i860 晶片上執行 NT 的程式碼,效果太差,而切換到卡特勒看好的 MIPS 晶片要走很多回頭路,後來他們切換到英特爾的 386 系列晶片,但還是必須忍受硬體的毛病。另一方面,缺乏程式設計工具拖慢了系統研發的進展,打造工具也分散了團隊的部分力量。
其次是團隊磨合不暢。卡特勒只想專注小團隊去開發 NT 核心,不想負責管理與之相關的圖形、網路、測試小組。他們各自工作風格不一,卡特勒甚至把測試小組當做累贅,他從不依靠測試小組,認為測試工程師只會讓程式看起來更糟糕。這種偏見源自他的個人程式設計風格,在寫程式碼前,他會先在頭腦裡形成程式碼圖,然後高精確度地寫下極少有 Bug 的程式碼,每一行程式碼都有註釋。
同時,他還要很不情願地根據專案經理帶來的客戶意見來修改程式碼和功能。
1990 年春天,圖形視覺化部分也遭遇嚴重困境,尤其採用 C++ 語言使得程式容量超過計算機記憶體,而 MIPS 晶片的釋出也延遲了,蓋茨還把 NT 向 386 晶片移植的工作視為專案最高優先順序,但是沒有完成。
更糟糕的是,不少人懷疑模型 NT 的客戶 - 服務模型會降低執行應用的效能,包括蓋茨也因為害怕犧牲太多速度,始終沒有認可這種模型。但卡特勒依然堅信他們會解決這個問題,在系統的可靠性和速度之間做出選擇時,他最不能容忍的是不穩定。
至此,要在 7 月寫完所有程式碼的計劃不可能實現。卡特勒討厭不能如期兌現承諾,種種問題讓他很崩潰,但現在沒法撂挑子了,除了測試部門,網路、圖形、相容性等團隊都交由其管理。他第一次感覺到,自己的事業與 NT 的命運已經聯絡在一起。
截止日期節節敗退
1990 年 6 月,Windows 3。0 的釋出讓整個軟體行業大變樣。他們開始思考如何將 NT 執行到 Windows 上。但最大的矛盾在於,OS/2 和 Windows 控制系統 PC 的方法互不相容,這讓客戶和工程師都變得難以適從。對微軟來說,他們不可能主要去支援 OS/2,但也不想與最大客戶 IBM 產生決裂。
蓋茨給 IBM 灌了兩斤迷魂湯。他讓後者相信,NT 分別支援 Windows 和 DOS 系統將帶來諸多好處,儘管這與他建立統一軟體標準的說法有矛盾。背地裡,微軟只讓來自以色列的一小隊人馬去設計 NT 的 OS/2 變種,而卡特勒團隊卻向 Windows 發展成計算機標準這一真正的目標前進。
對卡特勒個人來說,此舉不僅讓他擺脫了 IBM,也將實現替代 UNIX 的期望。他早前就以蔑視 UNIX 而聞名,認為這是一幫博士設計出來的垃圾。那時的 UNIX 缺乏對系統資源配額的支援(例如,任何程序都可能透過分配過多記憶體或 fork() 迴圈導致系統崩潰),還缺乏 VMS 風格的程序許可權、微核心架構,以及缺乏對多個子系統的支援。
半年後,IBM 才發現到被微軟擺了一道,還是後者主動披露的。1991 年 1 月,在微軟舉辦的應用軟體開發者大會上,IBM 工程師幻想著微軟 NT 團隊會介紹支援 OS/2 的內容,但直到演講快結束都有提到。IBM 工程師當場質疑,NT 工程師挑明要放棄支援 OS/2,這導致 IBM 解除了與微軟的合作關係。
隨後新的研發進度表出爐,卡特勒承諾會在 1991 年 10 月 31 日,在萬聖節前 NT 程式碼將會完成。而測試和修 Bug 的工作則會推遲到 1992 年的第二季度,這也是把 NT 交付給客戶的時間。
NT 逐漸成型,卡特勒希望團隊都能嘗試使用 NT 系統,這樣就可以檢查 NT 各個部分存在的缺陷和瑕疵,並對某些型別的程式缺陷進行改進。他們將轉換到 NT 系統的計算機上分為三個階段:純核心 NT、圖形以及網路階段。
真正評判程式碼優劣的方法就是執行程式碼。隨著更多工程師使用 NT,他們發現,要在 NT 上完成一件工作非常困難,不得不花費數小時甚至數天時間進行修復 Bug,大大影響了專案的進度。直到 1991 年 5 月底,沒有 Windows 圖形的 NT 版本執行得很快,可依然是個很差的替代品。
1991 年 8 月,他們需要在三個月內基本完成 NT 的程式以趕上截止日期,但現實是,NT 的程式碼最多隻能完成 80%。這時 NT 團隊要考慮的是系統的安全性問題,主要是防止資訊篡改。他們大大低估了這個工作的難度。再一次,卡特勒放棄了在 10 月完成 NT 的計劃,那時即使是最好的版本都有很多缺陷,而且效能上也有侷限,儘管此前的測試表明 Windows 應用在 NT 上執行只比在 DOS 上慢比較小的百分點。
他給的最新截止日期是 1992 年 4 月。沒有人比他更想看到 NT 早日釋出。
除了統一 NT 的兩個版本進展緩慢,讓他更頭疼的是不斷新增的新功能,比如容錯性,直到 1991 年聖誕節前夕都沒有完成,檔案系統也遲遲沒有定型。甚至到 1991 年底,測試都沒有開始。相容 DOS 和 Windows 應用的進展也落後了。而圖形小組由於使用 C++ 而不是更容易的 C 語言降低了效率。
也不全是要延期的壞訊息。卡特勒用強硬手段幫助團隊度過了難關,使得 NT 的 MIPS- 英特爾版本在聖誕節前釋出。在開發早期階段,NT 就達到了一個在其他系統上很難達到的水平,在他眼裡這是一個重大成就。
專案進度安排很嚴謹,但研發過程中的專案工作量依然充滿未知。1992 年 2 月,這是研發 NT 的第三年了,卡特勒的計劃一次次被 NT 的複雜性作弄。
節節敗退的日程表讓他很不安。卡特勒一直認為,作業系統的開發最好是儘早釋出第一個版本,更多功能將來可以再新增,但 Windows NT 開發到現在已不只是按照他的個人想法可轉移。
這次,他把公開測試版推遲到了 7 月 1 日。
焦頭爛額之際,卡特勒得到了一個意外喜訊。他的老東家 DEC 同意成為購買 NT 的第一個計算機制造商。在他看來,被 DEC 取消的 Mica 專案和 NT 大體是等價的,實際上,NT 的許多元素都有他在 DEC 做系統時的技術對映,比如記憶體管理、程序和排程與 VMS 非常相似,而 DEC 現在卻花大價錢買下原本可以免費擁有的東西,這讓他體會到一絲復仇打臉的快感。
混亂終將變得有序
隨後卡特勒要求團隊快馬加鞭,讓工程師注意細節,為了激勵他們的鬥志,有時還親自上陣負責寫模組。
終於,1992 年 6 月 29 日,他們釋出了一個 WindowsNT Beta 版本,主要改善了系統的質量和可靠性。接下來,他們需要花幾個月時間完成未完的功能、修復 Bug、提高效能並儘可能減小 NT,最終版本將在年底釋出。
太大、太慢是一直困擾他們的關鍵問題。有人調侃,NT 是一頭吃記憶體的飛豬,在效能方面是一隻蝸牛,這兩個指標離蓋茨在三年前設定的目標還很遠。
卡特勒承認 NT 太慢,但現在差不多達到他的期望了,因為對效能的改進沒有止境。軟體歷史充分證明,從 IBM 的 360 到不同風格的 UNIX,再到微軟的 Windows,幾乎所有劃時代的系統都是在不成熟的狀態就釋出出來,然後逐步演進並贏得更廣泛的認可。
記憶體方面,蓋茨的公開目標是將 NT 的最低記憶體要求設定為 8MB,但現在至少需要 16MB 才能滿足典型使用者的應用需求,而當時大多數個人電腦裝備的是 4MB 記憶體,而增加記憶體容量的話要花更多成本。
至此,蓋茨只能放棄了在 8MB 記憶體的 PC 執行 NT 的打算,但在效能的問題上他不會讓步,當時作業系統業務大約佔微軟所有銷售額的一半,如果這一點不能滿足客戶的要求,它們就可能轉向 IBM 的 OS/2。
一次次的延期釋出挫傷了團隊計程車氣。但催促連續不斷,而且沒有明確的結束期限。當大多數人認為這個作業系統快結束了,其實還有幾個月的乏味測試,以及尚未完成的功能和效能改進等著他們。每天大約有 2000 個 Bug 需要解決,卡特勒關注 Bug 數量,就像關注著戰場上的傷亡數字。
他制定的殘酷進度讓很多人難以忍受,尤其最後的死亡行軍期間,很多團隊成員掙扎在工作和個人生活這條線上,讓他們跟情人、朋友、孩子的關係變得很緊張。卡特勒二次婚姻破滅,基本沒有家庭生活上的牽絆,也一直待在戰壕裡。NT 團隊此刻的拼勁後來也激勵了一位來自遙遠東方的深度學習框架創業者,在《觀止》的第 187 頁空白處,他寫下了一段批註,
“看看創造奇蹟的人”
。
距離創造奇蹟還有一步之遙,只是卡特勒再沒敢承諾系統釋出的準確時間。為了提升團隊士氣,他在全員郵件中重複著他的口號,“記住這美好的舊日時光”。
1993 年 6 月 21 日,NT 的釋出終於進入倒計時,為了慶祝專案即將生產,工程師們為他獻上一個祭壇。一個月後的 7 月 26 日,Windows NT 終於發到工廠生產了。
獨自坐在辦公室的卡特勒難掩激動心情,他釋出了一封全員郵件,開頭寫著:NT 釋出了,再說一遍,NT 釋出了——一連摁了 5 個感嘆號。
那美好的舊日時光
卡特勒似乎是那個註定為 Windows NT 而生的人,它的成功佔據天時地利人和。
微軟迫切需要一個可移植的作業系統來幫助其贏得未來,
它擁有打造這個系統所具備的足夠資金和人才資源,但只差卡特勒這樣的技術領導者
,同樣不容忽視的是,蓋茨和鮑爾默給了他本人最大程度的信任和支援,在微軟王國裡封給了卡特勒一片擁有高度決策權的自由領地。
遠大目標的呼召和自由的管理空間對卡特勒推進 NT 至關重要。在這裡他完全施展了他獨特的領導和技術才能。NT 團隊沒有固定的彙報層級,他本人拒絕過度管理,討厭複雜的規章制度,儘可能不插手下屬的工作,相信最突出的才幹會在人數較少的小團隊中顯現。他在分配工作時留有一定靈活性,喜歡讓每個人扮演不同角色,可以主動解決沒有明確職責歸屬的事,而不是畫地為牢。
卡特勒像是同時兼電影導演、演員和場務於一身,他證明自己可以把混亂的系統變得有序,不管它有多麼難控制。
作為導演,他依賴於召集到的所有人的才能,同時將自己的思想和偏好施加到下屬身上。如果在方向問題出現各種創意和分歧,最後由他拍板如何去做。他的挑戰在於如何讓這些有才華的人遵循同一份進度安排,服從同一份通知。同時,作為演員和場務,他又能時刻親自上陣,為系統的每一條程式把脈,值得一提的是,NT 的 177 個。c 檔案出自卡特勒,比 NT 首席架構師 Mark Lucovsky 還要多一倍。在長期無序的技術架構和組織結構演變中,他是運籌帷幄的那個人。
可以想象,在研發 Windows NT 的 5 年裡,如果不是由卡特勒這樣執著、強悍的猛人把持,要帶領 250 名精英工程師在心力交瘁的上千個日夜裡不斷推進絕非易事,換個人領導 NT 團隊可能會是另一番光景。
當然,NT 的成功離不開每一位工程師付出的艱苦努力。而該專案後來的巨大成功也證明,他們的付出是值得的。一直到 2001 年 Windows XP 釋出,NT 已成為所有 Windows 產品的核心系統,包括 2021 年最新發布的 Windows 11,而它卻是一個 30 年前設計的系統,老年的卡特勒會自豪地告訴你,那全部都基於 NT。
這離不開 NT 核心的技術創新。從 NT 釋出的第一天起,其諸多特性從根本上保證很多方面優於 UNIX,以及後來的 Linux:
1
日誌檔案系統 NTFS,具有抗崩潰能力和效能。Linux 在 NT 釋出 6 年後開始才具備類似的日誌功能集
2
含有第三代擴充套件檔案系統 ext3。
3
服務。在 UNIX 裡,“守護程序(daemons)”是常規程序。要啟動一個守護程序,你必須知道它的位置、語法和依賴關係。而 NT 允許使用者集中管理服務程序並自動管理它們的依賴項。GNOME 和 KDE 在 2000 年有了類似 NT 的服務概念,幾年後被 DBus 標準化。MacOS 和 SystemD 則分別於 2005、2011 年才有。
4
登錄檔,用於儲存和檢索應用程式配置資料的統一模型。UNIX 在 /etc 中有任意格式的文字檔案,但在實踐中效果不佳,導致產生版本控制 / 隔離問題。
5
執行緒和程序有很大區別。UNIX 將程序作為執行和地址空間的單位,它的一些實現支援執行緒(或 LWP,輕量級程序),但在 POSIX 執行緒出現前,它們的建立成本更高且非標準。
6
NT 的模組化裝置驅動架構允許在系統初始化後加載裝置驅動,而當時的 UNIX 通常將驅動編譯到核心中。NT 還支援 PnP 和“裝置樹(device trees)”,所以可以正確計算驅動初始化的依賴項。2003 年,Linux 才具備“統一裝置模型”能力。
7
一個 O(1) 排程程式。直到 2003 年 Linux 才具備。
8
NT 的核心是“可搶佔的”,有更好的系統響應能力和並行處理效能。在 OS X Leopard 前,OS X 的搶佔性(粗粒度鎖定)非常有限。Linux 在 2011 年才擺脫了粗加鎖方式。
1996 年,卡特勒停止管理整個 NT 專案,但繼續領導核心開發直到 2006 年。自 2000 年以來,他參與開發了每一個 Windows 版本的核心技術,包括第一個完整 32 位的 Windows 版本,同時對 AMD64 平臺的 Windows XP、Server 2003 系統做出重要貢獻。後來隨著計算機行業從伺服器轉向雲服務,他在 2008 年擔任微軟 Azure 雲計算平臺的主要開發者。2012 年,他參與開發了 Xbox 主機作業系統部分。
在幾十年職業生涯中,他在架構設計、編碼、註釋等方面表現出的嚴謹風範,深刻影響了微軟技術團隊的工程文化,這也是他影響工程師的永久性遺產。
如今,這位出生於 1942 年,現已是 79 歲的高齡工程師依然還會去辦公室寫程式碼。他喜歡完成自己的程式碼,然後看著它正常工作。休息間隙,這個倔老頭兒或許還會憶起開發 NT 的那美好的舊日時光。
題圖源自微軟官網、維基百科
參考資料:
1。《觀止:微軟建立 NT 和未來的奪命狂奔》,G。 Pascal Zachary 著,張銀奎等譯
2。https://news。microsoft。com/features/the-engineers-engineer-computer-industry-luminaries-salute-dave-cutlers-five-decade-long-quest-for-quality/
3。https://retrocomputing。stackexchange。com/questions/14150/how-
4。should-we-interpret-dave-cutlers-criticism-of-unix/14151
5。https://en。wikipedia。org/wiki/Dave_Cutler
6。https://en。wikipedia。org/wiki/Windows_NT
7。https://www。tech-insider。org/windows/research/1993/0526。html