spec-driven-development

spec-driven-development

熱門

在編寫程式碼之前先建立規格。當開始一個新專案、功能或重大變更,且尚無規格時使用。當需求不明確、模糊或僅存在於模糊概念中時使用。

7.7萬星標
0分支
更新於 2026/7/3
SKILL.md
readonlyread-only
name
spec-driven-development
description

在編寫程式碼之前先建立規格。當開始一個新專案、功能或重大變更,且尚無規格時使用。當需求不明確、模糊或僅存在於模糊概念中時使用。

規格驅動開發

概述

在編寫任何程式碼之前,先撰寫結構化的規格。規格是你與人類工程師之間共享的真相來源——它定義了我們要建置什麼、為什麼,以及如何知道完成。沒有規格的程式碼就是猜測。

使用時機

  • 開始一個新專案或功能
  • 需求模糊或不完整
  • 變更涉及多個檔案或模組
  • 你即將做出架構決策
  • 任務需要超過30分鐘來實作

何時不使用: 單行修正、錯字更正,或需求明確且自成一體的變更。

閘門式工作流程

規格驅動開發分為四個階段。在當前階段驗證完成之前,不得進入下一階段。

規格 ──→ 計畫 ──→ 任務 ──→ 實作
   │          │        │          │
   ▼          ▼        ▼          ▼
 人類       人類     人類       人類
 審查       審查     審查       審查

第一階段:規格

從高層次願景開始。向人類提問釐清問題,直到需求具體明確。

立即揭露假設。 在撰寫任何規格內容之前,列出你的假設:

我做的假設:
1. 這是一個網頁應用程式(不是原生行動應用)
2. 認證使用基於 session 的 cookie(不是 JWT)
3. 資料庫是 PostgreSQL(根據現有的 Prisma schema)
4. 我們只針對現代瀏覽器(不支援 IE11)
→ 請現在糾正我,否則我將繼續使用這些假設。

不要默默填補模糊的需求。規格的整個目的就是在程式碼被寫出來之前,揭露誤解——假設是最危險的誤解形式。

撰寫涵蓋以下六個核心領域的規格文件:

  1. 目標 — 我們要建置什麼以及為什麼?使用者是誰?成功的樣貌是什麼?

  2. 指令 — 完整的可執行指令及其參數,而不只是工具名稱。

    建置:npm run build
    測試:npm test -- --coverage
    Lint:npm run lint --fix
    開發:npm run dev
    
  3. 專案結構 — 原始碼位置、測試位置、文件歸屬。

    src/           → 應用程式原始碼
    src/components → React 元件
    src/lib        → 共用工具
    tests/         → 單元測試與整合測試
    e2e/           → 端對端測試
    docs/          → 文件
    
  4. 程式碼風格 — 一個真實的程式碼片段勝過三段描述。包含命名慣例、格式化規則,以及良好輸出的範例。

  5. 測試策略 — 使用什麼框架、測試放在哪裡、覆蓋率期望、哪些測試層級對應哪些關注點。

  6. 邊界 — 三層系統:

    • 總是做: 提交前執行測試、遵循命名慣例、驗證輸入
    • 先問: 資料庫 schema 變更、新增相依套件、變更 CI 設定
    • 絕不做: 提交機密、編輯 vendor 目錄、未經核准移除失敗的測試

規格範本:

# 規格:[專案/功能名稱]

## 目標
[我們要建置什麼以及為什麼。使用者故事或驗收條件。]

## 技術棧
[框架、語言、主要相依套件及版本]

## 指令
[建置、測試、lint、開發——完整指令]

## 專案結構
[目錄佈局及說明]

## 程式碼風格
[範例片段 + 關鍵慣例]

## 測試策略
[框架、測試位置、覆蓋率要求、測試層級]

## 邊界
- 總是做:[...]
- 先問:[...]
- 絕不做:[...]

## 成功標準
[我們如何知道完成——具體、可測試的條件]

## 待解決問題
[任何需要人類輸入的未解決事項]

將指示重新框架為成功標準。 當收到模糊需求時,將其轉化為具體條件:

需求:「讓儀表板更快」

重新框架的成功標準:
- 儀表板 LCP < 2.5 秒(4G 連線)
- 初始資料載入在 < 500 毫秒內完成
- 載入期間無版面位移(CLS < 0.1)
→ 這些是正確的目標嗎?

這讓你可以反覆嘗試、重試並解決問題,朝著明確的目標前進,而不是猜測「更快」是什麼意思。

第二階段:計畫

根據驗證過的規格,產生技術實作計畫:

  1. 識別主要元件及其相依關係
  2. 決定實作順序(哪些必須先建置)
  3. 記錄風險及緩解策略
  4. 識別哪些可以平行建置,哪些必須循序進行
  5. 在階段之間定義驗證檢查點

遵循 planning-and-task-breakdown 以了解這些步驟背後的相依圖譜對應與垂直切割機制;它是權威來源。上述項目符號是輕量摘要;若兩者不一致,以 planning-and-task-breakdown 為準。

輸出慣例: 將計畫儲存至 tasks/plan.md,任務清單儲存至 tasks/todo.md,遵循 /plan 指令慣例。若 tasks/ 不存在則建立。後續指令(/build 等)預期這些路徑存在。

計畫應可審查:人類應能閱讀並說「是的,這是正確的方法」或「不,請更改 X。」

第三階段:任務

將計畫分解為離散、可實作的任務:

  • 每個任務應能在一次專注的 session 中完成
  • 每個任務有明確的驗收標準
  • 每個任務包含驗證步驟(測試、建置、手動檢查)
  • 任務按相依關係排序,而非感知的重要性
  • 沒有任務應需要變更超過約 5 個檔案

遵循 planning-and-task-breakdown 以了解完整的任務規模與相依排序機制;它是權威來源。以下範本是輕量的內聯形式;若兩者不一致,以 planning-and-task-breakdown 為準。

任務範本:

- [ ] 任務:[描述]
  - 驗收:[完成時必須為真的事項]
  - 驗證:[如何確認——測試指令、建置、手動檢查]
  - 檔案:[將被觸及的檔案]

第四階段:實作

一次執行一個任務,遵循 skills/incremental-implementation/SKILL.mdincremental-implementation)和 skills/test-driven-development/SKILL.mdtest-driven-development)。使用 skills/context-engineering/SKILL.mdcontext-engineering)在每個步驟載入正確的規格段落和原始檔,而不是將整個規格一次灌給 agent。

保持規格活躍

規格是活文件,而非一次性產物:

  • 當決策變更時更新 — 如果你發現資料模型需要變更,先更新規格,再實作。
  • 當範圍變更時更新 — 新增或刪除的功能應反映在規格中。
  • 提交規格 — 規格應與程式碼一起納入版本控制。
  • 在 PR 中引用規格 — 連結回每個 PR 實作的規格段落。

常見合理化藉口

合理化藉口 現實
「這很簡單,我不需要規格」 簡單的任務不需要規格,但仍需要驗收標準。兩行的規格也可以。
「我寫完程式碼後再寫規格」 那是文件,不是規格。規格的價值在於在程式碼之前強制釐清。
「規格會拖慢我們」 15 分鐘的規格可以避免數小時的重工。15 分鐘的瀑布式開發勝過 15 小時的除錯。
「需求無論如何都會改變」 這就是為什麼規格是活文件。過時的規格仍然比沒有規格好。
「使用者知道他們要什麼」 即使明確的請求也有隱含假設。規格揭露那些假設。

紅旗

  • 在沒有任何書面需求的情況下開始寫程式碼
  • 在釐清「完成」的定義之前問「我應該直接開始建置嗎?」
  • 實作未在任何規格或任務清單中提及的功能
  • 做出架構決策卻未記錄
  • 因為「要建置什麼很明顯」而跳過規格

驗證

在進行實作之前,確認:

  • [ ] 規格涵蓋所有六個核心領域
  • [ ] 人類已審查並核准規格
  • [ ] 成功標準具體且可測試
  • [ ] 邊界(總是做/先問/絕不做)已定義
  • [ ] 規格已儲存至儲存庫中的檔案