Balance Quality with Pragmatism #
品質與實用的辯證 #
程式碼品質(Code Quality)歸根究柢是場關於權衡(Trade-offs)的賽局,並沒有一條放諸四海皆準的通用法則。
Effective 工程師面對決策時,不應糾結於抽象的「對錯(Right or Wrong)」, 而應將思維轉向判斷該方案在當前情境下是「行得通還是行不通(Work and doesn’t work)」。 在此前提下,我們透過以下四個面向來落實這項原則。
1. 建立可持續的程式碼審查機制 #
建立 Code Review 流程不僅是為了把關,更是團隊成長的基石。其具體效益包含:
| 價值維度 | 核心功能 | 對團隊的長遠影響 | 連結的思維模型 |
|---|---|---|---|
| 品質門神 | 提早發現錯誤 | 降低生產環境的修復成本,避免設計短視 | P95 效能優化:減少極端 Bug 對使用者的衝擊 |
| 行為約束 | 提升責任感 | 開發者會自發性地重構,不留下 Dirty Mess | 守 (Shu):在被檢視的壓力下,維持基本的開發規範與紀律 |
| 技術傳承 | 樹立典範 | 透過 Feedback 分享 Best Practices | 轉化 (Transform):將個人的高階技巧轉化為團隊的共同資產 |
| 系統韌性 | 共享知識 | 消除資訊孤島 (Silos),確保 Bus Factor 大於 1 | 低耦合 (Decoupling):讓工作內容不與特定個人過度耦合 |
| 速度紅利 | 長期敏捷性 | 易讀、易改的程式碼,是維持開發速度的基石 | 人工時間優化:減少後人理解程式碼的認知負荷 |
根據 2008 年一項針對 650 家公司、12,500 個專案的研究發現,經過設計與程式碼審查的流程,平均能移除 85% 的殘留錯誤。
2. 透過抽象化管理複雜度 #
選對抽象層(Abstraction),程式設計會優雅高效;選錯了,則會變成一連串災難。錯誤介面會因被迫適應預期外互動而臃腫笨重。
正確抽象化能透過以下方式提升生產力(甚至可達數量級的提升):
- 簡化問題:將原本複雜問題拆解為易理解的基本元素(Primitives)。 例如許多複雜的數據處理問題,都可被簡化為一連串的 Map 與 Reduce 轉換
- 提升維護性:解決硬核問題一次,便能讓解法重複使用多次
- 落實 DRY 原則:良好抽象將複雜細節統一封裝(Consolidate),每次的重複使用都在攤提開發成本
什麼是好的抽象化?
建立通用的解決方案雖然比解決特定問題耗時,但一個好的抽象化應具備以下特質:
易於學習 (Easy to learn)
易於使用 (Easy to use):即便沒有文件也能憑直覺使用
難以誤用 (Hard to misuse):設計上應避免使用者輕易犯錯
功能強大 (Sufficiently powerful):足以滿足需求
易於擴充 (Easy to extend)
受眾合適 (Appropriate to the audience)
3. 自動化測試 #
隨著新功能的開發,錯誤率(Error Rate)往往會飆升。自動化測試(Automated Testing) 是建立信心的關鍵。
- 信心來源:為修復的 Bug 撰寫測試,確保該問題在合併到主分支後永遠不會再重現
- 對抗恐懼:消除人們「不敢修改程式碼」的恐懼文化。沒有測試保護,問題往往要很久才會被發現,且常被錯誤歸因於功能擁有者,而非始作俑者
- 誰該寫測試?:應由程式碼作者撰寫,而非讓幾個月後試圖修改的人補償
面對無測試專案的策略: 若你需要接手一個完全沒有測試的專案,不要試圖一次補完。請從 「最有價值(Most Valuable)」 的部分開始寫測試,然後由此延伸。
4. 償還技術債 #
技術債(Technical Debt) 指的是那些為了讓軟體維持健康與品質,卻被推遲的必要工作。
值得注意的是,技術債不一定源於草率的權宜之計(Quick and dirty workarounds)。 很多時候,當我們尚未完全理解問題全貌時就編寫軟體,初版設計往往不夠乾淨,這也是種技術債。
償還策略:高槓桿原則 #
技術債難以量化,且並非所有債務都值得償還。如果把所有資源都拿來還債,你將無暇開發新事物。 Effective 工程師會專注於 高槓桿(Highest Leverage) 的債務:
程式碼中「高流量(Highly Trafficked)」,且修復成本最低(Takes the least time)的部分。這些改進能帶來最高效益。
重點摘要 (Key Takeaways) #
- 建立審查文化:Code Review 不僅除錯,更是推廣優良編碼規範的模範
- 投資抽象化:好的抽象化能一勞永逸地解決困難問題,大幅提升使用者生產力
- 自動化測試擴展品質:單元與整合測試能減緩修改脆弱代碼的恐懼。優先撰寫能省下最多時間的測試
- 管理技術債:不要盲目還債。專注那些利息最高(影響範圍最大)的債務