Google 軟體工程深度解析

Google 軟體工程之道:一份深度解析報告

報告摘要

本報告旨在深度剖析 Google 的軟體工程之道,揭示其作為全球頂尖科技巨擘,如何應對前所未有的技術挑戰。研究發現,Google 的工程哲學並非一系列孤立的最佳實踐,而是一個深思熟慮、緊密整合且相輔相成的生態系統。其核心在於解決兩個根本性問題:時間(Time),即如何建構能夠持續數十年並不斷演進的永續性系統;以及規模(Scale),即如何有效管理龐大統一的程式碼庫與全球數萬名工程師的協作。

為應對這些挑戰,Google 的軟體工程體系建立在三大支柱之上:

  1. 文化與組織 (Culture & Organization):以「心理安全感」為基石,賦予團隊勇於冒險和承認失敗的自由。透過「目標與關鍵成果 (OKR)」框架,在確保核心任務執行的同時,鼓勵對「登月計畫」式目標的追求。並藉由「無咎檢討會 (Blameless Postmortem)」,將每一次失敗轉化為組織學習與系統性改進的寶貴機會。
  2. 核心工程實踐 (Core Engineering Practices):Google 的實踐將其文化理念編碼為日常工作流程。其標誌性的「單體程式碼庫 (Monorepo)」提供了統一的程式碼視圖,而高效的建構系統「Bazel」則確保了在巨大規模下的開發速度與正確性。「程式碼審查 (Code Review)」被視為提升程式碼健康的集體責任,而「測試金字塔」則是一種優化測試投入與風險管理的經濟策略。
  3. 系統可靠性與基礎設施 (System Reliability & Infrastructure):「網站可靠性工程 (SRE)」將軟體工程的嚴謹思維應用於系統維運,透過「錯誤預算 (Error Budget)」機制,巧妙地統一了開發與維運團隊的目標。而如「Borg」叢集管理器和「Spanner」全球分散式資料庫等傳奇性基礎設施,則是在底層解決了極度困難的通用問題,從而極大地提升了整個工程組織的生產力與槓桿效應。

本報告將進一步探討這些支柱的細節,分析其內在邏輯與相互關聯,並比較 Google 與其他科技巨頭的文化差異。最終,報告將提煉出 Google 之道中具有普適性的核心原則,為其他面臨成長與複雜性挑戰的組織提供具體的實踐建議。結論指出,Google 的成功並非偶然,而是源於其將軟體開發視為一門真正的「工程」學科,並為此付出了相應的嚴謹、遠見與持續投資。

第一部分:Google 軟體工程的哲學基石

在深入探討 Google 具體的工具與流程之前,必須首先理解其背後的指導哲學。Google 的工程文化將「軟體工程 (Software Engineering)」與「程式設計 (Programming)」明確區分開來,這不僅是術語上的差異,更是思維模式上的根本轉變。這種轉變源於 Google 面對的獨特挑戰,並由三大核心概念所定義:時間、規模與權衡。

1.1 程式設計 vs. 軟體工程:時間、規模與權衡

傳統意義上的程式設計,通常被視為一種個人或小團隊的創造性活動,其目標是為了解決一個特定問題而產出可執行的程式碼 1。然而,當一個軟體專案的生命週期被預期長達數十年,且需要由成千上萬的工程師協同維護時,單純的程式設計思維便顯得捉襟見肘。這正是 Google 所定義的「軟體工程」的起點 2。

Google 的核心理念認為,軟體工程與程式設計的關鍵區別在於三個維度 1:

這種哲學思維的轉變,可以視為對軟體開發領域中「傑文斯悖論 (Jevons Paradox)」的一種應對 2。該悖論指出,資源使用效率的提升反而會導致該資源消耗量的增加。在軟體領域,更高效的程式語言和開發工具並沒有讓工程師的工作變少,反而催生了更宏大的專案、更龐大的團隊和更長壽的軟體。這種成功所帶來的規模擴張,反過來又產生了新的、二階的複雜性問題:程式碼的可持續性(時間問題)和組織的協調性(規模問題)。因此,Google 的軟體工程之道,不僅僅是一套實踐方法,更是為了管理自身效率與成功所帶來的巨大複雜性而演化出的一套嚴謹的工程學科。

1.2 海勒姆定律:隱性介面的無情法則

在探討時間對軟體影響的過程中,一個被 Google 工程師奉為圭臬的經驗法則——「海勒姆定律 (Hyrum's Law)」——扮演了至關重要的角色。該定律由 Google 工程師 Hyrum Wright 提出,其內容為:「當你的 API 有了足夠多的使用者時,你在合約中承諾什麼都無關緊要:所有系統中可觀測到的行為都會被某些人所依賴。」6。

這條定律揭示了一個殘酷的現實:在一個大規模、長生命週期的軟體系統中,任何微小的改動,哪怕是修改一個未公開的內部實現細節,都有可能破壞某個依賴於該「可觀測行為」的使用者。例如,一個函式原本不保證返回結果的順序,但由於某個版本的實現恰好總是按字母順序返回,使用者便可能在自己的程式碼中依賴這個順序。一旦後續版本為了優化效能而改變了這個順序,就會導致使用者端的程式碼崩潰 6。

海勒姆定律是「時間」維度挑戰在日常開發中的具體體現。在 Google 這樣一個擁有龐大、統一程式碼庫(即單體程式碼庫)的環境中,任何一段程式碼的「使用者」數量都可能是天文數字。這使得海勒姆定律的影響被極度放大,它迫使 Google 的工程師必須將系統的每一個可觀測行為都視為一個需要謹慎對待的隱性 API。

這條定律也從根本上解釋了 Google 為何會採取看似矛盾的工程策略組合:一方面,它擁抱一個極度開放和統一的單體程式碼庫,讓所有程式碼互相可見;另一方面,它又對依賴關係管理、建構流程和程式碼提交施加了極其嚴格的中心化控制。這個組合並非偶然,而是應對海勒姆定律風險的深思熟慮的結果。

其內在邏輯如下:

  1. 海勒姆定律明確指出,任何可觀測的行為都可能演變成一個事實上的依賴關係 6。
  2. 在傳統的多程式碼庫(multi-repo)環境中,這些隱性的跨庫依賴關係難以被追蹤和管理。當某個底層函式庫更新時,其影響範圍往往是未知的,極易引發「依賴地獄」和意想不到的系統性崩潰。
  3. Google 的單體程式碼庫策略,將所有依賴關係都置於一個統一的、可分析的系統之內 7。這使得任何改動的潛在影響範圍在理論上都是可知的。這為進行大規模的原子性變更和重構,以修復由海勒姆定律引發的問題,提供了可能性。
  4. 然而,僅有可見性而無控制,將會導致混亂。如果任何工程師都可以隨意修改任何程式碼並引入新的依賴,整個系統將迅速失控。因此,一系列嚴格的工具和流程應運而生,它們共同構成了針對海勒姆定律風險的「圍堵策略」。例如,建構系統 Bazel 能夠精確理解整個程式碼庫的依賴圖譜;強制性的程式碼審查流程則旨在審核每一項變更,以發現其可能帶來的非預期後果。

綜上所述,單體程式碼庫暴露了海勒姆定律帶來的風險,而 Google 強大的中心化工具鏈則是馴服這一風險的必要手段。這兩者共同構成了 Google 在時間和規模挑戰下,維持程式碼庫健康和可持續性的基石。

第二部分:文化與組織:打造高效能團隊的基石

如果說哲學思想是 Google 工程之道的靈魂,那麼其獨特的文化與組織結構就是承載這個靈魂的軀體。Google 投入了巨大的資源來研究和建設其內部的人類系統,因為他們深知,再先進的技術,如果沒有一個能夠支持其運行的文化環境,也無法發揮其最大效能。本部分將探討構成 Google 文化核心的三大支柱:心理安全感、OKR 目標管理,以及從失敗中學習的無咎檢討會。

2.1 心理安全感:亞里斯多德計畫的啟示

2012年,Google 啟動了一項名為「亞里斯多德計畫 (Project Aristotle)」的多年期研究,旨在回答一個根本問題:「什麼是打造成功團隊的關鍵?」9。研究團隊分析了超過 180 個內部團隊的大量數據,涵蓋了團隊成員的性格、技能、背景以及管理風格等多種變數 10。

最初,研究人員的假設與許多傳統觀念一致,認為一個成功的團隊或許是由最頂尖的個體組成的「夢幻組合」11。然而,研究結果卻出乎所有人的意料。數據顯示,團隊的效能與成員的個人能力、性格特質、甚至是團隊的組成結構(如內向者與外向者的比例)之間並沒有明顯的相關性。真正決定團隊成敗的,是團隊成員之間的互動方式、工作結構以及他們對工作的集體感知 12。

在所有被識別出的因素中,心理安全感 (Psychological Safety) 被證實是迄今為止最重要的基石 9。心理安全感被定義為一種團隊內共享的信念,即團隊成員相信在這個環境中進行人際冒險是安全的 9。換言之,團隊成員可以放心地承認錯誤、提出問題、分享瘋狂的想法,甚至挑戰現狀,而不用擔心會因此受到懲罰、羞辱或被視為無知、消極 9。

除了心理安全感,亞里斯多德計畫還識別出另外四個關鍵動態:

心理安全感之所以如此關鍵,是因為它並非僅僅是創造一個「友好」或「舒適」的氛圍。恰恰相反,它是一個實現**「有建設性的不適 (productive discomfort)」「高度問責 (high accountability)」**的先決條件 10。一個缺乏心理安全感的團隊,成員會傾向於自我保護,隱藏錯誤,避免提出可能被視為愚蠢的問題,從而扼殺了學習和創新的機會。

深入分析可以發現,心理安全感並非一個孤立的文化價值,而是 Google 整個高性能工程體系得以順暢運轉的潤滑劑。它與其他核心實踐之間存在著深刻的內在聯繫:

  1. 無咎檢討會 (Blameless Postmortems):Google 的 SRE 文化要求工程師在系統故障後,公開、誠實地討論失敗的根本原因 13。如果工程師擔心因為承認錯誤而受到指責,他們就不可能進行真正深入和誠實的分析。心理安全感為這種「無咎」文化提供了存在的土壤,使得每一次失敗都能成為一次寶貴的集體學習機會 14。
  2. OKR 目標管理:Google 的 OKR 系統鼓勵設定極具挑戰性的「抱負型 (aspirational)」目標,其中,達成 70% 就被視為成功 15。如果團隊害怕因未能達到 100% 而受到懲罰,他們就會傾向於設定保守、易於實現的目標,從而扼殺了突破性創新的可能性。心理安全感使得「在追求宏大目標過程中的失敗」成為一種可被接受的、甚至是值得鼓勵的行為。
  3. 程式碼審查:Google 的程式碼審查流程強調坦誠、直接的回饋 16。在一個缺乏安全感的環境中,直接的批評很容易被解讀為人身攻擊,導致審查過程充滿防禦和敵意。心理安全感確保了回饋能夠被視為對事不對人的建設性意見,從而真正提升程式碼品質並促進知識共享。

因此,心理安全感在 Google 的工程文化中,扮演著基礎性、賦能性的角色。它不是最終目標,而是釋放團隊集體智慧、驅動創新、並讓其他所有高效工程實踐得以有效實施的必要條件。

2.2 目標與成果:OKR 的雙軌制驅動

為了在龐大且快速發展的組織中保持方向一致和行動協同,Google 早在 1999 年就採納了由傳奇創投家約翰·杜爾 (John Doerr) 引入的「目標與關鍵成果 (Objectives and Key Results, OKR)」框架 15。如今,OKR 已經深入到 Google 的各個層面,從公司級的戰略目標到每個團隊甚至個人的工作計畫,都圍繞著 OKR 展開 15。

OKR 框架的核心結構非常簡潔 17:

在 Google 的實踐中,最獨特也最關鍵的一點是其雙軌制 OKR 系統。所有 OKR 被明確劃分為兩種類型 17:

  1. 承諾型 OKR (Committed OKRs):這些是團隊承諾必須完成的目標,通常與核心業務的健康運行直接相關,例如確保服務達到其服務等級協定 (SLA)。對於承諾型 OKR,預期評分是滿分 1.0。任何低於 1.0 的分數都意味著計畫或執行上出現了失誤,需要進行解釋和檢討 17。團隊需要調整資源和優先級,以確保這些目標按時完成。
  2. 抱負型 OKR (Aspirational OKRs):這些是「登月計畫 (moonshot)」式的目標,代表了團隊對未來的宏大願景,即使在設定目標時,團隊可能還不完全清楚如何實現它們,或者缺乏足夠的資源 17。抱負型 OKR 的目標是激發團隊跳出常規思維,挑戰極限。其預期評分在 0.6 到 0.7 之間。如果一個團隊總是能 100% 完成他們的抱負型 OKR,這反而說明他們設定的目標不夠有野心 15。

這種雙軌制設計是 Google 組織層面上進行**「受管理的風險投資 (managed risk-taking)」**的核心機制。它巧妙地解決了成熟組織普遍面臨的一個困境:如何在確保當前業務穩定運行的同時,為可能帶來顛覆性創新的長期專案分配資源和精力。

此外,Google 的 OKR 流程強調透明度,所有員工的 OKR 在公司內部都是公開可見的。這促進了跨團隊的協調與對齊,讓每個人都清楚地知道公司的首要任務是什麼,以及自己的工作如何為之貢獻 15。值得注意的是,OKR 並不直接用於員工的績效評估,這進一步鼓勵了員工設定真正有挑戰性的目標,而不是為了績效而選擇易於達成的目標 15。

2.3 無咎檢討會:從失敗中學習的文化

在任何複雜的工程系統中,失敗都是不可避免的。Google 的獨特之處不在於它能防止所有失敗,而在於它建立了一套強大的文化和流程,確保組織能從每一次失敗中汲取最深刻的教訓。這個流程的核心,就是「無咎檢討會 (Blameless Postmortem)」13。

無咎檢討會是 Google 網站可靠性工程 (SRE) 文化的一項基本原則 13。它是一份關於某次故障事件的書面記錄,其目的是分析事件的影響、緩解措施、根本原因以及防止其再次發生的後續行動 20。其最重要的特點是「無咎 (blameless)」——整個過程的核心假設是:

參與事件的每個人都懷有良好意圖,並基於當時所掌握的資訊做出了他們認為正確的決定 13。

這種文化的價值源於對人性和系統複雜性的深刻理解。在一個充滿指責和懲罰的環境中,當問題發生時,人的本能反應是隱藏錯誤、推卸責任,以求自保 14。這種「指責遊戲 (blame game)」的直接後果是,導致失敗的真正系統性問題被掩蓋,寶貴的學習機會也隨之流失,同樣的錯誤未來很可能會一再發生。

無咎文化通過消除恐懼,創造了一個鼓勵透明和誠實的環境。它將焦點從「是誰犯了錯?」轉移到「系統的哪個環節出了問題,才使得錯誤的發生變得可能?」13。例如,與其質問「為什麼值班工程師錯過了警報?」,無咎檢討會更關心「為什麼我們的監控系統不夠清晰,或者警報過於頻繁以至於產生了『警報疲勞』?」。這種視角的轉變至關重要,因為修復系統比「修復」人要有效得多,也更具擴展性。

一個典型的 Google 無咎檢討會流程通常在發生特定觸發事件後啟動,例如:

檢討會的產出是一份詳細的報告,其語言風格也經過精心設計,以強化無咎文化。例如,鼓勵使用「我們」而非「你」,提問時多用「如何發生」而非帶有質問語氣的「為什麼發生」21。報告會詳細記錄事件時間線、影響範圍、根本原因分析,並最終形成一份具體的、可追蹤的行動計畫 (Action Items),分配給相應的團隊去執行,以從根本上加固系統 20。

這份報告不僅在團隊內部審閱,還會在更廣泛的範圍內分享,有時甚至公司高層也會參與其中 13。這種廣泛的分享確保了從一次局部失敗中學到的教訓能夠惠及整個組織,提升整體的系統彈性。

從更深層次看,無咎檢討會是 Google 將**「失敗的勢能」轉化為「改進的動能」**的核心機制。它是一個高度形式化的組織學習流程,是 Google 工程哲學中「時間」原則最直接的體現——通過投資於對過去失敗的深入理解,來為系統的未來購買更高的可靠性。

2.4 知識共享的創新:從「廁所測驗」到卓越工程文化

在一個擁有數萬名工程師、辦公室遍布全球的巨型組織中,如何有效地傳播知識、統一工程實踐、並持續強化核心文化,是一個巨大的挑戰。傳統的培訓課程和冗長的內部文件往往效率低下,因為工程師們通常非常忙碌,難以主動投入大量時間去學習。面對這個「最後一哩路」的難題,Google 採用了一種極具創意、甚至有些古怪的解決方案——「廁所測驗 (Testing on the Toilet, TotT)」22。

TotT 專案始於 2006 年,當時 Google 正經歷爆炸性增長,隨之而來的是頻繁的軟體錯誤和代價高昂的發布回滾 22。一個名為「測試小組 (Testing Grouplet)」的志願工程師團體,對如何提升公司的測試文化感到憂心忡忡。在一次腦力激盪中,有人半開玩笑地建議,可以把關於測試的技巧貼在洗手間的隔間裡,因為「人們在那裡顯然有時間閱讀」22。

這個看似戲謔的想法迅速被付諸實踐。第一期 TotT 內容非常簡單,只是一個程式碼範例和一個改進建議,由總部的一位工程師撰寫,並由倫敦辦公室的志願者張貼 22。很快,這種形式受到了意想不到的歡迎。越來越多的工程師開始自願撰寫內容,一個由志願者組成的「張貼大軍」在全球各地的 Google 辦公室裡將這些傳單貼滿了洗手間 23。

TotT 的成功之處在於其巧妙地利用了幾個關鍵原則,使其成為一種**「環境式、低摩擦的文化與技術教育」**模式:

隨著時間的推移,TotT 的內容也從最初單純的軟體測試,擴展到涵蓋程式設計實踐、機器學習、Web 開發等更廣泛的軟體工程主題,並在 2024 年正式更名為「廁所科技 (Tech on the Toilet)」22。其影響力也得到了數據的驗證:一篇 2019 年在軟體工程頂級會議上發表的研究論文,分析並證實了 TotT 在推動 Google 內部工具和基礎設施採用方面的顯著成效 22。許多廣受歡迎的 TotT 文章,如《減少巢狀,降低複雜度》或《測試太 DRY?讓它們 DAMP 一點!》,在內部程式碼審查和設計文件中被引用了數百次,成為了事實上的最佳實踐標準 22。

TotT 的成功甚至啟發了 Google 內部其他類似的知識分享專案,如關注非技術性生產力技巧的「廁上學習 (Learning on the Loo)」24,並被許多其他公司所效仿 22。它生動地證明了,解決複雜的組織問題,有時並不需要複雜的系統,而需要的是對人性的洞察和打破常規的創意。

第三部分:核心工程實踐:在規模化下維持紀律

如果說文化和哲學是 Google 工程體系的「道」,那麼本部分將要探討的則是實現這一「道」的「術」——那些將抽象原則轉化為工程師日常工作的具體流程和工具。在 Google 的海量程式碼和龐大團隊規模下,維持紀律和效率是一項巨大的挑戰。為此,Google 建立了一套高度整合、自動化且強制執行的核心工程實踐,涵蓋了從程式碼存儲、建構、審查到測試的整個生命週期。

3.1 單體程式碼庫 (Monorepo):統一與挑戰

與業界普遍採用的、將不同專案或服務分散在多個獨立程式碼庫(multi-repo)中的做法不同,Google 做出了一個極具挑戰性且影響深遠的戰略決策:將幾乎所有軟體專案的原始碼都儲存在一個巨大的、統一的版本控制庫中,即「單體程式碼庫 (Monorepo)」7。

這個名為 Piper 的內部系統,儲存了超過 20 億行程式碼,總大小高達 86TB,並且每天要處理來自上萬名工程師的約 4 萬次提交 26。選擇這條道路,是因為在 Google 看來,單體程式碼庫在應對「時間」和「規模」挑戰時,提供了多個無可比擬的戰略優勢:

然而,這種統一性帶來的好處是以巨大的技術代價換來的。一個如此龐大的單體程式碼庫會引發一系列嚴峻的挑戰,若沒有相應的解決方案,整個系統將完全無法運作 7:

為了克服這些挑戰,Google 投入了巨量資源,打造了一整套高度客製化的基礎設施生態系統 26:

因此,Google 的單體程式碼庫策略並非一個可以輕易複製的「最佳實踐」。它是一個戰略性的權衡和承諾。Google 認為,單體程式碼庫在管理依賴、應對海勒姆定律、以及實現長期程式碼演進方面所帶來的好處,遠遠超過了為此建立和維護一套複雜的客製化工具鏈的巨大成本。這個決策是 Google 整個工程體系的戰略支點,它強制推行了一套中心化的工具和治理模式,從而實現了在分散式世界中難以企及的一致性和大規模變革能力。

3.2 建構系統 (Bazel):速度與正確性的融合

如果說單體程式碼庫是 Google 工程體系的骨架,那麼其建構系統 Bazel 就是驅動這個龐大骨架運動的強勁引擎。沒有一個能夠在速度和正確性上都做到極致的建構系統,Google 的單體程式碼庫將會因為自身的重量而陷入癱瘓,無法動彈。

傳統的建構工具,如 Make 或 Ant,大多是基於任務 (task-based) 的 28。開發者需要編寫腳本來定義一系列要執行的命令(如編譯、連結、打包)。這種方式在小型專案中尚可應付,但在 Google 的規模下,其弊端暴露無遺:它速度緩慢、容易出錯且難以維護 28。為了確保正確性,開發者往往需要在每次建構時重新執行所有步驟,導致時間極長;或者,他們會嘗試編寫複雜的邏輯來判斷哪些部分需要重建,但這本身就極易引入錯誤和不確定性 29。

為了解決這些根本性問題,Google 開發了自家的建構系統,並將其開源為 Bazel 30。Bazel 的設計哲學與傳統工具完全不同,它是基於產物 (artifact-based) 的。Bazel 的核心是理解程式碼之間的依賴關係,並基於這些關係建立一個精確的「動作圖 (action graph)」28。這個圖譜詳細描述了每一個建構產物(如函式庫、二進位檔案)是如何由其輸入檔案和建構規則生成的。

基於這個核心設計,Bazel 實現了兩大關鍵目標 28:

  1. 速度 (Speed):由於 Bazel 精確地知道所有依賴關係,當某個檔案發生變更時,它能夠準確地計算出只需要重建動作圖中受影響的節點。此外,Bazel 會積極地快取 (cache) 所有建構過程中的中間產物和最終產物。如果一個建構任務的輸入檔案和建構命令都沒有改變,Bazel 會直接從快取中獲取結果,而無需重新執行。這使得即使在一個擁有數十億行程式碼的倉庫中,大多數的增量建構也能在極短的時間內完成。
  2. 正確性 (Correctness):Bazel 通過「沙盒 (sandboxing)」機制來確保建構的封閉性 (hermeticity)。每一個建構動作都在一個隔離的環境中執行,該環境只能訪問其明確聲明的輸入依賴。它無法訪問網路,也無法讀取工作區中未聲明的檔案。這徹底消除了因開發者機器環境差異(如安裝的工具版本不同、環境變數設定不一)而導致的建構結果不一致的問題,完美解決了「在我的機器上可以正常運作」的千古難題 28。這種可重現性 (reproducibility) 對於一個每天自動執行數萬次建構和測試的組織來說,是不可或缺的。

此外,Bazel 使用一種名為 Starlark 的高階、人類可讀的語言來定義建構規則 30。開發者只需聲明他們想要建構的目標(如一個 C++ 函式庫或一個 Java 應用程式)及其依賴,而無需關心底層調用編譯器和連結器的複雜細節 30。

因此,Bazel 與單體程式碼庫的關係是密不可分的共生關係。單體程式碼庫的龐大規模創造了對一個高效、可靠建構系統的迫切需求。而 Bazel 精確的依賴分析和高效的快取機制,正是讓單體程式碼庫在實踐中變得可行的關鍵技術。Bazel 不僅僅是一個工具,它是 Google 在規模化下,對「速度」與「正確性」這對看似矛盾的目標所給出的工程學答案。

3.3 程式碼審查 (Code Review):提升程式碼健康的集體責任

在 Google,幾乎沒有任何程式碼可以在未經另一位工程師審查的情況下,被提交到公司的單體程式碼庫中。程式碼審查 (Code Review) 並非一項可有可無的建議,而是被整合到開發流程中的一個強制性環節。這一實踐的根本目的,並非僅僅是為了找出程式碼中的錯誤,而是為了達成一個更宏大的目標:確保 Google 程式碼庫的整體健康度 (overall code health) 隨著時間的推移而持續改善 16。

這個指導原則意味著程式碼審查是一個需要精妙平衡的過程。一方面,開發者需要能夠推進他們的任務,如果審查者過於苛刻,使得任何變更都難以提交,那麼開發者就會失去改進程式碼的動力,程式碼庫也會因此停滯不前 16。另一方面,審查者對其審查的程式碼負有所有權和責任,他們需要確保程式碼庫保持一致性、可維護性和可讀性 16。

為了平衡這兩者,Google 確立了一條核心的審查標準:「總體而言,一旦一個變更列表 (CL, Change List) 處於一個明確能夠改善系統整體程式碼健康的狀態,審查者就應該傾向於批准它,即使這個變更並不完美。」16。

這條「持續改進而非追求完美」的原則,是 Google 程式碼審查文化的精髓。審查者不應要求作者在批准前打磨每一個微小的細節。相反,他們應該在推動進度和改進的重要性之間做出權衡。如果一個變更整體上提升了系統的可維護性、可讀性和可理解性,那麼就不應該因為一些不完美的細節而將其拖延數天或數週 16。審查者仍然可以提出改進建議,但如果建議並非至關重要,他們會用「Nit:」(吹毛求疵之意) 作為註解前綴,告知作者這只是一個可以選擇性忽略的潤飾點 16。

Google 的程式碼審查流程由一個名為 Critique 的內部工具提供支持 32。Critique 與公司的版本控制系統、建構系統和靜態分析工具深度整合,提供了一個高效的協作平台。其典型流程如下 33:

  1. 創建變更:作者在本地完成程式碼修改,並上傳一個快照到 Critique。
  2. 請求審查:作者向一位或多位審查者發出審查請求。Critique 會基於程式碼的所有權、最近的修改歷史和審查者的可用性等因素,智慧地推薦合適的審查者 33。
  3. 評論與回覆:審查者在 Critique 的介面中對程式碼進行逐行評論。作者根據回饋修改程式碼,上傳新的快照,並回覆評論。這個過程可能會反覆多次。
  4. 批准與提交:當審查者對變更的最終狀態感到滿意時,他們會給予批准,標記為「LGTM (Looks Good To Me)」。一旦獲得所有必要的批准,作者就可以觸發提交流程,將程式碼合併到主幹中。

除了保證品質,程式碼審查在 Google 還扮演著另外兩個重要的角色:

綜上所述,Google 的程式碼審查流程是一種**「分散式、持續性的品質保證與文化傳播」**機制。它將維護程式碼健康的責任,從一個中心化的 QA 團隊分散到每一位工程師身上。通過「持續改進」的核心原則和強大的工具支持,它在確保品質和推動進步之間取得了務實的平衡,成為了 Google 在巨大規模下維持工程紀律的關鍵一環。

3.4 測試金字塔:Google 的測試策略與配比

在 Google,軟體測試不僅僅是品質保證的一個環節,更是一門被深入研究和系統化實踐的工程學科。面對海量的程式碼和極快的開發迭代速度,如何有效地分配測試資源,以在成本、速度和覆蓋率之間取得最佳平衡,是一個核心問題。為此,Google 大力倡導並實踐了「測試金字塔 (Testing Pyramid)」模型 34。

測試金字塔是一個視覺化的隱喻,它建議將軟體測試按照其粒度和範圍劃分為不同的層級,並指導了在各個層級應該投入的測試數量比例 35。Google 根據測試的範圍、運行方式和資源消耗,將其測試分為三類:小型 (Small)、中型 (Medium) 和大型 (Large) 測試,這大致對應於業界通用的單元測試、整合測試和端到端測試 37。

根據 Google 在 2014 年測試自動化大會上提出的建議,一個健康的測試組合應該遵循 70/20/10 的黃金比例 34:

測試金字塔的理念,本質上是一個基於風險和成本管理的經濟學策略。其內在邏輯是,將大部分的測試投入(即資本)配置在回報最高、成本最低的資產上。

  1. 測試的最終目標是以盡可能低的成本,盡可能早地發現錯誤。
  2. 單元測試是發現錯誤成本最低的方式。它們運行速度快,能提供即時回饋,且定位問題精準,因此應該佔據最大比例(70%)34。
  3. 端到端測試是發現錯誤成本最高的方式。它們運行緩慢,維護困難,且除錯耗時,因此應該只用於覆蓋最關鍵、最高價值的核心使用者流程,數量要嚴格控制(10%)34。
  4. 整合測試則填補了兩者之間的空白,以中等的成本捕捉單元測試無法覆蓋的模組間交互問題。

Google 同時也警告要避免兩種常見的測試反模式 34:

下表清晰地總結了 Google 的測試金字塔模型:

測試規模 對應類型 建議比例 關鍵特性
小型 (Small) 單元測試 (Unit Test) 70% 速度快 (毫秒級)、可靠/封閉、範圍小 (單一函式/類別)、在隔離環境中驗證單元邏輯。
中型 (Medium) 整合測試 (Integration Test) 20% 速度中等、通常可靠、範圍中等 (幾個組件交互)、驗證模組間的協同工作。
大型 (Large) 端到端測試 (E2E Test) 10% 速度最慢、可能脆弱不穩、範圍大 (完整使用者流程)、從使用者角度驗證整個系統。
Table 1: Google 測試金字塔 (小型、中型、大型測試) 摘要

這個框架為工程團隊提供了一個清晰、可操作的指南,幫助他們在追求軟體品質的過程中,做出明智的、符合經濟效益的決策。

第四部分:系統可靠性與維運:SRE 與基礎設施

Google 的服務遍及全球,為數十億使用者提供不間斷的服務。維持如此龐大規模系統的穩定性和可靠性,是一項極其艱鉅的挑戰。傳統的系統管理員 (sysadmin) 模式,即通過手動操作來應對故障,在 Google 的規模下早已失效 41。為此,Google 獨創了一套革命性的維運理念和實踐——網站可靠性工程 (SRE),並建立了支撐其全球業務的傳奇性基礎設施。

4.1 網站可靠性工程 (SRE):將軟體工程思維應用於維運

網站可靠性工程 (Site Reliability Engineering, SRE) 的概念於 2003 年由 Google 工程副總裁本·特雷諾·斯洛斯 (Ben Treynor Sloss) 創立 42。其核心思想可以用一句話概括:「

SRE 就是讓軟體工程師來設計一個維運團隊時會發生的事。」41。它主張用軟體工程的方法論和實踐,來解決傳統上由維運團隊處理的問題,其目標是建構和運行大規模、高可用、可擴展的分散式系統 41。

SRE 的核心職責涵蓋了系統的可用性、延遲、效能和效率,其日常工作的一個主要目標是通過自動化來消除「瑣務 (toil)」——那些手動的、重複的、缺乏長期價值且隨著服務規模擴大而線性增長的工作 42。SRE 團隊通常由具備軟體開發和系統管理雙重背景的工程師組成 42。

雖然 SRE 常與 DevOps 相提並論,因為兩者都旨在打破開發與維運之間的壁壘,但 SRE 可以被視為 DevOps 理念的一種非常具體和規範化的實現 42。SRE 與傳統 DevOps 的關鍵區別在於其對

數據和量化指標的極度重視。SRE 的運作基於一套嚴格的數據驅動框架:

  1. 服務等級指標 (SLI - Service Level Indicator):這是對服務某個方面效能的量化測量。例如,HTTP 請求的延遲、錯誤率或系統的可用性。SLI 必須是可測量的。
  2. 服務等級目標 (SLO - Service Level Objective):這是一個為 SLI 設定的目標值或範圍。例如,「99.9% 的請求延遲必須低於 100 毫秒」。SLO 是 SRE 團隊與產品開發團隊之間達成的關於服務可靠性目標的正式協議。
  3. 錯誤預算 (Error Budget):一旦設定了 SLO,錯誤預算就自然產生了。它等於 100% - SLO。例如,如果可用性 SLO 是 99.9%,那麼錯誤預算就是 0.1%。這個預算代表了服務在一個特定時間週期內「被允許」的不可靠程度。

錯誤預算是 SRE 實踐中最具革命性的概念,它從根本上重新定義了開發與維運之間的關係,將傳統的對立關係轉變為基於共同目標的合作關係。

這個機制巧妙地統一了雙方的激勵機制。開發團隊為了保持其發布速度,會更有動力去編寫高質量的、可靠的程式碼,並協助 SRE 提升系統的穩定性。而 SRE 團隊則有動力去建立更完善的自動化測試和部署流程,以幫助開發團隊安全、快速地發布,從而減輕自身的維運負擔。這種基於數據驅動的契約,將一場無休止的拉鋸戰,轉變為一場共同追求速度與穩定平衡的協作。

4.2 傳奇基礎設施:Borg 與 Spanner 的設計哲學

Google 的軟體工程實踐,建立在其強大而獨特的內部基礎設施之上。這些基礎設施並非簡單的工具集合,而是 Google 工程哲學的終極體現:在基礎設施層面,一次性地解決一個極度困難且通用的問題,從而讓成千上萬的應用程式開發者不必重複地、拙劣地解決同一個問題。 其中,Borg 叢集管理器和 Spanner 全球分散式資料庫是兩個最具代表性的傳奇系統。

Borg:抽象化機器的藝術

Borg 是 Google 內部使用的大規模叢集管理系統,是如今廣為人知的 Kubernetes 的前身和靈感來源 46。早在 2003 年左右,Google 就已經在生產環境中運行 Borg,用以管理由數萬台伺服器組成的龐大叢集,並在其上運行數十萬個作業 (job) 46。

Borg 的核心設計哲學是向使用者隱藏資源管理和故障處理的複雜性 46。在 Borg 的世界裡,開發者不需要關心他們的程式碼具體在哪一台物理機器上運行。他們只需以一種聲明式的方式,定義他們的工作負載(一個「job」),以及該工作負載所需的資源(如 CPU、記憶體)。一個 job 由一個或多個相同的「task」組成,Borg 的任務就是找到叢集中合適的機器來運行這些 task 46。

其基本架構包括 47:

Borg 的出現,為 Google 的開發者提供了一個強大的抽象層。它將整個數據中心的數萬台伺服器,抽象成了一台巨大的、共享的、有彈性的電腦。開發者可以專注於他們的應用程式邏輯,而將資源分配、任務調度、故障恢復等繁瑣而困難的分散式系統問題,交給 Borg 這個統一的平台來解決。這是一種巨大的生產力槓桿,是 Google 能夠在極大規模下保持開發速度的關鍵。

Spanner:征服全球一致性的聖杯

如果說 Borg 解決了計算的規模化問題,那麼 Spanner 則解決了資料的全球化規模和一致性問題。Spanner 是 Google 的全球分散式資料庫,它被設計用來管理遍布全球的 PB 級資料,並提供傳統資料庫的強大功能 48。

Spanner 最具革命性的貢獻在於,它是全球第一個實現了「外部一致性 (Externally-Consistent)」分散式交易的系統 48。在 Spanner 出現之前,分散式資料庫領域普遍認為,開發者必須在強一致性(如傳統單機資料庫提供的 ACID 交易,但難以水平擴展)和最終一致性(可大規模擴展,但程式設計模型複雜,難以推理)之間做出痛苦的抉擇 50。

Spanner 打破了這個困局。它通過一個名為 TrueTime 的創新 API,實現了看似不可能的任務 48。TrueTime 利用 GPS 接收器和原子鐘,提供了一個能夠精確表示時鐘不確定性的時間服務。它返回的不是一個精確的時間點,而是一個保證包含了真實絕對時間的微小時間區間

[earliest, latest] 49。

基於 TrueTime,Spanner 得以為全球範圍內的每一筆交易分配一個具有全域意義的提交時間戳。通過巧妙地結合 Paxos 共識演算法(用於資料複製)和兩階段提交協議(用於分散式交易),並在提交過程中引入一個基於 TrueTime 不確定性的「提交等待 (commit wait)」機制,Spanner 能夠保證交易的提交順序與真實世界中發生的時間順序完全一致,即實現了外部一致性 49。

對於應用程式開發者而言,Spanner 提供了一個熟悉的 SQL 查詢介面和強一致性的交易保證,同時又具備了在全球範圍內水平擴展的能力 49。這意味著,開發者可以像使用傳統資料庫一樣簡單地開發全球化的應用,而無需處理分散式共識、資料複製和時鐘同步等極其複雜的底層問題。

Borg 和 Spanner 共同體現了 Google 基礎設施的設計哲學:通過巨大的前期投資,在平台層面解決最困難、最普遍的問題,從而為上層的無數應用程式開發者提供一個簡潔、強大且可靠的抽象,極大地加速了整個公司的創新步伐。

第五部分:未來展望:為 AI 時代重塑軟體工程

隨著人工智慧,特別是大型語言模型 (LLM) 的興起,軟體開發的範式正在經歷一場深刻的變革。作為這場革命的領導者之一,Google 也在積極地調整其久經考驗的軟體工程實踐,以應對 AI 時代帶來的全新挑戰和機遇。Google AI 負責人傑夫·迪恩 (Jeff Dean) 的視角,以及 Google 在硬體和軟體協同設計方面的努力,揭示了其未來工程之道的發展方向。

5.1 Jeff Dean 的視角:AI 時代的程式碼與系統複雜性

傑夫·迪恩作為 Google 最資深的工程師之一,其觀點深刻地反映了 AI 對軟體工程的衝擊。他預測,在不久的將來,AI 系統的能力將達到初級工程師的水平,能夠自主完成許多程式設計任務 52。這意味著軟體工程師的角色和所需技能將發生轉變。

在 AI 時代,傳統的程式碼複雜性管理依然重要,但新的、更高層次的複雜性正在出現 52:

Google 的核心工程原則——時間、規模與權衡——在 AI 時代並未過時,而是正在向更高的抽象層次演進

傑夫·迪恩的願景揭示了,未來的軟體工程將更多地涉及管理 AI 代理的團隊、除錯模型的突現行為 (emergent behaviors),以及在一個資料移動成本主導的世界裡優化系統。根本的工程哲學依然適用,但其應用的具體形態正在被徹底重塑。

5.2 硬體與軟體的協同設計:從 TPU 到 Pathways

為了應對 AI 時代的計算挑戰,Google 採取了軟硬體深度協同設計的策略。他們認識到,通用的 CPU 對於深度學習中核心的大規模矩陣運算效率低下。因此,Google 自主研發了專為機器學習設計的硬體——張量處理單元 (Tensor Processing Unit, TPU) 52。TPU 是一種專用積體電路 (ASIC),本質上是為低精度線性代數運算設計的加速器,能夠以比通用 CPU 或 GPU 更高的效能和更低的功耗來執行神經網路的訓練和推論任務 52。

然而,單個 TPU 的算力遠不足以訓練當今的巨型基礎模型。訓練一個像 Gemini 這樣的模型,需要將成千上萬個 TPU 晶片連接成一個龐大的超級計算叢集。這帶來了一個新的、巨大的軟體工程挑戰:如何讓研究人員和工程師能夠有效地編寫程式,來利用這個由數萬個計算單元組成的分散式系統?

為了解決這個問題,Google 開發了一個名為 Pathways 的新一代分散式系統 52。Pathways 的目標是

抽象化底層分散式 AI 訓練的複雜性。它為開發者提供了一個極其簡潔的程式設計模型,讓他們可以像在編寫一個單一的 Python 程式一樣,來驅動成千上萬個 TPU 晶片協同工作。Pathways 系統會自動處理諸如將模型和資料分片到不同晶片上(模型平行和資料平行)、管理晶片間的通訊、以及處理硬體故障等複雜問題 52。

這種做法與 Google 過去的基礎設施戰略一脈相承。正如 Borg 抽象化了物理伺服器,讓開發者無需關心他們程式碼運行的具體機器一樣,Pathways 抽象化了整個分散式加速器叢集,讓 AI 研究人員可以專注於模型架構和演算法的創新,而無需成為分散式系統專家。

TPU 和 Pathways 的組合,構成了 Google 在 AI 時代的基礎設施核心。這再次證明了 Google 的核心工程哲學:通過在基礎設施層面進行巨大的、前瞻性的投資,來為整個工程組織提供強大的槓桿效應。這種軟硬體協同設計的能力,是 Google 在這場 AI 競賽中保持領先地位的關鍵所在。

第六部分:結論與借鑑:Google 之道的普適性與應用

經過對 Google 軟體工程哲學、文化、流程和基礎設施的深度剖析,我們可以得出結論:Google 的成功並非源於某個單一的「秘密武器」,而是一個經過長期演進、各部分緊密耦合、相互支撐的複雜生態系統。然而,這並不意味著 Google 的做法是放之四海而皆準的唯一真理。本部分將首先對比 Google 與其他科技巨頭的工程文化,以揭示不同策略背後的商業邏輯,然後提煉出 Google 之道中對其他組織最具借鑑意義的核心原則。

6.1 巨頭對比:Google 與其他科技公司的工程文化差異

科技行業的巨頭們,儘管在許多技術棧上趨同,但其內在的工程文化卻大相徑庭。每種文化都是對其獨特的商業模式、歷史背景和市場環境的高度優化結果。

下表對這些巨頭的工程文化進行了簡要的比較:

公司 核心哲學 開發節奏 決策模式 關鍵流程/文化 優勢 潛在弱點
Google 規模化下的可持續性 審慎/較慢 工程師主導,共識驅動 程式碼審查/測試金字塔 長期可維護性、系統穩定 流程較重、創新速度可能較慢
Meta 速度與迭代 極快 產品/工程師合作 持續部署/A/B 測試 開發速度快、市場反應敏捷 可能累積技術債、員工倦怠
Amazon 客戶至上/主人翁精神 快速/數據驅動 產品經理主導,自上而下 數據分析/營運卓越 業務執行力強、營運效率高 高壓力、內部競爭激烈
Microsoft 安全與可靠 結構化/中等 產品/專案管理主導 安全開發生命週期 (SDL) 企業級安全、可靠性高 流程較為傳統、靈活性稍遜
Netflix 自由與責任 快速/自主 精英工程師自主決策 人才密度/留任測試 創新能力強、吸引頂級人才 文化適應性要求高、協作成本
Table 2: 主流科技巨頭工程文化比較分析

這個比較表明,不存在普適的「最佳」文化。每種文化都是其所在公司在特定歷史和商業環境下做出的戰略權衡。理解這一點,有助於我們更客觀地看待 Google 的選擇,並從中提煉出真正具有普適價值的原則。

6.2 關鍵原則提煉與實踐建議

對於大多數組織而言,完全複製 Google 的做法(例如建立自己的 Piper 或 Bazel)既不現實也無必要。然而,支撐這些工具和流程背後的核心原則,卻具有極高的參考價值和可移植性。以下是從 Google 之道中提煉出的,可供任何期望提升其工程能力的組織實踐的建議:

  1. 擁抱工程思維:這是最根本的起點。在啟動專案時,團隊領導者應引導團隊思考「時間、規模與權衡」的問題。問一問:「這個系統的預期壽命是多久?」「如果使用者數量或開發團隊增長十倍,我們現在的架構和流程還能應對嗎?」「我們是在為短期目標優化,還是在為長期健康投資?」僅僅是提出這些問題,就能從根本上改變團隊的設計決策。
  2. 優先培養心理安全感:這是最具影響力且成本最低的實踐。任何層級的領導者都可以從今天開始,通過以下方式來營造安全感:將工作挑戰定義為學習問題而非執行問題;在團隊面前承認自己的無知和錯誤,展示脆弱性;以及以提問代替指令,鼓勵團隊成員發聲 12。這不需要任何預算,只需要領導者有意識的努力。
  3. 推行「無咎檢討會」:即使是小規模的故障,也應建立一個正式的、無咎的複盤流程。將焦點從追究個人責任轉移到尋找系統性的改進機會上。這不僅能解決當前的技術問題,更能建立一種持續學習和信任的文化 13。
  4. 實踐「精簡版」測試金字塔:也許無法嚴格遵循 70/20/10 的比例,但可以有意識地將測試資源向金字塔底部傾斜。鼓勵開發者編寫更多的快速、可靠的單元測試,並嚴格審視每一個新增的、緩慢而脆弱的端到端測試的必要性。追蹤測試比例,並警惕「冰淇淋甜筒」反模式的出現 34。
  5. 標準化程式碼審查:即便沒有 Critique 這樣的整合工具,也應建立清晰的程式碼審查標準。採納 Google「提升程式碼健康度」的原則,在推動進度和保證品質之間尋求務實的平衡 16。確保審查的重點是基於技術事實和設計原則的討論,而非個人偏好之爭。
  6. 追求「單一版本」的理念:雖然大多數公司沒有單體程式碼庫,但可以努力趨近其核心優勢——減少「依賴地獄」。通過推行主幹開發 (Trunk-Based Development)、最小化長期存在的功能分支、並投資於穩健的持續整合/持續部署 (CI/CD) 管線,可以模擬單一事實來源所帶來的部分好處。

總而言之,「Google 之道」的精髓,在於其始終如一地將軟體開發當作一門真正的工程學科來對待,並為之付出了相應的嚴謹、遠見和投資。對於任何一個希望在時間的長河中生存、發展並保持卓越的組織而言,這些源自 Google 的工程原則——即便不是其具體的工具——不僅僅是好的建議,更是在應對日益增長的複雜性時,一條必經的道路。

引用的著作

  1. 1. What Is Software Engineering? - Software Engineering at Google ..., 檢索日期:6月 19, 2025, https://www.oreilly.com/library/view/software-engineering-at/9781492082781/ch01.html
  2. Software Engineering at Google: Lessons Learned from Programming Over Time - Amazon.com, 檢索日期:6月 19, 2025, https://www.amazon.com/Software-Engineering-Google-Lessons-Programming/dp/1492082791
  3. Software Engineering at Google[Book] - O'Reilly Media, 檢索日期:6月 19, 2025, https://www.oreilly.com/library/view/software-engineering-at/9781492082781/
  4. Software Engineering at Google - Abseil, 檢索日期:6月 19, 2025, https://abseil.io/resources/swe-book
  5. Software Engineering At Google Summary PDF | Titus Winters - Bookey, 檢索日期:6月 19, 2025, https://www.bookey.app/book/software-engineering-at-google
  6. Software Engineering at Google - Abseil, 檢索日期:6月 19, 2025, https://abseil.io/resources/swe-book/html/toc.html
  7. 10 Common monorepo problems and how your team can solve them - Digma AI, 檢索日期:6月 19, 2025, https://digma.ai/10-common-problems-of-working-with-a-monorepo/
  8. What is Monorepo? Benefits, Use Cases, and Best Practices - Aviator, 檢索日期:6月 19, 2025, https://www.aviator.co/blog/what-is-a-monorepo-and-why-use-one/
  9. Project Aristotle Psychological Safety - LeaderFactor, 檢索日期:6月 19, 2025, https://www.leaderfactor.com/learn/project-aristotle-psychological-safety
  10. Project Aristotle: Implications and Challenges - Leading Sapiens, 檢索日期:6月 19, 2025, https://www.leadingsapiens.com/project-aristotle/
  11. Google's Project Aristotle - Psych Safety, 檢索日期:6月 19, 2025, https://psychsafety.com/googles-project-aristotle/
  12. Team dynamics: The five keys to building effective teams - Think ..., 檢索日期:6月 19, 2025, https://www.thinkwithgoogle.com/intl/en-emea/future-of-marketing/management-and-culture/five-dynamics-effective-team/
  13. Blameless Postmortem for System Resilience - Google SRE, 檢索日期:6月 19, 2025, https://sre.google/sre-book/postmortem-culture/
  14. How to run a blameless postmortem | Atlassian, 檢索日期:6月 19, 2025, https://www.atlassian.com/incident-management/postmortem/blameless
  15. How Google Sets Goals: The OKR Approach - Bernard Marr, 檢索日期:6月 19, 2025, https://bernardmarr.com/how-google-sets-goals-the-okr-approach/
  16. The Standard of Code Review | eng-practices - Google, 檢索日期:6月 19, 2025, https://google.github.io/eng-practices/review/reviewer/standard.html
  17. What Matters: OKR Google playbook: Examples ... - What Matters, 檢索日期:6月 19, 2025, https://www.whatmatters.com/resources/google-okr-playbook
  18. What is an OKR? Definition and Examples - What Matters, 檢索日期:6月 19, 2025, https://www.whatmatters.com/faqs/okr-meaning-definition-example
  19. Mastering OKR Methodology: Insights from Google's Approach - JOP, 檢索日期:6月 19, 2025, https://www.getjop.com/blog/okr-methodology-google
  20. Conduct thorough postmortems | Cloud Architecture Center, 檢索日期:6月 19, 2025, https://cloud.google.com/architecture/framework/reliability/conduct-postmortems
  21. What are Blameless Retrospectives? How Do You Run Them? - FireHydrant, 檢索日期:6月 19, 2025, https://firehydrant.com/blog/what-are-blameless-retrospectives-do-they-work-how/
  22. Tech on the Toilet: Driving Software ... - Google Testing Blog, 檢索日期:6月 19, 2025, https://testing.googleblog.com/2024/12/tech-on-toilet-driving-software.html
  23. Introducing "Testing on the Toilet" - Google Testing Blog, 檢索日期:6月 19, 2025, https://testing.googleblog.com/2007/01/introducing-testing-on-toilet.html
  24. The inside story of how Google bathrooms became classrooms, 檢索日期:6月 19, 2025, https://blog.google/inside-google/life-at-google/inside-story-learning-on-the-loo/
  25. Software Problems in Bathroom Stalls: Google's Testing on the Toilet - Trend Hunter, 檢索日期:6月 19, 2025, https://www.trendhunter.com/trends/google-testing-toilet
  26. How Google Does Monorepo - QE Unit, 檢索日期:6月 19, 2025, https://qeunit.com/blog/how-google-does-monorepo/
  27. Pros of monorepo? : r/ExperiencedDevs - Reddit, 檢索日期:6月 19, 2025, https://www.reddit.com/r/ExperiencedDevs/comments/1gluvy8/pros_of_monorepo/
  28. Build Systems and Build Philosophy - Software Engineering at Google, 檢索日期:6月 19, 2025, https://abseil.io/resources/swe-book/html/ch18.html
  29. Why a Build System? | Bazel, 檢索日期:6月 19, 2025, https://bazel.build/basics/build-systems
  30. Intro to Bazel, 檢索日期:6月 19, 2025, https://bazel.build/about/intro
  31. Quickstart: Building with Bazel | GoogleTest, 檢索日期:6月 19, 2025, http://google.github.io/googletest/quickstart-bazel.html
  32. Understanding the code review tool Critique - Graphite, 檢索日期:6月 19, 2025, https://graphite.dev/guides/understanding-google-critique-code-review-tool
  33. Critique: Google's Code Review Tool - Abseil, 檢索日期:6月 19, 2025, https://abseil.io/resources/swe-book/html/ch19.html
  34. Just Say No to More End-to-End Tests - Google Testing Blog, 檢索日期:6月 19, 2025, https://testing.googleblog.com/2015/04/just-say-no-to-more-end-to-end-tests.html
  35. The testing pyramid: Strategic software testing for Agile teams - CircleCI, 檢索日期:6月 19, 2025, https://circleci.com/blog/testing-pyramid/
  36. The Practical Test Pyramid - Martin Fowler, 檢索日期:6月 19, 2025, https://martinfowler.com/articles/practical-test-pyramid.html
  37. The test pyramid: A complete guide - Qase, 檢索日期:6月 19, 2025, https://qase.io/blog/test-pyramid/
  38. Small, Medium, Large - Mike Bland, 檢索日期:6月 19, 2025, https://mike-bland.com/2011/11/01/small-medium-large.html
  39. As a good first guess, Google often suggests a 70/20/10 split: 70% unit tests, 20% integration tests, and 10% end-to-end tests. : r/softwaretesting - Reddit, 檢索日期:6月 19, 2025, https://www.reddit.com/r/softwaretesting/comments/45yt38/as_a_good_first_guess_google_often_suggests_a/
  40. Understanding the Testing Pyramid and Testing Trophy: Tools, Strategies, and Challenges, 檢索日期:6月 19, 2025, https://dev.to/craftedwithintent/understanding-the-testing-pyramid-and-testing-trophy-tools-strategies-and-challenges-k1j
  41. What is SRE? – Understanding Site Reliability Engineering | RST Software, 檢索日期:6月 19, 2025, https://www.rst.software/blog/what-is-sre
  42. Site reliability engineering - Wikipedia, 檢索日期:6月 19, 2025, https://en.wikipedia.org/wiki/Site_reliability_engineering
  43. en.wikipedia.org, 檢索日期:6月 19, 2025, https://en.wikipedia.org/wiki/Site_reliability_engineering#:~:text=Site%20Reliability%20Engineering%20originated%20at,site%20reliability%20engineers%20on%20staff.
  44. cloud.google.com, 檢索日期:6月 19, 2025, https://cloud.google.com/sre#:~:text=SRE%20is%20a%20job%20function,professional%20services%2C%20and%20other%20resources.
  45. Software Engineer III, Site Reliability Engineering — Google Careers, 檢索日期:6月 19, 2025, https://www.google.com/about/careers/applications/jobs/results/139425587304243910-software-engineer-iii/
  46. (PDF) Large-scale cluster management at Google with Borg (2015) | Abhishek Verma | 1425 Citations - SciSpace, 檢索日期:6月 19, 2025, https://scispace.com/papers/large-scale-cluster-management-at-google-with-borg-4i7d9qnw5x
  47. Borg: the Next Generation, 檢索日期:6月 19, 2025, https://www.cs.cmu.edu/~harchol/Papers/EuroSys20.pdf
  48. Spanner: Google's Globally-Distributed Database - Google Research, 檢索日期:6月 19, 2025, https://research.google/pubs/spanner-googles-globally-distributed-database-2/
  49. Spanner: Google's Globally Distributed Database - CS@Cornell, 檢索日期:6月 19, 2025, https://www.cs.cornell.edu/courses/cs5414/2017fa/papers/Spanner.pdf
  50. Spanner wins the 2025 ACM SIGMOD Systems Award | Google Cloud Blog, 檢索日期:6月 19, 2025, https://cloud.google.com/blog/products/databases/spanner-wins-the-2025-acm-sigmod-systems-award
  51. Spanner: Becoming a SQL System - Google Research, 檢索日期:6月 19, 2025, https://research.google/pubs/spanner-becoming-a-sql-system/?hl=id
  52. Google's Jeff Dean on the Coming Era of Virtual Engineers ..., 檢索日期:6月 19, 2025, https://www.sequoiacap.com/podcast/training-data-jeff-dean/
  53. Jeff Dean & Noam Shazeer – 25 years at Google: from PageRank to AGI, 檢索日期:6月 19, 2025, https://www.dwarkesh.com/p/jeff-dean-and-noam-shazeer
  54. Google Vs Amazon Vs Microsoft PM Roles: A Deep Dive - Engineer Seeking FIRE, 檢索日期:6月 19, 2025, https://engineerseekingfire.com/google-vs-amazon-vs-microsoft-pm-roles-a-deep-dive/
  55. 5 keys differences between working at Google and Facebook - Carrus.io, 檢索日期:6月 19, 2025, https://www.carrus.io/blog/5-key-differences-between-working-at-google-and-facebook
  56. Development and Deployment at Facebook - Engineering People Site, 檢索日期:6月 19, 2025, https://people.engr.tamu.edu/pcr/courses/csce431/fall19/reading/FacebookDevelopment.pdf
  57. Facebook vs Apple vs Amazon vs Netflix vs Google (FAANG) | Which One is Best for You? - YouTube, 檢索日期:6月 19, 2025, https://m.youtube.com/shorts/UHPvcKoWnKs
  58. Amazon Software Engineer Work-Life Balance | | Interview Kickstart, 檢索日期:6月 19, 2025, https://interviewkickstart.com/blogs/articles/amazon-software-engineer-work-life-balance
  59. Career insights – AWS Software Development Engineer – Life at AWS, 檢索日期:6月 19, 2025, https://aws.amazon.com/careers/life-at-aws-inside-the-role-how-aws-culture-empowers-software-engineers/
  60. Software Development Life Cycle | Microsoft Power Automate, 檢索日期:6月 19, 2025, https://www.microsoft.com/en-us/power-platform/topics/phases-of-the-software-development-lifecycle
  61. Microsoft Security Development Lifecycle (SDL) - Microsoft Service ..., 檢索日期:6月 19, 2025, https://learn.microsoft.com/en-us/compliance/assurance/assurance-microsoft-security-development-lifecycle
  62. Engineering Culture and Hiring at Netflix - WeCP, 檢索日期:6月 19, 2025, https://www.wecreateproblems.com/blog/engineering-culture-and-hiring-at-netflix
  63. Netflix Culture Memo - Careers at Netflix, 檢索日期:6月 19, 2025, https://jobs.netflix.com/culture
  64. Learning from Netflix: How to Build a Culture of Freedom and Responsibility, 檢索日期:6月 19, 2025, https://knowledge.wharton.upenn.edu/podcast/knowledge-at-wharton-podcast/how-netflix-built-its-company-culture/
  65. How freedom and responsibility make Netflix rule the world - runandjump, 檢索日期:6月 19, 2025, https://www.runandjumpltd.co.uk/netflix