<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Spec-Driven Development on Orangex-position0的技术博客</title><link>https://Orangex-position0.github.io/tags/spec-driven-development/</link><description>Recent content in Spec-Driven Development on Orangex-position0的技术博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Tue, 15 Sep 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://Orangex-position0.github.io/tags/spec-driven-development/index.xml" rel="self" type="application/rss+xml"/><item><title>什么是 Spec-Driven Development：让 AI 先读懂需求，再开始写代码</title><link>https://Orangex-position0.github.io/posts/ai-coding/spec-driven-development/</link><pubDate>Tue, 15 Sep 2026 00:00:00 +0800</pubDate><guid>https://Orangex-position0.github.io/posts/ai-coding/spec-driven-development/</guid><description>&lt;img src="https://Orangex-position0.github.io/" alt="Featured image of post 什么是 Spec-Driven Development：让 AI 先读懂需求，再开始写代码" /&gt;&lt;p&gt;AI Coding 让“写代码”变快了，但也放大了另一个问题：如果需求本身是模糊的，AI 只会更快地产生一堆看似合理、实际偏题的代码。&lt;/p&gt;&#10;&lt;p&gt;所以我最近在看 SDD，也就是 Spec-Driven Development。它的核心不是多写一份文档，而是把规格说明变成开发流程里的真实源头：先把“要做什么、为什么做、做到什么程度算完成”说清楚，再让 AI 去处理“怎么实现”。&lt;/p&gt;&#10;&lt;p&gt;一句话理解 SDD：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;先由人定义 What，再让 AI 推导 How。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;你可以从这篇文章了解四件事：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;SDD 到底是什么&lt;/li&gt;&#10;&lt;li&gt;SDD 的标准四阶段流程&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;spec.md&lt;/code&gt;、&lt;code&gt;plan.md&lt;/code&gt;、&lt;code&gt;tasks.md&lt;/code&gt; 三文件体系怎么流转&lt;/li&gt;&#10;&lt;li&gt;一个好的 Spec 应该怎么写&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="1-sdd-是什么"&gt;&lt;a href="#1-sdd-%e6%98%af%e4%bb%80%e4%b9%88" class="header-anchor"&gt;&lt;/a&gt;1. SDD 是什么&#10;&lt;/h2&gt;&lt;p&gt;SDD，全称 Spec-Driven Development，可以翻译为规格驱动开发。&lt;/p&gt;&#10;&lt;p&gt;传统开发里，文档经常只是代码之前的脚手架：需求评审时写一写，开发时参考一下，项目推进后很容易和代码脱节。到了 AI Coding 场景，这个问题会更明显。因为 AI 不是项目成员，它不知道你的历史上下文、团队习惯和隐含边界。你给它一个模糊输入，它就会用自己的默认假设补全空白。&lt;/p&gt;&#10;&lt;p&gt;SDD 的思路是反过来：规格说明不是代码的附属品，而是唯一真实来源。代码、测试、任务拆分和实现计划，都从 Spec 派生出来。&lt;/p&gt;&#10;&lt;p&gt;也就是说，AI 写得好不好，不只取决于模型能力，也取决于 Spec 是否足够清楚。&lt;/p&gt;&#10;&lt;p&gt;可以粗略对比一下：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;开发方式&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;核心输入&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;常见问题&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;直接 Prompt 编程&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;一段自然语言需求&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AI 容易自由发挥，边界和验收标准不稳定&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;传统文档驱动&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;PRD、设计文档、会议结论&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;文档和代码容易脱节&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SDD&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;可验证的 Spec + Plan + Tasks&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;前期要花时间迭代 Spec，但后续实现更可控&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;所以 SDD 不是“写更多文档”，而是把需求从“描述性文本”变成“可约束实现的开发输入”。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="Direct Prompt 与 SDD 输入方式对比" class="gallery-image" data-flex-basis="426px" data-flex-grow="177" height="941" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://Orangex-position0.github.io/posts/ai-coding/spec-driven-development/2.png" srcset="https://Orangex-position0.github.io/posts/ai-coding/spec-driven-development/2_hu_d8e532d42a5af982.png 800w, https://Orangex-position0.github.io/posts/ai-coding/spec-driven-development/2_hu_bcd3f88cb894d86d.png 1600w, https://Orangex-position0.github.io/posts/ai-coding/spec-driven-development/2.png 1672w" width="1672"&gt;&lt;/p&gt;&#10;&lt;h2 id="2-sdd-的四阶段流程"&gt;&lt;a href="#2-sdd-%e7%9a%84%e5%9b%9b%e9%98%b6%e6%ae%b5%e6%b5%81%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;2. SDD 的四阶段流程&#10;&lt;/h2&gt;&lt;p&gt;一个典型的 SDD 流程可以拆成四个阶段：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;阶段&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;主导者&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;核心产出&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;关键动作&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Specify&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;人&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;spec.md&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;定义问题、目标、边界、成功标准&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Plan&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;人 + AI&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;plan.md&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;根据 Spec 生成架构方案、模块划分、接口设计&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Implement&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AI&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;代码 + 测试&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;按任务逐步实现&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Validate&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;人 + AI&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;测试结果 + Review 结论&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;自动化测试、人工审查、回到 Spec 修正偏差&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;这四步里，最容易被低估的是第一步 Specify。&lt;/p&gt;&#10;&lt;p&gt;很多 AI 编程失败，不是失败在 Implement，而是失败在 Specify。需求里没有说清楚目标边界，AI 就会替你做决定；成功标准没有写成可验证条件，AI 就会用“功能已经完成”这种描述性结论糊过去；Non-Goals 没写清楚，AI 就可能顺手加一个你并不需要的功能。&lt;/p&gt;&#10;&lt;p&gt;SDD 想解决的正是这个问题：在代码生成之前，把关键约束提前落到文档里。这其实和如今（2026年）AI Coding 圈中提到的“关键决策前置”理念类似。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="SDD 四阶段流程：Specify、Plan、Implement、Validate" class="gallery-image" data-flex-basis="426px" data-flex-grow="177" height="941" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://Orangex-position0.github.io/posts/ai-coding/spec-driven-development/1.png" srcset="https://Orangex-position0.github.io/posts/ai-coding/spec-driven-development/1_hu_549032141da308ac.png 800w, https://Orangex-position0.github.io/posts/ai-coding/spec-driven-development/1_hu_312bc6dd3dfab80b.png 1600w, https://Orangex-position0.github.io/posts/ai-coding/spec-driven-development/1.png 1672w" width="1672"&gt;&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; A[需求想法] --&gt; B[spec.md&lt;br/&gt;What / Why]&#10; B --&gt; C[plan.md&lt;br/&gt;How]&#10; C --&gt; D[tasks.md&lt;br/&gt;可执行任务]&#10; D --&gt; E[代码与测试]&#10; E --&gt; F[验证与 Review]&#10; F --&gt;|发现偏差| B&lt;/pre&gt;&lt;p&gt;注意最后一条回路：如果验证阶段发现问题，不应该只在代码里打补丁，而是先判断 Spec 是否写错、写漏或写得太模糊。否则下一次让 AI 继续改，很可能又会沿着同一个模糊输入跑偏。&lt;/p&gt;&#10;&lt;h2 id="3-三文件体系specplantasks"&gt;&lt;a href="#3-%e4%b8%89%e6%96%87%e4%bb%b6%e4%bd%93%e7%b3%bbspecplantasks" class="header-anchor"&gt;&lt;/a&gt;3. 三文件体系：Spec、Plan、Tasks&#10;&lt;/h2&gt;&lt;p&gt;GitHub 的 Spec Kit 把 SDD 落成了一套比较清晰的文件流转方式：&lt;code&gt;spec.md&lt;/code&gt;、&lt;code&gt;plan.md&lt;/code&gt;、&lt;code&gt;tasks.md&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;这三个文件分别回答三个问题：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;文件&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;回答的问题&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;不该承担的职责&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;spec.md&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;做什么，为什么做，怎么验收&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;不写具体技术实现细节&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;plan.md&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;如何实现，架构怎么选，模块怎么拆&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;不重新发明需求&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;tasks.md&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;按什么顺序交付，每一步怎么验证&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;不塞进大段设计讨论&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="specmd定义-what-和-why"&gt;&lt;a href="#specmd%e5%ae%9a%e4%b9%89-what-%e5%92%8c-why" class="header-anchor"&gt;&lt;/a&gt;spec.md：定义 What 和 Why&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;spec.md&lt;/code&gt; 是 SDD 的起点。它应该回答：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;为什么要做这个功能？&lt;/li&gt;&#10;&lt;li&gt;用户是谁？&lt;/li&gt;&#10;&lt;li&gt;用户在什么场景下使用？&lt;/li&gt;&#10;&lt;li&gt;功能边界在哪里？&lt;/li&gt;&#10;&lt;li&gt;做到什么程度算完成？&lt;/li&gt;&#10;&lt;li&gt;本期明确不做什么？&lt;/li&gt;&#10;&lt;li&gt;有哪些必须遵守的技术或业务约束？&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这里最重要的一点是：&lt;code&gt;spec.md&lt;/code&gt; 不应该提前写死具体实现。&lt;/p&gt;&#10;&lt;p&gt;比如：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;使用 Redis 分布式锁防止订单重复提交。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这句话已经进入 How 的范围了。除非“必须使用 Redis 分布式锁”本身就是项目约束，否则它不适合放在 Spec 里。&lt;/p&gt;&#10;&lt;p&gt;更适合作为 Spec 的说法是：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;订单创建接口必须支持幂等：客户端使用同一个 Idempotency-Key 重试请求时，系统最多创建一笔订单，并返回同一个订单编号。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这句话没有绑定具体技术栈，但它足够约束实现。无论最后用数据库唯一约束、Redis 锁还是其他方案，都必须满足“同一个幂等键最多创建一笔订单”这个可验证标准。&lt;/p&gt;&#10;&lt;p&gt;这里涉及到了如何编写一个“好的 Spec”，后面第四章会有具体说明。&lt;/p&gt;&#10;&lt;h3 id="planmd把需求翻译成方案"&gt;&lt;a href="#planmd%e6%8a%8a%e9%9c%80%e6%b1%82%e7%bf%bb%e8%af%91%e6%88%90%e6%96%b9%e6%a1%88" class="header-anchor"&gt;&lt;/a&gt;plan.md：把需求翻译成方案&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;plan.md&lt;/code&gt; 基于 &lt;code&gt;spec.md&lt;/code&gt; 生成，负责回答“怎么做”。&lt;/p&gt;&#10;&lt;p&gt;这一步可以让 AI 先生成方案，但人必须 review。因为 AI 很容易给出看似完整、实际不适合当前项目的设计，比如：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;引入一个项目里没有的基础设施&lt;/li&gt;&#10;&lt;li&gt;把简单功能拆成过多模块&lt;/li&gt;&#10;&lt;li&gt;忽略现有架构边界&lt;/li&gt;&#10;&lt;li&gt;给出无法测试或无法回滚的方案&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;好的 &lt;code&gt;plan.md&lt;/code&gt; 应该能解释关键设计选择，而不是只列一个技术清单。&lt;/p&gt;&#10;&lt;p&gt;比如：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;选择在 orders 表增加 idempotency_key 字段，并建立 user_id + idempotency_key 唯一索引，而不是引入 Redis 分布式锁。&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;原因：订单创建已经落库在同一个事务中，数据库唯一约束可以直接保证最终一致的去重语义；引入 Redis 锁会增加额外组件依赖和锁过期边界。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这种说明比“用数据库实现幂等”更有价值，因为它把取舍讲清楚了。&lt;/p&gt;&#10;&lt;h3 id="tasksmd拆成可验证的小任务"&gt;&lt;a href="#tasksmd%e6%8b%86%e6%88%90%e5%8f%af%e9%aa%8c%e8%af%81%e7%9a%84%e5%b0%8f%e4%bb%bb%e5%8a%a1" class="header-anchor"&gt;&lt;/a&gt;tasks.md：拆成可验证的小任务&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;tasks.md&lt;/code&gt; 把 &lt;code&gt;plan.md&lt;/code&gt; 拆成可执行任务。&lt;/p&gt;&#10;&lt;p&gt;任务拆分的关键不是“越细越好”，而是每个任务都应该有独立可验证的交付物。一个任务如果完成后无法检查，就很难交给 AI 稳定执行。&lt;/p&gt;&#10;&lt;p&gt;比如下面这种任务就太模糊：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;完善订单幂等功能。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;更好的写法是：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 为 orders 表增加 idempotency_key 字段，并添加 user_id + idempotency_key 唯一索引。&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 调整订单创建接口：同一用户使用相同 Idempotency-Key 重试时返回已有订单编号。&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 补充 3 个测试：首次创建订单、相同幂等键重复请求、不同幂等键创建新订单。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;拆到这个程度，AI 才知道每一步的完成条件是什么，人也更容易 review。&lt;/p&gt;&#10;&lt;h2 id="4-什么是好的-spec"&gt;&lt;a href="#4-%e4%bb%80%e4%b9%88%e6%98%af%e5%a5%bd%e7%9a%84-spec" class="header-anchor"&gt;&lt;/a&gt;4. 什么是好的 Spec&#10;&lt;/h2&gt;&lt;p&gt;我理解一个好的 Spec 至少应该包含六个要素：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;要素&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;作用&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;示例&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Problem Statement&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;定义为什么做&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;当前系统不支持细粒度权限控制，管理员只能使用固定角色&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Success Metrics&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;定义做到什么程度算完成&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;权限判断 P95 小于 50ms，覆盖 20+ 权限类型&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;User Stories&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;定义谁在什么场景下使用&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;作为管理员，我可以创建自定义角色&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Acceptance Criteria&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;定义怎么验收&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;单用户拥有多个角色时，权限结果取并集&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Non-Goals&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;定义本期不做什么&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;本期不支持跨组织权限委托&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Constraints&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;定义必须遵守的约束&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;必须兼容现有 OAuth 2.0 登录流程&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;这里有两个关键词：可验证、有限边界。&lt;/p&gt;&#10;&lt;h3 id="反例看起来像需求其实约束不了实现"&gt;&lt;a href="#%e5%8f%8d%e4%be%8b%e7%9c%8b%e8%b5%b7%e6%9d%a5%e5%83%8f%e9%9c%80%e6%b1%82%e5%85%b6%e5%ae%9e%e7%ba%a6%e6%9d%9f%e4%b8%8d%e4%ba%86%e5%ae%9e%e7%8e%b0" class="header-anchor"&gt;&lt;/a&gt;反例：看起来像需求，其实约束不了实现&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;系统需要一个快速的搜索功能。搜索结果应该相关且准确。界面要美观易用。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这段话不是完全没用，但它不适合作为给 AI 的 Spec。问题在于：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;“快速”没有指标，无法验证&lt;/li&gt;&#10;&lt;li&gt;“相关且准确”没有定义搜索范围和排序规则&lt;/li&gt;&#10;&lt;li&gt;“美观易用”混入了 UI 评价，但没有交互标准&lt;/li&gt;&#10;&lt;li&gt;没说为什么要做搜索，也没说搜索什么内容&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;如果直接把这段话交给 AI，它只能自行猜测。&lt;/p&gt;&#10;&lt;h3 id="正例把描述变成可验收条件"&gt;&lt;a href="#%e6%ad%a3%e4%be%8b%e6%8a%8a%e6%8f%8f%e8%bf%b0%e5%8f%98%e6%88%90%e5%8f%af%e9%aa%8c%e6%94%b6%e6%9d%a1%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;正例：把描述变成可验收条件&#10;&lt;/h3&gt;&lt;p&gt;可以改成这样：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Problem:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;当前文章列表超过 200 篇后，用户只能通过分类和标签查找内容，无法按关键词快速定位文章。&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User Story:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;作为博客读者，我希望在文章列表页输入关键词后，看到标题或摘要命中的文章列表。&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Acceptance Criteria:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 搜索范围包括文章标题和 description，不包括正文全文。&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 搜索大小写不敏感。&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 无匹配结果时展示空状态，而不是保留旧列表。&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 在 200 篇文章规模下，搜索结果应在 300ms 内返回。&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Non-Goals:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 本期不做全文搜索。&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 本期不做搜索高亮。&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 本期不引入独立搜索服务。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这份 Spec 没有告诉 AI 必须用什么技术实现，但它把边界说清楚了。AI 可以自由选择实现方式，但不能偏离验收标准。&lt;/p&gt;&#10;&lt;h2 id="spec-的粒度怎么控制"&gt;&lt;a href="#spec-%e7%9a%84%e7%b2%92%e5%ba%a6%e6%80%8e%e4%b9%88%e6%8e%a7%e5%88%b6" class="header-anchor"&gt;&lt;/a&gt;Spec 的粒度怎么控制&#10;&lt;/h2&gt;&lt;p&gt;Spec 最难的是粒度：写得太粗，AI 会自由发挥；写得太细，又变成伪代码，失去了让 AI 参与方案设计的意义。&lt;/p&gt;&#10;&lt;p&gt;Github spec-kit 提出了一个校验标准：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;换一种技术栈实现，这份 Spec 是否仍然成立？&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;如果答案是否定的，说明 Spec 里可能混入了太多实现细节。&lt;/p&gt;&#10;&lt;p&gt;比如：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;使用 Redis ZSET 存储排行榜。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这句话换成不用 Redis 的技术栈就不成立，所以它更像 Plan 里的技术选择。&lt;/p&gt;&#10;&lt;p&gt;再看这句：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;排行榜需要支持实时更新，用户完成一次有效得分后，排名结果应在 1 秒内反映到榜单查询结果中。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这句话无论用什么技术栈都成立，所以更适合放进 Spec。&lt;/p&gt;&#10;&lt;p&gt;我会把原则总结成一句话：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;Spec 要精确到能约束实现，但抽象到不依赖具体实现细节。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="spec-需要迭代不是一遍写完"&gt;&lt;a href="#spec-%e9%9c%80%e8%a6%81%e8%bf%ad%e4%bb%a3%e4%b8%8d%e6%98%af%e4%b8%80%e9%81%8d%e5%86%99%e5%ae%8c" class="header-anchor"&gt;&lt;/a&gt;Spec 需要迭代，不是一遍写完&#10;&lt;/h2&gt;&lt;p&gt;很多人第一次写 Spec 时，会下意识把它当成一次性文档：写完就交给 AI，然后进入实现。&lt;/p&gt;&#10;&lt;p&gt;但实践里，第一版 Spec 往往都有问题：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;边界条件漏了&lt;/li&gt;&#10;&lt;li&gt;成功标准太模糊&lt;/li&gt;&#10;&lt;li&gt;Non-Goals 不够明确&lt;/li&gt;&#10;&lt;li&gt;用户场景写得太泛&lt;/li&gt;&#10;&lt;li&gt;技术约束没有说清楚&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;根据阿里淘特团队的实践经验，Spec 往往需要 3 到 5 次迭代才会比较稳定。这个成本是值得的，因为改文档通常比改代码便宜得多。&lt;/p&gt;&#10;&lt;p&gt;更重要的是，Spec 的迭代过程会逼着人先想清楚问题本身。AI 可以帮我们写代码，但不应该替我们决定产品边界和工程取舍。&lt;/p&gt;&#10;&lt;h2 id="推荐工具github-spec-kit"&gt;&lt;a href="#%e6%8e%a8%e8%8d%90%e5%b7%a5%e5%85%b7github-spec-kit" class="header-anchor"&gt;&lt;/a&gt;推荐工具：GitHub Spec Kit&#10;&lt;/h2&gt;&lt;p&gt;如果想实际尝试 SDD，可以从 GitHub Spec Kit 开始。&lt;/p&gt;&#10;&lt;p&gt;Spec Kit 提供了一组围绕 SDD 的命令和模板，核心流程是：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/speckit.specify -&amp;gt; /speckit.plan -&amp;gt; /speckit.tasks -&amp;gt; /speckit.implement&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;更完整的流程还可以加入：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/speckit.constitution -&amp;gt; /speckit.specify -&amp;gt; /speckit.clarify -&amp;gt; /speckit.plan -&amp;gt; /speckit.checklist -&amp;gt; /speckit.tasks -&amp;gt; /speckit.analyze -&amp;gt; /speckit.implement&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中 &lt;code&gt;constitution.md&lt;/code&gt; 比较有意思。它相当于项目级别的“宪法”，用来定义不可违背的工程约束，比如：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;架构分层原则&lt;/li&gt;&#10;&lt;li&gt;安全要求&lt;/li&gt;&#10;&lt;li&gt;测试要求&lt;/li&gt;&#10;&lt;li&gt;API 设计约束&lt;/li&gt;&#10;&lt;li&gt;代码质量底线&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;有了这些公共约束，每个 Spec 就不需要重复声明“这个项目不允许绕过鉴权”“这个项目必须补测试”之类的基础规则。AI 在生成 Plan 和 Tasks 时，也能对齐项目长期约束。&lt;/p&gt;&#10;&lt;p&gt;不过工具只是辅助。真正重要的还是写 Spec 的习惯：把 What 和 Why 说清楚，把边界写明确，把验收标准变成可验证条件。&lt;/p&gt;&#10;&lt;h2 id="总结"&gt;&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;总结&#10;&lt;/h2&gt;&lt;p&gt;SDD 的价值不在于多产出几个 Markdown 文件，而在于改变 AI Coding 的输入方式。&lt;/p&gt;&#10;&lt;p&gt;直接让 AI 写代码时，Prompt 往往混在一起：需求、实现、约束、偏好、临时想法都塞进一段话里。SDD 则把这些内容拆开：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;spec.md&lt;/code&gt; 负责 What 和 Why&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;plan.md&lt;/code&gt; 负责 How&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;tasks.md&lt;/code&gt; 负责可执行步骤&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;constitution.md&lt;/code&gt; 负责项目级不变量&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这样做的结果是，AI 不再只是根据一段模糊描述自由发挥，而是在明确边界和验收标准下生成实现。&lt;/p&gt;&#10;&lt;p&gt;对我来说，SDD 最重要的提醒是：AI 编程不是跳过需求分析，而是让需求分析变得更关键。因为代码生成越快，错误需求被放大的速度也越快。&lt;/p&gt;&#10;&lt;p&gt;先写清楚 Spec，再让 AI 动手，可能才是更稳定的 AI Coding 工作流。&lt;/p&gt;&#10;&lt;h2 id="参考资料"&gt;&lt;a href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99" class="header-anchor"&gt;&lt;/a&gt;参考资料&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.github.com/spec-kit/" target="_blank" rel="noopener"&#10; &gt;GitHub Spec Kit Documentation&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.com/github/spec-kit/blob/main/docs/concepts/sdd.md" target="_blank" rel="noopener"&#10; &gt;GitHub Spec Kit: What is Spec-Driven Development?&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.com/github/spec-kit/blob/main/docs/reference/agentic-sdd.md" target="_blank" rel="noopener"&#10; &gt;GitHub Spec Kit: Agentic SDD&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://news.qq.com/rain/a/20260509A01W3100" target="_blank" rel="noopener"&#10; &gt;5 人 7 天干完 20 人数周的活：Spec-Driven Development 如何重新定义 AI 编程_腾讯新闻&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item></channel></rss>