Day 21 講了容錯模式的設計。今天倒帶重放,講這個模式當初是怎麼跟 Claude Code 一起落地的——因為那次協作過程本身,比結果更值得記錄。
我給的初始指令大意是:「所有呼叫 LLM 生成內容的地方要加上容錯:失敗時不能中斷排程流程,要退回純數據的基本版內容。」
注意這段話的抽象層級——我講的是業務規則(不能中斷、要有退路),不是實作指令(在哪個檔案加 try/except)。這是跟 agent 協作幾個月摸出來的心得:把「要什麼」講清楚,把「怎麼做」留給它先提案。你描述得越接近實作,就越容易把自己還沒想清楚的實作偏見一起塞給它。
Claude Code 讀完專案裡現有的幾處 LLM 呼叫後,回了一個問題,大意是:
「失敗」的定義包含「API 成功回應、但內容不符合預期格式」的情況嗎?現有程式碼裡有一處對回應做了格式解析,如果解析失敗,目前的行為是往外拋例外。
這一問直接命中了我沒想清楚的邊界。我原本腦中的「失敗」只有逾時跟錯誤碼——「成功地回傳垃圾」這個失敗模式(後來在 Day 21 裡寫的 _looks_valid 檢查)是被這個反問逼出來的。而它能問出這個問題,恰恰因為它動手前真的去讀了現有程式碼,發現了一處與我的描述矛盾的既有行為。
這是我認為 AI 協作最被低估的價值:它是一面會找碴的鏡子。 你給的規格照到現有程式碼上,不一致的地方它會指出來——而規格跟現實的不一致處,正是 bug 的出生地。
邊界定清楚後(失敗 = 逾時 ∪ 錯誤碼 ∪ 格式不符;一律回 fallback 字串不拋例外),它做了三件事:
第 2 步值得特別停留。「把一個模式套用到所有符合條件的地方」這件事,人類工程師的失誤率被大幅低估了——大範圍重構漏改一兩處是常態,而漏掉的那處不會報錯,它只是安靜地保持著舊行為,直到某天 AI 掛掉時那一處如舊地把例外拋穿整條排程。機械化的完整性正是 agent 相對於人類的結構性優勢:它不疲勞、不「想說這處應該沒差」、不因為改到第十五處而開始複製貼上。
回看整個過程,分工的形狀很清楚:
| 環節 | 誰主導 | 為什麼 |
|---|---|---|
| 定義業務規則(什麼算失敗、退路長怎樣) | 我 | 這是產品承諾,責任在我 |
| 發現規格的邊界漏洞 | 它(透過讀碼反問) | 它對「現況」的盤點比我的記憶可靠 |
| 模式設計與命名 | 它提案、我裁決 | 品味可以委託,拍板不行 |
| 全場掃蕩落地 + 測試 | 它 | 機械化完整性是它的主場 |
這張表幾乎就是我對「跟 AI agent 協作」的完整方法論——後面幾天(測試紀律、記憶系統、多 agent、自動巡檢)都是這張表在不同場景的展開。