簡(jiǎn)評(píng):原文作者 Fergus Henderson 在 Google 工作了 10 年以上果录,目前負(fù)責(zé) Google 的 text-tospeech 工程小組。有很多書籍或文章會(huì)從 商業(yè)/管理 等非技術(shù)角度來講 Google 是如何運(yùn)作的,這篇文檔則是從軟件工程學(xué)的角度來講 Google 是如何運(yùn)作的。
Google 的成功有很多原因,其中一個(gè)重要原因就是 Google 不斷積累的疑枯、優(yōu)秀的軟件工程實(shí)踐經(jīng)驗(yàn)。
本文的目的是梳理并簡(jiǎn)要介紹 Google 軟件開發(fā)的核心流程蛔六,內(nèi)容上主要分為軟件開發(fā) (Software development)荆永、項(xiàng)目管理 (Project management) 和團(tuán)隊(duì)建設(shè) (People management) 三個(gè)方面。
▎軟件開發(fā)
源碼倉庫(The Source Repository)
- 單一源代碼倉庫国章,除了核心配置和安全相關(guān)代碼具钥,任何工程師都可以訪問任何代碼,并可以根據(jù)需要修改
- 所有開發(fā)都基于 master 分支液兽,發(fā)布的時(shí)候才創(chuàng)建發(fā)布分枝
- 代碼的每個(gè)子樹都有 owner骂删,任何修改都需要 owner 批準(zhǔn)
Blaze 分布式構(gòu)建系統(tǒng)(The Build System)
- 構(gòu)建和測(cè)試存儲(chǔ)庫中的任何軟件通常非常簡(jiǎn)單和快捷
- 開發(fā)人員只需要編寫 BUILD 文件,并且每個(gè)構(gòu)建系統(tǒng)僅依賴 BUILD 文件所聲明的文件
- 構(gòu)建系統(tǒng)的優(yōu)化:可靠,自動(dòng)跟蹤依賴關(guān)系桃漾,增量構(gòu)建坏匪,緩存構(gòu)建結(jié)果以便復(fù)用
- 自動(dòng)代碼檢查和測(cè)試
代碼審查(Code Review)
- 完善的代碼審查工具拟逮,如可視化的 Web 界面撬统、電子郵件集成、自動(dòng)展示測(cè)試或靜態(tài)分析的結(jié)果
- 每個(gè)變更都必須由至少另外一人審查敦迄,并將審查結(jié)果自動(dòng)復(fù)制到項(xiàng)目維護(hù)者的郵件列表
- 鼓勵(lì)小的變更恋追,大的變更可以拆分為一系列較小的變更
測(cè)試(Testing)
- 鼓勵(lì)和廣泛使用單元測(cè)試,Mocking 非常普遍
- 廣泛使用集成測(cè)試和回歸測(cè)試
- 自動(dòng)測(cè)量測(cè)試覆蓋率
- 部署之前進(jìn)行負(fù)載測(cè)試罚屋,顯示關(guān)鍵的 metrics苦囱,比如延遲、錯(cuò)誤率以及它們隨請(qǐng)求速率的變化情況
Bug 跟蹤(Bug tracking)
- Google 使用名為 Buganizer 的 Bug 跟蹤系統(tǒng)
- 使用標(biāo)簽分類 bug
- 每個(gè) bug 都有一個(gè)默認(rèn)的 assignee 和抄送郵件列表
編程語言(Programming languages)
- 鼓勵(lì)使用 C++脾猛、Java撕彤、Python 或 Go之一,最小化不同編程語言的數(shù)量
- 每種語言都有 Google 風(fēng)格指南猛拴,還有一個(gè)公司范圍內(nèi)的可讀性培訓(xùn)
- 不同語言之前使用基于 Protocol Buffers 的 RPC 通信
- 為所有語言提供通用的開發(fā)工具羹铅,比如代碼簽出、編輯愉昆、構(gòu)建职员、測(cè)試、審查跛溉、bug 報(bào)告等
調(diào)試和分析(Debugging and Profiling tools)
- 在通用框架中提供調(diào)試和代碼跟蹤工具
- 提供用于調(diào)試的網(wǎng)絡(luò)接口檢查 RPC 調(diào)用的時(shí)間焊切、錯(cuò)誤率和頻率限制以及資源消耗、性能分析數(shù)據(jù)等
發(fā)布(Release engineering)
- 頻繁發(fā)布(比如每周或每兩周)芳室,自動(dòng)化發(fā)布任務(wù)专肪,提高工程師積極性,允許更多迭代以加快整體速度
- 發(fā)布分支堪侯,將 master 的修改 cherry-pick 到發(fā)布分支
- 發(fā)布到 staging 服務(wù)器牵祟,測(cè)試部分生產(chǎn)流量的副本
- 發(fā)布到 canary 服務(wù)器,測(cè)試真實(shí)生產(chǎn)流量的一個(gè)子集
- 最后逐步發(fā)布到所有服務(wù)器
Launch approval
- 任何用戶可見的更改或重大的設(shè)計(jì)變更都需要工程團(tuán)隊(duì)之外的很多人員的審查和批準(zhǔn)抖格,以確保這些變更滿足符合法律诺苹、隱私、安全雹拄、可靠性以及業(yè)務(wù)需求
- Google 內(nèi)部的 Launch approval 工具會(huì)跟蹤這些審查和批準(zhǔn)
Post-mortems
- 任何重大的生產(chǎn)故障都需要寫一份事后的總結(jié)文檔收奔,描述事件的原因、影響以及如何解決
- 重點(diǎn)關(guān)注如何避免它們?cè)俅伟l(fā)生(而不是追究人員責(zé)任)
頻繁重寫(Frequent rewrites)
- 大部分軟件每隔幾年都會(huì)重寫一次
- 減少了累計(jì)復(fù)雜性
- 有助于適應(yīng)當(dāng)前的最佳實(shí)踐滓玖,鼓勵(lì)新的想法
- 也是一種團(tuán)隊(duì)成員之間傳遞 ownership 的方式
- 這是 Google 保持敏捷和長期成功的關(guān)鍵
▎項(xiàng)目管理
20% 時(shí)間
- 允許工程師將 20% 時(shí)間花在喜歡的任何項(xiàng)目上
- 有助于新想法的原型開發(fā)和演示坪哄,提高員工積極性
- 鼓勵(lì)創(chuàng)新企業(yè)文化
OKRs(Objectives and Key Results)
- 個(gè)人和團(tuán)隊(duì)要明確記錄目標(biāo)并評(píng)估這些目標(biāo)的進(jìn)展情況,團(tuán)隊(duì)設(shè)置季度和年度目標(biāo)
- 建立關(guān)鍵結(jié)果來量化 OKR,用 OKR score 評(píng)估進(jìn)展情況
- 設(shè)置野心勃勃的 OKR 指標(biāo)翩肌,即設(shè)置期望為目標(biāo)的 65%
- OKR 是全公司透明的模暗,是一種簡(jiǎn)化的溝通框架,使每個(gè)人都清晰了解公司的目標(biāo)以及自己的位置
項(xiàng)目審批(Project approval)
- Google 沒有明確的項(xiàng)目審批流程念祭,一般通過自下而上的方式進(jìn)行
公司重組(Corporate reorganizations)
- 因項(xiàng)目取消而重組時(shí)工程師可以自由選擇新的團(tuán)隊(duì)或角色
- 在很大程度上兑宇,技術(shù)驅(qū)動(dòng)公司應(yīng)該進(jìn)行頻繁的重組以避免組織效率低下
▎團(tuán)隊(duì)建設(shè)
角色(Roles)
技術(shù)角色與管理角色分開,項(xiàng)目由技術(shù)主管領(lǐng)導(dǎo)和決策粱坤,而經(jīng)理負(fù)責(zé)管理技術(shù)主管隶糕,指導(dǎo)職業(yè)發(fā)展,并負(fù)責(zé)績效評(píng)估站玄。
- 軟件工程師
- 研究科學(xué)家
- SRE
- 產(chǎn)品經(jīng)理
- 項(xiàng)目經(jīng)理
工作環(huán)境(Facilities)
- Google 提供豐富的娛樂枚驻、運(yùn)動(dòng)和餐飲設(shè)施
- 開放式辦公鼓勵(lì)溝通
- 先進(jìn)的視頻會(huì)議設(shè)施方便不同團(tuán)隊(duì)的溝通
培訓(xùn)(Training)
- 新員工培訓(xùn),每個(gè)新員工都有導(dǎo)師和伙伴(Buddy)
- 「Codelabs」和豐富的培訓(xùn)課程
- 也支持外部機(jī)構(gòu)學(xué)習(xí)
換崗(Transfers)
- 鼓勵(lì)在不同部門換崗株旷,幫助公司內(nèi)傳播知識(shí)
- 允許 12 個(gè)月內(nèi)表現(xiàn)良好的員工更換項(xiàng)目
- 鼓勵(lì)臨時(shí)性的參與其他項(xiàng)目
績效考核和獎(jiǎng)勵(lì)(Performance appraisal and rewards)
- 鼓勵(lì)「peer bonuses」和「kudos」
- 明確詳細(xì)的晉升過程再登,確保正確的人得到晉升
- 匿名反饋調(diào)查評(píng)估經(jīng)理的績效
▎小結(jié)
本文簡(jiǎn)要介紹了在 Google 使用的重要軟件工程的實(shí)踐方法。Google 是一個(gè)龐大并且多元化的組織晾剖,有一些部門用的是不同的實(shí)踐方法锉矢,但是這里描述的實(shí)踐方法被 Google 大多數(shù)的團(tuán)隊(duì)所遵循。
實(shí)踐方法的詳細(xì)內(nèi)容請(qǐng)移步文末的英文原文鏈接钞瀑。
原文鏈接:Software Engineering at Google
推薦閱讀:Chrome 十周年重設(shè)計(jì) | 首席設(shè)計(jì)師專訪