Spec-Driven Development: Agentic Coding at FAANG Scale and Quality — 規格驅動開發:在 FAANG 規模下實現高品質的 AI 輔助編程

Amazon Kiro 首席工程師 Al Harris 深入介紹了 Spec-Driven Development(規格驅動開發)的核心理念與實踐方法。他展示了如何透過結構化的需求定義、設計文件和 Property-Based Testing,將傳統軟體工程的嚴謹性與 AI Agent 的生產力結合,解決 Vibe Coding 在規模化和程式碼品質上的不足,讓 AI 輔助開發能夠達到企業級的可靠性和可重現性。


原影片連結:https://www.youtube.com/watch?v=HY_JyxAZsiE

影片重點

  • Amazon Kiro 是一款 Agentic IDE,已於近期正式 GA(General Availability)
  • Spec-Driven Development 將軟體開發生命週期(SDLC)壓縮為需求→設計→任務→執行的緊密迭代循環
  • 使用 EARS(Easy Approach to Requirement Syntax)格式定義結構化自然語言需求
  • Property-Based Testing(屬性測試)可直接從 EARS 需求轉譯為系統屬性驗證
  • Spec 不僅是文件,更是系統在某個時間點的狀態表示和結構化工作流程
  • MCP(Model Context Protocol)整合可在 Spec 的任何階段使用,擴展 Agent 能力
  • Steering(引導文件)和自訂 Artifact 讓開發者能精細控制 Agent 行為
  • Spec 作為活文件(Living Document),支援跨時間的需求變更追蹤

詳細內容

[00:00] Kiro 簡介與 Spec-Driven Development 的起源

Al Harris 以 AWS 首席工程師的身份介紹了 Kiro——一款 Agentic IDE。Kiro 從一個三四人的小團隊起步,目標是改善軟體開發生命週期的體驗。團隊聚焦三大核心挑戰:擴展 AI 開發到更複雜的問題提升對 AI Agent 的控制力、以及提高輸出程式碼的可靠性

他們的解決方案就是 Spec-Driven Development。Al 指出,Vibe Coding 雖然好用,但過度依賴操作者本身的能力——你需要自己設定好 Guardrails、讓 Agent 遵循嚴格的工作流程。Spec-Driven Development 則希望尊重軟體工程 25-30 年的經驗,將瀑布式、XP 等方法論的精華融入 AI 開發流程中。

[03:30] Spec 的核心概念:SDLC 的壓縮迭代

Al 解釋了 Spec-Driven Development 的核心思想:將軟體開發的發現與實作壓縮為一個緊密的內部循環。他認為軟體開發有一半是需求探索(Discovery),而最好的方式是快速產出結果並回饋到需求中。

這個流程包含:需求定義(含驗收標準)→ 設計文件(可與團隊和利害關係人審查)→ 任務清單程式碼實作。所有這些都在一個緊密的迭代循環中完成,讓你能及早發現副作用並回饋修正。

[05:30] EARS 格式與 Property-Based Testing

Kiro 使用 EARS(Easy Approach to Requirement Syntax)格式來表達需求。這是一種結構化的自然語言格式,使用 “When… Then… Shall…” 的語法,讓需求既人類可讀又機器可解析。

在 GA 版本中,Kiro 新增了 Property-Based Testing(屬性測試)功能。EARS 需求可以直接轉譯為系統屬性(Properties),也就是你想要交付的不變量(Invariants)。系統會嘗試找出任何能推翻這些不變量的反例——如果找不到,就能以高置信度確認系統符合需求。Al 提到這類似 Python 的 Hypothesis 庫或 Node 的 fast-check。

[08:00] Spec 的三重意義

Al 將 Spec 定義為三個層面:

  1. 系統狀態的表示:一組 Artifact,代表系統在某個時間點 t 的狀態,包含功能需求和非功能需求
  2. 結構化工作流程:引導你經歷需求定義、設計和執行三個階段,可靠地交付高品質軟體
  3. 工具和系統:在上述基礎上提供可重現結果的工具,例如 Property-Based Testing 和需求驗證(掃描需求中的歧義和衝突約束)

[10:30] 用 MCP 擴展 Spec 生成能力(200 Grit 磨砂)

Al 使用磨刀石磨砂粒度(Grit)的比喻來描述工具鏈的精進層次。200 Grit 是基礎層——使用 MCP Server 來擴展 Agent 在 Spec 各階段的能力。

他示範了如何用 Asana MCP 從任務管理工具中拉取需求,直接在 Kiro 中生成 Spec。只要給 Kiro 一個 Asana 任務 URL,它就能自動拉取所有 Metadata 並生成對應的需求文件。MCP 也可以在設計階段使用,例如用 Fetch MCP 從網路上搜尋類似產品作為參考。

[15:00] 自訂 Artifact 提升精細度(400 Grit 磨砂)

進入 400 Grit 階段,Al 展示了如何自訂 Spec 產出的 Artifact。因為所有 Artifact 都是自然語言,你可以要求加入任何你想要的內容:

  • UI Wireframe:在設計文件中加入 ASCII 線框圖,在實作前就確認 UI 方向
  • 測試案例:在任務中加入明確的 Unit Test 案例,確保 Agent 完成任務時不只是「宣稱完成」而是真正通過所有測試

Al 強調了一個常見痛點:LLM 非常擅長宣稱自己完成了工作(”I’m done, I’m happy”),但實際上測試可能根本沒通過。通過在任務中明確定義測試案例,配合 Agent Hooks,可以有效解決這個問題。

[19:00] 迭代流程與挑戰偏見(800 Grit 磨砂)

最精細的層次是 800 Grit——不僅調整 Artifact,還要質疑和迭代整個開發流程本身。Al 用一個實際範例說明:他要求 Kiro 把對話記錄存到 S3,但這個提示本身就引入了一個偏見——為什麼一定是 S3?

他建議在設計完成後,主動詢問 Agent:「這是實現 Session Persistence 的慣用方式嗎?」讓 Agent 利用 MCP 工具去搜尋文件、查閱資料,提出替代方案。在這個案例中,Agent 發現了 AgentCore Memory 這個更慣用的選項。

核心建議:不要被自己提示中的假設鎖死,主動挑戰 Agent 的設計決策。

[22:00] 現場 Demo:Gramps 專案

Al 現場示範了一個名為 “Gramps” 的專案——一個部署在 Amazon Bedrock AgentCore 上的爸爸笑話產生器。他展示了完整的 Spec-Driven Development 流程:

  1. 設定好 CDK Stack 和基礎專案結構(Vibe Coding 階段)
  2. 添加 AWS Documentation MCP 和 Fetch MCP 作為知識來源
  3. 提出需求:為 Agent 加入 Session Memory,避免重複產生相同笑話
  4. Kiro 自動生成需求、設計文件、Properties 和任務清單
  5. 執行所有任務,產出包含 S3 Checkpoint Saver 的完整實作

他特別展示了 Steering 文件的作用——記錄了 CDK 部署的特殊參數和注意事項,避免重複踩坑。

[30:00] Q&A:與其他工具的差異

觀眾提問了 Kiro 的 Spec-Driven Dev 與其他工具(如 Cursor 的 Planning Mode)的差異。Al 回應了幾個關鍵區別:

  • Kiro 的 Spec 不僅是 LLM 驅動,背後有結構化系統和非 LLM 的推理工具(Neurosymbolic Reasoning)
  • Spec 是持久化的活文件,而非一次性的執行計劃
  • 支援雙向同步:後續修改會更新已有的 Spec,而非產生新的
  • Spec 也成為了團隊的設計審查工具——Kiro 團隊內部已用 Spec Review 取代傳統的 Design Doc Review

[35:00] Q&A:大型既有程式碼庫的處理

關於 Brownfield(既有程式碼庫)場景,Al 坦承效果取決於程式碼的結構品質。如果系統有良好的關注點分離(Separation of Concerns)、模組高度內聚(Cohesive),Agent 表現會很好。反之,技術債越重、模組耦合越緊,Agent 越難有效工作。

Kiro 採用「漸進式揭露」(Incremental Disclosure)策略——不在對話開頭載入大量上下文,而是讓 Agent 自主發現所需的上下文。他們的基準測試顯示,Agent 在提供較少上下文但給予發現工具時表現更好。

[40:00] Q&A:Spec 的組織與演化

關於 Spec 的組織方式,Al 說明每個 Spec 代表一個功能或問題領域。以 Kiro 自身的開發為例,他們有 Prompt Registry、Chat UI Telemetry、Message History Sanitizer 等不同的 Spec。

當新需求涉及已有的 Spec 時(例如為 Chat UI 新增 Telemetry),Agent 會先搜尋是否存在相關 Spec,然後修改現有文件而非創建新的。跨功能需求(如 PII Redaction 涉及 API、Security 和 Logging)則需要開發者決定是修改其中一個 Spec 還是創建跨功能 Spec。

[45:00] Q&A:效能、語言支援與 AWS 整合

最後的 Q&A 涵蓋了幾個實用主題:

  • Prompt Caching:Kiro 可達到 90-95% 的 Cache Token 使用率,大幅降低延遲
  • 語言支援:官方支援 JavaScript、TypeScript、Java、Python 和 Rust,但理論上可用於任何語言
  • AWS 整合:Kiro 刻意不與 AWS 深度綁定,CLI 提供了 use_aws 工具但可替換為任何雲端平台的 MCP
  • Steering 的重要性:Agent 預設會「太客氣」試圖滿足所有人,透過 Steering 明確告知優先級(如延遲、成本、程式碼風格)才能得到符合需求的程式碼

我的想法

這場演講讓我對 Spec-Driven Development 有了更具體的認識。Al Harris 的「磨砂粒度」比喻非常精妙——從基礎的 MCP 整合(200 Grit),到自訂 Artifact(400 Grit),再到挑戰流程本身(800 Grit),形成了一個清晰的工具鏈精進路徑。

最讓我印象深刻的是「挑戰你自己的偏見」這個觀點。我們在寫 Prompt 時往往會不自覺地嵌入技術選型偏見(例如直接說「存到 S3」),而好的做法是先描述問題(「我需要 Session Persistence」),讓 Agent 透過工具去探索最佳方案。這和好的工程實踐中「先問 Why 再問 How」的原則完全一致。

Property-Based Testing 的整合也是一個亮點。在 AI 輔助開發中,「Agent 宣稱完成但實際有問題」是個普遍痛點。透過 EARS 需求直接轉譯為屬性測試,建立了從需求到驗證的完整鏈條,這比單純依賴 Agent 的自我評估要可靠得多。

不過我也注意到,Spec-Driven Development 有一個明顯的前期投資成本。Al 自己也承認這點——如果只是 10 秒的 Prompt 做錯了沒什麼損失,但花了一小時做的設計文件就真的希望能做對。這意味著 Spec-Driven Development 更適合中大型功能開發,而非快速原型或小修小補。開發者需要根據任務的複雜度和重要性,在 Vibe Coding 和 Spec-Driven Development 之間做出權衡。

進階測驗:Spec-Driven Development — 規格驅動開發

測驗目標:驗證你是否能在實際情境中應用 Spec-Driven Development 的概念。
共 5 題,包含情境題與錯誤診斷題。

1. 你正在使用 Kiro 為一個新功能建立 Spec,你在 Prompt 中直接寫了「把使用者資料存到 Redis」。Agent 照做了,但你後來發現團隊其實偏好用 DynamoDB。根據 Al Harris 的建議,你一開始應該怎麼做? 情境題

Prompt: “Add session persistence. Store user data to Redis at the end of every session.”
  • A. 在 Prompt 中同時列出 Redis 和 DynamoDB,讓 Agent 自己選
  • B. 先讓 Agent 用 Redis 完成實作,再手動改成 DynamoDB
  • C. 只描述問題(「我需要 Session Persistence」),在設計階段讓 Agent 透過 MCP 工具研究最佳方案並提供替代選項
  • D. 在 Steering 文件中固定 DynamoDB 為唯一選擇,避免 Agent 使用其他方案

2. 你的團隊使用 Kiro 開發了一個 API 模組,之前已有一個完成的 Spec。現在 PM 要求新增一個和這個 API 相關的 Telemetry 功能。你應該如何處理 Spec? 情境題

已有 Spec:api-design/ ├── requirements.md (原 API 需求) ├── design.md (原 API 設計文件) └── tasks.md (原任務清單) 新需求:為 API 加入 UI Telemetry 功能
  • A. 在 Kiro 中建立一個全新的 Spec 來處理 Telemetry 功能
  • B. 讓 Kiro 找到既有的 API Spec,在原有的需求和設計文件上做修改和追加
  • C. 手動編輯 requirements.md 加入 Telemetry 需求,再讓 Kiro 從設計階段重新開始
  • D. 刪除舊的 Spec,重新讓 Kiro 生成包含 Telemetry 的完整 Spec

3. 你使用 Kiro 完成了所有任務,Agent 回報「所有任務已完成」。但你不確定程式碼是否真的符合需求。根據 Al Harris 介紹的做法,哪種方式最能有效驗證程式碼正確性? 情境題

Agent 回報:✅ All tasks completed successfully. ✅ Implementation looks good. ✅ Ready for deployment.
  • A. 手動逐一檢查每個檔案的修改內容
  • B. 讓 Agent 再跑一次所有任務確認一致性
  • C. 依賴 Agent 自己執行的 Unit Test 結果
  • D. 利用 EARS 需求轉譯的 Property-Based Testing,透過尋找反例來驗證系統不變量是否成立

4. 小明在 Kiro 中開始了一個新的 Spec-Driven Development 流程。他在設計階段加入了大量背景上下文,然後又修改了 MCP Server 設定。結果 Agent 變得非常緩慢,回應時間從原本幾秒變成幾十秒。最可能的原因是什麼? 錯誤診斷

Session 狀態: – 已進行 45 分鐘的對話 – Context 接近 160K tokens – 剛剛修改了 MCP Server 設定(新增了 2 個 MCP) – Agent 回應時間:從 ~3 秒 → ~30 秒
  • A. 新增的 MCP Server 本身回應太慢
  • B. 在深度 Session 中修改 MCP 設定觸發了快取失效,導致大量 Token 需要重新冷發送
  • C. Context 超過了 200K 上限導致系統自動壓縮
  • D. Kiro 的程式碼索引正在後台重建

5. 小華用 Kiro 為一個大型既有專案建立 Spec,但 Agent 生成的設計文件品質很差——經常引用不存在的模組,對系統架構的理解也有很多錯誤。專案結構如下,最可能的根本原因是什麼? 錯誤診斷

專案結構: src/ ├── core/ │ ├── auth-and-db-and-cache.js (3000 行,同時處理認證、資料庫和快取) │ ├── utils.js (5000 行,各種工具函式) │ └── helpers.js (2000 行,和 utils.js 有大量重複) ├── api/ │ ├── routes.js (所有 API 路由在單一檔案) │ └── middleware.js (引用 core/ 中多個全域變數) └── tests/ └── test.js (大部分測試已過期失敗)
  • A. Kiro 不支援 JavaScript 專案的 Spec-Driven Development
  • B. 專案沒有安裝足夠的 MCP Server 來提供外部上下文
  • C. 程式碼缺乏良好的關注點分離和模組內聚性,導致 Agent 難以理解系統結構
  • D. Agent 的 Context Window 不夠大,無法裝入整個專案
0

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *