兩位拯救谷歌的超級工程師的故事:計算機界最好的結對編程榜樣
作者 | James Somers
譯者 | 核子可樂、蔡芳芳
在很多人眼中,Jeff Dean 就是谷歌技術的代名詞,也是谷歌如此強大的重要原因。但實際上他們都忽視了 Jeff Dean 背後的另外一位技術大神。在谷歌從創業公司成長為一代巨頭的過程中,有數不清的工程師參與貢獻,其中 Jeff Dean 和 Sanjay Ghemawat 是最初也是至今僅有的兩位達到 Level 11(Google Senior Fellow)級別的超級工程師,而且他們二人還是相交甚厚的好朋友。作為同在一台計算機上編碼的好哥們兒,Jeff Dean 與 Sanjay Ghemawat 一同改變了谷歌公司乃至整個互聯網的發展方向。有人戲稱他們為計算機界最好的結對編程榜樣。
2000 年 3 月的一天,谷歌公司最頂尖的六位工程師齊聚某臨時「作戰指揮室」。當時的谷歌,正面臨著前所未有的緊急狀況。
前一年 10 月,谷歌用於爬取 Web 以建立網路內容索引的核心系統宣告停止工作。雖然用戶仍然可以通過 google.com 網站進行結果查詢,但他們收到的結果實際上已經過期了五個月。
由此引發的利益衝突遠超工程師們的想像。
谷歌公司的聯合創始人 Larry Page 以及 Sergey Brin 當時正在與雅虎就為後者的搜索引擎提供支持進行協議談判,而且這兩位大佬承諾的索引規模要比當時谷歌索引的實際規模大上十倍——這將是一套能夠隨時跟進萬維網內容變化的整體性索引。就在當時,互聯網的體量在一年之內增長了一倍。
因此,一旦修復失敗,那麼 google.com 仍將停留在五個月之前,而與雅虎之間的交易也可能因此失敗——谷歌公司為此次談判投入的一切都將付之東流。
1
挽救谷歌的雙子星在這間階梯會議室里,工程師們把門板放在木頭架子上搭成簡易辦公桌,就在這裡裝上電腦開始幹活。當時 27 歲的 Craig Silverstein 坐在遠處,他身材矮小但嗓門卻相當洪亮。Silverstein 是谷歌公司的第一位員工:早在 Brin 把自己的客廳當成辦公室時他就已經加入了谷歌,並新手重寫了大部分代碼。
經過四天四夜的努力,他和另一位名叫 Bogdan Cocosel 的羅馬尼亞系統工程師感到一籌莫展。Silverstein 回憶道,「我們所做的任何分析都沒有什麼意義。一切都出了問題,但我們找不到其中的原因。」
Silverstein 當時幾乎徹底忽略了安靜坐在他左後方的 33 歲麻省理工學院畢業生 Sanjay Ghemawat。這位濃眉黑髮的工程師在幾個月之前(1999 年 12 月)才剛剛加入 谷歌公司。他是跟著 Digital Equipment Corporation(簡稱 D.E.C)的同事,31 歲的 Jeff Dean 一同跳槽的。Jeff 比 Sanjay 早十個月離開 D.E.C,兩個人的關係一直很好,而且非常享受結對編寫代碼的工作方式。
在作戰室里,Jeff 把椅子搬到了 Sanjay 的辦公桌前。在 Sanjay 敲打鍵盤的同時,Jeff 就在旁邊側身觀看,並時不時提點修改意見,就像製片人通過耳機對新聞主播耳語一樣。
Jeff 與 Sanjay 開始對這個總也沒個結果的索引問題進行研究。他們發現有些詞語丟失了——他們嘗試搜索了「郵箱」一詞,但得不到任何結果,而其它一些詞語則出現了亂序問題。幾天以來,他們一直在尋找代碼中的問題,檢查代碼的邏輯。但令人崩潰的是,對所有代碼的每一部分進行全面審查之後,他們仍未能發現任何 bug。
程序員們有時會將自己的軟體概念轉化為層次結構,一般以頂層用戶界面為起點,逐步下降至愈發基礎的層級。而在結構底層則存在著軟體與硬體的過渡結構,在這裡天馬行空的代碼序列開始轉向由電與硅組成的實體世界。
在作戰室中度過的第五天,Jeff 與 Sanjay 開始懷疑其中的問題不是出在邏輯層面,而屬於物理範疇。他們將混亂的索引文件轉換為最原始的表示形式:二進位代碼。更具體地講,他們想了解機器到底看到了什麼。
Sanjay 的顯示器上出現了一系列粗體的 0 和 1,每一行代表一個索引詞。Sanjay 發現,其中某個本應是 0 的數位卻顯示成了 1。接下來,Jeff 與 Sanjay 將所有錯誤排序的詞語彙總了起來,並發現了其中的共通模式——每個詞語都存在相同的問題。他們機器上的內存晶元發生了故障。
Sanjay 不由自主將目光投向 Jeff。幾個月以來,谷歌一直在經歷各種各樣且持續增加的硬體故障。問題是,隨著谷歌業務的快速發展,其計算基礎設施也在不斷擴大。計算機硬體發生故障的概率一般是很低的,因此問題堆積起來之後,一下子引發了破壞性的影響。電線磨損、磁碟損壞、主板過熱。相當一部分設備根本無法一次性成功啟動,也有一些莫名其妙地速度變慢了。
與此同時,讓人始料不及的環境因素也必須考慮在內——超新星爆炸時,爆炸波會產生指向各個方向的散射高能粒子。科學家們認為,其中一種被稱為宇宙射線的粒子確實有極小的機率會擊中地球上的計算機晶元並引發破壞——即導致目標出現從 0 到 1 的翻轉。因此,美國宇航局、各大金融企業等重量級機構所使用的強大計算機系統會採用具備單 bit 狀態轉換容錯能力的特殊硬體。但這時的谷歌仍然採取初創企業的運營模式,即購買大量不具備這種能力的低成本電腦設備。而事實證明,到這時谷歌已經迎來了發展的拐點——其計算集群已經變得無比龐大,因此發生硬體故障開始成為一種必然事件。
之後的幾天,Jeff 與 Sanjay 全力編寫代碼以修複發生故障的機器。新的索引很快構建完成,作戰室也正式解散。但這時的 Silverstein 卻陷入了沉思。他是一位出色的調試人員,他很清楚發現錯誤的關鍵在於識別出問題的根源。在這方面,Jeff 與 Sanjay 顯然做得更好。
在 2000 年 3 月索引崩潰事件之前,谷歌公司的系統一直以其創始人在斯坦福大學研究生院中編寫的代碼為基礎。Page 與 Brin 並不是專業的軟體工程師,他們只是來自學術界的搜索技術實驗研究員。因此,在他們的網路爬取程序發生崩潰時,系統不會給出任何有意義的診斷信息——屏幕上只會顯示「Whoa,horsey!」這樣的感嘆。谷歌公司的元老級員工們把 Page 與 Brin 編寫的 BigFiles 軟體稱為 BugFiles,戲謔其中充斥著無數 bug。那時候,谷歌最重要的索引代碼需要數天才能處理完成,而且一旦遇到問題就必須從頭開始重新啟動。按照矽谷通行的說法,谷歌的系統不具備「可擴展性」。
我們都會使用「搜索 Web」或者「搜索網路」的說法,但實際上這種表述並不準確。實際上,我們的搜索引擎遍歷的是 Web 的索引——或者說地圖。在 1996 年還在使用 BackRub 這個名號時,谷歌的索引地圖還很小,足以安裝在 Page 宿舍中的個人電腦里。但到 2000 年 3 月,其規模已經超出了任何超級計算機的處理能力。
要跟上如此迅猛的發展速度,谷歌公司唯一的方法就是購買消費級設備並將其組成一個集群。由於消費級設備當中有半數成本來自對谷歌公司毫無意義的「垃圾」——包括軟盤驅動器與金屬機箱,因此他們決定直接訂購主板與磁碟並將其連接起來。谷歌在加利福尼亞州聖克拉拉市的一棟樓里將 1500 套這樣的設備堆到了六英尺高; 但由於硬體故障,其中只有 1200 套設備能夠正常工作。另外,隨機發生的故障也在不斷破壞著這套系統。為了維持業務運轉,谷歌方面必須將這些計算機構建成一套無縫且具備彈性的整體。
面對這項工作,Jeff 與 Sanjay 再度攜手出擊。
曾效力於蘋果公司參與 Macintosh 機研發的 Wayne Rosing 於 2000 年 11 月加入了谷歌,負責管理其百人工程團隊。他回憶道,「這兩位是真正的領導者。」
他們每周工作九十個小時,全力編寫代碼
,希望在不影響整體系統的情況下解決單一磁碟驅動器可能出現的故障。他們在網頁爬取過程中添加了檢查點,以便整個流程能夠實現中途重新啟動。通過開發新的編碼與壓縮方案,他們使得系統容量增加了一倍。他們同時也是毫不妥協的優化者。在汽車拐彎時,輪胎外側必然更多地接觸地面; 磁碟驅動器也是同理,其在運轉時外邊緣的移動速度要高於內邊緣。谷歌公司已經將最常訪問的數據移動到外邊緣處,從而加快讀取磁頭的執行速度。但在這種情況下,存儲碟片內側往往會被留空。Jeff 與 Sanjay 將這部分空間利用起來,存儲常用搜索查詢的預處理數據。
到 2001 年,他們用了四天時間證明谷歌索引應該採用快速隨機存取內存,而非相對較慢的磁碟存儲——這一發現顛覆了谷歌的經濟理念。Page 與 Brin 都很清楚,
能夠即時提供答案的服務將受到用戶的熱烈歡迎,但問題在於這樣的速度水平需要強大的計算能力支持,而計算能力是要花錢的。面對這樣的困境,Jeff 與 Sanjay 利用軟體解決了問題
。在 Rosing 於 2005 年離職之後,Alan Eustace 成為谷歌公司工程團隊的負責人。Eustace 回憶道,「核心矛盾在於,我們必須了解最微小的細節,才有可能解決規模化問題。」Jeff 與 Sanjay 對於計算機的工作原理非常熟悉,能夠立足 bit 層級進行思考。Jeff 曾經整理出一份《每位程序員都應該了解的那些延遲數字》清單。
雖然名為「每位程序員都應該了解」,但大多數從業者對這些數字其實非常陌生
——例如一級緩存引用通常需要半納秒,或者從內存中順序讀取 1 MB 大概需要 250 微秒等等。但這些數字已經直接烙進了 Jeff 與 Sanjay 的大腦當中
。憑藉著他們對谷歌核心軟體的多次重寫,該系統的容量已經提升至新的數量級。與此同時,在谷歌龐大的數據中心之內,技術人員也開始遵循不規劃工作路線——根據軟體生成的指令來更換磁碟驅動器、電源以及記憶棒。如此一來,即使部件不斷損耗甚至需要清退,整體系統仍能夠蓬勃發展。如今的谷歌工程師們身處從 1 級開始的龐大存在鏈當中。最底層的 1 級代表 IT 技術支持人員,2 級為大學新生,3 級則通常是擁有碩士學位的員工。達到 4 級往往需要數年實踐周期,或者擁有博士學位。大多數員工的職業晉陞都停留在第 5 級。6 級為工程師,代表谷歌公司前 10% 的卓越人才,他們的技術能力直接決定著項目的成敗。7 級則代表著擁有長期實踐經驗的 6 級工程師。8 級為首席工程師,他們的工作與各主要產品及基礎設施緊密關聯。9 級為傑出工程師,在很大程度上已經成為一種尊稱。而 10 級代表谷歌院士,這是一種終身性的榮譽頭銜。谷歌院士是全球所在領域內毋庸置疑的佼佼者,
Jeff 與 Sanjay 則是谷歌高級院士——該公司最初也是唯二的 11 級員工
。
2
最棒的搭檔,最好的結對編程榜樣這兩位谷歌公司的頂尖程序員,彼此如同同一個大腦的兩個半球。
谷歌園區坐落在距離山景市中心僅幾分鐘路的高速公路旁,這裡排布著裝有深色窗戶、毫不起眼的數座建築。去年夏天的一天,在共同完成了上午的編程工作之後,Jeff 與 Sanjay 在名為 Big Table 的園區自助餐廳里共進午餐。實際上,餐廳的名稱就源自他們在 2005 年協助開發的系統——這套系統負責將無數計算機作為一個資料庫進行處理。Sanjay 又高又瘦,穿著復古味十足的深棕色夾克、灰色褲子還戴著一副窄框眼鏡。他看中了一張露天餐桌,輕快地走了過去,撐起遮陽傘在陰涼處坐了下來。當然,他也沒有忘記把另一把椅子搬到太陽下頭。只過了一分鐘,Jeff 隨後趕到,穿著短袖襯衫和時髦的運動鞋。
就像老夫老妻一樣,Jeff 和 Sanjay 各自講述著自己記憶中的細節,共同回顧他們親身參與的那些早期項目。
Sanjay 表示,「我們當時還是手寫代碼。」他的眼鏡在陽光下自動變換著顏色。「我們也會進行代碼重寫,這種感覺像 「哦,好像跟我們上個月寫的東西也差不多。」」
Jeff 則補充道:「或者說,只是其中的索引數據略有不同。」
Sanjay 接過話頭:「那麼,到底有多大的不同?這就是我們需要弄清的——」
Jeff 再次接上:「本質問題。」
Sanjay 最後做出總結,「這是我們工作的常規模式。」
Jeff 咬了一口手中的披薩。他的手指粗糙、骨節分明、皮膚堅韌。而 Sanjay 看起來則有一種截然相反的儒雅感,真的很難想像這樣的兩個人會成為摯友。Sanjay 說道,「我也不知道當初是怎麼決定在一起合作的。」
Jeff 說道,「但早在加入谷歌之前,我們就是搭檔了。」
Sanjay:「但我不知道我們為什麼會覺得一起在同一台計算機前面琢磨,會比分頭行動效果更好。」
Jeff 則表示,「我寧願走過兩個街區,也想從自己的 D.E.C 研究實驗室趕到他的研究室去。兩個實驗室中間有家冰淇淋店。」
Sanjay 開心地叫道,「所以,應該就是冰淇淋店養成了我們的這種習慣。」
Sanjay 一直沒有結婚,但他經常跟 Jeff 本人、他的妻子 Heidi 和兩個女兒一起度假。Jeff 的女兒們會稱他為 Sanjay 叔叔,他們五個人也經常在周五相約聚餐。Sanjay 和 Jeff 的大女兒 Victoria 關係相當要好。Sanjay 相當驕傲地表示,「我可是看著他的女兒長大的。」在 2004 年穀歌上市之後,他們搬到了僅相隔四英里的新住處。Sanjay 住在山景市舊城區一間不起眼的三居室中,Jeff 則在帕洛阿爾托市設計了自己的房子,還在地下室安裝了一架蹦床。在設計房子時,他發現雖然自己很喜歡這方面工作,但卻沒有耐心聽取 Sanjay 在建築方面提出的那麼多細化意見:主梁、螺栓以及承重等大量細節信息,會徹底破壞 Jeff 的宏觀構想。
對於結對編程,Sanjay 表示:「我不太理解為什麼大多數人不願意這麼做。」
Jeff 表示,「你需要找到一個能夠與你的思維方式兼容的人,這樣兩個人在一起才能形成互補的力量。」
他們離開餐桌,在 Big Table 餐廳的谷歌員工當中穿梭,只為找到好吃的冰淇淋。在這兩個人當中,Jeff 更有表達自己的願望,因此他在走路時分享了自己的冰淇淋心得。「我負責接冰淇淋,我覺得一推一提的辦法能讓冰淇淋牢牢站在蛋筒上。」Sanjay 對此深以為然,他開心地把巧克力加香草味的混合冰淇淋壓進 Jeff 手中的甜筒。
每個人都會有靈感枯竭的時候,但兩個人卻很少同時身陷困境。縱觀過去三十五年,大約一半的諾貝爾生理學或醫學獎都被頒發給這樣的科學合作搭檔。
經過多年共同的工作與生活,兩個人之間甚至發展出了專用的交流語言,就像是一對雙胞胎一樣。他們會模仿彼此的穿著與習慣,共享對方的幽默風格,並建立起共通的信念。但是,這種程度的合作在軟體開發中其實非常罕見。雖然開發人員們有時也會談到「結對編程」——即兩名程序員共享同一台計算機,一人負責「駕駛」而另一人負責「導航」——但 Jeff 與 Sanjay 的夥伴關係遠比這密切得多。如果說普通程序員間的友情類似於協作飛行員,那麼 Jeff 與 Sanjay 更像是同一個大腦的兩個半球。他們發表的不少著名論文都是共同署名的,他們的經理之一 Bill Coughran 回憶道,「他們是如此多產,工作如此高效,我們經常會以他們為中心建立團隊。」
1966 年,System Development Corporation 的研究人員們發現,最出色的程序員在工作效率方面往往達到最差程序員的十倍以上。從那之後,是否存在這種「10x(十倍效率)程序員」就一直是爭議性話題。面對龐大且必須以集體形式進行的軟體項目,這一思維顯然是在強調個人成員的重要性。在編程領域,很少有成就能夠獨立存在。但即使如此,頗為諷刺的是,
很多程序員都將 Jeff 與 Sanjay 共同完成的工作視為 10x 程序員確實存在的鐵證
。Jeff 於 1968 年 7 月出生於夏威夷,他的父親 Andy 是一位熱帶病學研究員,母親 Virginia Lee 則是一名通曉六種語言的醫學人類學家。出於興趣,父子二人對一台 IMSAI 8080 計算機進行編程探索。他們將升級程序焊接在機器上,並深入研究了這台設備的每一部分構造。
Jeff 和他的父母經常搬家。十三歲時,他提前結束了自己八年級的學業,隨家人一同來到索馬利亞西部的某難民營。後來在就讀高中時,他開始為流行病學家們編寫一款名為 Epi Info 的數據收集程序; 這一成果最終成為野外工作的標配工具,推出了十幾種語言的版本並發行了數十萬份。
Jeff 後來在明尼蘇達大學遇到了妻子 Heidi,那時的他還沒有將自己的生活與編程緊密聯繫起來。她回憶道,「他從來不會吹噓自己取得的這些成就。你得想盡辦法才能引導他開始講述。」兩個人的第一約會是共同觀看一場女子籃球比賽,那天 Jeff 在啦啦隊里扮成了一隻金花鼠吉祥物。
eff 的博士學業專註於編譯器,這是一種將人們編寫的代碼轉換為針對計算機進行優化的機器語言指令的軟體。Allan Eustace 指出,「如果從樂趣出發,那麼編譯器本身非常無聊。」但在另一方面,這項工作卻能讓人「與機器走得更近」。在談到 Jeff 時,Sanjay 不停用食指按著自己的太陽穴。「在你編寫代碼時,他會組織出一套模型。他會提醒「這些代碼的性能如何?」
他幾乎能夠以半自動方式考慮所有可能出現的情況
。」
Sanjay 在 17 歲進入康奈爾大學之前從來沒有接觸過計算機。他於 1966 年出生於印第安納州西拉斐特市,但在印度北部工業城市哥打長大。他的父親 Mahipal 是一位植物學教授,母親 Shanta 負責照料 Sanjay 和他的兩個哥哥姐姐。這是一個典型的知識分子家庭:他的叔叔 Ashok Mehta 曾經買過一本 Frederick Forsyth 撰寫的《豺狼之日(The Day of the Jackal)》的複印本。書已經快要散架了,但孩子們仍然把它拼起來讀完了。Sanjay 的哥哥 Pankaj 成為了哈佛商學院有史以來獲得終身教職的最年輕的教師(目前在紐約大學擔任教授)。Pankaj 與 Sanjay 就讀於同一所大學,而且被譽為「全才」。Sanjay 表示,「其實我多少有點生活在哥哥陰影之下的感覺。」因此,Sanjay 一直非常謙和低調。2016 年,當他入選美國人文與科學院(American Academy of Arts and Sciences)時,他甚至沒有通知自己的父母; 兩位老人是從鄰居們那裡聽到這個好消息的。
在麻省理工學院的研究生院,Sanjay 找到了一群志同道合的好朋友。但他很少約會,直到現在也「很少很少」與異性往來。Sanjay 表示,他並不是拒絕組建家庭,只是事情順其自然地發展到了現在這樣。他的密友們已經習慣了不打擾他的生活,而父母也早就接受了自己兒子做出的永遠當個單身漢的決定。也許正是因為他總是生活在自己的世界中,谷歌公司內的其他員工覺得他身上籠罩著一種神秘感。他以安靜而深刻著稱——這是一個深思熟慮且不同尋常的人。在他的桌子上,還保留著一堆近二十年前寫下的 Mead 組合筆記,其中寫滿整潔的清單與圖表。他習慣於拿起筆來快速記下自己的思路。雖然很少引用筆記中的內容,但他認為書寫有助於思考。
他在麻省理工學院攻讀碩士時的導師是 Barbara Liskov,一位頗具影響力的計算機科學家,專攻複雜代碼庫的管理。在她看來,最好的代碼應該像是一篇傑出的文章。其中需要擁有一套精心實現而成的結構,且每個字句都應有其意義。但以這種方式編程,要求創作者與受眾共情。另外,這也意味著創作者不僅要將代碼視為達成目的的手段,也要把它作為藝術品。Craig Silverstein 表示,「我認為他最擅長的是系統設計類工作。看到 Sanjay 所編寫的代碼文件,你會發現這就如同一尊比例勻稱的美麗雕像。」
在谷歌,Jeff 的名頭明顯更響亮一些。事實上,好事者甚至依照動作影星查克·諾里斯給 Jeff Dean 編了不少段子。(例如「查克·諾里斯能數到無窮大……而且數了兩次」; 「Jeff 的簡歷只需要列出他沒做過的事,因為這樣篇幅更短」。)但是,對於那些非常了解二人的人們來說,Sanjay 的才能絕對不遜於 Jeff。曾經長期與二人共事的 Wilson Hsieh 表示,「Jeff 非常善於提出瘋狂的想法以及原型設計,而 Sanjay 則是那種能夠一路完成開發工作的人。」在生活當中,Jeff 更為外向,而 Sanjay 則比較內斂。在代碼層面,情況卻恰好相反。Jeff 的編程結果往往令人頭暈目眩——他能夠迅速勾勒出令人吃驚的想法,但由於整個過程太快,所以其他人往往無法理解。而 Sanjay 的代碼則非常親和友好。
Silverstein 指出,「有些人的代碼太過鬆散,也就是一屏代碼當中包含的信息太少。這意味著你總得來回滾動才能看明白這些代碼到底要表達什麼含義。但也有些人編寫的密碼太過密集,看著它會有那種「呃,好吧,我不打算繼續看下去了」的感覺。Sanjay 在這兩者之間找到了平衡點。面對他的代碼,你會覺得「沒問題,我可以看懂」,但同時裡面又包含著大量內容。」Silverstein 同時補充道,「每當我打算為 Sanjay 的代碼添加新功能時,總會發現其中的 hook 似乎已經留好了。我能理解其中的偉大之處,而且弄不清楚這樣的代碼是怎樣編寫出來的。」
今年春天的一個早上,Jeff 和 Sanjay 站在 40 號樓的小廚房裡——這裡正是谷歌人工智慧部門的所在地。他們身後的白板上寫滿了矩陣代數;桌子上則擺著一篇關於無監督對抗網路的論文。Jeff 穿著一件褪色的 T 恤與牛仔褲,看起來就像一個剛剛找回生活方向的流浪漢;Sanjay 則穿著毛衣和灰色褲子。明亮的窗戶外露出一大片高聳的松樹,遠處還有一片田野。無論何時,只要在工作階段,Jeff 永遠離不開意式濃縮咖啡。在小廚房的吧台上,一台三英尺寬的 La Marzocco 咖啡研磨機正在嗡嗡作響。Sanjay 一邊盯著那台機器一邊說,「我們遲到了。」這時候是上午 8 點 32 分。
在咖啡時間結束後,他們走到了自己的電腦前。Jeff 從自己的辦公桌邊抓過一把椅子——他的辦公桌很臟,而 Sanjay 的桌子則永遠一塵不染。他把一隻腳搭在文件柜上,向後仰過去; Sanjay 則在他面前查看屏幕。顯示器上打開了四個窗口:左邊是網路瀏覽器與終端,用於運行分析工具; 右邊則是文本編輯器 Emacs 中的兩個文件——一個是待辦事項列表與 notebook,另一個則是色彩斑斕的代碼。Sanjay 把自己的筆記本放在了 Jeff 的台式機旁邊。
「好了,我們都做了些什麼?」Sanjay 打開了話題。
Jeff 表示,「我覺得我們正在研究 TensorFlow Lite 的代碼規模。」
這是一個與機器學習相關的重要軟體項目,Jeff 與 Sanjay 都擔心它的體積會無限膨脹; 正如圖書編輯一樣,他們需要想辦法精簡內容。為此,兩位構建起一款「瘦身」工具,而工具自身同樣需要優化。
Sanjay 表示,「所以我在嘗試弄清它到底有多慢。」
Jeff 回應道,「那可是相當慢。」他向前側了側身,但仍然非常放鬆。
Sanjay 接言道,「所以這代表的是 120 KB,大概有 8 秒鐘那麼慢。」
Jeff 則回應,「是 12 萬次堆棧調用,可不是 120 KB。」
Sanjay 說道,「好吧,KB 指的是文本量,大概是。」
Jeff 回道,「哦,對,抱歉。」
Sanjay 發問,「我不太明白應該為單元大小取怎樣的閾值。0.5MB 怎麼樣?」
Jeff 表示「應該可以。」Sanjay 開始敲擊鍵盤,而 Jeff 被吸引到了屏幕上。「所以你的意思是,如果比 0.5MB 大,那我們就應該……」他的話還沒說完,Sanjay 就用代碼做出了回應。
Sanjay 在開車的時候會把手放在十點和兩點方向,而後專註地盯著前方——現在他在操作鍵盤,姿態也完全一致。他的雙腳分開與肩同寬,仍然保持著自己最熟悉的狀態。他細長的手指輕輕划過各個按鍵,並逐漸吸引到幾位年輕程序員的圍觀。
不久,他們達成了階段性的勝利,Sanjay 輸入一條命令來測試目前的進展。略顯疲憊的他在命令運行的同時檢查了一下電子郵箱。測試結束了,但他沒有第一時間注意到。
「嘿,」Jeff 打了個響指,手指向屏幕。雖然在日常談話中 Jeff 總是非常輕鬆和藹,但當他和 Sanjay 一起坐在電腦前時,就會瞬間變成一個自以為是、粗魯且總愛唱反調的傢伙。Sanjay 對此早就習以為常了。在他認為 Jeff 的思路太快時,他會把手從鍵盤上抬起來比個手勢,好像在說「等一會兒。」(一般來說,Jeff 就像油門,而 Sanjay 則是剎車。)雖然兩個人似乎馬上就要吵起來了,但在過去二十年當中,他們從來沒有真正彼此吼叫。
Sanjay 滾動屏幕,把新的代碼挪到屏幕正中。Jeff 看了看,「這些都可以加入常規流程,不是嗎?」
「嗯,」Sanjay 表示同意。
Jeff 扳了一下手指關節,「似乎沒問題,那現在就添加?」
Sanjay 更為謹慎,「不,我……」
Jeff 則顯得有些急躁,「這裡有我們還沒發現的問題?」
「那倒不是,我的意思是,我們得先弄清目前的狀況。我們可以先做點筆記,對吧?」
「好,沒問題,」Jeff 又放鬆下來,他的情緒總是說變就變。他們一起整理出一張便條。
接近午餐時間,他們工作了兩個小時,期間休息了十分鐘,工作時大部分時間都在交流。(年輕的程序員看到他們的工作狀態應該會記憶深刻,因為這兩個人的對話從不會停止,甚至連停頓都沒有。)在標準工程實踐當中,大家需要將你的代碼交給另一名程序員審查。但 Jeff 與 Sanjay 跳過了這一步,只是在記錄中寫下「lgtm」,意思是「looks good to me」——我覺得可以。從某種意義上說,他們可能會被細枝末節所淹沒。然而,他們的代碼開發工作需要充分考慮到谷歌自身龐大的業務規模。他們所擔心的 KB 以及微秒延遲可能在世界各地的數據中心之間成倍增加,最終增長至十億倍之巨。這些龐大且持續發熱的機房中塞滿無窮無盡的處理器機架,需要可觀的水冷資源進行冷卻。就是在這樣看似平淡的工作當中,Jeff 曾輕鬆寫意地回到家中,告訴女兒們「Sanjay 和我今天把谷歌搜索的速度提高了 10%。」
3
大數據的基石:MapReduce 的誕生在 2003 年的四個月當中,Jeff 與 Sanjay 幫助谷歌完成了創立以來規模最大的一次升級。他們所使用的軟體,就是後來赫赫有名的 MapReduce。這次升級的靈感,來自他們在對谷歌爬取工具與索引器進行第三次重寫的過程。他們意識到,每一次他們解決一個重要問題,所面向的都是地理分布廣闊且個別設備可能不太可靠的無數計算機上協同運行。因此,只有對解決方案進行全面推廣,才能避免一次又一次重複面對同樣的問題。更具體地講,應該創建一款工具,確保谷歌公司的每一位程序員都能夠利用其運行數據中心內的機器——換言之,將谷歌的所有基礎設施視為一台碩大無朋的整體計算機。
Jeff 與 Sanjay 在辦公室的角落裡編寫出了 MapReduce。辦公室窗外對著一個池塘。MapReduce 的意義在於把可能令人費解的複雜流程整理得井然有序。在 MapReduce 出現之前,每一位程序員都必須弄清楚要如何對數據進行分割與分發,分配工作並自行負責硬體故障的處理。MapReduce 為編程人員提供了一種用於考量此類問題的結構化方法。正如廚師在食材下鍋之前要先對其進行分類一樣,MapReduce 也要求程序員將自己的任務分成兩個階段。首先,程序員需要告訴每台機器如何完成任務的「Map」階段(比如計算某個詞語在網頁中出現的次數); 接下來,程序員要編寫指令以實現全部機器結果的「Reduce」(例如將上述結果相加)。MapReduce 可以處理分發工作的細節,從而幫助程序員擺脫這些複雜且枯燥的任務。
在接下來的一年當中,Jeff 與 Sanjay 以 MapReduce 任務的形式重寫了谷歌的爬取與索引系統。很快,當其他工程師意識到 MapReduce 的強大力量後,他們也開始利用其處理視頻並在谷歌地圖上渲染圖塊。MapReduce 非常簡單,能夠輕鬆消化各類新型任務。谷歌的業務有著明確的所謂「晝夜使用曲線」——即白天的流量比晚間更多,而 MapReduce 任務則開始使用閑置部分的容量。正如生物會在夢中回顧白天的經歷,現在谷歌也在利用同樣的方式處理自己的數據。
很早開始,就有一系列跡象表明谷歌其實是一家偽裝成搜索公司的 AI 公司。2001 年,與 Jeff 及 Sanjay 同一辦公室的 Noam Shazeer 就曾因谷歌從其它廠商處獲取的授權拼寫檢查器而身心俱疲:這款工具不斷犯下令人尷尬的錯誤,例如提醒輸入了「TurboTax」的用戶,正確內容可能應該是「Turbot ax」——這太離譜了,turbot 是一種生活在北大西洋海域的比目魚。拼寫檢查器的表現取決於其使用的詞典,Shazeer 也深深意識到,谷歌公司完全能夠立足網路獲取有史以來規模最大的詞典。他編寫了一個程序,能夠利用網路文本的統計屬性來確定哪些詞語更可能出現拼寫錯誤。該軟體學習到,「pritany spears」與「Brinsley spears」,實際上都屬於「Britney Spears」——也就是小甜甜布蘭妮的常見誤寫。在 Shazeer 參加谷歌每周舉辦的 T.G.I.F 聚會(公司每周五下午定期組織的放鬆活動)並展示這款程序時,其他員工開始進行測試,並發現這東西確實精明得很。在此之後,通過與 Jeff 以及另一位工程師 Georges Harik 的合作,Shazeer 將類似的技術應用到了網頁的關聯廣告當中。定向廣告成了一棵取之不盡的搖錢樹,而谷歌則將這棵樹植根在自己的計算基礎設施之上。這就是良性循環的開端——規模化成就了谷歌的智能化,而智能化為谷歌帶來了大筆財富,這些財富又進一步推動谷歌實現規模壯大。正是這樣的發展體系,使得谷歌公司佔據著無法動搖甚至令人不安的主導地位。
越來越多富有進取心的程序員們利用 MapReduce 發掘谷歌數據中的洞察見解,由此積累下的結論使得轉錄用戶的語音郵件、回答客戶問題、自動完成查詢以及翻譯各國語言逐漸成為可能。更重要的是,這些系統都是利用複雜度相對較低的機器學習演算法開發而成的。Jeff 總結稱,「即使是非常簡單的技術,在配合大量數據之後,也能帶來良好的效果。」而在「數據、數據、數據」成為谷歌的最高指導原則(利用 BigTable、MapReduce 及其後續技術存儲並處理這些數據)之後,谷歌基礎設施的全球擴展能力也變得更加無縫化與靈活化。更重要的是,Jeff 與 Sanjay 打造的這些技術能夠通過智能化方式進行管理,從而確保普通程序員也能夠編寫分散式程序,最終讓谷歌在這些新的技術領域中佔據先發主導地位。即使是普通用戶,可能也注意到了某些悄然出現的趨勢:谷歌雲正在變得越來越聰明。
2004 年,考慮到這些技術可能對需要處理大量數據的天文學家、遺傳學家乃至其他領域的科學家們具有重大意義,Jeff 與 Sanjay 共同撰寫了一篇論文《MapReduce:立足大型集群簡化數據處理(MapReduce: Simplified Data Processing on Large Clusters)》並公開發表。這篇 MapReduce 論文的出現時機可謂恰到好處。
當時,成本愈發低廉的硬體與網路服務、互連設備正快速普及並帶來巨量數據,但只有極少數企業擁有能夠處理這些信息的軟體。在經歷了艱難的小型搜索引擎 Nutch 的擴展挑戰之後,Mike Cafarella 與 Doug Cutting 兩位工程師清楚認識到了 MapReduce 的重要性,並決定從零開始為其創建一套免費克隆版本。他們最終將自己的項目命名為 Hadoop,這個名字源自 Cutting 兒子最喜愛的一隻毛絨小象。
Hadoop 快速發展成熟,目前已經被半數全球財富五十強企業所採用。事實上,Hadoop 幾乎成為大數據的代名詞。眾所周知,Facebook 公司就利用其所謂「Hadoop MapReduce」存儲及處理用戶元數據——包括用戶的點擊、點贊、廣告查看等行為的信息。Facebook 一度擁有世界上規模最大的 Hadoop 集群。此外,Hadoop MapReduce 還有力支撐起了 LinkedIn 與 Netflix 的業務體系。前美國國家安全局技術主管 Randy Garrett 就曾經向國安局局長 Keith Alexander 上將演示過這項技術。Hadoop 執行分析任務的速度可以達到原有系統的 18000 倍,這使其成功催生出一種全新的情報收集方法——亦有部分觀察家將其稱為「collect it all」方法。
4
擁抱人工智慧Jeff 天生不願安於現狀:一旦看到問題解決方案的輪廓,這個問題對他而言也就失去了吸引力。2011 年,在全世界都向雲計算張開懷抱時,他開始與來自斯坦福大學的計算機科學教授吳恩達合作。吳恩達教授當時在谷歌公司負責領導一個關於神經網路研究(即利用虛擬「神經元」構建計算機程序)的秘密項目。Jeff 曾在本科求學階段接觸過神經網路,但那個時候還無法解決真實世界中的問題。吳恩達告訴 Jeff,情況正在快速發生改變。在斯坦福大學,研究人員們發現向神經網路提供大量數據之後,即可取得一系列激動人心的結果。吳恩達認為,在谷歌龐大的業務規模支撐之下,神經網路不僅將在實用性層面有所提升,更會變得無比強大。
神經網路與傳統計算機程序截然不同。與通常的方法不同,神經網路的行為並非由程序直接指定,而是通過輸入與反饋自行「學習」到的。自從本科畢業之後,Jeff 的神經網路知識就一直停滯不前,於是 Heidi 很快發現家裡的衛生間中擺滿了相關教材。Jeff 決定每周拿出一天了解這個被稱為「谷歌大腦(Google Brain)」的項目。谷歌公司內部有很多人對這項技術持懷疑態度,Alan Eustace 回憶道:「這簡直是在浪費人才。」就連 Sanjay 也對 Jeff 的舉動無法理解,他認為「你的工作在於管理基礎設施,整那些沒用的幹啥?」
在接下來的七年時間裡,谷歌大腦團隊開發出了遠超以往最佳方案的機器翻譯以及語音與圖像識別神經網路。最終,這些神經網路模型取代了谷歌最重要的搜索結果排序與定向廣告演算法,這也使得谷歌大腦團隊成為公司內增長速度最快的部門之一。2001 年加入谷歌公司的工程師 Claire Cui 提到,Jeff 的參與標誌著谷歌內部人工智慧開發工作的歷史性轉折點:「當時有人相信這項技術,也有人不信,但 Jeff 證明了它確實有效。」
事實證明,人工智慧以規模化為前提,而 Jeff 這位系統工程師正是規模化實現的好手。他的一項重要努力在於領導了 TensorFlow 項目的開發——目標是為人工智慧創造出與 MapReduce 相似的簡化方案。TensorFlow 極大降低了將神經網路分配至多台計算機的門檻,從而將大量計算設備視為統一的龐大主腦。2015 年,TensorFlow 正式亮相,並成為人工智慧領域的客觀標準。谷歌 CEO Sundar Pichai 最近驕傲地宣布穀歌是一家「AI 優先」的企業,並任命 Jeff 領導公司內的所有 AI 開發項目。
Jeff 現在每周拿出四天時間管理谷歌大腦團隊,包括團隊中的三千名成員。他到處發表演講,每周召開一次關於新型計算機晶元(即專為神經網路設計的張量處理單元,簡稱 TPU)的例會。此外,他還參與到 AutoML 的開發協助當中——這是一套嘗試利用神經網路設計其它神經網路的系統。在如此繁重的工作壓力之下,如今他每周與 Sanjay 一同編寫代碼的機會只剩下一次。
5
角色不同,但友情長存工程技術總是在人們難以察覺的幕後悄然演變。十八世紀偉大的探險家 James Cook 與 George Vancouver 取得輝煌成就的背後,是投入數十年努力發明出海上經度計算裝置的約克郡木匠 John Harrison。
最近,Jeff 與 Sanjay 相約到他們最喜愛的墨西哥餐廳 Palo Alto Sol 享用塔可卷餅。Jeff 掏出了手機,「還記得 Gmail 是什麼時候上線的嗎?」手機回答道,「2004 年 4 月 1 日。」Sanjay 不喜歡在吃飯的時候分心,但 Jeff 卻對語音助手的表現非常滿意。谷歌現在擁有一系列能夠與用戶對話、傾聽並回答問題的程序,這些程序同樣隱藏在幕後,在世界各地數據中心的支持下為無數應用程序提供支持。
當前,Jeff 與 Sanjay 兩人的角色已經大不相同。在谷歌,Sanjay 屬於那種「個人貢獻者」——他獨自幹活,不涉及任何管理工作。他對這種狀態非常滿意。他說,「我可不想像 Jeff 那樣工作。」他目前正在開發一款幫助工程師輕鬆組合併控制幾十種程序(用於獲取新聞、圖像與價格等信息)的軟體,這個軟體將在用戶在谷歌搜索框內輸入文本時開始運行。另外,他每周定期與一群「區域技術負責人(Area Tech Leads)」開會,這可以說是谷歌工程開發方面最高級別的會議——他們共同制定的方針會影響整個公司的技術決策。
如果把谷歌比作一棟房子,那麼 Jeff 負責設計新的房間,而 Sanjay 則在身後調整結構、加固大梁、擰緊螺栓
。與此同時,在每周星期一的共同編程中,Jeff 與 Sanjay 又鼓搗出了一個新的 AI 項目。Jeff 說這是一種嘗試,要訓練出一套「巨型」機器學習模型來執行成千上萬種不同任務。Jeff 多年來一直在考量這個思路,並在最近意識到這可能並非天方夜譚。他和 Sanjay 打算構建一套原型,然後組織起團隊圍繞其做開發。
在軟體世界裡,最好的領導方法就是用代碼說話
。Jeff 的妻子 Heidi 說:「我覺得他們都很想念對方。」當合作機會減少時,他們開始相約在周五晚上聚餐。
今年 3 月的一個星期天,Jeff 與 Sanjay 一起去庫比蒂諾郊外遠足。天氣涼爽乾燥,但陽光曬在身上已經有了點暑意。Jeff 開著一輛藍色的特斯拉 Roadster 來到了山口,車子的保險柜上貼著 Bernie 2016 的貼紙。Sanjay 則開著自己的紅色特斯拉 Model S 緊隨其後。那天早上,Sanjay 一直在看書,而 Jeff 跑去踢足球(小腿上的設備顯示他總共跑了 7.1 英里)。在「三月索引」事件的 20 年之後,Jeff 黝黑的皮膚讓他看起來像個已經退役的長跑運動員,但 Sanjay 卻顯得非常年輕。
遠足的路線總長 6 英里,途中要穿過一片茂密的叢林。Jeff 在前面帶路,兩個人在林子里追憶了谷歌快速發展的歷程。Sanjay 想起在谷歌的第一個快速發展階段,曾有個管道工一次性為男廁所安裝了兩個廁位。他說,「我還記得 Jeff 是怎麼講的,他說「這就叫雙管齊下」。」
他們走出叢林,面前是一片荒地,還有一隻禿鷹從頭頂飛過。
Jeff 說道,「這山比我想像的還陡。」
Sanjay 回應道,「不是說這次遠足的路很好走嗎?」
Jeff 根本不接茬:「怪不得另外一側沒有自行車道呢。」
他們再次扎進叢林。在通過一段之字形的上坡時,Jeff 往外瞥了一眼:「我們應該找個地方遠眺一下。」
他們腳下的山路直通山頂,那裡高峻敞闊,沒有樹木遮擋,正是遠眺的好位置。雖然山間蒙著一層薄霧,但他們仍然可以看到南邊的聖克魯斯山與東邊的米遜峰。Jeff 遙指,「Sanjay 快看,你的辦公室在那!」他們並肩而立,目光穿過幽長的山谷。
英文原文
https://www.newyorker.com/magazine/2018/12/10/the-friendship-that-made-google-huge
※蘇寧金融會員領域驅動設計實踐
※微軟宣布開源 WPF、WinForms和WinUI
TAG:InfoQ |