🎯 什麼情境該想到我
當你「用蠻力硬幹一個問題卻事倍功半」,或不確定「是該繼續調參,還是根本換個方法」的時候。作者花整堂課只講「找對模型」有多重要。
⚙️ 怎麼用(作者的四條結論)
- 正確的模型在形式上通常是簡單的:若你的模型像托勒密「40 個圓套在一起」那樣複雜到難以求解,多半是模型錯了,該找更簡單的(如換成一個橢圓)。
- 正確的模型一開始可能還不如「精雕細琢的錯誤模型」準:哥白尼日心說初期誤差比地心說還大;但只要認定大方向是對的,就該堅持下去,別因一時不如舊方法就放棄。
- 大量準確的資料很重要:開普勒能發現橢圓軌道,靠的是第谷留下的大量精確觀測資料。
- 模型遇到雜訊而失準時,別用湊合的修正去打補丁,要找雜訊的根源——這往往通往重大發現(天王星軌道異常,順著找根源就發現了海王星)。
★ 套用到軟體工程:「本輪」的症狀
托勒密的地心說為了貼合觀測,在圓上一層一層加本輪,最後疊到 40 多個圓。軟體裡也有同樣的現象——模型選錯了,就只能不停打補丁。辨認的訊號:
| 症狀 | 代表 |
|---|---|
| 同一個模組的 bug 修了又出現變形版本 | 修的是症狀,模型本身不對 |
程式碼裡越來越多 if 特殊情況 | 每個特例都是一個本輪 |
| 沒人能用一句話說清楚「這個系統怎麼運作」 | 模型已經複雜到無法被理解 |
| 修一個 bug 會引發另一個 bug | 補丁之間互相牽制 |
★ 三個「換模型」的真實例子
| 錯的模型 | 補丁長什麼樣 | 對的模型 |
|---|---|---|
| 金額用浮點數 | 到處加 round()、比較時用 abs(a-b) < 0.001、對帳時總差幾分錢 | 用最小單位的整數(分、satoshi)或十進位型別;補丁全部消失 |
| 時間存「當地時間字串」 | 夏令時轉換時重複或跳過一小時、跨時區比較出錯、到處加時區換算 | 存 UTC 時間點 + 另存使用者的時區名稱(如 Asia/Taipei,而不是固定的 +08:00);只在顯示時轉換 |
| 快取用固定的過期時間 | 過期時間越調越短(資料太舊)又越調越長(資料庫撐不住),一直在兩者之間擺盪 | 改成資料變更時主動失效(事件驅動);過期時間只當保險 |
共通點:對的模型在形式上更簡單,這正是書中第一條結論。花在調參數(調過期時間、調容差)上的時間,常常是在替錯的模型加本輪。
★ 什麼時候該換模型、什麼時候該繼續調
| 繼續調參數 | 該換模型 |
|---|---|
| 調整讓結果穩定地越來越好 | 調整讓一個問題變好、另一個問題變糟 |
| 例外情況越來越少 | 例外情況越來越多 |
| 能解釋為什麼某個參數值比較好 | 參數值只是「試出來剛好能用」 |
書的第二條結論也提醒:新模型一開始可能比精雕細琢的舊模型表現更差。換模型時要預期一段過渡期,用明確的指標(錯誤率、補丁數量、事故數)判斷方向對不對,而不是看第一週的結果。
🧪 我實際套用的紀錄
- 2026-07-24:(待填)
⚠️ 注意 / 什麼時候不適用
- 「堅持大方向」的前提是你有理由相信方向對;不是固執己見。判斷方向對錯,看它是否更簡單、更能解釋現有資料、能否舉一反三。
🔗 相關工具
- 工具-簡單即是美 —— 選模型的判準,繞得越少的模型通常越接近本質
- 工具-用資訊消除不確定性 —— 配套量尺,模型好不好用資訊量來衡量而非直覺
- 工具-區分修復與掩蓋症狀 —— 同一心態的工程版,別在錯的模型上一直調參數