剃刀
正確的設計是 最少 的、能完全滿足使用者 實際 需求的設計—— 不添加任何尚未存在的需求。兩次削減:找出需求,然後讓解決方案 符合需求。
1. 找出真正的需求。 人們所要求的,是他們已經想到的解決方案, 而不是其底層的需求——而他們 說 的常常不是他們 想 的。 陳述的請求、想像的解決方案和實際的需求是三件不同的事情。 從第一性原理重建需求:這是為誰設計的,他們現在真正想做的 是什麼?你無法針對一個尚未找到的目標進行削減——如果不清楚, 就提問。
2. 削減解決方案以符合需求 (奧卡姆剃刀)。 正確的設計是滿足該需求 所需的最少活動部件;每一層額外的抽象、選項、抽象層或防護都是 成本——建造、閱讀、測試、破壞和更改——除非 當前的 需求 為其買單。要找到最少的部件,停在第一個能行得通的台階上:
- 它是否真的需要存在? → 否:丟掉它 (YAGNI)。
- 是否已有東西解決了它——這個程式碼庫、標準函式庫、平台功能、 已安裝的相依套件? → 使用它,不要從頭建造。
- 它能否是一個顯而易見的東西,而不是一個系統? → 讓它變成那樣。
對解決方案保持懶惰,但永遠不要在理解問題上偷懶。
流程
- 重建真正的需求 (第一次削減);用一句話陳述它。
- 推導出最小的設計——從最笨但能運作的方法開始,只添加 需求強迫要加的內容 (第二次削減)。
- 將提案與最小設計進行比較。每一項多餘的內容都是候選的 削減對象;標出紅旗 (YAGNI、過早抽象、過度防禦、重新發明、 投機選項)。
- 不要過度削減。重新閱讀需求,並放回它實際需要的任何東西。 縮小 ≠ 脆弱——絕不削減真正的驗證、錯誤處理、安全性或 可及性。
輸出
使用這個模板,並保持簡潔——一把手術刀,而不是一篇論文:
## 真實需求
<一行——使用者真正需要的東西,而不是他們要求的>
## 最小設計
<能滿足需求的最窄方法>
## 被削減的多餘設計
- <項目> — <紅旗 + 為何沒有當前需求證明其正當性>
## 保留 (不要過度削減)
<任何看起來可以削減但實際上是必要的東西,以免之後被遺漏。
如果沒有符合條件的,則省略此部分。>
如果設計已經是最小的,就這麼說並停止。