傳統 PRD 的結構性缺陷是:它把大量篇幅花在描述「要做什麼」,只用很少篇幅(或完全不寫)交代「為什麼是這個做法」與「怎樣算做完」。這在需求提出者與實作者天天坐在一起時不構成問題——缺的資訊可以隨時口頭補齊。一旦交接變成非同步(跨時區、跨團隊、或接手者是 AI agent),這些缺口就會直接變成錯誤的實作。

Spec 是交接載體,不只是需求描述

Spec-Driven Development 的價值有一半來自它是一份好的交接物。 它把需求從「說明文件」變成「可執行契約」:有可測試的驗收標準、有明確的邊界(不做什麼)、有假設的顯性列舉。這些欄位不是為了流程完備,每一個都對應一種交接損耗——驗收標準對應「不知道怎樣算做完」,邊界對應「範圍蔓延」,假設列舉對應 隱性假設

spec 的內容怎麼寫、四階段閘門怎麼設,Spec-Driven Development:規格先行 已經處理得很完整,這裡不重複。從交接的角度,只補三件那篇沒有強調的事。

第一,spec 必須包含「已否決的選項」。 一份只寫最終決定的 spec,交出去之後接手者會重新提案已被否決的方案,或在實作中「順手改得更好」而破壞當初的取捨。這一欄的成本極低(三行字),對抗的是最貴的一種失敗——決策漂移。

第二,Problem Framing 的產物本身也要一起交。 只交 spec 不交問題陳述,接手者會知道要建什麼,但不知道成功長什麼樣,於是在遇到 spec 沒覆蓋的細節時無從判斷。問題框定的方法見 Problem Framing:定義正確問題;從交接角度要記住的是:spec 回答 what/how,問題陳述回答 why,兩者缺一都會讓接手者在邊緣情況下亂猜。

第三,spec 的第一個讀者可能不是人。 當 spec 直接被拿去當 AI agent 的執行輸入時,它會被逐字執行而不是被合理解讀。這其實是好消息:它逼你把原本靠默契補齊的部分寫出來。壞消息是粒度問題——太粗 agent 無法執行,太細等於用自然語言重寫程式。目前沒有公認的判準,這也是 SDD 專欄 追蹤的待解問題之一。

驗收標準與 DoD 的分工

這兩個概念經常混用,但在交接裡各有位置。

驗收標準(Acceptance Criteria)是這一個需求的行為契約:在什麼情境、做什麼動作、預期什麼結果。它隨需求而變,寫在需求本身裡,最好寫成可以直接轉成測試的形式(Given / When / Then 或等價結構)。

Definition of Done 是團隊層級的一致門檻:不論做哪個需求,都必須通過的那組條件。典型的 DoD 包含測試已寫並通過、code review 已完成、可觀測性(log/metric)已加、無障礙已檢查、文件或 ADR 已更新、feature flag 與回滾路徑已確認。DoD 不需要每次重寫,它是團隊的常數。

分工的意義在交接時才顯現:AC 告訴接手者「這件事要做成什麼樣」,DoD 告訴接手者「在這個團隊裡,交出去之前還要做哪些事」。新人與 AI agent 缺的通常是後者——他們能做對功能,卻交出一個沒有測試、沒有 log、沒有回滾路徑的實作,因為沒有人告訴過他們這裡的門檻。

最容易掉落的一類:非功能需求

功能需求會被寫下來,因為它是需求提出者想要的東西。非功能需求常常不被寫下來,因為它是需求提出者預設會有的東西——這正是隱性假設的定義。

在交接時要主動點名的幾類:效能預算(首屏時間、p95 延遲、可接受的資料量級)、錯誤處理策略(重試幾次、退避策略、失敗後使用者看到什麼)、資料保存與刪除(保留多久、誰能刪、刪除是軟刪還是硬刪)、權限模型(誰能看、誰能改)、可觀測性(出事的時候要能回答哪些問題)、法規與隱私(個資落在哪個欄位、要不要遮罩)。

這些項目有一個共同特徵:事後補的成本遠高於事前寫的成本,而且多數涉及資料結構或介面形狀,一旦上線就很難回頭。所以它們值得放進 DoD 當固定檢查項,而不是指望每次需求都記得寫。

一個判準:spec 能不能撐過「作者消失」測試

檢驗需求交接品質有一個便宜的方法:假設寫這份 spec 的人今天起休假兩週,完全聯絡不到。接手者能不能只靠這份文件開工,並在遇到 spec 沒覆蓋的情況時,用文件裡的問題陳述與取捨紀錄自己判斷?

不能的話,缺的通常不是細節,而是 why。細節可以問,why 沒有人能替你回答。

延伸