摘錄翻譯自“Software Engineering at Google”床嫌,作者:Fergus Henderson
軟件開(kāi)發(fā)
代碼庫(kù)
大部分的 Google 代碼都存在統(tǒng)一的源代碼庫(kù)中,可供 Google 內(nèi)部所有工程師訪問(wèn)。但是 Chrome 和 Android 則分別有單獨(dú)的代碼庫(kù)。
Google 的代碼庫(kù),在 2015 年 1 月的統(tǒng)計(jì)中客们,共計(jì) 86T 數(shù)據(jù),上10億個(gè)文件材诽,9百萬(wàn)個(gè)源代碼文件底挫,其中包含了 20 億行代碼。迄今為止共計(jì) 3500 萬(wàn)次提交脸侥,每個(gè)工作日平均發(fā)生 4 萬(wàn)次更新建邓。
任何 Google 員工,都可以隨意的訪問(wèn)所有代碼睁枕,并下載涝缝、編譯,可以在自己的環(huán)境下自行改寫譬重,但任何更改的提交拒逮,都需要通過(guò)代碼負(fù)責(zé)人的審批才可以。
所有的開(kāi)發(fā)都在庫(kù)的頭部進(jìn)行臀规。對(duì)代碼進(jìn)行任何更改后滩援,自動(dòng)化系統(tǒng)將進(jìn)行測(cè)試,并在幾分鐘內(nèi)通知開(kāi)發(fā)者和代碼審查者塔嬉,對(duì)更改的測(cè)試是否失敗玩徊。
代碼庫(kù)中每個(gè)分支都有單獨(dú)的文件注明“代碼所有人”,只有代碼所有人才有權(quán)利審核提交的更改谨究。通常情況下恩袱,項(xiàng)目組的所有成員都是“代碼所有人”。
編譯系統(tǒng)
Google 使用分布式編譯系統(tǒng)胶哲,叫做 Blaze畔塔。Blaze 提供了標(biāo)準(zhǔn)的命令,用于編譯和測(cè)試庫(kù)中的所有代碼鸯屿。Blaze 這種統(tǒng)一的編譯工具澈吨,讓 Google 公司的所有工程師都能隨時(shí)編譯和測(cè)試任何軟件,也都能跨項(xiàng)目工作寄摆。
程序員需要撰寫“BUILD”文件谅辣,用來(lái)引導(dǎo) Blaze 如何編譯軟件。在Go語(yǔ)言的代碼中婶恼,build 文件可以自動(dòng)生成桑阶。
每個(gè)編譯步驟必須是“隔離”的柏副,只依賴于聲明的輸入。為了實(shí)現(xiàn)編譯的分布式運(yùn)行蚣录,必須強(qiáng)制要求正確輸入所有的依賴:只有聲明了的輸入才被發(fā)送到進(jìn)行編譯的機(jī)器上去搓扯。
每個(gè)編譯步驟的結(jié)果是確定的。這樣保證了編譯系統(tǒng)可以緩存編譯結(jié)果包归。軟件工程師可以回退到老的版本號(hào),并重新編譯铅歼,且得到完全一樣的二進(jìn)制結(jié)果公壤。
編譯結(jié)果緩存在云端。包括中間結(jié)果椎椰,這樣當(dāng)有別的編譯請(qǐng)求過(guò)來(lái)厦幅,系統(tǒng)直接應(yīng)用緩存的結(jié)果。
增量的重新編譯非晨快确憨。編譯系統(tǒng)運(yùn)行在內(nèi)存中,當(dāng)重新執(zhí)行編譯任務(wù)時(shí)瓤的,它能夠分析文件上次編譯后發(fā)生的增量變化休弃。
提交前檢查。Google 有專門的自動(dòng)化工具圈膏,用來(lái)在發(fā)起代碼審查和準(zhǔn)備提交更改到代碼庫(kù)時(shí)塔猾,進(jìn)行一整套的標(biāo)準(zhǔn)檢查。
代碼審查
Google 開(kāi)發(fā)了基于 Web 的代碼審查管理工具稽坤。程序員可以申請(qǐng)對(duì)代碼進(jìn)行審查丈甸,審查者可以在瀏覽器上比較差異,并寫上評(píng)語(yǔ)尿褪。當(dāng)寫代碼的人發(fā)起一次審查申請(qǐng)睦擂,則系統(tǒng)自動(dòng)發(fā)郵件給審查者,并附上代碼查看頁(yè)的鏈接杖玲。
對(duì)源代碼的任何更改顿仇,必須經(jīng)過(guò)最少一次審查。如果更改不是由“代碼所有人”做出摆马,則還必須由所有人中的一位進(jìn)行審查夺欲。
系統(tǒng)可以自動(dòng)推薦合適的審查者。當(dāng)然今膊,寫程序的人些阅,可以自己選擇審查者。
Google 鼓勵(lì)工程師們斑唬,將每一次代碼更改控制在較小的規(guī)模上市埋。 30-99 行的代碼更改黎泣,通常視為“中等”;300 行以上則標(biāo)記為“大”缤谎; 1000-1999 行抒倚,則是“巨大”;
測(cè)試
單元測(cè)試是必須的坷澡,在 Google 的開(kāi)發(fā)中廣為采用托呕。集成測(cè)試和回歸測(cè)試,也較為普及频敛。Google 有一個(gè)自動(dòng)化的工具项郊,用來(lái)衡量測(cè)試覆蓋的范圍,這個(gè)結(jié)果也在代碼瀏覽器中可以查看斟赚。
部署前一定要做壓力測(cè)試着降。項(xiàng)目組要用表格或者圖標(biāo)顯示關(guān)鍵參數(shù),尤其是壓力之下的延遲和錯(cuò)誤率拗军。
Bug 跟蹤
Google 使用的 Bug 跟蹤工具叫 Buganizer任洞。有的團(tuán)隊(duì),安排專人分配 Bug发侵,有的團(tuán)隊(duì)則在例行的會(huì)議中分配交掏。
開(kāi)發(fā)語(yǔ)言
Google 內(nèi)部有四大語(yǔ)言,一般都建議工程師在這四種里挑選刃鳄。四大語(yǔ)言是: ?C++耀销,Java, Python铲汪, Go熊尉。不用多說(shuō),減少語(yǔ)言數(shù)量掌腰,可以增加代碼復(fù)用狰住,并提高內(nèi)部協(xié)作。
每種語(yǔ)言都有代碼規(guī)范齿梁,保證風(fēng)格統(tǒng)一催植。公司范圍內(nèi),還有針對(duì)“代碼可讀性”的培訓(xùn)勺择,由經(jīng)驗(yàn)豐富的老司機(jī)创南,對(duì)新人進(jìn)行培訓(xùn)。代碼審查省核,也需要對(duì)“可讀性”做專門的評(píng)審稿辙。
在不同語(yǔ)言之間的交互操作,要通過(guò)Protocol Buffers 來(lái)處理气忠。Protocol Buffers 是 Google公司開(kāi)發(fā)的一種數(shù)據(jù)描述語(yǔ)言邻储,類似于XML能夠?qū)⒔Y(jié)構(gòu)化數(shù)據(jù)序列化赋咽,可用于數(shù)據(jù)存儲(chǔ)、通信協(xié)議等方面
調(diào)試工具和性能分析工具
?Google 的服務(wù)器連接了很多庫(kù)吨娜,提供用于調(diào)試服務(wù)器的工具脓匿。服務(wù)器崩潰時(shí),可以自動(dòng)導(dǎo)出堆棧軌跡到日志文件宦赠。 還有 Web 界面用于調(diào)試陪毡,可以用來(lái)查看呼入和呼出的 RPC 調(diào)用、更改的命令行標(biāo)志值勾扭、資源消耗毡琉、性能分析等。
發(fā)版
Google 的大部分項(xiàng)目組尺借,都有固定的軟件工程師負(fù)責(zé)發(fā)版。
大部分的軟件精拟,發(fā)版比較頻繁燎斩。通常是周發(fā)版,或者每?jī)芍馨l(fā)版蜂绎,有些項(xiàng)目組甚至每天發(fā)栅表。所以,自動(dòng)化進(jìn)行發(fā)版就是必須的了师枣。頻繁發(fā)版有助于工程師們保持斗志怪瓶,提高整體速度,實(shí)現(xiàn)更多的迭代践美,從而也可以獲得更多的反饋洗贰,并做出更多有益的更正。
上線
要上線任何更改陨倡,并對(duì)用戶可用敛滋,則需要項(xiàng)目組外很多人的審批。審批來(lái)自多個(gè)方面兴革,包括法律合規(guī)绎晃、隱私保護(hù)、安全要求杂曲、可靠性庶艾、業(yè)務(wù)需求等等。
Google 有一個(gè)內(nèi)部的上線審批工具擎勘,用來(lái)執(zhí)行審查和上線審批咱揍。通過(guò)定制,這個(gè)工具棚饵,對(duì)不同的產(chǎn)品有不同的審查和審批流程述召。
過(guò)錯(cuò)總結(jié)
發(fā)生了重大的服務(wù)事故后朱转,相關(guān)人員要起草過(guò)錯(cuò)總結(jié)報(bào)告。文檔描述事故細(xì)節(jié)积暖,包括標(biāo)題藤为、概要、影響夺刑、時(shí)間段缅疟、原因、故障組件遍愿、行動(dòng)存淫。 總結(jié)的聚焦在于問(wèn)題,以及未來(lái)如何解決沼填,而不是聚焦在于人桅咆,也不是為了懲罰責(zé)任人。
頻繁的重寫代碼
Google 鼓勵(lì)頻繁的重寫代碼坞笙,任何軟件每隔幾年就重寫一遍岩饼。一來(lái)可以優(yōu)化產(chǎn)品,采用最先進(jìn)技術(shù)薛夜,去掉無(wú)用的功能籍茧,另外還可以轉(zhuǎn)移知識(shí)到新員工,并保持員工的斗志梯澜。
項(xiàng)目管理
20%的自由時(shí)間
盡人皆知寞冯,google的工程師擁有 20%的自由時(shí)間,可以隨意做感興趣的東西晚伙,而無(wú)需審批吮龄。這當(dāng)然是為了激發(fā)工程師的各種創(chuàng)意,同時(shí)也讓工程師們保持高效率咆疗,而不是窒息在必須完成的任務(wù)中螟蝙。 另外,也考慮到民傻,很多員工都會(huì)私下里自己做一些東西胰默,那么還不如鼓勵(lì)大家將這些研究方向公開(kāi)。
目標(biāo)和關(guān)鍵結(jié)果
不論個(gè)人還是團(tuán)隊(duì)漓踢,都要明確的寫下自己的目標(biāo)牵署,并評(píng)估達(dá)成目標(biāo)的進(jìn)度。每個(gè)季度的末尾喧半,要根據(jù)關(guān)鍵結(jié)果奴迅,對(duì)目標(biāo)達(dá)成情況進(jìn)行打分,分?jǐn)?shù)從 0 分到 1 分。這 OKR 分?jǐn)?shù)是全公司內(nèi)部公開(kāi)的取具。但這并不直接用作個(gè)人績(jī)效評(píng)估的輸入倍权。
平均得分是 0.65敏释,但鼓勵(lì)大家將目標(biāo)定的高一些番捂,所以在可完成任務(wù)之上深寥,再加 50% 的工作量是正常的。
項(xiàng)目立項(xiàng)
對(duì)于項(xiàng)目立項(xiàng)審批块仆,以及項(xiàng)目取消构蹬,Google并沒(méi)有清楚定義的流程。即便是在 Google 做過(guò) 10 年的老經(jīng)理悔据,也不知道決策是如何做出的庄敛。很可能因?yàn)樵诠痉秶鷥?nèi),流程并不一致科汗,經(jīng)理們可以自行判斷并決策藻烤。有時(shí)候,決策是由下而上進(jìn)行的头滔,因?yàn)轫?xiàng)目組的人都走光了怖亭。有時(shí)候,決策是自上而下的拙毫,老板們決定哪些項(xiàng)目得到更多的預(yù)算依许,那些則必須關(guān)閉棺禾。
機(jī)構(gòu)重組
當(dāng)關(guān)閉一個(gè)大項(xiàng)目時(shí)缀蹄,工程師們可以自行尋找新機(jī)會(huì),加入新團(tuán)隊(duì)膘婶。有的時(shí)候缺前,還會(huì)搞“去碎片化”行動(dòng),把瑣碎的分散的團(tuán)隊(duì)合并悬襟,這個(gè)時(shí)間工程師也可以自行選擇團(tuán)隊(duì)和工作地點(diǎn)衅码。
經(jīng)常進(jìn)行重組,有利于突破大公司的低效陷阱脊岳。
人的管理
崗位
Google 將“技術(shù)路線”和“管理路線”分開(kāi)逝段;將“技術(shù)領(lǐng)導(dǎo)” 從“管理”中分出;將“研究”綜合到“工程”中割捅;設(shè)置“產(chǎn)品經(jīng)理”奶躯、“項(xiàng)目經(jīng)理”、和“站點(diǎn)可靠性”來(lái)支持工程師們亿驾。
工程中主要的崗位包括:
- 工程經(jīng)理
這是工程序列中唯一的“人員管理”崗位嘹黔。軟件工程師也“可能”管理人,但工程經(jīng)理“總是”管理人莫瞬。工程經(jīng)理通常以前就是工程師儡蔓,具備技術(shù)經(jīng)驗(yàn)郭蕉,以及管理人的技能。
技術(shù)領(lǐng)導(dǎo)力與人員管理能力之間喂江,是有區(qū)別的召锈。
“工程經(jīng)理”不一定帶領(lǐng)項(xiàng)目;項(xiàng)目通常由“技術(shù)組長(zhǎng)”負(fù)責(zé)开呐,當(dāng)然“技術(shù)組長(zhǎng)”也可能由“工程經(jīng)理”擔(dān)任烟勋,但大多數(shù)情況下都是“工程師”。項(xiàng)目的“技術(shù)組長(zhǎng)”對(duì)項(xiàng)目中的技術(shù)問(wèn)題筐付,具有決定權(quán)卵惦。
經(jīng)理負(fù)責(zé)選擇“技術(shù)組長(zhǎng)”,并監(jiān)控團(tuán)隊(duì)績(jī)效瓦戚。工程經(jīng)理還負(fù)責(zé)職場(chǎng)發(fā)展的培訓(xùn)及引領(lǐng)沮尿,進(jìn)行績(jī)效評(píng)估,并部分負(fù)責(zé)薪酬制定较解。還要做一些招聘工作畜疾。
一般來(lái)說(shuō),工程經(jīng)理管理 3 - 30 個(gè)人印衔,普遍情況下是 8 - 12 人啡捶。
- 工程師
在 Google,“工程”和“管理”的職業(yè)發(fā)展路線是不同的奸焙。工程師可以管理下屬瞎暑,但這不是必須的。在更高層次与帆,領(lǐng)導(dǎo)力是必須的了赌,但領(lǐng)導(dǎo)力不一定從對(duì)人的管理中來(lái)。比如玄糟,開(kāi)發(fā)了極具影響力的軟件勿她,或者寫的代碼被很多工程師使用,也是一種領(lǐng)導(dǎo)力阵翎。
- 研究科學(xué)家
科學(xué)家的招聘的門檻更高逢并,需要有學(xué)術(shù)上的論文發(fā)表能力和代碼能力。除了科學(xué)家需要論文和著作外郭卫,科學(xué)家和工程師沒(méi)有顯著的區(qū)別砍聊。在Google,科學(xué)家和工程師一起工作箱沦,同樣研發(fā)產(chǎn)品辩恼,同在一個(gè)團(tuán)隊(duì)。這樣的安排為的將研究成果更好的導(dǎo)入產(chǎn)品中。
- 站點(diǎn)可靠性工程師
對(duì)系統(tǒng)的維護(hù)由軟件工程師團(tuán)隊(duì)負(fù)責(zé)灶伊,而不是通常的系統(tǒng)管理員疆前。站點(diǎn)可靠性工程師的技能要求,比軟件開(kāi)發(fā)工程師要稍低聘萨。
- 產(chǎn)品經(jīng)理
產(chǎn)品經(jīng)理負(fù)責(zé)管理產(chǎn)品竹椒,他們協(xié)調(diào)軟件工程師的工作,宣講功能特性米辐,與其他團(tuán)隊(duì)配合胸完,跟蹤bug和進(jìn)度,保證一切順暢運(yùn)行以開(kāi)發(fā)出高質(zhì)量的產(chǎn)品翘贮。產(chǎn)品經(jīng)理不寫代碼赊窥。
- 計(jì)劃經(jīng)理/技術(shù)計(jì)劃經(jīng)理
計(jì)劃經(jīng)理有點(diǎn)類似產(chǎn)品經(jīng)理,但他們不管產(chǎn)品狸页,而是管理項(xiàng)目锨能、過(guò)程、或運(yùn)營(yíng)芍耘。
工程師與產(chǎn)品經(jīng)理址遇、計(jì)劃經(jīng)理的比例,一般非常高斋竞,大約在4:1 到30:1之間倔约。
設(shè)施
Google 有很先進(jìn)的各種設(shè)備,包括游戲房坝初、健身房浸剩,以及提供各種美食的免費(fèi)餐廳,這一切都是為的將員工留在公司脖卖,多多工作乒省。還可以帶朋友來(lái)蹭飯巧颈,這樣就增加了將朋友招聘進(jìn)來(lái)的機(jī)會(huì)畦木。
Google 的座位都是開(kāi)放的,甚至有點(diǎn)擁擠砸泛,這有助于加強(qiáng)交流十籍,但同時(shí)也影響了個(gè)人的專注,算是權(quán)衡之下的損失了唇礁。員工雖然有自己的座位勾栗,但每 6 -12 個(gè)月就要換一換,也是為了加強(qiáng)交流盏筐。
培訓(xùn)
Google 的培訓(xùn)有一下幾種:
- 新員工 (Nooglers)都要參加一個(gè)入職培訓(xùn)教程
- 技術(shù)員工要參加一個(gè)“Codelabs”围俘,進(jìn)行短期的在線培訓(xùn)課程,其中還有編碼練習(xí)
- 許多在線和現(xiàn)場(chǎng)的培訓(xùn)課程
- 對(duì)于參加外部機(jī)構(gòu)的課程,Google也給予支持
每個(gè)新員工界牡,都被指派一名正式的“導(dǎo)師” 和一名“搭檔”簿寂,以幫助他盡快上手。
換崗
鼓勵(lì)換崗流動(dòng)宿亡,以在公司范圍內(nèi)傳播知識(shí)常遂,并提高跨組織的交流。在一個(gè)崗位工作 12 個(gè)月后挽荠,可以選擇其他項(xiàng)目克胳,也可以選擇換個(gè)辦公室。
績(jī)效評(píng)估和獎(jiǎng)勵(lì)
Google 非常歡迎互相評(píng)價(jià)圈匆。 工程師可以彼此互贈(zèng)正面評(píng)價(jià)漠另,一種是“同事獎(jiǎng)金”,一種是“點(diǎn)贊”跃赚。每名員工酗钞,每年擁有兩次機(jī)會(huì),給予其他員工以“同事獎(jiǎng)金”提名来累,獎(jiǎng)金是 100 美元砚作。這種“同事獎(jiǎng)金”是為了獎(jiǎng)勵(lì)員工在職責(zé)之外幫助他人∴谒“點(diǎn)贊”則僅僅是表?yè)P(yáng)葫录,沒(méi)有現(xiàn)金獎(jiǎng)勵(lì)。
經(jīng)理可以發(fā)放獎(jiǎng)金领猾,包括一種在項(xiàng)目完成后的特殊獎(jiǎng)金米同。Google和其他公司一樣,也有年底績(jī)效獎(jiǎng)和股權(quán)激勵(lì)摔竿。
績(jī)效優(yōu)秀面粮,可以晉升。而績(jī)效差的继低,則需要進(jìn)行改進(jìn)熬苍,但有意思的是 Google 很少開(kāi)除員工。員工還要對(duì)經(jīng)理的績(jī)效進(jìn)行評(píng)估袁翁,以保證管理效率和管理質(zhì)量柴底。