Martin Fowler 网站的 SPDD:把 prompt 当一级交付物
目录
把 prompt 当成与代码同级的工程工件管理,版本化、评审、复用、迭代。这条主张不新,Structured Prompt-Driven Development 的贡献是把它具体化成了一组流程、一份七维度模板(REASONS Canvas)和一套配套 CLI(gszhangwei/open-spdd),外加一个完整示例项目(gszhangwei/token-billing)。文章 2026-04-28 发在 Martin Fowler 网站,作者 Wei Zhang 和 Jessie Jie Xia 都来自 Thoughtworks。本文只聚焦 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 整套设计可以看作对这种含糊的工程化回应。
参考资料#
- Martin Fowler — Structured Prompt-Driven Development(Wei Zhang & Jessie Jie Xia,2026-04-28)
- openspdd CLI 工具
- token-billing 示例项目
- 相关笔记:工程化引入 Agentic Workflow、prompt-driven vs spec-driven:把 PDD、SPDD、Spec Kit 几支理清楚