谷歌基情錄:TensorFlow、Hadoop、MapReduce 都靠他們誕生!
【CSDN編者按】迄今為止,Google帝國已創立二十載。在這背後,離不開一眾「開國元勛」的豐功偉績,譬如聲名遠揚的MapReduce、TensorFlow、乃至於Hadoop——這些都和Jeff Dean、Sanjay Ghemawat兩個人有著千絲萬縷的聯繫。作為最早的一批程序員,Jeff Dean和Sanjay Ghemawat這對曾在同一台計算機上編程的好兄弟,不僅是Google唯二登上11級的工程師,還極大地改變了Google和互聯網的發展方向。「相比之下,Jeff和Sanjay就好像一個大腦的左腦和右腦。」正是如此完美契合的兩個人,才書寫了一段載入史冊的偉大友情。
2000年3月,陷入僵局的Google索引
2000年3月的一天,Google最優秀的六位工程師齊聚在一個臨時的作戰室,該公司正處於前所未有的緊急狀態。
10月份,公司的核心系統(負責爬取Web構建「索引」的系統)停止了工作。雖然用戶仍然可以在google.com上輸入查詢,但他們只能拿到5個月前的搜索結果——其中的利害關係比工程師們想像的更嚴重。
Google的聯合創始人拉里佩奇和謝爾蓋布林正在與雅虎就搜索引擎進行談判,而且他倆承諾可以提供十倍大小的索引。他們現有的索引就能夠緊跟互聯網的發展,而且在過去的一年中該索引的規模翻了一番。如果他們失敗,那麼google.com將仍然是一個時間膠囊,與雅虎的交易會化為泡影,而公司也將面臨所有的努力都灰飛湮滅的危機。
工程師們在一段樓梯旁的會議室里支起了幾個鋸木架,然後把門板搭在上面當電腦桌在上面辦公。27歲的Craig Silverstein坐在遠處的牆邊,他身材矮小,聲音很高,他是Google的第一位員工:當Google的辦公室還在布林的客廳時,他就加入了公司,並重寫了大部分的代碼。雖然他與一位名叫Bogdan Cocosel的羅馬尼亞系統工程師奮戰了四天四夜,但是毫無頭緒。Silverstein回憶說,「我們所做的分析沒有任何意義。一切都不正常,但我們不知道為什麼。」
Silverstein沒有注意到他左手邊有一位安靜的麻省理工畢業的高材生Sanjay Ghemawat,33歲,長著濃密的眉毛和黑色的頭髮,兩鬢略顯灰色。Sanjay在幾個月前(具體說是12月)剛剛加入公司,他與另一位同事31歲的Jeff Dean是從Digital Equipment Corporation跳槽過來的。Jeff 是一個身材苗條精力充沛的人,在他跳槽十個月後,Sanjay也離開了那家公司。他們倆人關係非常親密,而且他倆喜歡一起寫代碼。
在作戰室的時候,Jeff搬著椅子去找Sanjay,Sanjay敲鍵盤的時候,Jeff就趴在他身邊,就好像製作人在新聞主播耳邊一邊指導工作一邊甜言蜜語。
Jeff和Sanjay開始研究陷入僵局的索引。他們發現有些辭彙不見了,他們搜索「郵箱」卻沒有返回任何結果,而且其他辭彙也不按順序顯示。幾天以來,他們全身心地投入到代碼邏輯中,一直在尋找代碼中的問題。一段又一段的代碼,慢慢篩查,但是他們始終找不到這個bug。
程序員經常會將他們的軟體從概念上分成層次結構,從頂層的用戶界面,逐步到越來越基礎的層面。這個結構的最底層是軟硬體交匯的地方,探尋這裡就要拋棄柏拉圖式的代碼秩序,轉而面向最基礎的電子和晶元的世界。
在作戰室奮戰的第5天,Jeff和Sanjay開始懷疑他們所尋找的問題不在邏輯層面,而在物理層面。他們將混亂的索引文件轉換成最底層的形式:二進位。他們想看看機器究竟看到了什麼。
Sanjay的監視器上顯示出了一大堆1和0,每行代表一個被索引的關鍵字。Sanjay發現,某個本該是0的數字現在卻是1。當Jeff和Sanjay將所有出錯的單詞都放在一起後,他們發現了一種模式——每個單詞都有相同的問題。不知怎地他們機器的內存晶元已遭到了破壞。
Sanjay看著Jeff。幾個月以來,Google出現的硬體故障越來越多。問題在於,隨著Google的發展,其計算機基礎設施也在不斷膨脹。計算機硬體很少出現問題,但是一旦你擁有足夠多的計算機,那麼就總會出問題:電線磨損、硬碟損壞、主板過熱。許多機器從一開始就有問題,有些計算機則會逐漸變得緩慢,奇怪的環境因素開始發揮作用。當超新星爆炸時,爆炸波會產生向各個方向散射的高能粒子;科學家認為,這個世界上存在一種被稱為宇宙射線的不定粒子可以擊中地球上的計算機晶元,將其上的0改寫成1。世界上最強大的計算機系統可能在美國宇航局、金融公司、以及其他使用了特殊硬體的公司,他們可以容忍單比特錯誤。但是當時Google的運營尚屬創業公司,他們購買的都是沒有這種功能的廉價計算機。而當時的Google正面臨著一個轉折點,它的計算集群如此之大,似乎硬體故障再所難免。
於是,Jeff和Sanjay一起編寫了代碼來彌補機器上的問題。
不久之後,新的索引完成了,臨時作戰室也解散了。Silverstein顯得有點不知所措:他才是最優秀的調試人員,找到bug的關鍵是找到問題的根源。但是Jeff和Sanjay調查得更為深入。
唯二登上 Google 11 級工程師的 Jeff 和 Sanjay
在3月份索引崩潰之前,Google系統的核心代碼都是其創始人在斯坦福大學讀研究生時期寫的。佩奇和布林不是專業的軟體工程師,他們只是在進行學術上的搜索技術實驗。當他們的網路爬蟲崩潰時,沒有提供任何有用的診斷消息,只有一些「啊哦!」之類的感嘆。
早期的員工將「BigFiles」(佩奇和布林編寫的一個軟體)稱為「BugFiles」(Bug文件)。他們最重要的索引代碼需要花費數天才能運行完成,如果遇到問題則必須從頭開始重新啟動。
按照矽谷的說法,Google不具備「可擴展性」。
我們所謂的「搜索網路」,實際上沒有搜索真正的網路;我們的搜索引擎只是遍歷了一個Web的索引,或者說一張地圖。
1996年,當Google還叫BackRub時,它的地圖非常小,佩奇宿舍的電腦就足夠了。2000年3月的時候,該映射大到沒有任何超級計算機能夠單獨處理。Google唯一的解決辦法就是購買多檯面向消費者的計算機,然後將它們連接成一個機組。由於Google認為這些計算機中一半的成本是垃圾(軟盤驅動器,金屬機箱),所以他們訂購了多個主板和硬碟,然後將它們拼湊在一起。當時在加利福尼亞州聖克拉拉市的一幢建築物中,Google的1500多台這樣的設備堆疊成了一座座6英尺(1.8米)高的小塔;由於硬體故障,只有1200台工作。看似很少發生的硬體故障卻在不斷破壞他們的系統,為了生存,Google不得不將它的計算機聯合起來,組成一個無縫且有彈性的整體。
Jeff和Sanjay共同負責了這項工作。
曾在蘋果就職的麥金塔電腦的先驅Wayne Rosing於2000年11月加入Google,並負責管理百人的工程團隊。他說,「他們無需領導。」他們每周工作90個小時,寫了幾周的代碼實現了某個硬碟驅動器的問題不會波及整個系統。他們在爬行過程中添加了檢查點,確保可以在中途重新啟動。通過開發新的編碼和壓縮方案,他們有效地將系統的容量增加了一倍。他們堅持不懈地優化。當汽車轉彎時,外側的輪子經過的地面更多;同樣,硬碟在旋轉的時候外邊緣的轉速比內邊緣高。Google將最常用的數據都移動到了外側,因此讀取針頭下面的比特可以更快地流動,而保持內側有一半為空;Jeff和Sanjay利用這些空間存儲常用搜索查詢的預處理數據。在2001年的4天時間裡,他們證明了Google的索引存取可以存儲在內存中,而無需存儲在相對較慢的硬碟中;這一發現徹底改變了公司的經濟狀況。佩奇和布林明白用戶對能夠立即提供答案的服務趨之若鶩。關鍵在於,速度需要計算能力,計算能力需要花錢——而Jeff和Sanjay卻利用軟體攻克了這一難題。
2001年,在Rosing離開之後,Alan Eustace出任了工程團隊的負責人。他說,「頗為自相矛盾的是,為了解決大規模的問題,你必須了解最小的細節。」Jeff和Sanjay可以從比特單位了解計算機。Jeff曾經給大家看過一些「每個程序員都應該知道的延遲數字」。然而事實上,幾乎沒人知道那個列表上的數字:一級緩存引用通常需要半納秒;從內存中順序讀取一兆位元組需要251微秒。這些數字已經深入了Jeff和Sanjay的大腦。在他們幾次帶頭重寫了Google的核心軟體後,該系統的能力得到了數量級的提升。與此同時,在該公司龐大的數據中心,技術人員需要千辛萬苦地找到相應的設備,並根據軟體生成的指令更換硬碟驅動器、電源和內存條。即使零件出現磨損或損壞,系統也不會受到影響。
現如今,Google的工程師需要從一級開始慢慢攀爬職業等級。最底層是IT技術支持人員;2級是大學畢業生;3級通常擁有碩士學位;擁有博士學位或經過幾年的努力以後他們能夠到達4級;而大多數都會停留在5級。只有10%的人擁有能力登上6級工程師,他們都是對項目成功做出了豐功偉績的人。擁有很多業績的6級工程師可以榮升到7級。8級的首席工程師一般都會負責主要產品或基礎設施。位居9級的人都是受人尊敬的傑出工程師。登上10級,榮獲「Google院士」的稱號,這份榮譽會讓你驕傲一生。Google院士通常是各自領域的世界領先專家,Jeff和Sanjay是「Google高級院士」——該公司第一個也是唯一兩個登上11級的工程師。
Google最頂級的兩位程序員Jeff Dean(左)和Sanjay Ghemawat(右)
「為什麼不結對編程呢?」
Google園區位於高速公路旁,距離山景城市中心只有幾分鐘車程,那是一群帶有色窗戶其貌不揚的矮建築。
去年夏天的一個周一,Jeff和Sanjay寫了一早上代碼後,來到一家名為Big Table的園區餐廳吃午餐,該餐廳以2005年他們參與開發的系統命名,該系統可以將無數計算機當成一個資料庫處理。Sanjay又高又瘦,穿著古老的栗色亨利汗衫,灰色褲子,戴著小框眼鏡。 他看到了外面的一張桌子,然後輕快地走了過去,撐開一把傘,在陰涼處坐了下來。他把另一張椅子搬到了太陽下面留給了Jeff,不一會兒Jeff過來了,穿著寬肩短袖襯衫,時髦的運動鞋。
他倆就像情侶一樣,你一言我一語講起了故事,一起回憶著早期的項目。
「當時我們手工寫代碼,「Sanjay說,他的眼鏡在陽光下變暗了。」我們重寫了那些代碼,寫完之後發現,哎,這好像是我們上個月剛寫的。」
「或許我們的索引數據略有不同,」Jeff補充道。
「或許略有不同,」Sanjay說,「所以我們才發現——。」
「這才是重點,」Jeff說。
「——這才是正常的情況。」Jeff最後說。
Jeff咬了一口他的披薩。他的手像水手一樣,疙疙瘩瘩很粗糙;相比之下Sanjay的手就顯得細皮嫩肉了,真不明白他們兩個人是怎麼成為一對的。「我也不太清楚我們是如何發現並肩作戰更好的。」他說。
「我們在未加入Google之前就並肩作戰了。」Jeff說。
「但我不知道為什麼我們倆人一起在一台電腦前工作,比在兩台電腦上更好。」Sanjay說
「在之前的公司的時候,我會從我的實驗室走兩個街區到他的實驗室去。」Jeff說,「路上有一家義大利冰淇淋店。」
「所以,你是為了那家義大利冰淇淋店。」Sanjay笑著說。
Sanjay沒有結婚,他與Jeff的兩個女孩和妻子Heidi一起去度假。Jeff的女兒叫他Sanjay叔叔,他們5個人經常在周五共進晚餐。Sanjay和大女兒Victoria一起學習烘焙。Sanjay自豪地說,「我看到他的女兒們長大了。」
2004年,Google首次公開募股後,他們分別搬進了相隔4英里的房子。Sanjay住在舊山景城一間不起眼的三居室;Jeff自己設計的房子靠近帕洛阿爾托市中心,他在地下室安裝了一個蹦床。在蓋房子的時候,他發現雖然他喜歡空間設計,但他並沒有耐心設計架構中「讓Sanjay來乾的方面」:梁、螺栓和負重等支撐宏偉設計的細節。
談到結對編程,Sanjay說,「我不知道為什麼別人不這麼做。」Jeff說,「你需要找到一個能在思維方式與你合得來的人,你們兩個人可以互補。」
他倆從桌邊起身,漫步走過Big Table與Google的員工群,開始回到軟體服務的工作中。兩個人之中Jeff更加急於發言,在回來的路上他分享了自己的軟體服務策略。他說,「我認為向上推進的方法可以增加穩定性。」Sanjay微笑著,專心地將巧克力和香草混合冰淇凌擠到了蛋捲筒里。
最佳程序員的效率是最差的十倍以上
社會學家Michael P. Farrell於2001年出版的《Collaborative Circles: Friendship Dynamics and Creative Work》一書中,對關係親密的創作群體(法國印象派,西格蒙德弗洛伊德及其同時代人)進行了研究。他寫道,「大多數奠定了新願景基礎的脆弱見解的出現時機並非整個團體一起工作時,也不是成員單獨工作的時候,而是當他們互相合作而且兩兩成對互相回應時。」
1869年夏天莫奈和雷諾阿並肩工作,這才有了印象派的風格;畢加索和喬治·布拉克在投身立體主義的六年合作期間,他倆經常只在畫布的背面簽名,以掩蓋每幅畫是由他們中的哪一位完成的。畢加索後來回憶道,「只有得到我倆共同的首肯,一幅畫作才算完成。」在《Powers of Two: Finding the Essence of Innovation in Creative Pairs》一書中,作家Joshua Wolf Shenk引用了1971年的訪談,約翰·列儂曾說道他和保羅·麥卡特尼中會有一人「寫出一段好的音樂,這很簡單,就像我今天看到了新聞或其他東西。」然後其中一人就會卡殼,直到另一個人到來,列儂說,「然後我唱一半,他會受到啟發寫下一點,反過來也一樣。」每個人都會有靈感匱乏的時候,但是很少有兩個人同時才思枯竭的時候。
在新科學或藝術的「理論建設」階段,廣泛探索而不陷入死胡同是非常重要的。弗朗索瓦·雅各布與雅克·莫諾一起開創了基因調控研究,他指出,在二十世紀中葉,分子生物學領域的大多數研究都是兩個人的結果。雅各布寫道:「兩個人共同設計理論和構建模型比一個人更勝一籌。因為兩個人共同處理同一個問題時,思緒更加輕易而且飛舞得跟快。它們可以在兩個夥伴之間來回跳躍,可以從彼此的思維之上衍生出新的想法來,就像一棵樹上的枝葉。在這個過程中,錯覺很快被扼殺在萌芽狀態。」在過去的35年里,大約一半的諾貝爾生理學或醫學獎都頒給了科學合作夥伴們。
經過多年的共同工作和生活,有時二人之間會產生一種私人語言,就像雙胞胎一樣。他們模仿彼此的衣著和習慣。彼此之間的幽默感互相滲透。在他們之間區分功勞已經不可能了。但是這種緊密的合作在軟體開發中並非常見。
雖然有時開發人員會提及「結對編程」(兩個程序員在一台計算機上編程,就好象一個「駕駛」而另一個「導航」),通常大家認為這種夥伴關係有點浪費資源,儘管這種結對其實就好象一架飛機上的兩個飛行員。相比之下,Jeff和Sanjay就好象一個大腦的左腦和右腦。他們的一些著名的論文有時多達十幾位合著者。Bill Coughran曾經擔任他們的經理,他回憶說:「他們結對工作非常多產,效率非常高,我們經常圍繞他們組建團隊。」
1966年,系統開發公司的研究人員發現,最佳程序員的效率是最差的十倍以上。從那以後,所謂的「10倍速程序員」的存在性一直存在爭議。這種說法是個人英雄主義,但軟體項目通常很龐大且是集體性的。在編程業界,很少有成就是孤立存在的。即便如此(也許諷刺的是)許多程序員都目睹了Jeff和Sanjay共同完成的工作,這正是10倍速程序員存在的證據。
1968 年的 Jeff 和 1966 年的 Sanjay
1968年7月,Jeff出生在夏威夷。他的父親Andy是一名熱帶病研究員,他的母親Virginia Lee是一位醫學人類學家,精通6種語言。Jeff和他的父親只為了好玩編寫了IMSAI 8080套件計算機。他們將升級程序接到機器上,仔細研究了每一部分。
Jeff經常和父母搬家。13歲的時候,他跳過了8年級最後3個月的課程,前往索馬利亞西部的一個難民營幫忙。後來,在上高中時,他開始為流行病學家編寫一個名為Epi Info的數據收集程序;後來該程序成了實地工作的標準工具,最終以十幾種語言發布了數十萬份。(有一個由疾病控制和預防中心維護的網站,名叫「Epi信息故事」,上面登載了Jeff高中畢業典禮上的照片。)Jeff在尼蘇達大學遇到了妻子Heidi,過了幾年她明白了該程序的意義。她說:「他沒有吹牛,我逐漸才得知的。」他們的第一次約會是在一場女子籃球比賽中。Jeff在啦啦隊里穿著地鼠的服裝。
在讀博期間,Jeff專註鑽研編譯器(這種軟體將人類寫的代碼轉換成經過優化的計算機指令)。Alan Eustace曾說:「編譯器非常無聊,一點也不性感。」但是,Jeff卻說:「它們可以讓你非常接近機器。」Sanjay用食指按摩著太陽穴說,「在寫代碼的時候,他會進入一種模式:這段代碼的性能如何?他會幾乎半自動地把所有極端的例子都考慮一邊。」
在17歲時上康奈爾大學之前,Sanjay沒有碰過電腦。1966年他出生於印第安納州西拉斐特,但在印度北部的工業城市哥打長大。他的父親Mahipal是一名植物學教授,母親Shanta負責照顧Sanjay和他的兩個哥哥姐姐。他們是一個書生氣很濃的家庭:他的叔叔Ashok Mehta曾買過一本弗雷德里克·福賽斯的著作《豺狼的日子》(The Day of the Jackal),裝訂磨損很嚴重,Ghemawat家的孩子們互相傳看了這本破舊的書。
Sanjay的哥哥Pankaj成了哈佛商學院有史以來最年輕的教師。(如今他是紐約州州立大學斯特恩商業學校的教授。)Pankaj和Sanjay就讀於同一所學校,而且Pankaj以多才多藝而聞名。Sanjay說:「我有點像是活在哥哥的陰影下。」他的這番話未免太謙虛了,2016年他任職於美國藝術與科學學院,但他沒有告訴父母,最後兩位老人還是從鄰居那裡得知的這個消息。
在麻省理工讀研究生期間,Sanjay結交了一群親密的朋友。儘管如此,他從來沒有約會,即便是現如今他的約會也是「非常非常罕見」。他說他不打算組建家庭——這只是他的生活方式。他的好朋友都知道不要催促他,而他的父母在很早以前就接受了他們的兒子將孤老終生的事實。
也許是因為他太注重隱私,在Google他是一個充滿了神秘色彩的男人。大家都知道他很安靜但很淵博,一個深刻且不同尋常的人。他的辦公桌上總是放著一疊Mead的筆記本,這些筆記本可以追溯到近二十年,裡面寫滿了整潔的清單和圖表。他喜歡用鋼筆寫草書。他很少翻看舊的筆記本,只是為了思考才寫下來。
在麻省理工期間,他的研究生指導員是Barbara Liskov——一位有影響力的計算機科學家,她的研究方向是複雜代碼庫的管理。在她看來,最好的代碼就像一篇好文章,需要精心實現的結構,每個字都不可少。以這種方式編程需要站在讀者的角度考慮。而且這也意味著代碼不僅僅是為了達到目的的手段,而其本身就是作品。Craig Silverstein曾說:「我認為他最擅長的是設計系統,你可以看看Sanjay所寫的代碼文件,就像一件比例勻稱的雕塑那般美麗。」
在Google,大家更熟悉Jeff。有人模仿Jeff Dean,就像有人仿照查克·諾里斯。(查克·諾里斯數數時會一直數到無限大…而且會數兩次;Jeff Dean的簡歷上寫的是他沒有做過的事情——因為這樣的話簡歷會更短一些。)對於那些了解他們兩個的人來說,Sanjay也同樣是天才。「Jeff非常善於提出瘋狂的新想法和原型設計,」與他們長期共事的同事Wilson Hsieh說,「而Sanjay構建的東西能用很長時間。」在生活中,Jeff更外向,Sanjay更內向。而在代碼中,情況正好相反。Jeff的代碼令人眼花繚亂,他可以迅速勾勒出令人吃驚的想法;但是,因為他是本著發現的精神快速完成的,所以讀者往往跟不上。Sanjay的代碼則比較合群。
Silverstein說:「有些人的代碼太鬆散了,一屏的代碼信息量非常少,你需要來回滾動才能搞清楚。而有些人的代碼過於密集,看著那些代碼,你不禁會想:我不想看這些代碼。Sanjay卻可以做到折中。看著他的代碼,你會想:好的,我也可以搞懂這些代碼。但是,你也可以從一頁代碼中獲得很多信息。每當我想往Sanjay的代碼添加新功能時,就感覺是水到渠成的事兒。我感覺像薩列里。我知道這很偉大,但是我不明白他是如何做到的。」
「今天我和 Sanjay 又將 Google 搜索速度提高了10%」
今年春天的一個周一早上,Jeff和Sanjay站在40號樓的小廚房裡,那裡是Google人工智慧部門的所在地。他們身後的白板畫滿了矩陣代數,桌子上放著一張無監督對抗網路的論文。Jeff身穿褪色的T恤和牛仔褲,看起來像是一個改良的沙灘流浪漢;Sanjay則穿著毛衣和灰色褲子。明亮的窗前是一片高大的松樹,還有一片田野。無論Jeff在Google的哪裡辦公,公司都會為他準備好咖啡機。小廚房的櫃檯上,一台三英尺寬的拉瑪佐科咖啡機正在嗡嗡作響。Sanjay站在咖啡機邊上說,「我們遲到了」。時間顯示8點32分。
喝完卡布奇諾後,他們走到電腦前。Jeff從自己的桌子前將一個髒兮兮的椅子挪到Sanjay椅子邊上,而Sanjay椅子卻一塵不染。Jeff把一隻腳搭在文件柜上,靠在後面上,而Sanjay則打量著眼前的屏幕。他們開了4個窗口:左側是Web瀏覽器和終端,用於運行分析工具;右邊是文本編輯器Emacs中的兩個文件,一個是待辦事項列表和筆記本,另一個是花花綠綠的代碼。Sanjay的一個筆記本放在電腦旁邊。
「好了,我們干到哪兒了?」Sanjay問。
「我記得上次我們正在研究TensorFlow Lite的代碼大小。」Jeff說。
這是一個與機器學習相關的重要的新軟體項目,Jeff和Sanjay擔心它會膨脹;他倆就像書籍編輯一樣,尋找可以刪減的地方。為了這個任務,他倆構建了一個新工具,而這個工具本身又需要優化。
「上次我正在努力搞清楚它究竟有多慢。」Sanjay說。
「非常慢。」Jeff說著身體向前傾,但仍然很放鬆。
「所以上次是120K位元組,」Sanjay說,「大概花了8秒吧。」
「是12萬次堆棧調用,」Jeff說,「不是120K位元組。」
「是文本的千位元組,大概是這個數字。」Sanjay說。
「哦,對,不好意思。」Jeff說。
「我不是很確定我們應該為每個單元設定多大的閾值,」Sanjay說,「半兆?」
「可以啊,」Jeff說。Sanjay開始敲鍵盤,Jeff緊盯著屏幕。「你說這個大小隻要比我們的樣本大就……」他沒有把後面的話說出來,因為他看到了Sanjay寫入代碼中的答案。
開車時,Sanjay會把手放在十點和兩點,然後專心地看著前方。敲鍵盤的時候也一樣。他的雙腳分開與肩同寬,看起來很像他工作時的樣子。他細長的手指輕輕划過鍵盤,一串串新代碼便源源不斷地流淌進了屏幕里。
不久,他們完成了一小段工作,Sanjay鍵入了一個命令來測試他們的進展。 他看起來很疲憊,在運行測試的時候他檢查了一下郵件。測試結束了,但他卻沒有注意到。
「嘿,」Jeff打了一個響指,指著屏幕說。雖然在談話中大家會用笑話和雙關語拿他開玩笑,但當坐在Sanjay的電腦前時,他會變得固執己見、無理並表示不贊成。Sanjay很大方地接受了這些。當他覺得Jeff太快時,他會把手從鍵盤上拿下來,並張開五指,表示「停」。(一般來說,Jeff是加速器,Sanjay是剎車)。即使他們之間發生爭論時也是如此:在20年的相處時間裡,他們不曾有過一次高聲爭吵。
Sanjay滾動滑鼠,將新代碼部分顯示出來。「看起來這些都可以放到個函數里,對吧?」Jeff說。
「嗯。」Sanjay同意了。
Jeff一邊把手指關節掰得啪啪響,一邊說,「似乎可行。 我們應該這樣做嗎?」
Sanjay很謹慎說:「我覺得……」
「那我們就這麼無視一個問題?」Jeff有點憤怒地說。
「不,我的意思是說,我們只是在設法了解事情的真相。所以我們先記下來吧?」
「好吧。」Jeff愉快地說,他的心情真是陰晴不定。他們一起寫了個注釋。
快到午餐時間了。他們工作了兩個小時,所以現在可以休息10分鐘,在這段休息時間裡大部分時間他們都在交談。(如果一般的程序員看到他們會留下深刻的印象,因為他們從未停止或卡殼。)按照標準的工程實踐,程序員寫的代碼都需要經過別人的審核,但Jeff和Sanjay跳過了這一步,在他們的日誌中簡單地寫上一筆「我看沒問題。」從某種意義上說,他們的工作中充滿了細枝末節。但是他們的代碼是在Google的規模下執行的。他們所擔心的千比特和微秒數,放到世界各地的數據中心(這些吵雜、熱氣衝天的大庫房中容納了無窮無盡的處理器,以及冷卻這些處理的大水桶)會增加幾十億倍。在這樣的日子裡,Jeff回家後就會對他的女兒說,「今天我和Sanjay又將Google搜索的速度提高了10%。」
MapReduce和 Hadoop 問世
2003年,Jeff和Sanjay花了4個月的時間,給Google來了一次最大的升級。他們通過一款名為MapReduce的軟體實現了這次升級。在第三次重寫Google的抓取工具和索引器時,他們想到了這個點子。每次解決完一個重要的問題,他們就會面臨這樣一個難題:協調大量地理位置上分散且不可靠的電腦。概括地說,他們的解決方案就是:避免一次又一次地重新面臨這個難題。而且還需要創建一個工具,讓Google所有的程序員都可以通過這個工具來運行數據中心的機器,就好像它們是一台地球那麼大的計算機。
Jeff和Sanjay在一間位於牆角可以俯瞰鴨子池塘的辦公室里寫完了MapReduce,這個工具為一個令人費解的過程設置了步驟與方法。在MapReduce問世之前,每個程序員都必須弄清楚如何分割和分發數據、分配工作並自行解決硬體故障。MapReduce針對這些問題,為編程人員提供了一種結構化的思考方法。就好像廚師備菜(提前準備材料),MapReduce要求程序員將他們的任務分成兩個階段。首先,程序員告訴每台機器如何完成「映射」階段的任務(比如,計算一個單詞出現在網頁上的次數);然後,程序員編寫命令「規約」所有機器的結果(比如,求它們的總和)。MapReduce會處理分發的細節,因此,程序員就不必考慮這些細節。
第二年,Jeff和Sanjay利用MapReduce重寫了Google的抓取和索引系統。很快其他工程師就意識了這個工具的強大之處,他們紛紛開始使用MapReduce處理視頻,並在Google地圖上渲染圖塊。MapReduce非常簡單,使用方法不言自明。Google擁有所謂的「晝夜使用曲線」 (白天的流量比夜間更多),而MapReduce可以利用閑置時期的資源。大腦在做夢期間處理白天的經歷。而Google則可以處理它的數據。
早些時候的跡象表明Google是一家冒充搜索公司的AI公司。2001年,Noam Shazeer曾與Jeff和Sanjay在同一間辦公室工作,他曾經對Google從另一家公司購買的拼寫檢查大失所望:它經常犯一些令人尷尬的錯誤,例如告訴那些輸入了「TurboTax」的用戶,他們是不是想找「turbot ax」(turbot是一種生活在北大西洋的比目魚)。拼寫檢查器的好壞取決於它的詞典,Shazeer意識到在網路上,Google擁有有史以來最大的詞典。於是,他編寫了一個程序,利用網上文本的統計屬性來確定哪些單詞可能有拼寫錯誤。該軟體了解到「pritany spears」和「brinsley spears」都意味著「布蘭妮·斯皮爾斯」。Shazeer在Google每周的「謝天謝地終於周五了」聚會上演示了他的程序,大家都去嘗試騙該程序,但是大部分人都失敗了。Shaze與Jeff以及一位名叫Georges Harik的工程師合作,採用類似的技術將廣告與網頁相關聯。廣告定位成為了公司源源不斷的資金,他們將這筆錢投入到了計算機基礎設施上。從此以後就形成了反饋循環,即巨大是Google智能的源泉;而智能是財富的源泉;財富又是其發展的源泉。如此這般,便成就了卓越、令人心驚、佔據主導地位的Google。
由於富有進取心的程序員不斷地利用MapReduce挖掘Google數據的潛力,因此Google可以將用戶的語音郵件轉譯程文本,自動回答他們的問題,並在100多種語言之間互譯。這些系統都是利用相對簡單的機器學習演算法開發的。即使是「非常簡單的技術,如果你擁有大量數據,那麼也可以發揮大作用,」Jeff說。隨著「數據,數據,數據」(使用BigTable、MapReduce及其後續產品進行存儲和處理)成為該公司最高指導原則,Google的全球基礎架構變得越來越完美無瑕和靈活。分散式計算的想法很古老,「雲計算」和「大數據」之類的概念在Google崛起之前就有了。但是,Jeff和Sanjay通過讓普通編程人員也能智能地管理分散式程序,讓Google對這項技術的掌握程度到了一個新的高度。用戶可能已經感覺到了變化:Google雲越來越聰明了。
2004年,因為Jeff和Sanjay認為MapReduce對天文學家、遺傳學家和其他需要大量數據處理的科學家都很有用,所以他們寫了一篇論文「MapReduce:大型集群上的簡化數據處理」,並公之於眾。MapReduce的論文就像一個天外救星。廉價的硬體以及Web服務和連接設備的增長導致了數據的泛濫,但很少有公司擁有處理這類信息的軟體。兩名工程師(Mike Cafarella和Doug Cutting)一直在努力擴展一個名為Nutch的小型搜索引擎,他倆非常相信MapReduce的重要性,所以他們決定從零開始構建一個一樣的免費系統。他們最終稱他們的項目為Hadoop(根據Cutting兒子子喜歡的大象毛絨玩具取得名字)。
隨著Hadoop的成熟,超過半數的財富五十強都採用了這個系統。它成了「大數據」的代名詞。Facebook使用了人們俗稱的「Hadoop MapReduce」來存儲和處理用戶元數據(點擊內容、點贊內容、以及觀看的廣告等信息)。它曾一度擁有世界上最大的Hadoop集群。Hadoop MapReduce還幫助推動了LinkedIn和Netflix的發展。國家安全局前技術總監Randy Garrett曾向該機構的主管General Keith Alexander展示過這項技術。Hadoop執行的分析任務比以前的系統快18000倍,它成為了一種新型的情報收集方法的基礎,一些觀察者稱之為「統統收集起來」。
Jeff領導開發的 TensorFlow
Jeff天生坐不住,一旦他看到解決方案的大致模樣後,就不會對問題那麼感興趣了。2011年,當全世界都在擁抱雲計算時,他開始與斯坦福大學的計算機科學教授Andrew Ng合作,當時Andrew Ng正在領導Google的一個秘密項目,研究神經網路(由虛擬的「神經元」組成的軟體程序),Jeff在大學期間接觸過神經網路;當時神經網路還無法解決現實世界的問題。Ng告訴Jeff,這種情況正在改變。在斯坦福大學,當研究人員賦予了這種網路大量數據的訪問時,他們取得了一些令人興奮的結果。Ng認為,憑藉Google的規模,神經網路不僅會有用,而且還能變得十分強大。
神經網路與傳統的計算機程序截然不同。程序員從來無法通過常規的方式指定它們的行為;相反,它們通過輸入「學習」並提供反饋。自從大學畢業以來,Jeff對神經網路的了解就沒有太大進步,而Heidi只能忍受他們的衛生間塞滿教科書。Jeff開始每周花一天時間參與這個被稱為「Google Brain」的項目。Google的許多人對這項技術表示懷疑。「多麼浪費人才,」他當時的經理Alan Eustace回憶道。Sanjay也無法理解Jeff的行為。「你不是在做基礎設施的工作嗎?」他想,「那你去那個項目幹什麼?」
在那之後的7年里,Google Brain團隊開發出了神經網路,在機器翻譯、語音和圖像識別方面擊敗了當時最先進的技術。最終,他們取代了Google最重要的搜索結果和定位廣告排名演算法,而Google Brain成為該公司發展最快的團隊之一。 2001年加入Google的工程師Claire Cui表示,Jeff的參與標誌著AI在Google發展的轉折點:「有人相信這項技術,而有人不信。Jeff會證明這項技術可行。」
事實證明,AI取決於其規模,這是系統工程師Jeff發現的。作為工作的一部分,他領導開發了一個名為TensorFlow的程序——他嘗試創建AI版的MapReduce。TensorFlow簡化了在一組計算機上分配神經網路的任務,並將這些計算機轉化成一個大腦。2015年,當TensorFlow向公眾發布時,它成為了AI的通用語言。最近,Google的CEO Sundar Pichai稱其為「AI第一」的公司,並任命Jeff為AI計劃的負責人。
現如今,Jeff每周花4天時間在Google Brain上。他領導著3千人的工作。他需要出差進行會談,召開每周的會議,研究新的計算機晶元(Tensor Processing Unit,專為神經網路設計的晶元),並幫忙開發AutoML——這是一個利用神經網路設計的其他神經網路的系統。每周他只有一次機會與Sanjay一起寫程序。
「Sanjay,那是你的辦公室!」
工程上的豐功偉績往往會自我匿跡。我們記得十八世紀偉大的探險家詹姆斯庫克和喬治溫哥華,卻不記得約翰哈里森,他是約克郡的木匠,經過幾十年的努力,他做的鐘錶足夠可靠,甚至可以在海上計算出經度。最近有一次,Jeff和Sanjay正在Palo Alto Sol(他們經常光顧的墨西哥餐廳)享用瑪格麗塔和辣醬玉米餅餡。Jeff拿出手機問道:「Gmail第一次亮相是什麼時候?」電話回答說,「2004年4月1日。」對社交場合很敏感的Sanjay似乎不喜歡餐桌上的談論別的事情,但Jeff卻一副興高采烈的樣子。如今,Google可以通過一系列程序與人交談、傾聽並回答問題,這些程序無縫集成而且基本上不可見,可以從他的手機延伸到世界各地的數據中心。
現如今,他們的職務有了不同。在Google,Sanjay是所謂的「個人貢獻者」 ,他獨自工作,不負責管理任何人。他對比表示感激。他說,「我可不想要Jeff的工作。」目前他正在開發一款軟體,讓工程師們能夠更輕鬆地組合和控制幾十個程序(比如獲取新聞、照片、價格),用戶只需在Google搜索框中輸入文本就可以運行。每周一次,他與一群「區域技術主管」(Google的工程絕地委員會)會面,決定影響整個公司的技術決策。如果說Google是一棟房子,那麼Jeff正在蓋新的房間,而Sanjay正在支撐結構,加固橫樑,擰緊螺栓。
與此同時,在周一的編程會議期間,他們會開始一些新鮮的事物。那是一個AI的項目:Jeff說這是一種嘗試,他們想要訓練一種「巨型」機器學習模型來完成數千或數百萬種不同的任務。多年來,Jeff一直在考慮這個想法,最近他覺得這個想法是可行的。他和Sanjay計劃建立一個原型,然後圍繞該原型組件一個團隊。在軟體的世界裡,最好的領導方法是利用代碼。
Jeff的妻子Heidi說:「我覺得他們很想念對方。」當他們的合作放慢後,他們開始在周五共進晚餐。
3月的一個周日,Jeff和Sanjay相約去庫比蒂諾來一次戶外遠足。那天天氣晴朗,陽光明媚,但是太陽有點大。Jeff開著藍色的特斯拉跑車(車後貼著Bernie 2016的保險杠貼紙)來到了出發口。緊隨其後的Sanjay開著自己的特斯拉,那是一輛紅色的Model S。整個早上Sanjay一直在讀書。而Jeff去踢足球了。與他的小腿相連的裝置說他跑了7.1英里。距離那個構建索引的3月已經過去20年了,Jeff就像一個退役的耐力運動員,他的皮膚被太陽曬壞了。Sanjay卻容顏未改。
那是一條長約6英里長的環路,需要穿過茂密的森林。Jeff一路領先。他們在樹林里追憶Google發展得如此迅速。Sanjay回憶說,在公司第一次猛增期間,一名水管工在男廁所的一個位置上安裝了兩個廁所。他說,「我記得Jeff當時說,兩個頭好過一個!」他大笑道。
他們從樹林里下來,踏上了一片乾燥裸露的地面。土耳其禿鷹從頭頂飛過。
「這裡的山丘比我想像的要陡峭。」Jeff說。
「不是有人曾經說這裡非常平坦的嗎?」Sanjay說。
「我猜這就是為什麼沒有騎自行車的路了。」Jeff說。
他們爬回了樹林里。在蜿蜒的小路上,Jeff瞥了一眼頭頂的樹木,然後說:「我們應該能找到一個絕佳的欣賞風景的地方。」
小徑通向山頂,那裡又高又寬,沒有樹木,可以美美地享受風景。地平線上有一片陰霾。不過,他們可以看到南面的聖克魯斯山脈和東面的使命峰。「Sanjay,那是你的辦公室!」Jeff說。他們肩並肩站在一起,望著山谷。
原文:https://www.newyorker.com/magazine/2018/12/10/the-friendship-that-made-google-huge
作者:James Somers
譯者:彎月,責編:郭芮
微信改版了,
想快速看到CSDN的熱乎文章,
趕快把CSDN公眾號設為星標吧,
打開公眾號,點擊「設為星標」就可以啦!
※為什麼好的程序員會寫出糟糕的單元測試?
※架構師究竟要不要寫代碼?
TAG:CSDN |