Jeff Dean的傳奇人生:超級工程師們拯救谷歌

AI前線導讀:在很多人眼中,Jeff Dean就是谷歌技術的代名詞,也是谷歌如此強大的重要原因。但實際上他們都忽視了Jeff Dean背後的另外一位技術大神。在谷歌從創業公司成長爲一代巨頭的過程中,有數不清的工程師參與貢獻,其中Jeff Dean和Sanjay Ghemawat是最初也是至今僅有的兩位達到Level 11(Google Senior Fellow)級別的超級工程師,而且他們二人還是相交甚厚的好朋友。

作爲同在一臺計算機上編碼的好哥們兒,Jeff Dean與Sanjay Ghemawat一同改變了谷歌公司乃至整個互聯網的發展方向。有人戲稱他們爲計算機界最好的結對編程榜樣。

本文爲《紐約客》雜誌爲Jeff Dean和他的“好基友”Sanjay Ghemawat撰寫的特稿,AI前線對文章進行了編譯。一起來探索兩位超級大神的激盪人生吧!

2000年3月的一天,谷歌公司最頂尖的六位工程師齊聚某臨時“作戰指揮室”。當時的谷歌,正面臨着前所未有的緊急狀況。

前一年10月,谷歌用於爬取Web以建立網絡內容索引的核心繫統宣告停止工作。雖然用戶仍然可以通過google.com網站進行結果查詢,但他們收到的結果實際上已經過期了五個月。

由此引發的利益衝突遠超工程師們的想象。

谷歌公司的聯合創始人Larry Page以及Sergey Brin當時正在與雅虎就爲後者的搜索引擎提供支持進行協議談判,而且這兩位大佬承諾的索引規模要比當時谷歌索引的實際規模大上十倍——這將是一套能夠隨時跟進萬維網內容變化的整體性索引。就在當時,互聯網的體量在一年之內增長了一倍。

因此,一旦修復失敗,那麼google.com仍將停留在五個月之前,而與雅虎之間的交易也可能因此失敗——谷歌公司爲此次談判投入的一切都將付之東流。

挽救谷歌的雙子星

在這間階梯會議室裏,工程師們把門板放在木頭架子上搭成簡易辦公桌,就在這裏裝上電腦開始幹活。當時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級員工

最棒的搭檔,最好的結對編程榜樣

image

這兩位谷歌公司的頂尖程序員,彼此如同同一個大腦的兩個半球。

谷歌園區坐落在距離山景市中心僅幾分鐘路的高速公路旁,這裏排布着裝有深色窗戶、毫不起眼的數座建築。去年夏天的一天,在共同完成了上午的編程工作之後,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表示,“你需要找到一個能夠與你的思維方式兼容的人,這樣兩個人在一起才能形成互補的力量。”

image

他們離開餐桌,在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在啦啦隊裏扮成了一隻金花鼠吉祥物。

Jeff的博士學業專注於編譯器,這是一種將人們編寫的代碼轉換爲針對計算機進行優化的機器語言指令的軟件。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%。”

大數據的基石: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兒子最喜愛的一隻毛絨小象。

image

Hadoop快速發展成熟,目前已經被半數全球財富五十強企業所採用。事實上,Hadoop幾乎成爲大數據的代名詞。衆所周知,Facebook公司就利用其所謂“Hadoop MapReduce”存儲及處理用戶元數據——包括用戶的點擊、點贊、廣告查看等行爲的信息。Facebook一度擁有世界上規模最大的Hadoop集羣。此外,Hadoop MapReduce還有力支撐起了LinkedIn與Netflix的業務體系。前美國國家安全局技術主管Randy Garrett就曾經向國安局局長Keith Alexander上將演示過這項技術。Hadoop執行分析任務的速度可以達到原有系統的18000倍,這使其成功催生出一種全新的情報收集方法——亦有部分觀察家將其稱爲“collect it all”方法。

擁抱人工智能

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一同編寫代碼的機會只剩下一次。

角色不同,但友情長存

工程技術總是在人們難以察覺的幕後悄然演變。十八世紀偉大的探險家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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章