如何在中國打造擁有谷歌工程師文化的團隊
本文為出門問問&Ticwear CTO雷欣博士從Coding、開發(fā)環(huán)境以及團隊合作等角度切入,分享谷歌的工程師文化、以及他和他的團隊是如何在中國打造公司的工程師文化。
一、什么是谷歌的工程師文化
在加入谷歌之前,我曾在微軟和斯坦福研究所工作過。這兩個地方其實是非常不一樣的,微軟是一種傳統(tǒng)軟件的開發(fā)模式,而斯坦福研究所是一個研究所,主要工作更偏向研究方向,更看重創(chuàng)新等能力,反而對代碼質量等的要求不是特別高。
到了谷歌之后,我印象最深的是,谷歌對代碼質量的要求和追求到了一種近乎狂熱的程度,主要體現在幾個方面:
-
Coding Style。谷歌內部有一套非常長的Coding Style Guide For Every Language。其中C++是谷歌的主要語言,包括其他語言如Java、Python等,不管什么語言,谷歌都有一個很長的Style Guide。
-
Readability。在谷歌,當你要想寫程序的時候,要先拿到所謂的Readability。假如你的代碼質量不過關,沒有通過Readability考核的話,那你的代碼可能就沒法Check In到代碼庫里面。
-
Unit Test。谷歌有非常完善的Unit Test機制,也有十分強烈的Unit Test文化。大家都知道,寫軟件其實跟搭積木很像,如果下層基礎不扎實的話,那整個軟件框架其實是很危險的。在谷歌,差不多每做一次代碼改動都會有一個Unit Test,雖然這會讓開發(fā)變慢,但它也意味著高質量和可靠性。
-
Code Review。谷歌很重視Code Review,基本上谷歌所有代碼都會保證至少有兩個以上的人對它Review后,才會讓你Check In。
-
LGTM(Look Good To Me)。***,你的代碼寫完之后,你需要得到這樣一個“LGTM”,就是“Look Good To Me”,得到這樣一個Prove后,你才能把這個代碼提交上去。
高效的開發(fā)環(huán)境
1、強大穩(wěn)定的Base庫
除了對代碼質量的高要求,谷歌的開發(fā)環(huán)境也相當強大,非常高效。在谷歌,成千上百萬的代碼用的其實都是同一個代碼庫,大家共享一套強大穩(wěn)定的Base庫。
這點是我以前在微軟的時候沒有看到的,在微軟,我們可能是每個小組都有自己的代碼庫,而且每個小組都有自己不同的代碼規(guī)范和風格,因此,當更換團隊或跨組工作的時候,不同小組之間的不同標準就會造成一些困難。
但在整個谷歌,所有的代碼規(guī)范都是統(tǒng)一的,因此可以這樣想,假如把代碼質量看作一個函數,描述成一個高斯分布的話,那谷歌的總體代碼是高斯分布的Balance,方差是非常小的,整體質量是非常高的。
2、代碼構建工具Blaze
代碼的話,谷歌有一個構建工具叫Blaze,這是一個好東西。我們寫代碼的人可能都知道Makefile,但這個工具的話,我記得以前經常會花更多的時間在調這個Makefile,而不是寫代碼上。
但谷歌的Blaze就讓事情變得簡單了,它可以讓我們集中精力在代碼上,進行快速并行編譯,并且效率非常高。
實際上,很多前谷歌人從谷歌出去后,想到的***件事都是怎么重現谷歌的這個框架,怎么能夠重新搭建這些東西,讓寫代碼變得更加容易。
其實,很多公司都有類似的工具,比如Facebook有Buck,Twitter有Pants,國內有個更加山寨的Blade,實際上這些東西都是想要達成Blaze的機制。
谷歌還有其他很多好東西,譬如Protocol Buffer,就是一種數據交換的格式;Stubby,谷歌后臺系統(tǒng)基于HTTP的RPC機制;還有Map Reduce、Big Table、GTest、 GFlags、 GLog等等??偟膩碇v,這些東西能讓讓開發(fā)更高效。
3、敏捷的開發(fā)團隊
谷歌的開發(fā)團隊一般都是比較小、比較敏捷的。以前谷歌的CEO Eric Schmidt說過這樣的話,“Google有影響力的項目都是2個人的小團隊開發(fā)出來的,如搜索、廣告、Gmail”。
一位在騰訊的前谷歌人也說過這樣一句話,“3-5個人做不好的事情,30-50人做的更爛”。我是比較傾向于認同這句話的,假如一個項目在初始階段,沒有靠那么兩三個人把框架搭得非常好的話,你再招更多的人只會是添亂,增加溝通、交流的成本。
一個很小的、2-3人的小團隊有什么好處呢?你能實現快速開發(fā)、快速上線、快速迭代,然后再去推進這個產品的改進。
4、一切自動化,數據驅動
谷歌還有一個特點是一切自動化,數據驅動。我們以前在谷歌是做語音識別的,語音識別中其實有很多東西是需要人手動去參與、調解的,比如一些參數類的東西。當時,我們組里面就有人提出要做這么一件事情——當時谷歌有40、50種語言的識別系統(tǒng),那我們做這樣一套系統(tǒng),我按一個鍵,它過一段時間就能把所有的、每一種語言的語音識別系統(tǒng)全都訓練出來,然后全部自動推上線,中間過程中不需要任何人的參與。當時就有人提出了這樣的想法,這就有點將工程做到***、做到***的理念,這是非常重要的。
二、如何達到谷歌的代碼質量
那我們怎么在一個小的Start Up中間達到谷歌的代碼質量呢?我有一些建議:
1、堅持原則
一定要堅持原則,堅持Unit Test和Code Review。
Start Up的步伐、步調是非??斓模鞣矫娴母偁幰埠芗ち?,可能你不快的話就會落后。在這種情況下的話,很多產品經理面對各方面的壓力,可能會“我只需要這個產品快速出來,我根本不Care你里面是怎么做的,你的代碼質量、代碼風格,Whatever,我不Care。”
但實際上,我覺得這樣是不太好的,因為,從公司的長遠角度來講,你把基礎框架搭好之后,對以后的發(fā)展、穩(wěn)定都會有很大的幫助。因此,在很大程度上,要堅持Unit Test、建立Code Review的機制,定要保證你的代碼是有一定質量的。
2、擁抱開源
第二點是要擁抱開源。實際上,谷歌是一個非常大氣的公司,它已經把很多很好、很酷的內部的東西都開源出來了,我們要做的話,就是需要把這些東西積攢在一起,然后搭建一套更適合于創(chuàng)業(yè)公司的開發(fā)環(huán)境。
3、鼓勵更新、快速迭代
很多時候,我們會面臨一個問題,代碼的***個版本出來之后,那我以后是在這個基礎上修改呢,還是在一定階段把它推翻了重來呢?
谷歌的話,它內部基本上都認為,沒有什么代碼是能活過超過2、3年的,所以,會對代碼進行推陳出新。實際上,在代碼的推陳出新之間,會把以前沒有考慮到的東西會做得更好,也會鍛煉新人,然后學到更多東西。
三、我們怎么做產品
同谷歌一樣,我們推崇“快速上線、持續(xù)迭代”,認為“天下武功,唯快不破”,所以我們一般都是以2-3個人為一個小團隊去集中攻堅一些比較難的問題,尋求快速的突破。
每周,我們都會進行產品的迭代,像我們最近做的智能手表操作系統(tǒng)Ticwear,每周的話我們基本上都是,周一到周三開發(fā),提出Bugs和Features,然后周四進行內部測試和粉絲內測,然后周五就馬上公測。
維持這樣一個很快的節(jié)奏,實際上是非常累的,但是在這個過程中,你實際上鍛煉了團隊,你的產品也可以更快的滿足用戶的需求。
四、打造一支谷歌工程師文化的團隊
1、招什么樣的人
***是要通才(Generalist)而非專才(Specialist),這個是非常重要的,通常來講,一個創(chuàng)業(yè)公司跟一個大公司的差別在于,創(chuàng)業(yè)公司的資源是非常有限的,每個人可能要做很多不同的事情,所以,對我們創(chuàng)業(yè)公司來說,一般想招的是通才(Generalist),而不是專才(Specialist)。大公司的話,因為它資源非常多,人也非常多,所以他更希望某一個人進來之后,能老老實實做一件事、做一個螺絲釘,把這個事情做得最深、最透,但是我們小公司的話,更多地希望員工能有更多的Coverage。
第二是一定要有分析和解決問題的能力。
第三就是執(zhí)行力,小公司之所以能夠在某些程度上做得比大公司更好,靠得其實并不完全是Idea,因為Idea是很容易被抄襲的,實際上拼得是執(zhí)行力,假如你執(zhí)行的不夠好的話,那你就沒有任何機會。
第四是要有一定的交流能力,就是說,雖然我們非常鼓勵員工能有強大的單兵作戰(zhàn)能力,但我們同時也希望在2、3個人這樣的小團隊中,他們能有非常高效的交流、溝通,去推進一些項目。
2、面試流程
其實我們的面試流程基本上都是Follow谷歌的那一套,都是Phone Screen 再加上3輪Onsite Coding Interview,每一輪Coding Interview都是必須要在白板上寫代碼,其中就包括系統(tǒng)設計、算法、編碼等。算法會多一點,可能會有幾個,還有就是編碼,我們希望說,一個算法,你想出來了,也能通過你寫的代碼呈現出來,理論上,你的代碼寫完之后,我放在編輯器里面,它沒有錯誤,能夠編譯、能夠跑通,這是我們的要求。
3、培訓
那人招進來之后,我們怎么去培訓他們呢?當然會有一些基本的Coding Style的培訓,然后我們會找一些導師,給他們設計一些比較獨立的Starter Project,讓他們能慢慢融入這個團隊。同時,我們也會有一些Codelabs,在某些專題方面,教教大家怎么用我們搭建的一些模型。
平時,我們還會有各種各樣的活動,比較大一點的有問問講堂,我們會請一些比較知名的專家、學者來給我們分享一些技術、業(yè)界的***的進展。同時,我們內部也會有一些技術分享,還會搞一些Hackathon,做一些Self Review、Peer Review,讓大家更好地融入這個團隊。
4、在中國招人留人的困難
我實際上回來才一年多一點,就發(fā)現在中國招人和留人有很多困難。
-
Risk Taking。我發(fā)現,其實很大一部分中國年輕人承擔風險的能力、Risk Taking的能力,相對美國來講是比較低的。我們在招人的時候,經常會碰到,有些人會說,“我爸媽認為大公司好,覺得BAT好”,或者說要有北京戶口,這樣的情況,這些我在美國的創(chuàng)業(yè)公司是很少見到的,所以這個也是我們比較頭疼的。
-
Temptation。即使我們好不容易招到人了,那么怎么去留住他們也是我們比較頭疼的地方。因為我們的要求比較高,所以我們招到的人、特別是后端的人才,素質都還是比較高的,那么,特別是在現在這個創(chuàng)業(yè)環(huán)境特別好的情況下,他們就會面對很多各種各樣的誘惑,譬如說,我們公司至少有3個工程師走了,其中有2個到了別的公司當Director,另外一個到別的公司做CTO,他們都只是一般工程師啊。
所以這種情況下,你招人、到底要招什么樣的人、完全招那些***的人是不是***的一種方式,也是值得我們去思考的一個問題。