Spec-Driven Development 真正有用的不是「寫更多」,而是把它當成合約+證據

SDD 不是 Markdown 瀑布流。對 coding agents 來說,能降低不確定性的不是更長的規格,而是合約(API/schema/error policy)+證據(tests/evals)+乾淨的脈絡供應鏈(context engineering)。本文整理一套可落地的 SDD 工作流。

Spec-Driven Development 真正有用的不是「寫更多」,而是把它當成合約+證據

Spec-Driven Development(SDD)真正有用的不是「寫更多」,而是把它當成合約+證據

我很懂那種畫面:

coding agent 很自信說「完成了 ✅」,你一跑測試,紅到像聖誕樹。

不是因為它不努力,是因為它在「腦補」。

很多時候我們以為問題是 spec 不夠長,於是開始把規格寫成教科書、寫成瀑布流 Markdown。

但真相更殘酷:你寫得再多,只要缺少邊界與驗證,agent 一樣會用錯的方式把事情做完。

所以我現在更願意把 SDD 理解成一句話:

SDD = contract + evidence(合約+證據)

而不是文件堆疊。


## 1)SDD 做對的事:讓 agent 不用猜

站在 coding agent 的視角,最值錢的不是「長篇敘述」,而是幾種硬資訊:

  • 共同語言:需求、邊界、non-goals 先寫清楚,少腦補。

  • 約束與合約:API / schema / error policy / SLO,這些是邊界條。

  • 可生成骨架:stubs / types / docs,讓它不用每次從 0 猜結構。

  • 可追溯:需求 → spec → code → test,形成稽核鏈。

如果你做的是介面明確、邊界穩定的工作(SDK、API contract、資料 schema),SDD 的收益會非常高。


## 2)SDD 容易崩壞的地方:都跟「人類以為自己有控制力」有關

我看過 SDD 在實務上崩壞,通常不是因為概念錯,而是因為落地方式踩到這幾個坑:

  1. 規格維護稅(spec drift)
    需求改了,改 code 很快;先更新 spec 再改 code 常常變流程負擔。
    最後 spec/code/團隊腦內模型不同步,反而更危險。

  2. 規格永遠寫不完「為什麼」
    spec 擅長 what,但真正決定行為的是 why:trade-off、不可動假設、暫時妥協。
    沒寫進去就會意圖錯位。

  3. 過度規格=假的安全感
    文件越厚越像有控制力。
    但沒有 tests / evals 的證據,agent 仍然可以把你帶到錯的地方。

  4. Markdown 地獄 + Double Review
    規格裡常包含 pseudo-code,你要先 review spec,再 review 真 code。
    審查成本直接翻倍。


## 3)我後來的結論:重點是 Context Engineering,不是 Spec Engineering

很多 prompt 失敗,其實是 context 失敗。

Context engineering 更像系統設計:你要設計「資訊供應鏈」,讓 agent 每一步拿到此刻剛剛好的資料。

而不是把 repo / wiki / 規格整包塞進 context window。

那種 everything-bagel context,只會讓注意力互相打架。

所以我現在把 spec 放在 context 裡,但它只負責「最硬的那塊」:

  • 合約(contract)

  • 邊界(boundaries)

  • 驗收標準(acceptance criteria)

剩下的,交給檢索、工具、測試去提供證據。


## 4)一個我覺得可行的 SDD 工作流(偏實作)

  1. 先寫最小 spec(只寫邊界)
  • 問題 / 非目標(non-goals)

  • 合約(API、資料結構、error policy)

  • 驗收標準(acceptance criteria)

  • 安全/依賴 allowlist

  1. 讓 agent 產 plan,但強制切小批次
  • 每一步都要能在 5–20 分鐘內驗證
  1. 每個步驟都要有「證據」
  • unit / integration tests / 最小 eval

  • 沒綠燈不算 done

  • 不接受「手動測試說明」當驗證

  1. context 當作預算管理
  • 只檢索此步驟需要的檔案

  • 工具按需上架(不要全開)

  • 清掉衝突指令,只留單一 source of truth

  1. 行為改了就更新 spec
  • spec 不更新,後面只會誤導 agent

## 5)怎麼把 spec 當「合約」,讓跨部門 review 不變成 double review 地獄

我覺得很多團隊對 SDD 的痛,表面上是「文件很煩」。

底層其實是:你把 spec 當成故事在寫,所以每個人都得再花一次腦力把它翻譯成「可以驗收的東西」。

要避免 double review,我通常會做三個收斂:

### 收斂 1:把 spec 寫成「可驗收的合約條款」,不是描述文

一份好用的 spec,對跨部門來說應該像合約:

  • 我們要交付什麼(scope)

  • 我們不做什麼(non-goals)

  • 什麼情況算失敗(error policy)

  • 用什麼方式驗收(acceptance criteria)

只要驗收條款清楚,review 就會自然變短。

### 收斂 2:把「why / trade-off」集中放在一個區塊,避免散落成小說

跨部門 review 最浪費時間的,通常不是在看功能,而是在問:

  • 為什麼要這樣設計?

  • 為什麼不做另一種?

  • 這個取捨背後的假設是什麼?

你不用寫長篇,但一定要有一個固定區塊,列出 3–5 條:

  • 不可動假設

  • 主要取捨

  • 風險與替代方案

讓大家一次看完,不用在文件裡「找作者心情」。

### 收斂 3:把 review 切成兩段:合約 review(一次)+證據 review(自動)

double review 會發生,是因為大家先 review spec,之後又要 review code。

比較省的方法是:

  • 合約 review:跨部門只 review 邊界/驗收/風險(一次就結束)

  • 證據 review:靠 CI 跑 tests/evals,變成可被信任的綠燈

然後你在 PR 裡只要求兩個輸出:

  1. 「合約是否被破壞」(diff 看 contract/spec 的關鍵段落)
  2. 「證據是否成立」(CI 綠燈)

當 spec 真的是合約、tests 真的是證據,review 就不會變成兩次相同的閱讀。


如果要用一句話收尾:

把 spec 寫成可驗收的合約,把對話變成可自動驗證的證據,你就能把跨部門 review 從「讀作文」拉回「確認條款」。


## 結尾

我不反對 spec。

我反對的是把 spec 當成「控制不確定性」的唯一手段。

對 coding agents 來說,能真正降不確定性的,通常是這三件事一起存在:

  • 清楚的合約(spec)

  • 乾淨的脈絡(context)

  • 可驗證的證據(tests/evals)

你把 SDD 用在「合約+證據」上,agent 會更可靠。

你把 SDD 用在「文件堆疊」上,你只會更晚發現錯誤。


#SDD #CodingAgents #ContextEngineering #Testing #軟體工程