AI 驅動開發流程

DDD → SDD

Domain-Driven Design Spec-Driven Development

設計 80% │ 實作 20%
使用 Claude Code + OpenSpec 打造高品質軟體

📖 簡報導覽

點擊任意章節快速跳轉,簡報中隨時按左下角 ⌂ 回到此頁

01

為什麼需要這套流程?

從傳統開發到 AI 驅動開發的轉變

傳統開發的痛點

😫
需求理解不一致
口頭溝通後直接動手寫 code,做完才發現方向不對
💣
技術債務累積
趕工交付導致重複實作、缺乏測試,維護成本指數增長
🔀
缺乏標準流程
每個人的開發方式不同,Code Review 難以統一標準
設計時間不足
「先寫再說」文化,邊寫邊改的循環浪費大量時間

AI 驅動開發帶來的改變

❌ 以前

  • 需求 → 直接寫 Code
  • 人工撰寫所有程式碼
  • 測試常被跳過
  • 文件事後補寫(或不寫)
VS

✅ 現在

  • 需求 → 深度討論 → 規格 → 實作
  • AI 協助生成、人類審查把關
  • 測試與實作同步完成
  • 規格文件即開發文件
核心轉變:讓人類專注在「想清楚要做什麼」,讓 AI 處理「怎麼實現」

80/20 設計原則

80% 設計 20% 實作
為什麼是 80/20?
當規格和設計已經完整明確,AI 可以快速且高品質地產出程式碼。
真正的挑戰在於:定義正確的問題設計正確的解決方案
實際效益:減少返工次數、降低溝通成本、提升代碼一致性、加速 Code Review
02

核心開發理念

DDD → SDD 雙引擎驅動

兩大方法論如何串聯?

DDD 定義領域模型 理解「做什麼」
SDD 產出規格文件 設計「怎麼做」
🛠️ 實作 + 測試 AI 編碼、人類把關
關鍵洞察:DDD 提供領域知識,SDD 將其轉化為可執行的規格。
這正是 Context Engineering 的核心 — 讓 AI 得到足夠的上下文才能產出高品質結果。

DDD — Domain-Driven Design

設計階段

以業務領域為核心,建立共通的語言和模型

核心概念

  • Ubiquitous Language:團隊共用術語
  • Bounded Context:劃分系統邊界
  • Aggregate:定義一致性邊界
  • Domain Event:捕捉業務事件

我們的專案實例

  • Policy、Product、Member = Ubiquitous Language
  • 保單管理 / AI 對話 / 推播通知 = Bounded Contexts
  • Member + MemberAccount = Aggregate
  • AfterProspectiveCustomerCreate = Domain Event
與 AI 協作的關鍵:在 CLAUDE.md 和 PRPs 中明確定義這些領域概念, AI 才能理解業務語境並產出正確的代碼。

為什麼 DDD 對 AI 開發特別重要?

AI 不是你的同事 — 它沒有「默契」,只有「上下文」

❌ 沒有 DDD

你:幫我寫一個計算保費的 API

AI:(猜測)好的,我假設保費 =
    金額 × 費率...
    (缺少年齡、性別、險種等
     業務邏輯,產出不完整)
VS

✅ 有 DDD

你:根據我們的領域模型,
    被保人(Insured) 有年齡/性別,
    險種(InsuranceType) 對應費率表,
    請實作 PremiumCalculator...

AI:(精準理解)根據領域模型,
    我會查詢 RateTable,
    考慮年齡區間和性別係數...
一句話總結:DDD 就是教會 AI「你的業務語言」, 讓它從「通用程式設計師」變成「領域專家助手」。

DDD 的兩個層次

🏗️ Strategic DDD — 劃定邊界(做對的事)
🌍 Bounded Context 把系統切成獨立的業務範圍。例:「AI 對話」和「保單管理」是不同的 Context,各有各的規則。
💬 Ubiquitous Language 每個 Context 內統一用語。「保單」在報價系統叫 Quote,在管理系統叫 Policy — 不要混用。
🗺️ Context Map 定義各 Context 之間如何溝通。例:報價 Context 產出的 Quote,怎麼傳給保單 Context 變成 Policy?
🧱 Tactical DDD — 建立模型(把事做對)
📦 Entity & Value Object Entity 有唯一 ID(如 Customer),Value Object 無 ID 純粹描述(如 Address、Money)。
🔗 Aggregate & Repository Aggregate 是一致性邊界(Customer+Policies),Repository 負責儲存。外部只能透過 Aggregate Root 操作。

DDD 實踐:與 Claude Code 一起做

實際操作只需要 3 個步驟

💬
Step 1:領域對話
把你的業務知識告訴 AI

「我們的保險系統有壽險、醫療險、意外險。
每種險有不同的費率計算方式...」
📐
Step 2:建立術語表
請 AI 幫你整理 Ubiquitous Language

「請把我們討論的業務術語整理成表格,
包含中文名、英文名、定義」
🗂️
Step 3:寫入 PRP
將術語和邊界定義寫入 requirements.md

「請將領域模型寫入
PRPs/feature/requirements.md」
💡 不需要完美!DDD 是漸進的。先從最核心的 3-5 個術語開始, 隨著開發進展逐步完善。不需要一次建立完整的領域模型。

DDD 如何對應到我們的專案?

不需要改 Package 結構 — DDD 是概念上的邊界劃分

實際 Package 結構(按層分類)

com.insuranceExpert/
├── model/       ← 所有 Model
│   ├── ai/
│   ├── customer/
│   ├── insuranceMaster/
│   └── ocr/
├── dao/         ← 所有 DAO
├── service/     ← 所有 Service
│   └── ai/
├── web/api/     ← Controller
├── config/
└── util/

概念上的 Bounded Context

Policy(保單管理)
  Policy, PolicyStatus, PolicyService

Product(產品保障)
  Product, Plan, Benefits, SubBenefits

AI Chat(AI 對話)
  ChatSession, ChatMessage, service/ai/*

Customer(客戶管理)
  Customer, CustomerTags, ProspectiveCustomer

Member(會員系統)
  Member, MemberAccount, MemberLogin
做法:建立一份 bounded-context-map.md 對照表, 記錄哪些類別屬於哪個 Context。AI 和團隊成員都用這份文件理解領域邊界。

SDD — Spec-Driven Development

規格階段

用結構化規格文件驅動開發,取代模糊的口頭需求

📝
proposal.md
提案文件
背景、目標、預期效益、高層級方案描述
📐
spec.md (design.md)
技術規格
架構設計、API 接口、資料模型、錯誤處理
tasks.md
任務拆解
可執行的工作項目、驗收條件、優先順序
SDD 的價值:規格就是 AI 的「完整上下文」。
當 spec.md 寫得越清楚,AI 產出的代碼品質越高、返工次數越少。
AI 同時根據 spec 產生實作代碼和對應的測試案例。

DDD → SDD 的協作流程

1. DDD:理解領域 與 Claude Code 討論業務需求 → 建立 Ubiquitous Language → 定義 Bounded Context
2. SDD:撰寫規格 AI 產生 proposal.md → 人類審查 → AI 產生 design.md + tasks.md → 交叉審查
3. 實作 + 測試 AI 根據規格撰寫代碼 → 同步建立單元測試 → Code Review 對照 spec → PR
4. 持續回饋 實作中的發現回饋至領域模型和規格 → 持續完善 → 更新 tasks.md
簡單記:DDD 幫你「問對問題」,SDD 幫你「寫好答案」,實作只是執行已驗證的方案。
03

工具全景圖

了解每個工具的角色與它們之間的關係

工具生態系統

🤖 Claude Code (CC) AI 編碼代理 — 對話、分析、生成、審查
📋
CLAUDE.md
專案規則與指引
AI 的「開發者手冊」
📂
PRPs / OpenSpec
規格文件管理
proposal / design / tasks
🔌
MCP Servers
擴充能力
Notion、Serena、Context7
🧩
Skills / Plugins
自動化技能
commit、review、testing 等
🎯
Subagents
專業子代理
前端、後端、測試等專家

Claude Code — AI 編碼代理

核心能力

  • 理解完整專案結構與上下文
  • 讀取、編輯、建立檔案
  • 執行 Shell 指令
  • Git 操作(commit、PR)
  • 多代理協作(Subagents)
  • 網頁搜尋與 API 呼叫

使用模式

  • 互動模式:在終端中對話
  • Plan 模式:先規劃再執行
  • Headless 模式:CI/CD 整合

常用 Slash Commands

  • /commit — 智慧提交
  • /review — 代碼審查
  • /help — 取得幫助

CLAUDE.md — 專案的靈魂

CLAUDE.md 是 Claude Code 進入專案時第一個讀取的檔案

⚙️ 核心規則
絕對禁止事項、必遵守要求
例:不可建立重複檔案、不可跳過測試
📖 專案結構
套件架構、命名慣例、技術堆疊
例:Spring MVC + JPA + LangChain4j
🛠️ 開發流程
Context Engineering 步驟
讀取 PRP → 確認任務 → 遵循模式
🤝 AI 行為規範
不可假設、不可幻覺依賴
必須確認檔案存在後再引用
關鍵:CLAUDE.md 寫得越完整,AI 的表現越好。 它就是 Context Engineering 的核心載體。

PRPs — 規格文件結構

PRPs/
├── feature-name-1/
│   ├── requirements.md    ← 需求定義(What & Why)
│   ├── design.md          ← 技術設計(How)
│   └── tasks.md           ← 任務拆解(Steps)
├── feature-name-2/
│   ├── requirements.md
│   ├── design.md
│   └── tasks.md
└── ...
PRPs = Product Requirement Packages
每個功能一個資料夾,包含完整的規格三件套。
AI 在開始任何開發前,必須先讀取對應的 PRP。
requirements.md = 做什麼 + 為什麼 design.md = 怎麼做(架構 + API + 資料模型) tasks.md = 做的順序 + 驗收條件
04

從零開始安裝

Step-by-step 工具安裝與環境設定

Step 1:安裝 Node.js

Claude Code 基於 Node.js 運行,需要 v18 以上

📥 Windows
nodejs.org 下載 LTS 版本
或使用 winget:
📋 驗證安裝
確認版本號 ≥ 18
# Windows (winget)
winget install OpenJS.NodeJS.LTS

# macOS (Homebrew)
brew install node@20

# 驗證安裝
node --version    # 應顯示 v18.x 或更高
npm --version     # 應顯示 9.x 或更高

Step 2:安裝 Claude Code

# 全域安裝 Claude Code
npm install -g @anthropic-ai/claude-code

# 驗證安裝
claude --version
注意:安裝完成後首次執行 claude, 會引導你完成帳號認證。需要 Anthropic API Key 或 Claude Max 訂閱。

帳號認證方式

方式 A:API Key
console.anthropic.com 取得 API Key
以用量計費(適合團隊)
方式 B:Claude Max 訂閱
使用個人 Claude 帳號登入
月費制(適合個人)

Step 3:設定 API Key(方式 A)

# 設定環境變數
# Windows (PowerShell)
$env:ANTHROPIC_API_KEY = "sk-ant-xxxxx"

# 或永久設定(推薦)
# Windows: 系統設定 → 環境變數 → 新增 ANTHROPIC_API_KEY

# macOS/Linux: 加到 ~/.bashrc 或 ~/.zshrc
echo 'export ANTHROPIC_API_KEY="sk-ant-xxxxx"' >> ~/.zshrc
⚠️ 安全提醒: 絕對不要把 API Key 提交到 Git!
確保 .env 已加入 .gitignore

Step 4:初始化專案

# 進入專案目錄
cd /path/to/your/project

# 啟動 Claude Code
claude

# Claude 會自動讀取 CLAUDE.md(如果存在)
# 如果不存在,可以請 Claude 幫你建立:
# > 請幫我建立 CLAUDE.md,這是一個 Spring MVC 專案...
建立 CLAUDE.md 的最佳實踐:
1. 描述技術堆疊和套件結構
2. 定義絕對禁止事項和必要規則
3. 說明 PRPs 結構和 Context Engineering 流程
4. 設定 AI 行為規範

Step 5:建立 PRPs 結構

# 建立 PRPs 資料夾結構
mkdir -p PRPs/your-first-feature

# 每個功能包含三個文件:
# PRPs/your-first-feature/
#   ├── requirements.md   ← 需求(和 Claude 討論後產出)
#   ├── design.md         ← 設計(Claude 根據需求產出)
#   └── tasks.md          ← 任務(Claude 根據設計拆解)
Tip:可以用 Claude Code 的 /generate-prp skill 來自動產生 PRP 範本,省去手動建立的麻煩。

Step 6:設定 MCP Servers(選配)

MCP (Model Context Protocol) 讓 Claude Code 擁有更多能力

// ~/.claude/settings.json 中配置
{
  "mcpServers": {
    "context7": {
      "command": "npx",
      "args": ["-y", "@upstash/context7-mcp@latest"]
    },
    "serena": {
      "command": "uvx",
      "args": ["serena-mcp"]
    }
  }
}
MCP Server用途
context7即時查詢最新框架文檔
serena語義化代碼分析與編輯
notion與 Notion 工作區整合
05

9 階段開發流程

從需求到部署的完整工作流

流程全覽

1需求
2討論
3規格
4審查
5實作
5實作
6Code Review
7測試
8PR/MR
9確認
設計 80%
階段 1-4:DDD + SDD 定義問題與設計方案
實作 20%
階段 5-9:編碼、測試、驗證、交付
設計階段 — DDD

Stage 1:需求

做什麼

  • 從 Backlog 中選取 Ticket
  • 確認需求範圍與目標
  • 取得需求編號
  • 建立 PRP 資料夾

DDD 如何參與

  • 用業務語言描述需求
  • 識別涉及的 Bounded Context
  • 定義相關的 Domain Entity
📤 輸入:Backlog Ticket
📦 輸出:需求編號 + PRPs/feature-name/ 資料夾
設計階段 — DDD + SDD

Stage 2:討論

與 Claude Code 進行深度討論,分析源代碼並制定計畫

# 啟動討論(在 Claude Code 中)

你:我要實作「保費試算功能」,Ticket 編號 IE-123。
    請先分析現有的保險計算相關代碼,
    然後我們一起討論最佳實作方式。

Claude:好的,讓我先分析...
        [讀取相關 Service、Model、Controller]
        我發現目前有 PolicyService 和 PremiumCalculator,
        建議我們在這個基礎上擴展...

你:同意,但需要考慮多險種的情況...
💡 關鍵:這個階段不急著寫 Code!
讓 AI 充分理解需求和現有架構,才能產出高品質的規格。
設計階段 — SDD

Stage 3:規格作成

由 AI 產生完整的規格文件三件套

# 請 Claude 產生規格

你:討論得差不多了,請根據我們的討論,
    幫我產生 PRPs/premium-calculator/ 底下的
    requirements.md、design.md 和 tasks.md。

Claude:好的,我根據討論內容產出以下規格:
        [產生三個文件]
文件內容重點篇幅
requirements.md用戶故事、驗收條件、非功能需求1-2 頁
design.md架構圖、API 設計、資料模型、錯誤處理3-5 頁
tasks.md任務清單、優先順序、預估工時、相依性1-2 頁
設計階段 — SDD

Stage 4:規格審查

AI 進行自我檢查與交叉驗證

🔍 Self-Check
AI 審查自己產生的規格:
• 是否有遺漏的邊界案例?
• API 設計是否一致?
• 是否與現有架構衝突?
🔀 Cross-Check
requirements ↔ design ↔ tasks 交叉比對:
• 每個需求都有對應的設計?
• 每個設計都有對應的任務?
• 任務能涵蓋所有驗收條件?
⚠️ 不通過 → 重寫
如果審查發現問題,回到 Stage 3 修正規格。
這裡「多花 30 分鐘修正設計」可以在實作階段「省下 3 小時除錯」。
實作階段

Stage 5:實作

AI 根據審查通過的規格編寫代碼,同步建立測試

5a. 讀取規格 AI 讀取 design.md 和 tasks.md,確認實作範圍與技術決策
5b. 編寫代碼 + 測試 AI 根據 spec 撰寫實作代碼,並同步建立對應的 JUnit 測試
5c. 每個 Task 完成後 Commit 小步快走 → 保持可追蹤性 → 降低回滾成本
💡 AI 的角色:AI 負責「寫」,人類負責「審」。
測試是實作的一部分,不是額外的步驟。
實作階段

Stage 6:代碼審查 (Code Review)

檢查實作是否符合 spec.md

審查要點

  • 是否符合 design.md 的架構設計?
  • API 接口是否與 spec 一致?
  • 錯誤處理是否完整?
  • 命名是否符合 Ubiquitous Language?
  • 是否有安全漏洞(OWASP Top 10)?

使用工具

# 使用 Claude Code 的
# code-review skill
/code-review

# 或手動請求
你:請對照 design.md
    審查我剛寫的代碼
發現差異 → 修正代碼,而非修改 spec
除非發現 spec 本身有設計缺陷,否則以 spec 為準。
驗證階段

Stage 7:測試驗證

🧪 後端測試
必須在實作同時建立:
• 單元測試 (JUnit)
• 整合測試
• 至少 3 個測試案例/功能

⛔ 禁止僅靠 Code Review 就標示 PASS
🌐 前端測試
使用 MCP 工具操作測試(如果允許)
• UI 互動驗證
• API 串接驗證
• 若不允許 MCP → 手動測試

需提供測試截圖或結果記錄
# 執行測試
ant test                        # 執行所有測試
ant test -Dtest=PremiumCalcTest # 執行特定測試
交付階段

Stage 8:PR/MR 作成

測試通過後建立 Pull Request / Merge Request

# 使用 Claude Code 的 commit-push-pr skill
/commit-push-pr

# 或手動操作
git checkout -b feat/IE-123-premium-calculator
git add .
git commit -m "feat(premium): 新增保費試算功能"
git push -u origin feat/IE-123-premium-calculator

# 使用 gh CLI 建立 PR
gh pr create --title "feat: 新增保費試算功能 (IE-123)" \
  --body "## Summary ..."
PR 描述應包含:
1. 功能摘要   2. 測試結果   3. 相關 Ticket 編號   4. 截圖(如有 UI 變更)
交付階段

Stage 9:最終確認 & CI/CD

開發者最終審查 Reviewer 確認代碼品質、測試覆蓋率、架構一致性
合併到主分支 Approve → Merge → 觸發 CI/CD Pipeline
CI/CD 執行 Build → Test → Deploy(依環境配置)
更新 Ticket 狀態 將 Ticket 標記為 Done → 更新 tasks.md
✅ 完成!整個流程確保了:
需求有文件 → 設計有規格 → 實作有測試 → 交付有審查
06

實戰示範

以「保費試算 API」為例,走完 DDD → SDD → 實作的完整流程

🎯 場景:新增保費試算 API

Ticket IE-456:新增保費試算 API,用戶輸入年齡、性別、保險類型,系統回傳保費估算結果。

DDD 階段:定義領域模型

Ubiquitous Language(共通語言):
  - 被保人 (Insured)     → 年齡、性別、健康狀態
  - 險種 (InsuranceType) → 壽險、醫療險、意外險
  - 保費 (Premium)       → 年繳保費、月繳保費
  - 費率表 (RateTable)   → 按年齡/性別查表

Bounded Context:
  - 報價上下文 (Quotation Context) ← 本次開發
  - 保單管理上下文 (Policy Context) ← 已存在

📐 SDD 階段:規格產出

# 與 Claude Code 對話

你:Ticket IE-456 的討論結果已經確認,
    請產生 PRPs/premium-calculator/ 的三個規格文件。

Claude:好的,我根據討論內容產生以下規格:

=== design.md (節錄) ===
## API 設計
POST /api/v1/premium/calculate
Request: { age, gender, insuranceType, coverageAmount }
Response: { annualPremium, monthlyPremium, rateApplied }

## 資料模型
PremiumRequest → 驗證 → RateTableLookup → PremiumResult

🧪 實作階段:代碼 + 測試

// PremiumCalculatorTest.java

@Test  // ✅ 預期成功
public void testCalculate_validInput_returnsCorrectPremium() {
    PremiumRequest req = new PremiumRequest(30, "M", "LIFE", 1000000);
    PremiumResult result = calculator.calculate(req);
    assertEquals(BigDecimal.valueOf(12500), result.getAnnualPremium());
}

@Test  // ⚠️ 邊界案例
public void testCalculate_maxAge_returnsHigherPremium() {
    PremiumRequest req = new PremiumRequest(70, "F", "MEDICAL", 500000);
    PremiumResult result = calculator.calculate(req);
    assertTrue(result.getAnnualPremium()
        .compareTo(BigDecimal.valueOf(50000)) > 0);
}

@Test(expected = InvalidAgeException.class)  // ❌ 預期失敗
public void testCalculate_negativeAge_throwsException() {
    new PremiumRequest(-1, "M", "LIFE", 1000000);
}

✅ 完整流程回顧

📋 需求 Ticket IE-456
💬 討論 DDD 分析
📐 規格 PRPs 三件套
🔍 審查 Cross-check
💻 實作 代碼+測試
👀 Review 對照 Spec
🧪 測試 JUnit 通過
🚀 交付 PR → CI/CD
07

最佳實踐與常見問題

讓流程運作更順暢的心法

Context Engineering 心法

🎯
提供完整上下文
告訴 AI「專案背景 + 技術限制 + 期望結果」
而不只是「幫我寫一個 API」
📚
善用現有模式
指向 codebase 中的範例:
「請參考 PolicyService 的模式來寫」
📋
先讀再寫
讓 AI 先分析現有代碼結構
再動手修改或新增
🧩
小步快走
每完成一個 task 就 commit
不要一次做完所有事情

常見踩坑與對策

⚠️ 踩坑 ✅ 對策
跳過設計直接寫 Code 強制要求先建立 PRP 再開工
AI 幻覺不存在的 API 或類別 CLAUDE.md 中設定「不可假設」規則
AI 產生重複實作 「Single Source of Truth」原則
測試只寫 happy path 每個功能至少 3 種測試(成功/邊界/失敗)
CLAUDE.md 過時 定期用 /revise-claude-md 更新
上下文視窗不夠 善用 Subagents 分擔工作

團隊協作建議

📦 統一 CLAUDE.md
將 CLAUDE.md 納入版本控制
團隊共同維護、定期更新
確保每個人的 AI 行為一致
📁 PRPs 作為 SSoT
PRPs 就是活的文件
取代 Confluence/Wiki 的過時文件
Code 和 Spec 永遠保持同步
🤝 Code Review 標準
Reviewer 對照 spec.md 檢查
不是「看起來可以」就 Approve
確認測試覆蓋率足夠
📈 持續改進
定期回顧流程效率
收集團隊的 prompt 最佳實踐
更新 Skills 和 CLAUDE.md

快速參考卡

常用指令

# 啟動 Claude Code
claude

# 常用 Slash Commands
/commit        # 智慧提交
/code-review   # 代碼審查
/generate-prp  # 產生規格
/help          # 取得幫助

# Plan 模式
# Claude 自動進入或
# 你可以手動要求:
你:請先進入 Plan 模式分析

開發檢查清單

  • ☐ 建立 Ticket & PRP 資料夾
  • ☐ 與 Claude 討論需求(DDD)
  • ☐ 產生規格三件套(SDD)
  • ☐ 規格審查通過
  • ☐ AI 實作代碼 + 測試
  • ☐ Code Review 通過
  • ☐ 所有測試通過
  • ☐ 建立 PR / MR
  • ☐ 合併 & 更新 Ticket

開始你的 AI 驅動開發之旅

設計 80% • 實作 20% • 品質 100%

DDD 定義問題 SDD 設計方案 實作 + 測試

💬 有問題?有想法?讓我們一起討論!