Wei Zhang 和 Jessie Jie Xia(两位都来自 Thoughtworks)2026-04-28 在 Martin Fowler 网站发表了 Structured Prompt-Driven Development。核心主张比较干脆:把 prompt 当成与代码同级的工程工件管理——版本化、评审、复用、迭代。这条主张不新,但作者把它具体化成了一组流程、一份七维度模板(REASONS Canvas)和一套配套 CLI(gszhangwei/open-spdd),外加一个完整示例项目(gszhangwei/token-billing)。

SPDD 与 PDD、Spec Kit、PromptOps 这些相邻概念的差别,另起了一篇速写:prompt-driven vs spec-driven:把 PDD、SPDD、Spec Kit 几支理清楚。本文只聚焦 SPDD 这一篇文章本身。

文章主张:prompt 是一级交付物#

文章开头给的一句话很直接:

Instead of relying on ad hoc chats, SPDD turns prompts into assets that can be: version controlled, reviewed, reused, and improved over time.

这句话把 SPDD 和临时 chat 式交互区分开来:prompt 不只是一次性输入,而是可以被版本化、评审、复用和持续改进的资产。SPDD 想解决的问题文章写得很具体:

  • 模糊的需求被快速翻译成代码,误解随之扩散
  • 评审里要处理的改动越来越多
  • 集成 / 测试问题增加
  • 难以推理生产风险

它给出的答案是:把"意图"从 chat 历史里拎出来,写成可追溯的工件

REASONS Canvas:把 prompt 拆成七层#

文章的核心是 REASONS Canvas 这个概念,它把一份"提示词"拆成七个维度,分到三个层次:

抽象层(意图与设计)
  R — Requirements   问题陈述 + DoD
  E — Entities       领域实体与关系
  A — Approach       解决策略
  S — Structure      系统内适配点、组件依赖

执行层
  O — Operations     把策略落成可测试的实现步骤

治理层(横切标准)
  N — Norms          命名、可观测性、防御性编码……
  S — Safeguards     不可协商的边界:不变量、性能、安全

REASONS 的价值不在字母好记,而在于它强迫你回答"这一段属于哪一层"。Norms 和 Safeguards 单独拎出来之后,那些"通用规则"就不需要每次重写一遍。Operations 这一格作者要求最严:精确到方法签名、参数类型、执行顺序——这意味着生成阶段更接近"忠实翻译已同意的计划",而不是再让模型"发挥"。

六步工作流与核心纪律#

示例流程按六个检查点展开,其中几步由 CLI 命令支撑:

步骤 命令 / 动作 目的
1 /spdd-story 把大需求按 INVEST 拆成用户故事
2 人工澄清 确保团队对故事的理解一致
3 /spdd-analysis 提取领域关键词、扫相关代码、生成战略分析
4 /spdd-reasons-canvas 生成完整 Canvas,作为可执行蓝图
5 /spdd-generate + /spdd-api-test + 评审 按 Canvas 生成代码,先做行为验证,再审意图对齐
6 生成 unit test prompt / unit tests 在实现稳定后补回归测试

流程本身不算稀奇,但作者夹了一条最关键的纪律:

When reality diverges, fix the prompt first — then update the code.

意思是:当评审发现代码与意图有出入,不要直接改代码——先回到 Canvas 里修意图,再让 /spdd-generate 按更新后的意图重新出代码。 这条直接决定 Canvas 是不是真的"一级工件":如果手改代码不同步回去,Canvas 很容易退化成只在第一次起作用的脚手架,几个 sprint 后没人会去信它,又退回 chat-driven 的状态。

作者也展示了反向情况——纯重构(比如把 magic number 提成常量)行为没变,那就允许先改代码,再用 /spdd-sync 把 Canvas 同步回去。两条规则合起来:

逻辑变化(行为改变) → 改 prompt → 重新生成代码
重构清理(行为不变) → 改代码    → 同步回 prompt

一个具体场景:计费引擎增强#

文章用的示例是一个 Token 计费引擎,从静态定价升级到按方案(Standard / Premium)分档的动态、模型感知定价。三个细节值得记:

  • 故事整合:两个原始故事被合成一个简化故事,仅保留背景、业务价值、in/out of scope、Acceptance Criteria。AC 用 Given/When/Then 写得很具体,例如 “Given a Standard customer with 100,000 monthly quota… When submitting 30,000 tokens… Then bill shows: 10,000 from quota, 20,000 overage, $0.20 charge.”
  • modelId 字段的可空性问题:评审里发现 modelId 应该是必填、默认 fast-model。作者没有直接改代码,而是先跑 /spdd-prompt-update 修 Canvas,确认后再让 /spdd-generate 做目标性更新。
  • 常量提取:把魔法数提常量是纯重构,直接改代码,再 /spdd-sync 把改动反映回 Canvas。

这三个细节正好是上面那条纪律的具体演练:行为变化先改 Canvas,行为不变的重构可以先改代码再同步回 Canvas。

适用度评估#

文章给了一份适用度评估,精简如下:

适用度 场景
★★★★★ 规模化、标准化交付:高重复业务逻辑、长期可维护
★★★★★ 高合规与硬约束:金融、多渠道部署
★★★★☆ 团队协作与可审计性:多人交付、端到端可追溯
★★☆☆☆ 紧急热修:速度优先于纪律
★★☆☆☆ 探索性 spike:治理开销过高
★☆☆☆☆ 上下文黑洞:领域定义不清
★☆☆☆☆ 创意 / 视觉工作:品味驱动而非逻辑驱动

把"探索 spike"“紧急热修"打到 ★★,背后的逻辑是:SPDD 的价值在它强制做的那些前置工作,而这些工作天然不适合一次性场景。

文章的收尾:一句 Hamming#

文章末尾引了 Richard Hamming 的一句话:

In science, if you know what you are doing, you shouldn’t be doing it. In engineering, if you don’t know what you are doing, you shouldn’t be doing it.

作者用它来论证 SPDD 的本质——AI 时代的软件开发,比拼的不再是模型本身的智商,而是工程师把问题想清楚、框定清楚、做决定的"认知带宽”。


几点笔记(个人观点)#

  • 体感对得上:AI 写得越快,PR 评审里"这段意图到底是什么"的来回就越多;把意图从 chat 里拎成可追溯工件,正是冲着这个去的。
  • 和我自己的定位关系:SPDD 把更多权重压在"上游意图的结构化",我在 Agentic Workflow 笔记里更靠近"下游工程基础设施"(可机读需求、可复现构建测试、静态规则落工具)。两者不冲突,更像同一条链上的不同段。
  • 两个让我犹豫的点:一是 REASONS 的边界划分会不会被过度形式化——小改动(加一个字段、修一行查询)逐项填七格可能不划算;二是 Canvas 和代码"双源真值"的同步纪律能否长期维持/spdd-sync 这个出口在真实项目里很容易被偷懒省掉,命运可能和 ADR 一样:前期热闹、后期腐化。
  • 我打算试的最小动作:把"逻辑改动改 prompt、重构改代码反向同步"这条规则写进 .claude/skills/AGENTS.md;把 Norms / Safeguards 抠成独立的"项目常量"文件存进 git;给一个正在做的小功能填一次完整 REASONS Canvas,走两三轮看是否真减少返工,再决定要不要上 open-spdd 这类工具。
  • 那句 Hamming 我没法反驳:过去半年最大的体感不是"AI 替我写了多少代码",而是"AI 让我意识到自己原本对意图描述得有多含糊"——SPDD 整套设计可以看作对这种含糊的工程化回应。

参考资料#