王垠:我和Google的故事

發表於2012-08-13

來源:王垠

也許有人看見過我批判 Google 的那篇英文文章Hacker News 上的討論)。它好像有一部分片面性,所以被我從英文部落格上拿下來了。我一直在反思自己在 Google 的經歷,因為在這個公司工作總是感覺不對勁,但是卻總也說不清楚為什麼。也許現在用自己的母語,我可以得出一個準確一點的結論吧。

受命於危難

先說說我的專案是怎麼開始的吧。當我加入的時候,我的老闆 Steve Yegge 的小組試圖製造一個跨語言的“服務式”程式設計工具,叫做 Grok。你可以把它想象成 Eclipse 和 Visual Studio, 但是 Grok 的設計目標不只是檢索和分析本機的某一種語言的程式碼,而是大規模的檢索和分析 Google 的所有專案,所有語言,所有程式碼。這包括 Google 的“四大語言”:C++、Java、JavaScript,、Python,一些工具性的語言:Sawzall,protobuf 等,還有一些“build file”和所有第三方的庫。Grok 的初期設計目標是一個靜態的程式碼索引服務,只要程式設計師點選任何一個變數或者函式名,就能“準確”的跳轉到它定義的位置。動態的編輯功能稍後也在陸續加入。

這種檢索不是像 ctags, etags 那種簡單的正規表示式匹配,而是像 Eclipse 和 Visual Studio 那樣的準確的“語義檢索”,所以它必須真正的理解程式語言的語義。在 Grok 誕生以前,市面上和 Google 內部都沒有一個工具能正確的支援所有“四大語言”,所以我不得不說,Steve 的專案比起 Google 的其他程式語言相關的專案是相當先進的。

雖然 Grok 的技術含量挺高,但是 Google 的管理層對東西的評價並不是看技術含量的,而是看你有多少“影響力”(impact),說白了也就是有多少使用者。Google 當時本來就只有不到一萬個程式設計師,一個“內部程式設計工具”能有多少“使用者”呢?所以 Grok 比起像 CodeSearch 一類利用正規表示式來查詢程式的“低端”專案來說,在管理層心目中並不佔任何優勢。而且由於其它專案介面好看些,使用者多些,Grok 隨時有被取消的危險,這使得 Steve 心理壓力很大。我就是在這個“危難關頭”進入他們的小組的。我當然沒蠢到會自己進入這樣一個組,但是 Steve 在電話面試時把一切都說得很美好的樣子。當時小組裡只有三個人:Steve 和另外兩個組員。

Steve Yegge

 

恐懼和疑惑

當我開始的時候,Grok 小組已經初步完成了 Java 和 JavaScript 的檢索模組。但是他們的檢索並不是自己設計的,而是從 Eclipse (JDT) 和 JSCompiler (開源後叫 closure compiler) 裡面分別“挖取”了對 Java 和 JavaScript 語義檢索的部分,修改之後插入到專案裡的。Eclipse 的設計非常的不模組化,以至於專案進行了一年多,大家還在忙著解決它帶來的各種 bug。

最開頭的時候 Steve 給了我兩個選擇:檢索 C++ 或者是 Python。我覺得 C++ 的設計太繁瑣,所以就選擇了看起來好一點的 Python。Steve 就讓我去找一個開源的 Python IDE,然後把裡面的語義檢索部分挖出來插入到專案裡面。可是在看過十個左右的“Python IDE”之後,我發現它們沒有一個能夠正確的“跳轉到定義”。分析其原因,是因為這些 IDE 基本上做的是正規表示式匹配,而完全不理解 Python 的語義。所以我對 Steve 說,我要自己從頭寫一個。但他反對這個提議,因為他覺得這是三個月的時間之內不可能完成的。不但是我不能,而且就算一個小組的高階程式設計師也不可能完成。就算完成了,他也不想“維護”這些程式碼。所以他寧願讓我去拿一個不怎麼樣的開源專案,因為這樣“維護”的工作就轉嫁到開源專案身上去了。

可是我很清楚的看到,這樣一個語義檢索,不過是一個抽象直譯器 (abstract interpreter)。寫直譯器是我很在行的,所以我告訴他這是我可以完成的,而且由於設計上的簡潔,我的程式碼的維護代價會比使用一個開源專案小很多。他沒有說話。我同時也在進行一些內部培訓,看一些視訊,折騰 MapReduce 一類的內部工具教程,就這樣過了一個星期。我隱約的感覺到 Steve 的不快,因為他不怎麼說話了,可是也沒有太在意,仍然傻乎乎的到處湊熱鬧。到了週五的時候,Steve 下午很早就回家了。另一個組員還待在哪裡,悶聲悶氣的。我對她說:“Steve 是不是不高興了?我知道我說話有點太自信,可能打擊到他了。”她好像打滿的氣球被開了一個孔:“他怎麼會被你打擊到?你知道他以前做的專案有多厲害嗎?他是怕你做不出來。之前有一些 intern 設的目標太高,以至於到最後沒有完成他們的專案。”於是她開啟 Eclipse,把 JSCompiler 的程式碼給我看。“你知道我們以前一個類似的專案 JSCompiler,花了多少時間才完成嗎?一個小組的人,四年的時間!”她開啟其中一個檔案,也就是處理符號表的那個模組,說:“看這一個檔案就有 9000 多行程式碼。你三個月能寫出這麼多程式碼嗎?”我翻了一下白眼,搞笑似地說:“啊~ 怎麼可能有 9000 多行?這些人真的知道怎麼寫這種程式碼嗎……”

後來具體的對話我忘記了,但是她說得那麼戰戰兢兢的,確實給了我一些壓力。再加上 Steve 那個悶聲子,真是不好受。所以那個週末我沒有出去玩,我下載了一個 Jython,把它的 parser 檔案 (ANTLR) 拿出來。自己設計了一個更簡單的 AST 資料結構,把這個 parser 生成的 AST 轉換成我的結構。然後就開始在上面寫一個抽象直譯器。由於 Java 的限制,我想出了一個更簡潔的用 Java 實現直譯器的方法,從而避免了使用繁瑣的 visitor pattern。一個週末之後,我做出了一個基本的原型。當然因為 Python 語言的複雜性,有很多細節的東西到後來才完全的實現。

等到星期一的時候,我告訴 Steve 我做了一個原型出來,而且因為我拿了 Jython 的 parser,我們以後可以用這個理由把這程式碼 merge 回 Jython,給他們提供功能,讓他們幫我們維護程式碼,對兩方都有好處。他居然一點也不高興,把我叫到一個白板前面,板著臉說:“你知道我為什麼擔心嗎?我怕在你離開四個月以後,我還在跟別人說,我仍然在改正我的 intern 程式碼裡的 bug!來,給我講一下你打算怎麼做。”我就畫了一個 AST 的類關係圖,在每個類插入一個叫 interp 的方法,然後指出這個東西就是一個直譯器。最後他豁然開朗了一樣,說:“好。我相信你知道你在幹什麼了。就這樣做吧。”

 

陌路

在 Google 的整個夏天,我都覺得跟其他人沒有共同語言。我感興趣的東西,他們一點都不瞭解,所以我也不想談。我覺得不以為然的一些東西,卻被捧上了天。總體感覺就是過度“和諧”,像是回到了小學。每個人都像是“祖國的花朵”,對 Google 的一切都讚不絕口。你本來有時不想笑,不想說好話,身邊的“社會壓力”卻讓你不得不滿臉堆笑,所以很累。沒有人說真話,以至於你不知道到底什麼好,什麼不好。


人們總是喜歡談論一些人的顯赫“地位”,傳說他們如何的“牛”。比如,有一次幾個人在談論一個 Google 的“牛人”,說他做了一個多麼了不起的專案,很快就升為了 Staff Software Engineer (“Staff”是比“Senior”高一級的職位,Steve 就是個 Staff)。我去看了一下這專案,發現不過就是 JUnit 的“C++ 版本”。JUnit 這東西技術含量本來就是相當低的,做這樣一個東西就能當“Staff”,那我豈不是輕而易舉就可以成為“Principal”了?哈哈。我心裡這樣想,但是沒有說出來。一個 Staff 就如此,談到 Google 的兩個創始人的時候,有些人就簡直是黑白不分了。對他們的各種武斷的甚至不講理的做法,居然都津津樂道。創始人在他們眼裡儼然就跟皇帝一樣,他們做什麼都是對的。甚至有人以自己的辦公室在創始人辦公室的正下方為豪。這種浮誇和互相吹捧之風,恐怕是在其它公司也少見的。Google 要求員工們保持一種“Googley”的態度,原來就是這樣的態度,過度的“正面”和“積極”。美國所崇尚的“個人主義”和“批判性思維”,在 Google 貌似高度缺乏。另一些時候,我會遇到一些對某種語言或者技術有宗教情緒的人。有一次吃午飯,一個工程師主動坐到我面前,像是在面試我一樣,正兒八經的開始自我介紹,後來我們就談到 C++。我說 C++ 設計實在是太繁瑣了,其實很多簡單的語言效率並不比 C++ 低,C++ 最近其實在向其它高階語言學一些東西…… 後來這人就不說話了。那天以後我就發現跟他打招呼他都不理了。後來我才發現,在 Google 是不可以指出某種語言,特別是 C++ 的缺點的。C++ 在 Google 的“勢力”之大,連 Java 都只能算二流貨色。最搞笑的其實是 Google 總喜歡故弄玄虛,把一些微不足道的東西說得很玄乎。很多文件,視訊,活動都掛著“Google Confidential”的標籤。等你去看了,卻發現其實是眾所皆知的東西,沒有什麼機密可言。可是大部分的實習生們卻有一種受寵若驚的感覺,以至於產生優越感。每個星期五,都會有一個“TGIF”,兩個創始人會像主持人一樣組織一個大會。本來無可非議,但是總感覺氣氛過於群情激昂了,有點像小學的時候升國旗開大會的感覺。好不容易大家聚在一起,總是在聽新聞釋出,不然就是談工作進度,不然就是表彰某些人。總之,你總是感覺在受到某種挑撥,有一種傳銷公司大會的感覺。大家輕輕鬆鬆一起玩的真正的 party,卻非常稀少。

由於 Google “免費”提供一日三餐和娛樂,健身設施,你總是感覺欠了公司什麼一樣,而其實這些錢都是出自你自己的勞動。而且因為這些設施離工作的地方太近,你總是感覺 Google 在你的生活裡無所不在,連玩的時候都在想著它。Steve 經常叫幾個人出去 Starbucks 買咖啡,我開頭還覺得奇怪,因為 Google 有上好的咖啡機。後來才明白原來他們只是想出去換個環境和人氣。一些別的公司的人(比如我寄宿房子的主人)也在疑惑,Google 的員工到底有沒有下班的時間。

我就是這樣度過在 Google 的每一天,以至於後來我都不怎麼在飯桌上吃飯了。自己把飯端到靠牆的吧檯去吃,或者坐在“冰激凌吧”跟裡面的廚師聊天,省得遇到一些高談闊論的人無語。我發現自己跟打掃衛生的大媽小妹們也談得來,她們也喜歡跟我說話。後來我發現有這種感覺的不只是我,另外兩個比較厲害的博士生也懶的在那邊吃飯了。其中一個說他一個星期就把自己的專案做完了,然後假裝仍然在做,免得又被增加任務。這就是所謂“能者多勞”吧。掌握了核心技術的人,往往會有一般程式設計師幾十,上百倍的效率,可是得到的“回報”卻是更多的任務量和壓力。

 

皇帝的織布工

雖然 Steve “允許”我自己從頭做一個 Python 分析器,但這卻不是沒有壓力的。這種感覺就像是“皇帝的新裝”裡的織布工一樣。我揚言自己會做出精美絕倫的布料,皇帝的大臣們卻看不見,所以他們就相當的小心。總是對我很敬畏的樣子,有時會來問候一下,做得怎麼樣了。可是一旦扯到深入的話題,卻又怕被看穿其實他們不懂很多東西。因為我的教授們研究 Scheme,所以 Steve 有時候也會很激動的表揚 Scheme,或者類似 Scheme 的語言比如 Clojure。這種奉承真的讓我受不了,生搬來的術語都是錯亂的,所以經常來回兩句之後,他就無語了。為什麼程式語言總是引起這種宗教的態度,不是抵制就是膜拜?

有一次一個 Staff Software Engineer 來訪。看我在做這個 Python 分析器,很鄙夷的樣子,說:“你做那個東西幹什麼。Python 本來是沒有型別的,怎麼推導得出型別來?我倒希望 Java 的型別推導做得更好一些,不用手寫很多型別。”顯然他不知道什麼是型別推導,他也不知道如何把 Java 的型別推導做得更好。很多人把自己的命運寄託在語言的設計者身上,自己沒有能力去改進它們,所以他們才會對程式語言頂禮膜拜。

 

壓力

直到有一天,我才發現 Steve 為什麼這麼緊張。那天有另一個“分舵”的 director 來訪,給我們做了一個關於“創新”(innovation)的演講。基本內容就是說,技術上的創新,如果吸引不到使用者,那就不算什麼創新,拉得到使用者的東西才叫創新。完全就是扯淡嘛,可是他那個氣勢真像是在宣佈聖旨一樣。

那天下午,這個 director 來到我們的辦公室。表情嚴肅的“審問”Steve:“你說你每天有 5000 個使用者。可是 Google 總共還不到 10000 個程式設計師。你是怎麼算的?你把接受你的服務的那些下游專案的使用者全都算進去了吧!”唉,想不到大名鼎鼎的 Steve Yegge 在這種欽差大臣面前也只能唯唯諾諾。

我可以說,這個 Python 的東西,雖然沒有費特別多力氣,但卻是 Google 裡很少有人可以做出來的,就算 Python 的創造者 Guido van Rossum 恐怕也玄。所以實際上這個東西在很大程度上拯救了這個瀕臨滅亡的專案,因為一旦 Grok 支援所有的“Google 語言”,就會有很多人注意到這個東西,從而會有“影響力”。這確實是後來發生的事,我走了之後,Grok 開始通過 API 給很多專案提供服務,包括 CodeSearch。

Google 給我的那點工資,其實是根本買不起這樣的軟體的。你可以參考一下像 CodeSonar 之類“靜態分析”軟體的價格,一份基本上就是我三個月的工資。由於我上學想找點外快,讓他們撿了一個便宜。可是這種“上級領導”的壓力居然也間接的傳到了我身上,而且是以一種非常不尊重的方式。這種感覺就是,你做得再多再出色,你相對於 Google 的“大拿”們,什麼都不算。這也許就是 Google 為什麼僱傭 Dennis Ritchie, Brian Kernighan, Ken Thompson, Rob Pike, Peter Norvig, Guido van Rossum 等大牛吧。因為它就可以說:“看我們 Google 有這些頂尖牛人,你算個什麼,要不斷努力!”Steve 不止一次的對我說:“你要為 Google 做出傑出的貢獻啊!Google 的東西總是最好的,你要做出 Google 一貫的品質來。你知道 Python 的創造者 Guido 也是 Google 的員工嗎?我一定會在他面前給你美言幾句。” 這種語氣,我好像在幾十年前的中國聽說過呢?“你要為祖國做出傑出的貢獻!”他也許以為我會受寵若驚,可是我心裡卻不是個滋味。

有時候他又會突然把臉一翻,做出一副“博學”的樣子,說:“你得把這個問題解決了。不然的話你的 intern 專案就是一個失敗的專案!” 其它組員如果看我貌似心情比較輕鬆,也會不時的提一下:“這個做完了嗎?如果這個做完了,你可以做那個。反正我們有的是事情給你做……” 我心裡其實在想,你知道這東西的“難度”嗎?符號表模組都要寫 9000 行程式碼的人,你自己來做一下,看看一年之內你做得出來不。總之他們就是用這種奉承,利誘,競爭,加威脅的方式,想方設法讓我多做事情。可是我心裡想的是,Google 老爹,您就給了那麼點錢,您想買多少東西啊?

本來這系統能做出來就不錯了,一個組員卻一直催著我寫 test。她根本不明白,一個程式並不是寫了測試就會是個好程式。這個程式經過我多次的大規模修改甚至推翻重來,即使一早寫了測試,那些測試也會很快作廢。這種大公司給人灌輸的“test-driven”程式設計方式,在這種創造性的程式設計裡是根本就是行不通的。要寫出這樣一個系統,必須全神貫注,深入到語言的本質。而去寫測試,往往會打亂原來的思路,所以測試應該是最後完成之後才寫的。當我最後完成這個系統,可以大規模的處理 Python 程式碼的時候,卻聽見從她的桌上傳來一聲沉悶的咆哮:“WRITE–THE–TESTS—”這真的非常 Googley!

 

結果

最後我順利完成了整個專案,從頭到尾都是我一個人設計實現的(除了 Jython 裡的 parser)。現在它每天都會把 Google 所有的 Python 程式碼索引一遍。很多內部工具比如 CodeSearch 裡面的 Python 檔案上的連結,都是這東西做出來的。我所有的程式碼加起來才 4000 行。處理符號表的模組只有 600 行。我怎麼也想不通為什麼 JSCompiler 會有 9000 行來處理這麼簡單的東西,也許這就是它為什麼花費了一個小組四年的時間。

 

總結

這些就是我對 Google 的印象。有好幾次我都看到很不錯的工程師進入 Google 之後就銷聲匿跡了,為 Google “默默奉獻”,不再有自己的發明創造。我感覺 Google 就是一個埋沒人才的機器,而它的“創造性”的名聲,卻讓越來越多的人才被埋沒。主動找上門的人才被埋沒了不說,還吞併其它公司,並且對他們施行同樣的“Google 文化”,埋沒更多的人才。

Google 總是號稱自己的工程師“build things ground up”,實際上卻總是拿一些現成的程式碼來修修補補,往往耗費更多的時間。當你真的想要“從頭”做起,卻發現重重的阻礙和壓力。

Google 跟其它公司有一個明顯的區別就是,Google 不稀罕你,你不被尊重,你活在某些你說不出他哪裡牛的“大牛”的陰影下。我沒有很多其他公司的工作經歷,但是我面試過其它一些公司。也許它們在技術上或者名氣上會比 Google 差一些,可是我能感覺到他們對人才的渴望和尊重。所以如果你有很強的能力,何必去 Google 受氣呢?無論你走到哪裡,那個地方就隨你而改進。

 

相關文章