簡評:原文作者 Fergus Henderson 在 Google 工作了 10 年以上,目前負責 Google 的 text-tospeech 工程小組。有很多書籍或文章會從 商業/管理 等非技術角度來講 Google 是如何運作的,這篇文檔則是從軟件工程學的角度來講 Google 是如何運作的。
Google 的成功有很多原因,其中一個重要原因就是 Google 不斷積累的、優秀的軟件工程實踐經驗。
本文的目的是梳理并簡要介紹 Google 軟件開發的核心流程,內容上主要分為軟件開發 (Software development)、項目管理 (Project management) 和團隊建設 (People management) 三個方面。
▎軟件開發
源碼倉庫(The Source Repository)
- 單一源代碼倉庫,除了核心配置和安全相關代碼,任何工程師都可以訪問任何代碼,并可以根據需要修改
- 所有開發都基于 master 分支,發布的時候才創建發布分枝
- 代碼的每個子樹都有 owner,任何修改都需要 owner 批準
Blaze 分布式構建系統(The Build System)
- 構建和測試存儲庫中的任何軟件通常非常簡單和快捷
- 開發人員只需要編寫 BUILD 文件,并且每個構建系統僅依賴 BUILD 文件所聲明的文件
- 構建系統的優化:可靠,自動跟蹤依賴關系,增量構建,緩存構建結果以便復用
- 自動代碼檢查和測試
代碼審查(Code Review)
- 完善的代碼審查工具,如可視化的 Web 界面、電子郵件集成、自動展示測試或靜態分析的結果
- 每個變更都必須由至少另外一人審查,并將審查結果自動復制到項目維護者的郵件列表
- 鼓勵小的變更,大的變更可以拆分為一系列較小的變更
測試(Testing)
- 鼓勵和廣泛使用單元測試,Mocking 非常普遍
- 廣泛使用集成測試和回歸測試
- 自動測量測試覆蓋率
- 部署之前進行負載測試,顯示關鍵的 metrics,比如延遲、錯誤率以及它們隨請求速率的變化情況
Bug 跟蹤(Bug tracking)
- Google 使用名為 Buganizer 的 Bug 跟蹤系統
- 使用標簽分類 bug
- 每個 bug 都有一個默認的 assignee 和抄送郵件列表
編程語言(Programming languages)
- 鼓勵使用 C++、Java、Python 或 Go之一,最小化不同編程語言的數量
- 每種語言都有 Google 風格指南,還有一個公司范圍內的可讀性培訓
- 不同語言之前使用基于 Protocol Buffers 的 RPC 通信
- 為所有語言提供通用的開發工具,比如代碼簽出、編輯、構建、測試、審查、bug 報告等
調試和分析(Debugging and Profiling tools)
- 在通用框架中提供調試和代碼跟蹤工具
- 提供用于調試的網絡接口檢查 RPC 調用的時間、錯誤率和頻率限制以及資源消耗、性能分析數據等
發布(Release engineering)
- 頻繁發布(比如每周或每兩周),自動化發布任務,提高工程師積極性,允許更多迭代以加快整體速度
- 發布分支,將 master 的修改 cherry-pick 到發布分支
- 發布到 staging 服務器,測試部分生產流量的副本
- 發布到 canary 服務器,測試真實生產流量的一個子集
- 最后逐步發布到所有服務器
Launch approval
- 任何用戶可見的更改或重大的設計變更都需要工程團隊之外的很多人員的審查和批準,以確保這些變更滿足符合法律、隱私、安全、可靠性以及業務需求
- Google 內部的 Launch approval 工具會跟蹤這些審查和批準
Post-mortems
- 任何重大的生產故障都需要寫一份事后的總結文檔,描述事件的原因、影響以及如何解決
- 重點關注如何避免它們再次發生(而不是追究人員責任)
頻繁重寫(Frequent rewrites)
- 大部分軟件每隔幾年都會重寫一次
- 減少了累計復雜性
- 有助于適應當前的最佳實踐,鼓勵新的想法
- 也是一種團隊成員之間傳遞 ownership 的方式
- 這是 Google 保持敏捷和長期成功的關鍵
▎項目管理
20% 時間
- 允許工程師將 20% 時間花在喜歡的任何項目上
- 有助于新想法的原型開發和演示,提高員工積極性
- 鼓勵創新企業文化
OKRs(Objectives and Key Results)
- 個人和團隊要明確記錄目標并評估這些目標的進展情況,團隊設置季度和年度目標
- 建立關鍵結果來量化 OKR,用 OKR score 評估進展情況
- 設置野心勃勃的 OKR 指標,即設置期望為目標的 65%
- OKR 是全公司透明的,是一種簡化的溝通框架,使每個人都清晰了解公司的目標以及自己的位置
項目審批(Project approval)
- Google 沒有明確的項目審批流程,一般通過自下而上的方式進行
公司重組(Corporate reorganizations)
- 因項目取消而重組時工程師可以自由選擇新的團隊或角色
- 在很大程度上,技術驅動公司應該進行頻繁的重組以避免組織效率低下
▎團隊建設
角色(Roles)
技術角色與管理角色分開,項目由技術主管領導和決策,而經理負責管理技術主管,指導職業發展,并負責績效評估。
- 軟件工程師
- 研究科學家
- SRE
- 產品經理
- 項目經理
工作環境(Facilities)
- Google 提供豐富的娛樂、運動和餐飲設施
- 開放式辦公鼓勵溝通
- 先進的視頻會議設施方便不同團隊的溝通
培訓(Training)
- 新員工培訓,每個新員工都有導師和伙伴(Buddy)
- 「Codelabs」和豐富的培訓課程
- 也支持外部機構學習
換崗(Transfers)
- 鼓勵在不同部門換崗,幫助公司內傳播知識
- 允許 12 個月內表現良好的員工更換項目
- 鼓勵臨時性的參與其他項目
績效考核和獎勵(Performance appraisal and rewards)
- 鼓勵「peer bonuses」和「kudos」
- 明確詳細的晉升過程,確保正確的人得到晉升
- 匿名反饋調查評估經理的績效
▎小結
本文簡要介紹了在 Google 使用的重要軟件工程的實踐方法。Google 是一個龐大并且多元化的組織,有一些部門用的是不同的實踐方法,但是這里描述的實踐方法被 Google 大多數的團隊所遵循。
實踐方法的詳細內容請移步文末的英文原文鏈接。
原文鏈接:Software Engineering at Google
推薦閱讀:Chrome 十周年重設計 | 首席設計師專訪