1. 編譯速度的演進#
1982 年,作者拿到第一台 IBM PC,面對的是漫長的編譯等待。軟體開發的核心循環——Edit-Compile-Test——其速度直接影響開發者的生產力。早期的工具如 Turbo Pascal 大幅縮短了編譯時間,證明了快速回饋循環的價值。
開發生產力的關鍵不在於打字速度,而在於 Edit-Compile-Test 循環的總耗時。任何能縮短此循環的改善,都會帶來倍增的效益。
2. 每日構建的核心概念#
每日構建(Daily Build)改善的是更大層級的循環:Report-Fix-Retest loop。其三大特徵:
- 自動化:不依賴人工記憶或手動操作,由腳本自動完成
- 每日執行:固定排程,確保持續整合的節奏
- 完整構建:從原始碼開始,涵蓋所有模組與元件
3. 每日構建的好處#
3.1 快速取得修復版本#
當 bug 被修復後,QA 團隊或使用者能在隔天就拿到包含修復的版本,不需要等待漫長的釋出週期。
3.2 開發者信心#
每次成功的構建都是一次驗證:程式碼至少能正確編譯並通過基本測試。這給予團隊持續前進的信心。
3.3 行銷與展示用途#
行銷團隊隨時可以取得最新的穩定版本進行展示或客戶演示,不需要向開發團隊臨時要求「能跑的版本」。
3.4 歷史存檔與除錯#
保留每日構建的產物,當出現難以追蹤的 bug 時,可以透過二分搜尋法(binary search)找出是哪一天引入的問題。
4. 如何建立每日構建流程#
4.1 基礎建設#
- 部署一台高速的構建伺服器,專門用於編譯與打包
- 自動化版本控制的 checkout 流程
- 自動化編譯、連結、打包的完整流程
4.2 文件化#
將整個構建流程文件化,確保任何團隊成員都能理解並維護構建腳本。避免構建流程成為單一成員的「黑箱知識」。
4.3 構建腳本的維護#
- 腳本應涵蓋所有必要步驟,不依賴任何手動操作
- 從乾淨的環境開始構建,確保可重現性
5. 最佳實踐#
- 腳本涵蓋一切:從 checkout 到最終安裝包,所有步驟都包含在構建腳本中
- 立即修復構建錯誤:構建失敗是最高優先級的問題,必須即刻處理
- 通知機制:構建失敗時自動通知整個團隊,讓責任歸屬清晰
- 維護可見的構建日誌:讓所有人都能看到構建狀態與歷史記錄
- 排程考量:若團隊跨時區,需安排多個構建時段,確保所有成員都能在工作日開始時取得最新版本
構建失敗後的第一件事不是追究責任,而是立即修復。讓「構建永遠是綠的」成為團隊文化。
6. 品質控制與成本效益#
修 bug 不應該是「發現就修」的反射動作,而應基於成本效益分析。
作者用花生醬果醬工廠的比喻說明:假設生產線上偶爾有瓶蓋沒蓋好的問題,修復這個問題的成本是否值得?答案取決於:
- 問題發生的頻率
- 每次問題造成的損失
- 修復的工程成本
- 修復後可能帶來的連帶風險
品質控制的本質是經濟決策:只有當修復的價值大於修復的成本時,才值得投入資源去修。