從 SBE 到 SDD:讓 AI 聽得懂人話的開發新思維

近年軟體圈開始流行一個新名詞 —— SDD(Spec-Driven Development)
顧名思義,它是一種「由規格驅動開發」的方式:
開發人員不再從零寫程式,而是讓 AI 根據需求規格(spec)自動生成架構、介面與部分邏輯。
這種做法聽起來令人振奮,但它的前提卻是——規格真的寫得夠好。

而在現實中,規格這件事,從來就沒那麼簡單。
在多數團隊裡,規格往往模糊不清、描述不全、甚至充滿誤解。
這時候若直接交給 AI 去生成程式碼,可能只會讓錯誤更快、影響更大。


🚧 為什麼單靠 SDD 不夠

想像你是一位開發者,接到這樣一份來自 PM 的 spec:

「乘客可預約早鳥票。若出發日距離今日超過 20 天,則顯示早鳥優惠選項。優惠依剩餘座位與時段自動計算。」

看起來清楚嗎?
對人類而言或許還行,但對 AI 來說,這份 spec 充滿灰色地帶。
它不會知道:

  • 「超過 20 天」是否包含當天?
  • 「剩餘座位」要少於多少才算「過少」?
  • 「優惠選項」是折扣百分比還是固定票種?

AI 不會猜,也不懂業界默契。
它會照字面實作出「完全正確但毫無業務價值」的程式。

這就揭示了 SDD 的三大限制 —— 模糊語言、規格不全、與缺乏業務知識。
我們來一一拆解這三個陷阱。

⚠️ SDD 的三大限制與風險

一、語言的模糊性 —— AI 讀得懂字,但不懂語氣

SDD 的前提是「規格能被明確表達」,
但自然語言的特性恰好相反,它充滿模糊與隱喻。
例如「若訂票超過五張就需要審核」這句話,
AI 會照字面理解為「任何人訂超過五張都要審核」,
而實際上業務邏輯可能是「只有公司帳號才需要主管審核」。

結果?AI 完美執行錯誤的邏輯。
這種錯誤往往不會在測試時被立即發現,
因為在規格層面它是「正確的」,但在商業層面卻「離題了」。

二、規格不可能寫全 —— 現實永遠比文件複雜

任何專案的 spec 都只是「冰山一角」。
人們在撰寫需求時,往往只記下顯而易見的行為。
但實際的產品邏輯往往複雜得多。

以高鐵早鳥票為例:「出發日超過 20 天可顯示早鳥優惠」只是表層邏輯。
實際上還包含:

  • 若該班次座位剩不到 10%,是否仍顯示?
  • 若用戶登入公司帳號,是否適用不同折扣?
  • 若同時使用優惠碼,優先順序是什麼?

這些未被寫出的細節,AI 不會幫你補齊。
結果就是「程式沒 bug,但功能不對」。

SDD 的本質,是把明確規格轉成明確程式。
它不會自動發現遺漏,反而會放大遺漏的後果。

三、Domain Know-how 無法自動推斷 —— AI 沒有「行業常識」

AI 雖然會寫程式,但它不理解文化與業界潛規則。
例如在台灣高鐵的早鳥票邏輯裡,有一條「付款後不得改期」的默契。
這是所有內部人員都知道的事,但若沒被寫進 spec,AI 完全不會考慮。

這不是 AI 的錯,而是因為「上下文」屬於人類知識的一部分。
AI 只看字面意思,不懂「隱含的業務意圖」。
因此,若希望 SDD 生成的程式具備商業正確性,就必須有專業人士補足這一層 domain knowledge。

🧩 解法:讓 SBE / BDD 來補足 SDD 的缺口

這時候,SBE(Specification by Example)BDD(Behavior-Driven Development) 的價值就浮現了。
這兩種方法的核心精神是一樣的:
用「具體範例」把模糊需求轉化為「可驗證的行為」。

SBE 不取代規格,而是讓規格更具體。
換句話說,它幫助團隊在「原始 spec」的基礎上,
用範例補上那些人類以為 AI 會懂,但實際上它不會懂的細節。

🧠 真實對話:當團隊用 SBE 釐清「早鳥票」需求

在高鐵專案的會議室裡,PM、QA、RD 與 AI 工具並肩坐著。
PM 一開口就說:

「早鳥票要在出發日 20 天前顯示,這樣使用者比較容易看到折扣。」

開發人員皺眉問:「那如果是今天 3 月 1 日訂 3 月 21 日的票,是 20 天剛好,要顯示還是不顯示?」
PM 想了想:「嗯…那應該是顯示吧。」
QA 補充:「那如果是凌晨 00:30 查詢呢?時間算哪一天?」
全場一陣靜默。

這時 QA 打開一份 SBE 模板,開始把「原始規格」具體化:

Scenario: 出發日超過 20 天時顯示早鳥選項
  Given 今天是 3 月 1 日中午 12:00
  And 使用者選擇 3 月 25 日出發
  When 使用者查詢可售車次
  Then 系統應顯示「早鳥優惠」標籤

PM 看了點頭:「對,這樣寫就清楚多了。」
RD 接著問:「那剩餘座位如果很少,是不是要取消早鳥?」
PM:「對,不能剩太少。」
QA:「那要怎麼定義太少?」
經過討論後,大家補上第二個範例:

Scenario: 剩餘座位過少時不顯示早鳥優惠
  Given 今天是 3 月 1 日
  And 使用者選擇 3 月 25 日出發
  And 該班次剩餘座位小於 10%
  When 使用者查詢可售車次
  Then 不應顯示「早鳥優惠」

這時,整個團隊終於對齊了理解:
不是只交「文字規格」給 AI,而是交「規格+經過釐清的範例」。

這樣的結構同時保留了設計意圖(What & Why)與實際行為(How & When)。
AI 不再只是「生成程式的機器」,而能根據具體行為與上下文做出合理的實作。

🤖 接棒:AI 如何從「規格+範例」生成程式(SDD 階段)

討論結束後,團隊把整理好的內容丟給 AI 工具(如 Kiro 或 Cursor)。
輸入的不是單一範例,而是一份完整的輸入包,包含:

  • 原始需求規格
  • 經過討論的範例(BDD 格式)
  • API / domain 背景說明

Prompt 內容可能像這樣:

「根據以下需求與範例,使用 TypeScript 與 NestJS 實作早鳥票查詢功能,
包含座位查詢、折扣判斷與對應的測試案例。」

AI 立刻生成:

  • TicketService:判斷距離出發日天數、查詢座位餘量、計算折扣範圍
  • TicketController:提供 /tickets/search API
  • 測試檔:依據範例自動驗證行為

這時的 AI 並不是在「猜」程式邏輯,而是在「執行共識」。
而這份共識的基礎,就是「spec + example」。

這正是現代開發轉變的關鍵:

AI 不取代人,而是放大規格與範例的準確性。

發表迴響

探索更多來自 轉念學 - 敏捷三叔公的學習之旅 的內容

立即訂閱即可持續閱讀,還能取得所有封存文章。

Continue reading