谷歌基情實錄:和Jeff Dean在同一臺電腦上寫程式碼

大資料文摘發表於2018-12-10

谷歌基情實錄:和Jeff Dean在同一臺電腦上寫程式碼

大資料文摘出品

編譯:DonFJ、周家樂、李雷、小七、胡笳、jin、錢天培

單絲不成線,孤木不成林,渾身是鐵也打不成幾根釘子。

谷歌的偉大有一多半要歸功於公司中親密無間、協同工作的程式猿們!向偉大的猿類童鞋致敬!

今天,就讓我們翻開谷歌程式設計師們的基情實錄,扒一扒《紐約客》筆下谷歌兩大元老——Jeff Dean和Sanjay Ghemawat“手拉手”走過的那些年。

故事從這裡開始!

2000年三月某日,六位谷歌的頂尖程式設計師齊聚一堂,眉頭緊鎖,當時谷歌正處於前所未有的緊急狀態。

公司的核心繫統罷工了,也就是那個爬取各種網頁然後建立索引的爬蟲系統。它要是罷工了,新產生的網頁和新聞都沒法被檢索到了!所以,就算這時候使用者還能湊合的在google.com上輸入檢索資訊,但是得到的結果都是五個月前的內容了。

這個事兒其實挺嚴重,因為當時的谷歌還不是現在這個龐然大物,他們需要資金需要錢,那就要向外界展示他們技術沒問題!

當時谷歌還剛好正在和雅虎談專案,為雅虎提供搜尋引擎。谷歌承諾提供一個比當時谷歌搜尋引擎還大十倍的索引,為什麼要這麼大的量呢,因為按照當時的情況,網際網路上的資料一年翻一倍(現在豈止一倍……),那這個索引剛好能小跑兒地跟上時代的步伐。

如果谷歌失敗了,建立不了這麼大的索引,那他們就會淪為一個時間膠囊,檢索的結果還都是老內容,而且跟雅虎談好的生意肯定崩了,谷歌就很有可能面臨著資金鍊斷裂然後GG的結果。

為了解決這個問題,工程師們紮營在一間靠近樓梯的會議室裡,鄭重的開啟他們的電腦。

Craig Silverstein是谷歌的第一個員工,在兩位創始人們還在自己家創業的時候就已經跟著他們混了。Silverstein當時還是個27歲意氣風發的小夥子,工程能力極強,重寫了很多谷歌的程式碼。他和Bogdan Cocosel,一位羅馬尼亞的系統工程師搞了四!天!四!夜!但是一無所獲……(是的,都是套路,先誇上天,然後pia!踹倒~)

Silverstein在回憶這段經歷的時候說,“額了個神,鬧鬼了,我們分析了半天找了半天試了半天搗鼓了半天呀!都沒用……我們真的弄不明白這是為什麼!”

在Silverstein抓耳撓腮的這幾天裡,坐他左手邊,一個默默無聞的程式設計師卻有了點思路。

Sanjay Ghemawat是一位33歲的MIT畢業生,生得是豹頭環眼,但兩鬢黑髮已經花白。Sanjay幾個月前才進入公司,跟他一起來的還有一位叫做Jeff Dean的童鞋。Dean原來在一家數字裝置公司工作,後來跳槽到谷歌。

Dean和Sanjay原來也經常在一起玩耍,後來Dean離開了華盛頓DC,Sanjay也跟著過來了。他們兩個關係特別好(unusually close),老喜歡一起寫程式碼。

在辦公室裡,Jeff把椅子推到了Sanjay桌子旁邊,自己的桌子空著。Sanjay敲程式碼的時候,Jeff就一邊兒斜靠著他,一邊兒在Sanjay耳邊指正他的錯誤,不時的還調戲一下Sanjay。

上面的畫面太美……我們繼續說索引失敗的問題!

Jeff和Sanjay也加入奮戰大軍,開始嘗試找到問題的根源。他們發現程式碼裡面有些單詞漏掉了,還有些單詞拼錯了。好幾天以來,他們都在尋找程式碼中的漏洞,一點點剝絲抽繭的查程式碼邏輯錯誤。慢慢的,所有的程式碼都查完了,但還是找不到問題。

程式設計師查bug也是有邏輯的,通常會分成很多層。先是最上面的使用者互動邏輯層,然後是程式碼實現層,資料層等等等等,一直到最底的硬體層。

當查到最底下的硬體層的時候其實是最困難的,因為那裡都是0、1組成的世界,是晶片中矽元素的碰撞,和高低電平之間的互動。

某個在互動層一眼就能看明白的東西,在底層世界你要花半個小時才懂得是什麼。終於,在第五天的時候,Jeff和Sanjay開始意識到問題可能不是出在程式碼上,而是出在硬體的物理層上!他們將索引的檔案以二進位制的形式開啟(是的,就是一堆0xblablablabla或者0101010001010的東西),然後嘗試從這堆看著跟亂碼一樣的內容中找到問題。

谷歌基情實錄:和Jeff Dean在同一臺電腦上寫程式碼

在Sanjay的螢幕上,密密麻麻的出現了一堆1和0,每一行代表一個索引詞。Sanjay一點一點的檢視檔案,說,這裡應該是0,居然變成了1.當Jeff和Sanjay耐心至極的將所有排列錯誤的單詞彙總到一起的時候,他們發現了共性!每個單詞中都有同樣的故障!

矛頭緊指一個目標,他們伺服器的記憶體!不出意外的話,是記憶體條出問題了。

Sanjay看著Jeff,這個結果其實並不意外。最近幾個月,公司內部硬體損壞事故頻發!

隨著公司規模的迅速擴大,谷歌對計算裝置的需求與日俱增,需要購入更多的裝置。對於單獨的計算機硬體來說,它壞掉的概率很低,但是如果你有大量的計算機的話,那麼故障就總是會發生(概率問題嘛~100臺故障率0.01的裝置中出現故障的概率可是高達63.4%的哦)。

什麼電線斷了、硬碟壞了、主機板過熱等等的問題接踵而來。甚至有的機器一開始就沒有工作,有的莫名其妙用著用著就慢了等等,各種問題五花八門。

據說當超新星爆炸的時候,爆炸波會產生高能粒子,這些粒子會向各個方向散射。科學家認為其中一種叫做cosmic射線的粒子極有可能擊中地球上的計算機晶片,然後讓0變成1……(聽著怎麼那麼像那些賣硬碟公司的軟文)。

為了防止這種問題,NASA和大批有錢有勢的公司都購入一些特殊的硬體來避免這個問題的發生。

谷歌那時候還是個沒錢的創業公司,苦哈哈的活著,買不起這麼高階的東西。但是當時的谷歌在業務上已經進入了轉折點,它慢慢的長大了,擁有的叢集數量開始特別龐大,大到硬體的損壞頻發!

所以在瞭解問題的根本之後,Jeff和Sanjay寫了很多程式碼來避免讓機器再出現類似的問題。那之後很快,新的索引就能夠建立辣~那個在樓梯旁邊的作戰指揮室自然而然解散鳥。

Silverstein很苦惱,他本來是一個很好的程式設計師,很擅長處理bug的。但是解決bug的真諦是弄清楚事情的根源。Silverstein挖得不夠深,相反,Jeff和Sanjay才真正的刨到了問題的根兒。

在這場三月風波之前,谷歌的系統都是植根於兩位創始人的核心程式碼上,而寫程式碼的時候他們還都是史丹佛的學生。兩位創始人Page和Brin都不是專業的軟體工程師,他們更像是個實驗室的研究人員,用自己在搜尋領域的學術知識搭建一個原型系統。

當他們的網路爬蟲GG的時候,系統沒能提供錯誤資訊,最多的就是輸出一句不痛不癢的:“我勒個去!(Whoa,horsey!)”。

谷歌的早期員工將Page和Brin寫的BigFiles系統戲稱為BugFiles。系統中最重要的索引部分程式碼需要好幾天才能寫完,如果它遇到問題的話,必須要從頭開始一點點排查才能解決。所以當時矽谷說谷歌搜尋引擎無法擴充套件(Google wasn’t “scalable”)。

要搞懂這個問題還要先了解“搜尋”在網路世界到底是如何進行的。

我們常說,我們是在網際網路上搜尋,但其實並非如此。我們能看到的結果依賴於搜尋引擎,搜尋引擎會用網路爬蟲到網路的各種地方來將資訊下載下來,然後建立索引。我們們能看到的結果只是索引庫中有的內容而已。

當谷歌還叫BackRub的時候,大概是1996年,當時的索引庫特別小,就安裝在Page宿舍的電腦上。但是在2000年的時候,索引就已經特別龐大,按照當時的技術,根本沒有任何超級計算機能夠將全部的內容放在上面處理。

在當時來說,唯一的解決方案就是買很多計算機,然後想辦法讓他們一起工作(就是我們知道的叢集)。可是以當時谷歌的資金情況來看,是買不了特別多全新的裝置的,所以他們的裝置中一半都是用到的別人淘汰的垃圾裝置,包括軟盤驅動、金屬託盤之類的。然後為了保證裝置的可用性,谷歌會向生產商購買“芯兒”,就是主機板和硬碟之類的東西,再把他們拼到一起使用。在加利福尼亞谷歌的一棟大廈裡,有1500臺這樣的混用裝置堆在六英尺高的機架上。但是由於故障等等原因,其中只有1200臺能使用。再微小、再偶然的故障,也會讓系統崩潰。

為了能讓系統工作下去,谷歌不得不將它的系統整合成一個天衣無縫的整體!

於是乎,Jeff和Sanjay一起並肩為這項工作而努力。

2000年11月,一個名叫Wayne Rosing的程式設計師加入了谷歌,並開始管理百人工程團隊。之前,他曾在Apple公司負責Macintosh專案的前期工作。

Wayne Rosing如此評價Jeff和Sanjay,“他們都是領導者”。

他們每週奮戰90個小時來編寫程式碼(平均每天超過12小時!),以確保一個微小的硬碟故障不會導致整個系統的癱瘓。他們在爬蟲程式中新增各種檢查點,以確保程式能夠在程式中途自動重啟。通過開發新的程式設計和壓縮方案,他們迅速高效實現了系統容量的翻倍。

簡直是兩隻行走的、機械般無情的優化器啊!

當汽車在轉彎時,它的外輪必須覆蓋更多的地面;同理,旋轉硬碟的外邊緣必須比內邊緣移動的更快。Google已經將執行最流暢的程式資料移動到了硬碟外緣,因為這樣後臺智慧傳送服務能夠在頭部讀取式的程式中運轉更快,並同時把內部空間留空。Jeff和Sanjay利用這些空間來儲存普通式搜尋查詢所需的預處理資料。

在2001年的四天中,他們證明了Goolgle的索引可以使用快速的隨機存取式儲存器,而不是相對儲存較慢的硬碟,這一發現使得公司的財務狀況實現了逆轉。

Page和Brin 很清楚,使用者將會湧向能夠迅速提供答案檢索服務的產品。關鍵問題是檢索速度需要匹配相應的計算能力,而計算能力需要成本投入。Jeff和Sanjay對軟體進行了見縫插針般的精細打磨

2005年,在Rosing離開團隊後,Alan Eustace繼任了工程師團隊的負責人。

“想要解決一定規模的問題,相應的,你必須瞭解最微小的細節”,Eustace說。

Jeff 和 Sanjay對計算機的瞭解已經達到了位元組級別。Jeff曾經發布過一個名為“每個程式設計師都應該知道的延遲數列”的列表。事實上,幾乎沒有程式設計師知道這個數字列表:引用L1快取通常需要半納秒,或者在記憶體中順序讀取一兆位元組通常需要250微秒。這些數字都深深印刻在了Jeff和Sanjay的腦海中。當他們多次幫助Google進行核心軟體的改寫後,其系統容量提升了幾個數量級。同時,在Google公司龐大的資料中心內,技術人員們正遵循軟體生成的指示,沿著曲曲折折的路,分部的替換硬碟、電源和記憶體條等裝置。就算存在部分脫軌或當機的情況,整個系統程式仍可健康執行。

今天,谷歌的工程師們從巨大生存鏈條中的1級水平開始成長。處在鏈條最底層的是IT支援人員。處在2級水平的是大學畢業生,3級水平的通常是碩士畢業生。想要達到4級,通常需要數年的積累,或者獲得博士學位。大多數工程師的成長程式都停留在第5級。

達到第6級的工程師們,是群體中的前10%,可以說他們所具有的能力是專案獲得成功的重要原因。7級工程師是具有老資歷的工程師們。首席工程師們,屬於8級別,通常都與某個主要產品或某項基礎設施相關聯。傑出的工程師們,屬於9級別,通常都已獲得極大的尊敬。成為Google的合夥人,即達到10級,能夠獲得伴隨自己一生的榮譽。Google的研究員們通常都是世界範圍內各領域的領軍人物。

Jeff和Sanjay都是Google的高階合夥人,是公司內第一批也是唯一的兩位11級工程師(神一樣的工程師!!!)。

Google的園區坐落在離市中心幾分鐘的高速公路旁,其山頂視角可縱覽風光。園區內是成片的低層建築,窗戶雖是彩色的卻毫不張揚。

去年夏天的某個星期一,經過一上午的集體程式設計,Jeff和Sanjay去了一家名為Big Table的園區自助餐廳吃午飯。這個餐廳是以2005年他們協助開發的一個系統命名的,該系統能夠把無數的計算機都識別為獨立的資料庫。Sanjay又高又瘦,他穿著一條古老的栗色Henley上衣,搭配灰色的褲子,並佩戴了一副小巧的金屬框眼鏡。他發現外面有一張桌子,便快步走過去,開啟傘,在陰涼處坐下。他又額外拉了一把椅子留給Jeff。一分鐘後,穿著短袖襯衫和時尚運動鞋的Jeff來了。

Jeff和Sanjay就像一對夫婦,你一言我一語的,從早期的那些專案開始共同回憶起他們的故事。

“我們可都是手寫程式碼,”Sanjay說到。他的眼鏡在陽光下顯得更暗了。“我們不停修改、重寫,可始終感覺跟上個月寫的比沒什麼長進。'”

“或者說只是索引資料中的傳遞方式略有不同,”Jeff補充道。

“而這些細小的差別,”Sanjay說。“就是我們得突破口”
“這才是本質,”Jeff說。

“…這是常見的模式,”Sanjay做了個總結。

Jeff吃了一口手裡的披薩。他的手指看起來就像低等水手那樣指節粗大、皮膚粗糙;相比之下Sanjay看起來精緻得多,連他自己都好奇他們是怎麼湊成一對的。“我也不太清楚那時候我們究竟怎麼了竟然會覺得湊一對會更好,”他說。

“我們來谷歌之前就開始這麼合作了,”Jeff說。

“不知道為什麼,我們就是覺著兩人共用一臺電腦會更利於合作”,Sanjay說。

“我願意從我的D.E.C.研究實驗室走兩個街區去他的D.E.C.實驗室,“Jeff說。“中間還有一家冰淇淋店。”

“這麼說是因為冰淇淋店咯”,Sanjay帶著微笑說道。

Sanjay至今還是單身,所以他經常和Jeff一家一起度假,包括Jeff的兩個女兒和妻子Heidi。Jeff的女兒們親切的稱呼他為Sanjay叔叔,他們五人還經常在週五一起聚餐。Sanjay和Jeff的長女維多利亞有時會一起烘焙。

“我可是看著他的女兒們長大的,”Sanjay自豪地說道。2004年Google I.P.O.之後,他們各自搬進了相隔四英里的房子。Sanjay住在Old Mountain View的一間很普通的三居室裡;Jeff則在Palo Alto市中心附近自己設計了一套別墅,還在地下室安裝了一個蹦床。

在房子裡工作的時候,Jeff發現雖然他喜歡設計自己的空間,但他實在無法忍受他所謂的帶有“Sanjay風格“的部分:屋樑,螺栓和載重這些細小的部分讓他那些偉大的設計避免了分崩離析。

“我不懂為什麼其他人不像我們這樣,”Sanjay說,“可以湊成一對一起程式設計。”

Jeff說:“你需要找到一個與你思維方式一致的人和你結對程式設計,這樣你們兩個人可以互相彌補。

他們推開桌子站起來,穿過Big Table和那些忙碌的谷歌人,出發去尋找好吃的甜筒了。他們兩人之中,Jeff更熱衷於表達,即使走在路上他還在闡述他的甜筒策略。“我覺得一邊擠冰激凌,一邊把甜筒往上推的策略更有穩定性。”他說到。Sanjay則帶著微笑專注地往他的甜筒裡繞上更多的巧克力香草冰淇凌。

在社會學家邁克爾•法瑞爾(Michael P. Farrell)2001年出版的《協作圈:友誼動機與創造性工作》(Collaborative Circles: Friendship Dynamics and Creative Work)一書中,他對相近的創作型群體進行了研究,包括法國印象派畫家、西格蒙德•弗洛伊德(Sigmund Freud)及其同時代的人。

他在書中寫道:“大多數新願景,並非起源於整個團隊的協商,也不是單個成員的獨立構想,而是他們在合作時相互激發出來的”。莫奈(Monet)和雷諾阿(Renoir)曾在1869年的夏天並肩工作,才開創了印象派畫風;畢加索(Pablo Picasso)和喬治·布拉克(Georges Braque)在六年的合作期內,都經常在畫布背面簽名,以混淆他們的作品,是以產生了立體主義。畢加索後來回憶道,“一幅畫只有我們倆都認同它完成了,它才能算真正的成品”。

在《兩個人的力量:發現創造性組合中的革新本質》一書中,作者Joshua Wolf Shenk引用了1971年John Lennon接受採訪時說的話,在採訪中Lennon是這樣形容他和Paul McCartney的,“我們都能寫出好的內容,就像‘我今天看了新聞’或者其他東西,這時創作就很容易”。他還說,“我們都可能會遇到創作瓶頸,但是我們可以相互激發,例如,我會唱一半,他會受到啟發,寫下一段,反之亦然。”每個人都會遇到創作瓶頸,但很少兩個人一起遇到。

在新科學或藝術的“理論建設”階段,重要的是廣泛探索,而不要陷入死衚衕。Francois Jacob與Jacques Monod一起開創了基因調控研究的先河,他指出,到了二十世紀中葉,分子生物學領域的大多數研究都是兩個人合作的結果。Jacob寫道:“相比一個人,兩個人更容易提出理論並構建模型。因為兩個人在處理同一個問題,所以想法就會來得更快、更多,它們會在合作伙伴之間相互反射。當它們彼此嫁接在一起時,就會像樹上的樹枝一樣,密不可分。在這個過程中,假象很快就會被扼殺在萌芽中。”在過去的三十五年裡,大約一半的諾貝爾生理學或醫學獎都是授予了科學合作伙伴。

經過多年工作和生活的分享,兩個人就可能會形成自己私密的語言,就像雙胞胎一樣。他們模仿彼此的衣著和習慣,幽默感也在不知不覺中相互滲透,在他們之間分配信任是不可能的。但是這種強度的合作在軟體開發中是不尋常的。雖然開發人員有時會談論“結對程式設計”,即兩個程式設計師共享一臺計算機,一個“駕駛”而另一個“導航”,但他們通常認為這種合作關係是冗餘的,這就好像一架飛機上安排了兩個飛行員。相比之下,Jeff和Sanjay有時更像是一個大腦的兩部分。他們共同參與了很多專案,所以很多著名的論文都有多達十幾位的合作者。他們的經理之一Bill Coughran回憶說:“他們非常多產,工作效率極高,因此我們常常會讓他們帶不同的專案。”

1966年,系統開發公司的研究人員發現,最好的程式設計師的效率是最差的十倍以上。從那以後,所謂的“10倍程式設計師”一直存在爭議。

這種說法推崇的是個人至上,但是軟體專案通常非常龐大,需要多人共同完成,尤其在程式設計中,很少有人是獨立完成專案的。然而,具有諷刺意味的是,即便如此,許多程式設計師也將Jeff和Sanjay共同完成的工作視為10倍程式設計師存在的證據。

Jeff於1968年7月出生在夏威夷,他的父親Andy是一名熱帶病研究員,而他的母親Virginia Lee是一位會講六國語言的醫學人類學家。一時興起,父子倆設計了一套IMSAI 8080工具包計算機。他們將升級程式焊接到機器上,學習它的每一部分。

Jeff和他的父母經常搬家。十三歲時,他正上八年級,為了到索馬利亞西部的一個難民營幫助父母,在最後的三個月裡他都沒有去上課。後來,在高中時,他開始為流行病學家編寫一個名為Epi Info的資料收集程式,之後它就成為了野外工作的標配工具,最終它以十幾種語言發行了數十萬份。由疾病控制和預防中心維護的一個網站(Epi Info Story)上面還有Jeff在高中畢業典禮上的照片。

Jeff在明尼蘇達大學遇到的他後來的妻子,Heidi。Heidi說:“Jeff從不張揚,想要了解他你可得一點點慢慢挖。”

他們的第一次約會是在一場女子籃球比賽中,當時Jeff穿著地鼠服在當啦啦隊。

Jeff在博士期間專注於編譯器,這是一種將人們編寫的程式碼轉換為針對計算機優化的機器語言指令的軟體。Alan Eustace說:“就有趣程度而言,編譯器非常無聊。”但是從另一方面說,它們可以讓你非常接近機器。

在描述Jeff時,Sanjay用食指在腦袋上畫了個圈,說道:“當你編寫程式碼時,他腦子裡就會跑出來一個模型,來衡量這段程式碼的性。他幾乎可以不會吹灰之力地考慮到所有極端情況。”

Sanjay在17歲時去康奈爾大學之前沒有碰過電腦。他於1966年出生於印第安納州西拉斐特,但在印度北部的工業城市長大。他的父親Mahipal是一名植物學教授,他的母親Shanta則在家照顧Sanjay和他的兩個哥哥姐姐。他們一家人都熱愛看書,還記得他的叔叔Ashok Mehta買了一本Frederick Forsyth寫的《豺狼的日子》副本,但它的裝訂已經嚴重損毀,他叔叔會看著Ghemawat的孩子們一起讀這本破舊的書,等所有人讀完了才捨得翻頁。

Sanjay的哥哥Pankaj是哈佛商學院有史以來最年輕的教師。(他現在是紐約大學斯特恩商學院的教授。)Pankaj和Sanjay去了同一所學校,當年Pankaj有著“文藝復興時期男子”的美譽。Sanjay說:“我有點生活在我哥哥的陰影下。”成年後,他保留了自我貶低的品質。2016年,當他被引入美國藝術與科學學院時,他的父母事前居然不知道,還是他們的鄰居告知的。

在麻省理工就讀研究生期間,Sanjay結識了一群關係緊密的朋友。儘管如此,他從來沒約過會,而且現在也“非常非常少見”。他說,他並不是不想結婚,只是順其自然就這樣了而已。他的親密朋友已經學會了不去打擾他,而他的父母也在很久以前就接受了他們的兒子將成為單身漢的事實。也許正是因為他如此低調,他在谷歌才充滿了神祕色彩。他喜安靜,比較沉默寡言,但是他是一個思想深刻且出眾的人。近二十年來,在他的桌子上,他一直保留著一堆Mead組合筆記本,這裡面記載的滿是整潔的清單和圖表。他喜歡用鋼筆寫草體字,但他很少翻閱之前的筆記本,書寫只是為了思考。在麻省理工時,他的研究生導師是一位很有影響力的電腦科學家Barbara Liskov,研究過複雜程式碼庫的管理。

在Barbara看來,最好的程式碼就像一篇好的文章。它需要精心設計的結構,每個單詞都應該發揮作用。這種程式需要與讀者產生共鳴。這也意味著程式碼不僅被看做是實現功能的手段,而其本身也是一種藝術。

Craig Silverstein說:“我認為他最擅長的就是系統設計”,“如果你閱讀Sanjay寫的程式碼,就知道他的程式碼就比例協調的雕塑那麼美。”

在谷歌,Jeff更為人所知,但是對於那些瞭解他們倆的人來說,他們會說Sanjay同樣是個天才。

“Jeff非常善於提出瘋狂的新想法和原型設計”,他們長期以來的同事Wilson Hsieh說道:“Sanjay是那種能夠打造出能夠持久執行的作品的人。”在生活中,Jeff更外向,Sanjay更內向。而在程式碼中,情況正好相反。Jeff的程式碼令人眼花繚亂——他可以迅速構架出驚奇的想法——但是因為實現的過快,出於探索精神的讀者可能會被拉在後面。Sanjay的程式碼更加具有交流觀賞性。

“有些人”Silverstein說,“他們的程式碼太過鬆散。一頁螢幕中的程式碼展示的資訊非常少。你總是來回滾動螢幕來弄清楚程式碼做的是什麼。另一些人程式碼寫的太過密集,你看著這樣的程式碼,會想,‘額,我一點也不想讀下去。’Sanjay以某種方式介於這兩種方式中間。你閱讀他們的程式碼,就好像‘哦,我懂了’而且,你仍然可以從一頁螢幕上得到很多資訊。”Silverstein繼續說道:“每當我想為Sanjay的程式碼新增新功能時,我會發現他已經給我準備好了切入口。我懂這種偉大,但我不明的他是如何做到的。”

今年春天的一個早上,Jeff和Sanjay站在40號樓的小廚房裡,那裡是谷歌人工智慧部門總部。在他們身後的白板上,寫滿了矩陣代數;一篇關於無人監督的對抗性網路的論文擺在桌上。Jeff穿著一件褪色的T恤和牛仔褲,看起來像是一個進階版流浪漢;Sanjay穿著一件毛衣和灰色的苦衷。明亮的窗外是一片高大的松樹,還有一片田野。無論Jeff在谷歌哪裡工作,都會伴隨咖啡機。在小廚房的櫃檯上,一個三英尺款的La Marzocco正在嗡嗡作響。“我們遲到了”,Jeff站在咖啡研磨機旁說道。這時正是八點三十二分。

在喝過卡布基諾後,他們走到各自的電腦前。Jeff從他自己的髒兮兮的桌子旁,滾了一把椅子到Sanjay的桌旁,那張桌子很乾淨。他把一隻腳放在檔案櫃上,向後靠著,而Sanjay盯著他們面前的電腦螢幕。

螢幕上有四個視窗:左側分別是Web瀏覽器和終端,用於執行分析工具;右側是文字編輯器Emacs的兩個編輯檔案,一個是待辦事項列表和筆記本,另一個是顏色豐富的程式碼。Sanjay的一個膝上型電腦放在電腦旁邊。

“好吧,我們做點什麼?”Sanjay問道。

“研究TensorFlow Lite的程式碼大小”,Jeff說。

這是一個與機器學習相關的主要新軟體專案,Jeff和Sanjay擔心它會像書編輯一樣不斷膨脹,他們正在尋找削減方法。為此他們構建了一個需要優化自身的新工具。

“所以我試圖找出它有多慢,”Sanjay說。

“非常慢,”Jeff說。他向前傾身,仍然很放鬆。

“所以那個是120KB,”Sanjay說,“要八秒鐘。”

“是十二萬個堆疊呼叫,”Jeff說,“不是KB。”

“好吧,我是說120KB個字元”,Sanjay說,

“哦,是的,抱歉”,Jeff說

“我不知道我們應該為單元大小設定什麼門檻”,Sanjay說“半個兆?”

“聽起來不錯”,Jeff說,Sanjay開始編碼,Jeff被螢幕所吸引。“所以你剛才說,如果它比我們樣本那個大...”還沒有說完,Sanjay就用程式碼回答了他。

當Sanjay開車時,他把手放在十點鐘和兩點鐘的位置,然後專注地向前看。他在敲鍵盤時也是這樣。他的雙腳分開與肩同寬,看起來好像在按照自己的姿勢行事。他的細長手指輕輕地移過鑰匙。一些年輕的程式設計師開始魚貫而入。

不久以後,他們達成了一個小里程碑,Sanjay敲下了一個命令來測試他們的進展。他看起來很疲憊,在程式執行的時候檢查了一下自己的郵箱。測試結束了,他沒有注意到。

“嘿”,Jeff 說道,啪的一聲指著螢幕。雖然他平時很喜歡講笑話,但當他坐在Sanjay的電腦前時,他會變得很自以為是、頑固、粗魯和不滿。Sanjay對此已然可以從容應對。當他認為Jeff的移動速度太快的時候,他會將手從鍵盤上抬起,並伸出手指,好像在說“停止”(一般來說,Jeff是加速器,Sanjay就是制動器。)這很接近爭論,在二十年的時間裡,他們已經不記得他們相互吼了多少回了。

Sanjay滾動螢幕,將新的程式碼塊放入檢視中。“所有這些都可以成為慣例,不是嗎?”Jeff說。

“嗯”,Sanjay表示同意。

Jeff敲了個指響,“似乎可行。我們應該這麼做嗎”?

Sanjay 很謹慎“不,我——”

“所以我們將忽略這個問題?”Jeff憤怒的說。

“不,我的意思是,我們只是試圖瞭解正在發生的事情的型別。所以我們可以做出一些關於它的訊息,對吧?”

“哦”,Jeff愉快地說,他的心情變好了。他們一起討論了這條訊息。

午餐時間接近了。他們工作了兩個小時,中間休息了十分鐘,大部分時間都在交談。(一個年輕程式設計師看著他們工作會留下很深的印象,因為他們從未停止或被卡住。)這種將你的程式碼由另一個人審查的方式,是標準的工程實踐。

但Jeff和Sanjay跳過了這一步,直接在日誌中輸入了一個敷衍的“lgtm”表示“我覺著不錯(looks good to me)”,從某種意義上說,他們沉浸在各種細枝末節中。

但是他們的程式碼是按照谷歌的規模來執行的。他們擔心的kb和微妙數將在世界各地的資料中心成倍增加,達到十億倍。在這樣的日子裡,Jeff回家會告訴他的女兒們,“Sanjay和我今天加快了谷歌搜尋的百分之十。”

2003年的四個月中,Jeff和Sanjay給谷歌帶來了可以說是其最大的單一升級,是用一個名為MapReduce的軟體做的。在第三次重寫Google的爬蟲和索引器(indexer)時,他們就有了這個想法。每次當他們解決一個重要的問題時,都會面對一個現實:如何讓大量散步各地、不可靠的計算機協同工作。做一個通用化的解決方案意味著他們可以避免一次又一次地重新面對這一問題。

MapReduce就是Jeff和Sanjay在一個辦公室的角落裡這樣編寫出來的,它對一個令人費解的複雜過程新增了排序。

在MapReduce出現之前,每個程式設計師都必須弄清楚如何分割和分發資料,分配工作以及自己負責解決硬體故障。MapReduce為編碼人員提供了一種思考這些問題的結構化方法。就像一位廚師的準備工作,在炒菜之前準備食材,所以MapReduce要求程式設計師將他們的任務分成兩個階段。首先,程式設計人員要告訴每臺機器如何進行任務的“map”階段(比如,計算一個單詞出現在網頁上的次數);接下來,她要編寫如何“合併”(reduce)所有機器結果的指令(例如,把它們加起來)。MapReduce處理分發的細節 – 並且對程式設計人員是透明的。

第二年,Jeff和Sanjay重寫了Google爬蟲和索引系統的MapReduce任務。很快,當其他工程師意識到它有多強大時,他們開始使用MapReduce處理視訊和在Google地圖上渲染圖塊。MapReduce非常簡單,新任務可以自發的進行。

谷歌擁有所謂的“晝夜使用曲線” - 白天的工作量比夜間更多 - 而MapReduce任務開始利用這些閒置能力。就像做夢中的大腦可以處理其日間體驗一樣,現在谷歌也可以在“夢中”處理它的資料了。

在谷歌早期階段,你就可以看出它是一家打著搜尋公司幌子的人工智慧公司。2001年,與Jeff和Sanjay共享辦公室的Noam Shazeer已經對Google從另一家公司購買的拼寫檢查程式越來越失望:它不斷犯下令人尷尬的錯誤,例如告訴那些想輸入“TurboTax”的使用者他們可能想輸入“turbot ax”(turbot是一種生活在北大西洋的比目魚)。

如果一個拼寫檢查程式參照的字典不好,那這個程式一定也好不到哪裡去。Shazeer意識到在網路世界,谷歌可以訪問有史以來最大的字典。他編寫了一個程式,該程式利用Web上文字的統計屬性來確定哪些單詞可能是拼寫錯誤。這個軟體學會了“pritany spears”和“brinsley spears”都是“Britney Spears”的意思。

當Shazeer在谷歌每週一次的TGIF聚會上演示這個程式時,其他的程式設計師們試圖騙過它,但大多數都失敗了。Shazeer與Jeff和一位名叫Georges Harik的工程師合作,採用類似技術將廣告與網頁相關聯。廣告定位成為支援公司重新投入其計算基礎架構的財路。這是良性迴圈的開始 - 巨大資料量將成為谷歌智慧的源泉;谷歌智慧帶來財富;而財富是公司增長的基礎 - 這將使谷歌成為人工智慧的霸主。

有想法的程式設計師使用MapReduce從Google的資料中獲取先機,因此使使用者的語音郵件識別,問題回答,查詢自動完成以及超過一百種語言的互譯成為可能。這種系統是使用相對簡單的機器學習演算法開發的。

“很簡單的技術,當你擁有大量資料時,也會工作得很好,”Jeff說。隨著“資料,資料,資料”使用BigTable,MapReduce及其後續產品進行儲存和處理成為公司的最高指導原則,Google的全球基礎架構變得更加無縫和靈活。

分散式計算的想法早已有之;像“雲端計算”和“大資料”這樣的概念也早於谷歌的崛起就已經出現。但是,通過使普通程式設計人員編寫分散式程式這件事變得智慧可控,Jeff和Sanjay已經讓谷歌對這些技術的掌控更上一層樓。使用者可能已經感覺到了某些變化:谷歌雲變得越來越聰明。

2004年,Jeff和Sanjay覺得MapReduce這項成果對對天文學家、遺傳學家和其他有大量資料需要處理的科學家也非常具有價值,於是他們寫了一篇論文把MapReduce公之於眾了。

這是一把神器!

硬體裝置的降價以及Web服務和連線裝置的增長導致了大量資料氾濫,但很少有公司擁有可以處理這些資訊的軟體。工程師Mike Cafarella和Doug Cutting一直在努力擴充套件一個名為Nutch的小型搜尋引擎,他們堅信MapReduce的重要性,因此決定從零開始構建一個免費的克隆版本。

他們最終以Cutting的兒子所喜愛的一頭毛絨玩具象給他們的專案取名Hadoop。

隨著Hadoop的逐步成熟,它已被全球財富50強中的一半所採用。它成為“大資料”的代名詞。據瞭解,Facebook使用“Hadoop MapReduce”來儲存和處理使用者後設資料(例如使用者點選內容、喜歡內容以及檢視了哪些廣告的資訊)。它曾一度擁有世界上最大的Hadoop叢集。

Hadoop MapReduce也幫助推動了LinkedIn和Netflix的發展。國家安全域性前技術總監Randy Garrett記得曾向該機構的主管Keith Alexander將軍展示這項技術。Hadoop執行分析任務的速度比之前的系統快了18000倍。它成為了一種新的情報收集方法的基礎,一些觀察家稱之為“全面收集”。

Jeff有一種不安分的本性:一旦他能看到解決方案的輪廓,問題就變得不那麼有趣了。2011年,當雲端計算開始為世界所接受時,他開始與史丹佛大學的電腦科學教授Andrew Ng合作。Andrew Ng當時正在谷歌主持一個祕密專案,研究神經網路-由虛擬“神經元”組成的軟體程式。

Jeff在他的大學期間曾經接觸過神經網路;那時的神經網路還無法解決現實世界的問題。Ng告訴Jeff這種情況正在發生改變。在史丹佛大學的研究中,當給神經網路輸入大量資料時,研究人員取得了一些令人興奮的結果。Ng認為,憑藉谷歌的規模,神經網路將不僅有用武之地而且會非常強大。

神經網路系統與傳統的電腦程式大不相同,該系統的操作不是由程式設計師進行常規的編碼建成,而是通過輸入與反饋學習到。在大學期間,Jeff沉迷於學習神經網路,這一點可以從浴室裡成堆的教科書就可以看出來。Jeff開始致力於“谷歌大腦”專案,然而,那時谷歌內部大多數員工都認為這個專案毫無價值。不僅經理Alan Eustace說“它是在浪費人才!”,Sanjay甚至質疑他“你究竟是在做些什麼?”。

此後7年內,谷歌大腦團隊成功訓練出了神經網路,完勝機器翻譯、機器語音以及影像識別。最後,他們替換掉谷歌的搜尋結果排序和定位廣告這些最重要的演算法,谷歌大腦成為公司內成長速度最快的團隊。Claire Cui將Jeff的創舉視為谷歌在A.I領域發展的轉折點:“公司裡,有人支援這個專案,也有人認為它是在浪費時間,但Jeff堅信它將會成功。”

AI似乎是一項繁冗複雜的大工程,所以Jeff研發出了一項程式“TensorFlow”,用於建立AI的分散式計算系統(MapReduce)。TensorFlow簡化了在計算機之間散步神經網路的過程,將他們集中於一個大腦。2015年,TensorFlow一經發布,就成為A.I領域的通用語。近期,谷歌執行長Sundar Pichai宣佈公司將A.I放於第一位,並且將任命Jeff為領頭人。

現在Jeff帶領著3000人的團隊,平均每星期有四天都在運營谷歌大腦。另外他還會去到全球演講、為新的電腦晶片(用於神經網路的張量處理單員)開周例會議、協助AutoML的研發——使用神經網路來建設其他網路的系統。

反觀Sanjay,他依舊是個“個體工作者”,獨自編寫程式,也不需要管理其他人。對此,他表示很慶幸:“我並不想像Jeff那樣工作。”他現在致力於研究一款軟體,讓工程師們可以更容易地整合和控制大量程式(例如尋找新聞、圖片和搜尋價格),並在使用者輸入搜尋詞時就開始執行。每週,他都需要和“Area Tech Leads”集團(谷歌工程絕地委員會engineering Jedi council)會面一次,保證技術更新能夠即時傳遞到整個公司。

如果將Google比喻為一座房子,Jeff在為房子增華添彩,而Sanjay則支撐著房子的基地,加固房樑,擰緊螺栓。

同時,在他們的“週一編碼日”,Jeff和Sanjay仍會聚在一起研究新事物。

Jeff說:“我想開發一個巨型機器學習模型,一個可以完成成千上萬不同任務的模型。”Jeff多年來一直在考慮這個問題,直到最近,他才肯定了它的可行性。他和Sanjay打算建造一個原型,團隊其他成員就可以按此繼續研發——在軟體世界,最好的領導方式是使用程式碼。

Jeff的妻子Heidi說:“他們很想念對方。”自從他們開始各自工作後,合作就越來越少了。

三月的某個週日,Jeff和Sanjay相約去Cupertino徒步旅行。天氣明亮清新,但是有些熱。Jeff開著一輛藍色特斯拉電動跑車,Sanjay的紅色特斯拉Model S緊隨其後。Sanjay喜好閱讀,Jeff經常打球。建造March index的20年後,Jeff越來越像退役的運動員,他的皮膚也被烈日曬成黝黑,而Sanjay看起來依舊年輕煥發,不曾老去。

穿過茂密森林,有一條道路環繞6公里。Jeff帶路,走在叢林中,他們追憶起以前Google如何快速發展。Sanjay回憶起,公司業績獲得第一次劇增後,給一個廁所隔間裝了兩個便池,“我還記得Jeff說,兩個比一個好。“

他們走出森林,進入鄉村,這時一隻土耳其禿鷹從頭頂飛過。

“這裡的山比我想象中還要陡峭”,Jeff說。

“我記得有人說過這是一個非常平坦的山坡”,Sanjay回應道。

“我想,這就可以解釋為什麼沒有人騎車了。”

當他們走回森林,Jeff向樹的遠方瞥了一眼,說到:“那邊我們可以看到更好的風景。”

這條小路通向一個小山頂,高而寬廣,沒有樹,可以俯瞰全景。雖然有薄霧籠罩,他們依舊看見了南邊的聖克魯茲山脈,以及東邊的使命峰。

Jeff調侃到:“Sanjay,看!那就是你的辦公室!”。

他們並立一起,眺望山谷。

相關報導:

https://www.newyorker.com/magazine/2018/12/10/the-friendship-that-made-google-huge/amp?__twitter_impression=true

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31562039/viewspace-2284743/,如需轉載,請註明出處,否則將追究法律責任。

相關文章