
生成式 AI 最大的问题,就在于不确定性、难以稳定复现性和无法根除的「幻觉」,这样的问题也影响到了 Vibe Coding 的效果,导致开发过程就像抽卡开盲盒,结果时好时坏。
Vibe Coding 对于快速原型验证或许尚可接受,但要构建严肃的、生产级别的软件系统,显然是远远不够的。我们需要一种能将传统软件工程的严谨性与 AI 的强大能力相结合的方法论。
最近,来自 Amazon Kiro 的首席工程师 AL Harris 详细阐述了的解决方案:Spec-Driven Development (SDD)——「规约驱动开发」。

这篇文章将从 Al Harris 的分享出发,探讨 SDD 是如何试图为混乱的 AI 编程注入工程的灵魂,以及它如何通过一套结构化的工作流和工具链,提升 AI 智能体的可控性、代码质量和交付的可靠性。
当前 AI 辅助编程模式的根本问题在于,开发过程高度依赖于操作者(也就是开发者)的个人能力。用户需要通过提示词引导模型,不断提醒模型不要偏离方向,并对模型生成的代码进行细致的审查和调试。
这个过程不仅效率低下,而且极度依赖个人经验,难以规模化。
更重要的是,AI 编程存在许多问题:

Vibe Coding 把开发者变成了「提示词工程师 + 人肉测试员」,这是工程可靠性的倒退。
我们需要一种方法,将过去二三十年软件行业沉淀下来的宝贵经验——从瀑布模型到敏捷开发,再到极限编程——融入到 AI 开发流程中。
Spec-Driven Development 正是基于这一理念而生。
很多人听到「Spec」或「规约」,第一反应可能是那些冗长、无人阅读的文档。但在 SDD 方法论中,「Spec」远不止于此。
SDD 的核心理念是将传统软件开发生命周期(SDLC)中那些被验证行之有效的实践——需求分析、系统设计、任务分解——进行压缩和自动化,并将其作为 AI 生成代码的强制前置步骤。

在 Kiro 的实践中,SDD 是一个结构化、可落地的流程,这个流程中会产生一系列明确的、可以被版本控制的工程产物(artifacts):

简单来说,SDD 就是将模糊的自然语言想法,通过一个结构化的流程,层层递进地转化为清晰的需求、可行的设计、具体的任务,并最终生成高质量、可验证的代码。
它压缩了传统软件开发生命周期,将需求发现、设计、实现等环节紧密地迭代融合在一起。
SDD 的想法不难理解,但要落地并不容易,需要一些具体的工程方法。
在 Kiro 的 SDD 流程中,当用户输入一个初始 Prompt 后,系统会首先生成一系列明确的需求和验收标准。这些验收标准采用了一种名为 EARS (Easy Approach to Requirements Syntax) 的格式。
EARS 是一种半结构化的自然语言。它使用特定的句式模板(例如 When <pre-condition>, the system shall <response>)来描述系统行为。
换句话说,就是描述「当【某个前置条件】发生时,在【某个特定场景】下,系统应当【执行某个动作】,以【实现某个结果】。」
EARS 的价值在于它的可解析性。非结构化的自然语言对于 LLM 来说灵活,但也充满了歧义。而 EARS 这种半结构化的格式,使得系统可以不完全依赖 LLM,而是使用更传统的、更可靠的自动化推理技术来解析、验证和处理这些需求。这为后续的一系列自动化操作奠定了基础。
例如,系统可以扫描 EARS 格式的需求,自动检测是否存在:
当检测到这些问题时,系统可以主动帮助用户解决这些模糊之处,从而在编码开始之前就极大地提升了需求的质量。
传统的单元测试通常是基于示例的测试 (Example-Based Testing)。开发者会编写具体的输入和期望的输出,例如 assert add(2, 3) == 5。这种方法的覆盖范围有限,很难发现边界情况下的 bug。
在 SDD 开发中,由于需求是使用 EARS 格式定义的,系统可以将这些结构化的需求,直接翻译成系统的「属性」(Properties)或「不变量」(Invariants)。
这就是属性测试 (Property-Based Testing, PBT)。
例如,对于一个排序函数,它的一个属性是「对于任何一个随机生成的列表,排序后的结果列表长度应与原列表相同」。测试框架(如 Python 的 Hypothesis 或 Node.js 的 fast-check)会自动生成成百上千个测试用例,试图找到一个能够证伪 (falsify) 这个属性的反例。
把 EARS 和 PBT 联系起来。Al 编程的路径就是:
自然语言需求(EARS 格式)-> 系统属性(自动提取)-> 属性测试代码(自动生成)
这意味着,开发者在需求阶段用自然语言描述的「系统应该做什么」,可以被自动转化为 PBT 测试用例,用来验证最终生成的代码是否真的做到了。
依靠这种方式,Kiro 实现了一条从初始需求一直贯穿到最终代码的主线。如果代码通过了所有从需求转化而来的属性测试,那么我们就有很高的置信度认为,交付的软件精确地满足了最初的设想。
这彻底改变了 AI 编程的游戏规则。它不再是「感觉代码好像对了」,而是有了一套机制来系统性地、自动化地验证代码的正确性是否与规约一致。这正是工程化的体现。
理论和工程都有了,但在实践中如何灵活运用?
答案就是打磨你的工具箱,并将其分为三个由粗到精的层次,对应着用户对 SDD 流程不同程度的定制和掌控。
这是最基础的增强能力。SDD 流程并非一个封闭的系统。通过 MCP,Kiro 可以与外部系统和服务进行交互。

比如,项目管理可能在 Asana 或 Jira 上。与其手动复制粘贴任务描述,你可以直接告诉 Kiro:「去执行我在 Asana 上的这个任务 [URL]」。Kiro 会通过 MCP 调用 Asana 的 API,获取任务的详细信息(标题、描述、子任务等),并以此为基础自动生成 Spec 的需求部分。
这一层打磨的核心在于将 AI 开发流程与现有的工程实践和数据源连接起来,让 Spec 的生成不是凭空想象,而是基于真实的项目上下文。你可以集成 GitHub, Brave Search, AWS 文档等任何提供了 API 的服务。
这一层体现了 SDD 的灵活性。Spec 的产物(requirements.md, design.md, tasks.md)本身也是自然语言文档,这意味着你可以像与 AI 对话一样,要求它改变这些文档的内容和形式。

比如:
这一层打磨的核心是提升 Spec 制品本身的信息密度和可操作性,使其更贴合团队的具体需求,让「完成」的定义不再模糊。
这是最高级的应用,也是最能体现人与 AI 协作价值的地方。它意味着你不仅可以定制 Spec 的内容,还可以挑战和迭代 Spec 生成的流程和决策本身。

比如,Harris 最初要求 Kiro 为一个 Agent 应用增加会话持久化功能,并随口提了一句「将会话转储到 S3 文件中」。Kiro 忠实地按照这个指示生成了基于 S3 的完整设计方案。
但他马上意识到,自己可能引入了偏见。S3 只是他熟悉的方案,但不一定是最优解。于是,他向 Kiro 发出了挑战:「这是实现会话持久化的惯用方法吗?有没有更好的选择?」

Kiro 接收到这个指令后,立即调用了相关的 MCP 工具(如 AWS 文档查询),进行了一番研究,然后回来提出建议:对于 LangChain(他们使用的 Agent 框架),使用其内置的 Agent Core Memory 机制可能更加原生和面向未来,当然,使用 S3 也是一个可行的选项。
这个过程的优势在于,SDD 并不要求你一开始就拥有完美的计划。相反,它鼓励你利用 AI 的信息检索和分析能力,来审视和优化你自己的初始想法。开发过程变成了一场动态的、有信息增益的对话,最终的设计决策是人类经验和 AI 研究能力的共同产物。
在分享的 Q&A 环节,Al 也回应了一些关于 SDD 在现实世界中应用的尖锐问题。
不同的 Vibe Coding 工具在探索不同的发展方向,Amazon Kiro 就是想把AI 辅助软件开发从手工作坊式走向工业化生产。
Spec-Driven Development 的核心思想,就是要通过引入结构、规约和可验证性,来驯服 AI 这匹强大的野马。
总结一下其核心价值:
总而言之,Spec-Driven Development 代表了一种范式转移:从单纯地向 AI「提示 (Prompting)」,转向与 AI 共同「规约 (Specifying)」。
这不仅仅是工具层面的变化,更是开发哲学层面的演进。它要求开发者更多地像一个架构师或产品经理一样思考,将重点放在定义「做什么」和「为什么做」上,而将「如何做」的繁重任务更大程度地交给可靠的 AI 智能体去完成。