Code review 會為組織帶來摩擦與延遲——但多數問題不是審查本身的錯,而是實施方式的錯。讓流程值得投入的關鍵,幾乎全都指向同一個方向:保持敏捷、保持快速、保持小顆,好讓 review 能適當地規模化。其中「寫小型變更」是最重要的一條。
🧠 為什麼這些準則重要
過重、或無法規模化的審查流程最終會變得不可持續——一旦不可持續,工程師就會開始繞過它。所以每一條最佳實踐的目的,都是降低單次審查的成本,讓「快速、輕量、值得做」的正向循環能一直轉下去。
- 小顆變更是流程敏捷的地基:小的變更好消化、好追 bug、好 rollback,也讓一位 Reviewer 就能勝任。
- 速度決定體驗:來回等待是 code review 最大的挫折來源。回饋要快、要一次講完。
- 信任是前提:整個流程圍繞「相信工程師會做正確的事」來優化——所以只需一個 LGTM、所以 Reviewer 可以帶著未解決評論就給 LGTM。
- 描述是為後世寫的:變更描述會變成永久的歷史紀錄,「Bug fix」這種描述對未來的考古者毫無幫助。
WARNING
大顆的「完整功能」變更容易被 Reviewer 以「範圍過大」為由直接拒絕——這是 Google 賦予 Reviewer 的權利。要引入重大新功能,應拆成一系列小型、漸進的變更。個別來看或許較難看清全貌,但這是值得的取捨。
⚖️ 六條實務準則
① 寫小型變更(最重要的一條)
- 「小型」通常指約 200 行程式碼以內;Google 約 35% 的變更只動一個檔案。
- 小型且原子性的變更更容易追蹤 bug 來源、也更容易 rollback。
- 幾乎所有 review 都只由一位 Reviewer 審——正是小顆變更讓這個優化成為可能。
// ❌ 一顆變更塞了三件事:重構 + 新功能 + 順手修 bug
// Reviewer 難以聚焦,rollback 時三件事被綁死。
// ✅ 拆成三顆各自聚焦的 CL:
// CL 1: refactor — 抽出 calculateTax()(無行為改變)
// CL 2: feat — 新增 applyCoupon()
// CL 3: fix — 修正四捨五入誤差 + 對應測試
function calculateTax(order) {
return order.taxableTotal * order.region.rate;
}每顆都聚焦單一議題,好審、好追、好回退。
② 保持審查快速
- 大多數變更預期在約一天內收到初始回饋(不是一天內完成審查,而是一天內給出初步回應)。
- 對 Reviewer 的硬性期待:在 24 個工作小時內回覆;若當下無法完成,至少回一句「收到、會盡快」。
- 不要零碎地(piecemeal)給回饋——沒什麼比作者回應完一輪後又收到不相關的新意見更令人沮喪。一次講完。
③ 控制 Reviewer 人數到最少
- 大多數 review 恰好由一位 Reviewer 審。
- 業界傾向找更多人、求一致同意,但 Google 發現這是邊際效益遞減——最重要的 LGTM 是第一個,額外 Reviewer 的成本很快超過價值。
- 若真需多人,各 Reviewer 應聚焦不同面向,而非重複審同一件事。變更可 CC 給相關團隊,但只有主要 Reviewer 需要給 LGTM。
④ 寫好變更描述(這是永久紀錄)
- 第一行至關重要:它會成為 review 工具的摘要、email 主旨、以及 Code Search 中的歷史摘要行。
- 描述要講清楚改了什麼和為什麼改。「Bug fix」對 Reviewer 和未來考古者都毫無幫助。
// ❌ Bug fix
// ✅ fix: 折扣金額出現負數時回傳 0
//
// 當 order.total 為負(退貨情境)時,discountFor() 會算出
// 負折扣並被錯誤地當成加值。加上邊界檢查與對應測試。⑤ 保持禮貌與專業
- Reviewer:尊重作者的實作方式,只在方法有明確缺陷時才建議替代方案;若作者能證明多種方法同樣有效,接受作者偏好;在問「為什麼這樣做」之前,別假設它是錯的。
- 作者:記住「你不等於你的程式碼」(you are not your code);把每條評論當成 TODO——不一定照做,但必須回應;在雙方都有機會提替代方案前,別擅自把評論標成已解決。意見不一致時可提替代方案並請 Reviewer PTAL(please take another look)。
⑥ 盡可能自動化
- Code review 是人工流程,但機械性的部分該自動化——投資工具會回本。
- Google 的 Presubmit 機制:變更送出前先跑格式、lint、測試等檢查,把問題擋在「寄出尷尬 email 給 Reviewer」之前,要求作者先修。
- 自動化讓 Reviewer 專注在真正重要的議題上,而不是格式細節。
IMPORTANT
正確性檢查是「左移」(shift left)與縱深防禦策略的一環,而非全部。隨著靜態分析與自動化測試進步,許多正確性檢查已能自動完成——code review 不需要「完美」就能產生效果。也因此,鼓勵工程師核准「改善 codebase」的變更,而不是苦等「完美」的解決方案。
🔑 Takeaways
- 小型變更(約 ≤ 200 行)是最重要的一條——好審、好追 bug、好 rollback,也讓「一位 Reviewer」成為可能。
- 審查要快:初始回饋約一天、Reviewer 24 工作小時內回應、意見一次講完別零碎。
- Reviewer 人數最小化,第一個 LGTM 價值最高;後續遞減。
- 變更描述講清楚「改了什麼 + 為什麼」,它是永久的歷史紀錄。
- 維持禮貌專業(「你不等於你的程式碼」、評論是 TODO),並把機械性檢查交給自動化(Presubmit)。
No notes yet — jot your takeaways or Q&A here.