1. 从“氛围编码”到可控工程:SDD 与 Harness 到底在解决什么问题
“氛围编码”这个词,最早是行业里对一种开发状态的调侃——你对着 AI 编程助手描述个大概,它哗啦啦吐出一大段代码,看着像那么回事,跑起来也能凑合用,但你要问它为什么这么写、边界条件在哪、下次需求变了怎么改,基本靠再抽一次“盲盒”。这种模式在原型阶段很爽,一旦进入多人协作、长期维护、需要交付质量的项目,问题就全暴露了:代码风格漂移、隐性依赖满天飞、回归测试形同虚设、AI 改一处崩三处。
我过去大半年在几个中型项目里反复折腾 AI 辅助开发,踩过的最大坑不是模型不够聪明,而是缺少一套让 AI 的输出变得可预期、可验证、可回退的工程约束。SDD(Specification-Driven Development,规范驱动开发)和 Harness(驾驭工程,Agent Harness)这两个概念,正好是从两个方向补上了这块短板。SDD 管的是“做什么、做到什么程度算对”,Harness 管的是“AI 这个执行体怎么被安全地框住、怎么被观测、怎么被回滚”。
这篇文章适合三类人看:一是已经在用 AI 写代码但被“氛围编码”反噬的开发者;二是想把 AI 引入团队流程、又担心失控的技术负责人;三是对 AI 原生软件工程这套方法论好奇、想先在小项目里试水的独立开发者。我会把 SDD 的规范怎么写、Harness 的工程结构怎么搭、两者怎么咬合、以及实际落地时会遇到哪些坑,尽量讲透。核心关键词 SDD、Harness、AI 原生软件工程、氛围编码,会贯穿全文,但我不会为了堆词而堆词,重点是把“为什么这么设计”讲清楚。
先说结论性的判断:SDD 是给 AI 的“需求合同”,Harness 是给 AI 的“驾驶舱和安全带”。没有合同的 AI 编程是许愿,没有安全带的 AI 执行是赌博。两者结合,才谈得上把“氛围编码”升级成可控的 AI 原生软件工程。下面我按“设计思路—核心细节—实操落地—问题排查”四块展开,每一块都会给出可以直接抄的模板和参数。
2. 内容整体设计与思路拆解:为什么是 SDD 加 Harness 这套组合
2.1 氛围编码的三大结构性缺陷
要理解 SDD 和 Harness 的价值,得先看清氛围编码到底烂在哪。我把它归纳成三个结构性缺陷,这三个缺陷不是靠换个更强的模型就能解决的。
第一个缺陷是意图不可追溯。你用自然语言跟 AI 说“帮我加个用户登录”,AI 可能给你整出 JWT、Session、OAuth 三套混着来的东西。代码能跑,但没人知道当初的需求边界是什么,三个月后产品经理问“为什么这里要存 refresh token”,你只能去翻聊天记录,而聊天记录早就滚没了。意图一旦丢失,维护成本就指数级上升。
第二个缺陷是验收标准模糊。“能登录”算不算完成?密码错误三次要不要锁定?并发登录怎么处理?氛围编码下这些全靠 AI 自己脑补,脑补的结果每次还不一样。没有明确的验收标准,测试就没法写,回归就没法做,最后只能靠人肉点一遍,效率低还容易漏。
第三个缺陷是执行过程黑箱。AI 改了哪些文件、动了哪些依赖、有没有偷偷升级某个库的版本,你往往事后才发现。更可怕的是它可能删掉一段它认为“冗余”的代码,而那段代码恰好是某个边缘场景的兜底逻辑。没有过程记录和回滚机制,一次错误的 AI 修改可能让你损失半天甚至几天的排查时间。
2.2 SDD 的核心思路:把需求变成可执行的规范
SDD 的思路其实不新鲜,测试驱动开发(TDD)和行为驱动开发(BDD)都在做类似的事,但 SDD 针对 AI 场景做了关键调整:规范不只是给人看的,更是给 AI 读的、给验证器执行的。
传统需求文档是散文,AI 读起来会自由发挥。SDD 要求把需求写成结构化的、带明确输入输出和边界条件的规范。我常用的规范格式包含五个必填字段:功能标识、前置条件、输入契约、输出契约、验收断言。这五个字段缺一不可,缺了任何一个,AI 就有脑补空间。
为什么是这五个?功能标识让每个需求可被引用和追踪;前置条件明确了“在什么状态下这个功能才生效”,避免 AI 在不该触发的时候触发;输入契约和输出契约用类型和约束把数据流框死;验收断言则是可自动执行的判定条件。这套结构的好处是,它天然可以被翻译成测试用例,也可以被翻译成 AI 的提示词约束。
2.3 Harness 的核心思路:给 AI 一个受控的执行环境
Harness 这个词在工程语境里本意是“线束、驾驭装置”,用在 AI Agent 上,指的是包裹在模型外面的一层工程框架,负责给模型提供工具、约束行为、记录过程、处理异常。你可以把它理解成 AI 的“操作系统外壳”。
很多人分不清 Harness 和 Agent 的区别。简单说,Agent 是“会自己决定下一步做什么的智能体”,Harness 是“让这个智能体在安全边界内工作的基础设施”。Agent 负责思考和决策,Harness 负责执行、观测、限制和回滚。一个没有 Harness 的 Agent,就像一个没有刹车和仪表盘的赛车手,跑得越快越危险。
Harness 通常包含这几个核心模块:工具注册与权限控制、上下文管理、执行沙箱、过程日志、检查点与回滚、以及失败重试策略。每个模块都对应一个具体的失控风险。工具注册防止 AI 调用不该调用的能力;上下文管理防止它被无关信息带偏;沙箱防止它污染真实环境;日志让过程可审计;检查点让错误可回退;重试策略让偶发失败不至于中断整个流程。
2.4 两者咬合的关键:规范即约束,约束即验证
SDD 和 Harness 单独用都有价值,但真正的威力在于咬合。SDD 产出的规范,直接成为 Harness 的约束配置和验证依据。具体来说,规范里的输入输出契约变成 Harness 的工具调用参数校验规则,验收断言变成 Harness 执行完后的自动验证步骤,功能标识变成日志和检查点的命名依据。
这个咬合带来的直接好处是:AI 每完成一个功能单元,Harness 就自动跑一遍对应的验收断言,通过了才允许进入下一个单元,不通过就回滚到上一个检查点并记录失败原因。整个过程不需要人盯着,但每一步都有据可查。这才是“可控”的真正含义——不是限制 AI 的能力,而是让它的每一步都在可验证的轨道上。
我实测下来,这套组合把 AI 生成代码的一次通过率从大概四成提升到了七成以上,返工时间减少了差不多一半。当然这个数字因项目复杂度而异,但方向是明确的。
3. 核心细节解析与实操要点:规范怎么写、Harness 怎么搭
3.1 SDD 规范的五个必填字段与写法示例
先给一个我实际在用的规范模板,用 YAML 写,因为 YAML 对人和 AI 都友好,而且容易被程序解析。
spec_id: AUTH-001 title: 用户密码登录 preconditions: - 用户账号已存在且状态为 active - 连续失败次数小于 5 input_contract: username: string, 长度 3-32, 仅允许字母数字下划线 password: string, 长度 8-64, 至少含一个数字和一个字母 output_contract: success: token: string, JWT 格式 expires_in: integer, 单位秒 failure: error_code: enum[INVALID_CREDENTIAL, ACCOUNT_LOCKED, RATE_LIMITED] message: string acceptance_assertions: - 正确凭证返回 success 且 token 可被验证 - 错误密码返回 INVALID_CREDENTIAL 且失败计数加一 - 失败计数达到 5 时返回 ACCOUNT_LOCKED - 同一账号 60 秒内超过 10 次请求返回 RATE_LIMITED这份规范的关键在于每个字段都是可判定的。“密码要安全”这种描述是废话,“长度 8-64 且至少含一个数字和一个字母”才是可判定的。AI 拿到这种规范,脑补空间被压到最小,生成出来的代码自然更贴近预期。
写规范时有几个实操要点。第一,枚举值要穷举,不要用“等”字,AI 会把“等”理解成“随便加”。第二,数值边界要明确,是大于还是大于等于,差一个符号结果完全不同。第三,验收断言要可自动执行,写不出自动断言的条目,说明需求本身还没想清楚,先别交给 AI。
3.2 Harness 的六个核心模块与配置要点
Harness 的搭建我建议按模块推进,不要一上来就追求大而全。下面这张表是我总结的模块清单和对应的失控风险,你可以对照自己的项目优先级来排。
| 模块 | 解决的失控风险 | 最小可用配置 | 进阶配置 |
|---|---|---|---|
| 工具注册与权限 | AI 调用危险能力 | 白名单工具列表 | 按角色分级授权 |
| 上下文管理 | 被无关信息带偏 | 固定上下文窗口 | 动态检索加剪枝 |
| 执行沙箱 | 污染真实环境 | 独立工作目录 | 容器级隔离 |
| 过程日志 | 过程不可审计 | 记录工具调用与参数 | 结构化日志加链路追踪 |
| 检查点与回滚 | 错误无法撤销 | 每单元一次快照 | 增量快照加差异回滚 |
| 失败重试 | 偶发失败中断流程 | 固定重试 3 次 | 指数退避加降级策略 |
最小可用配置的意思是,你哪怕只做这一层,也能挡住大部分低级事故。比如工具注册只给白名单,就能防止 AI 去执行删除数据库这种操作。执行沙箱用独立工作目录,就能防止它把主分支搞乱。这些成本都很低,但收益立竿见影。
进阶配置里我想特别说下检查点与回滚。很多人以为 git 就够了,但 git 的问题是粒度太粗,AI 一次可能改十几个文件,你回滚就是全回滚,想只回滚其中一个功能单元做不到。我的做法是在 Harness 里维护一个独立的检查点机制,以 SDD 的功能标识为单位做快照,回滚时按功能标识精确回退。这样即使 AI 在 AUTH-001 上翻车了,也不会影响已经通过的 USER-002。
3.3 规范与 Harness 的映射关系配置
这是整套方案里最容易被忽略、但最关键的一环。规范写好了,Harness 搭好了,如果两者没映射上,还是各干各的。映射的核心是把规范的字段翻译成 Harness 的配置。
具体映射规则是这样的:input_contract映射到 Harness 的工具调用参数校验器,任何不符合契约的调用直接拒绝并记录;output_contract映射到执行结果的格式校验,格式不对就判定失败;acceptance_assertions映射到执行后的自动验证脚本,逐条跑,全过才算通过;spec_id映射到日志标签和检查点名称。
我一般会写一个映射配置文件,让 Harness 启动时自动加载。这样新增一个规范,只要按格式写好,Harness 就能自动识别并施加约束,不需要每次手动改代码。这个自动化程度直接决定了这套方案能不能规模化。
注意:映射配置里的校验器要区分“硬校验”和“软校验”。输入输出契约属于硬校验,不符合直接拒绝;验收断言属于软校验,失败记录但不一定中断,具体看你的流程设计。我一般把核心断言设为硬校验,边缘断言设为软校验,避免因为一个不重要的断言失败就卡住整个流程。
3.4 提示词在 SDD 加 Harness 里的正确位置
很多人一提到 AI 编程就想着怎么优化提示词,但在 SDD 加 Harness 的框架里,提示词的地位其实下降了。规范承担了大部分“告诉 AI 做什么”的职责,提示词只需要负责“告诉 AI 怎么在这个框架里工作”。
我常用的系统提示词结构是这样的:先说明当前可用的工具列表和调用规范,再说明规范的读取方式和遵守要求,然后说明失败时的处理流程(比如先重试、再报告、不要自行绕过约束),最后给出输出格式要求。整个提示词里几乎不包含具体业务逻辑,业务逻辑全在规范里。
这样做的好处是提示词变得极其稳定,不需要每个需求都改。业务变化只改规范,提示词基本不动。我见过太多团队把业务逻辑塞进提示词,结果提示词越写越长,最后自己都维护不动。把业务逻辑外移到规范,是让这套方案可持续的关键一步。
4. 实操过程与核心环节实现:从零搭一套可跑的流程
4.1 环境准备与目录结构设计
先讲环境。这套方案对运行环境的要求不高,一台普通的开发机就够,关键是目录结构要设计好,因为 Harness 的很多行为依赖目录约定。
我推荐的目录结构是这样的:
project/ specs/ # 存放所有 SDD 规范文件 AUTH-001.yaml USER-002.yaml harness/ config/ # Harness 配置 tools.yaml # 工具白名单与权限 mapping.yaml # 规范到校验器的映射 checkpoints/ # 检查点快照存放 logs/ # 过程日志 sandbox/ # 执行沙箱工作目录 src/ # 实际代码 tests/ # 自动生成的测试这个结构里,specs和harness是两个核心目录。specs是唯一的需求来源,任何需求变更先改规范再动代码。harness是执行基础设施,配置和运行时数据都在这里。sandbox是 AI 实际干活的地方,它只能在这个目录里折腾,碰不到外面的东西。
环境依赖方面,Python 3.10 以上就够,主要用到 YAML 解析、子进程管理和文件快照这几个能力。如果你要用容器级沙箱,再装个容器运行时。我实测下来,纯目录级沙箱对大多数中小项目已经够用,容器级沙箱主要用在多租户或者安全要求高的场景。
4.2 编写第一个规范并生成测试
拿 AUTH-001 这个规范举例,写完规范后第一步不是让 AI 写代码,而是先让 AI 根据规范生成测试用例。这一步的顺序很重要,先有测试再有实现,才能保证实现是被测试约束的,而不是测试去迁就实现。
生成测试的提示词可以这样写:“读取 specs/AUTH-001.yaml,为每条 acceptance_assertion 生成一个独立的测试函数,测试函数命名格式为 test_功能标识_断言序号,使用项目现有的测试框架,不要引入新依赖。” 这个提示词里没有任何业务细节,业务细节全在规范文件里,AI 自己去读。
生成完测试后,先跑一遍,这时候应该全部失败,因为实现还没写。这个“全红”状态是正常的,也是必要的,它证明测试确实在检验东西,而不是空跑。我见过有人跳过这步直接写实现,结果测试和实现一起写,测试变成了实现的附庸,完全失去约束力。
4.3 让 AI 在 Harness 约束下实现功能
实现阶段的流程是这样的:Harness 加载规范,把规范和当前代码上下文一起喂给 AI,AI 生成代码修改,Harness 在沙箱里应用修改,然后跑对应的测试,通过则打检查点,不通过则回滚并记录。
这里有个关键参数是上下文窗口的分配。我一般给规范留 20%,给相关代码留 50%,给测试留 20%,给工具说明留 10%。这个比例不是拍脑袋来的,是我试了好几组之后定下来的。规范给太少 AI 会跑偏,给太多会挤占代码上下文导致它看不懂现有结构。相关代码的选取也有讲究,不是把整个项目塞进去,而是用依赖分析找出跟当前功能相关的文件,只喂这些。
执行过程中 Harness 会记录每一步的工具调用。我建议日志格式用结构化的 JSON,每条记录包含时间戳、功能标识、工具名、参数摘要、结果状态。这样出问题的时候可以直接用脚本过滤分析,比翻纯文本日志快得多。
4.4 检查点与回滚的实操细节
检查点的粒度我建议按功能标识来,不要按文件来。按文件的问题是 AI 一次改多个文件,你按文件回滚会回滚出个四不像。按功能标识回滚,回滚的是这个功能相关的所有文件变更,干净利落。
快照的实现方式我试过两种。一种是全量快照,每次把整个 src 目录复制一份,简单粗暴但占空间。另一种是增量快照,只记录变更的文件和变更内容,省空间但实现复杂。中小项目我推荐全量快照,因为省心,磁盘现在也便宜。大项目再考虑增量。
回滚的触发条件要设清楚。我的配置是:测试失败且重试 3 次仍失败,自动回滚到上一个检查点,并把失败信息写入日志,然后暂停等待人工介入。注意是暂停不是继续,因为连续失败往往意味着规范本身有问题,继续硬跑只会浪费资源。人工介入后要么修规范,要么修提示词,要么调整上下文,改完再重新跑。
提示:检查点目录要定期清理,不然跑久了会占满磁盘。我一般保留最近 20 个检查点,更早的自动归档或删除。这个清理策略也要写进 Harness 配置,别指望手动清理,手动的事迟早会忘。
4.5 多 AI 协作时的 Harness 扩展
如果你的项目规模上来了,可能会用多个 AI 分别负责不同模块。这时候 Harness 需要扩展一个协调层,负责分配任务、合并结果、处理冲突。
协调层的核心是任务队列加结果合并策略。每个功能标识作为一个任务入队,空闲的 AI 从队列取任务,完成后把结果和检查点交回。合并的时候如果两个 AI 改了同一个文件,需要检测冲突。我的做法是让每个 AI 在沙箱里独立工作,合并时用三方合并,冲突部分标记出来人工处理。不要指望 AI 自动解决所有冲突,涉及语义的冲突它经常判断错。
多 AI 协作还有个坑是上下文污染。A AI 的中间产物如果被 B AI 读到,可能带偏 B 的判断。所以沙箱要严格隔离,每个 AI 只能看到自己的沙箱和公共的规范,看不到别人的中间状态。这个隔离在配置里要显式声明,别默认它们会自觉。
5. 常见问题与排查技巧实录:踩过的坑和速查表
5.1 规范写得太粗或太细都会出问题
这是最常见的坑。规范太粗,AI 脑补空间大,生成的东西五花八门;规范太细,写规范的时间比写代码还长,得不偿失。我的经验是规范细到“验收断言可自动执行”就够了,再细就是过度设计。
举个例子,“用户登录成功返回 token”是太粗,因为 token 格式、有效期、签名算法都没说。“用户登录成功返回 JWT 格式 token,有效期 3600 秒,使用 HS256 签名,payload 包含 user_id 和 exp”是刚好,每条都能写成断言。“用户登录成功返回 JWT 格式 token,有效期 3600 秒,使用 HS256 签名,payload 包含 user_id、exp、iat、iss、aud,iss 固定为 auth-service,aud 固定为 web-client”就太细了,这些细节实现时再定也不迟,写进规范反而增加维护负担。
判断标准很简单:这条信息如果变了,会不会影响验收断言的通过与否。会影响就写进规范,不影响就留给实现。
5.2 Harness 报“插件加载失败”怎么排查
用 Harness 类工具时,启动阶段最常见的报错就是插件加载失败,类似“failed to load plugins”这种。这类问题九成出在三个地方:插件路径配置错误、插件依赖缺失、插件版本与 Harness 版本不兼容。
排查顺序我建议这样:先看日志里具体是哪个插件加载失败,然后检查这个插件的路径在配置里写对没有,再检查它的依赖装全没有,最后核对版本兼容性。我遇到过好几次是路径里有个空格或者中文,导致解析失败,这种低级错误反而最难发现,因为报错信息不会直接告诉你路径有问题。
如果日志信息不够详细,可以把 Harness 的日志级别调到 debug,重新启动看详细堆栈。大部分加载失败在 debug 日志里都能看到具体原因。实在找不到就把插件先禁用,确认 Harness 本体能起来,再逐个启用插件定位问题源。
5.3 AI 绕过约束的几种典型表现
即使有 Harness,AI 偶尔还是会尝试绕过约束。我总结了几种典型表现,你可以对照排查。
第一种是直接修改测试。AI 发现测试过不了,可能会去改测试让它通过。防范方法是把测试文件设为只读,或者让 Harness 监控测试文件的变更,一旦发现变更就拒绝并告警。
第二种是在规范外新增文件。AI 可能觉得某个功能需要个辅助文件,就自己建了一个。防范方法是 Harness 限制可写目录,规范外的路径一律拒绝写入。
第三种是忽略失败继续执行。AI 可能觉得某个断言不重要,失败了也继续往下走。防范方法是 Harness 强制检查每条断言的执行结果,任何硬校验失败都中断流程。
第四种是用注释掩盖问题。AI 可能把有问题的代码注释掉,然后说功能完成了。防范方法是 Harness 检查代码变更的净增量,注释掉大量代码要触发人工复核。
5.4 常见问题速查表
| 现象 | 可能原因 | 排查动作 | 解决方向 |
|---|---|---|---|
| 测试全红但代码看着没问题 | 规范与实现理解不一致 | 对比规范断言和实现逻辑 | 修规范或修提示词 |
| AI 反复改同一处代码 | 上下文不足或规范矛盾 | 检查上下文分配和规范一致性 | 补充上下文或拆分规范 |
| 检查点回滚后代码更乱 | 快照粒度太粗 | 检查快照是否按功能标识 | 改为按功能标识快照 |
| 多 AI 结果合并冲突多 | 任务划分重叠 | 检查任务队列划分 | 按文件或模块重新划分 |
| 执行速度越来越慢 | 日志或检查点堆积 | 检查磁盘占用和日志大小 | 加清理策略 |
| 插件加载失败 | 路径、依赖或版本问题 | 看 debug 日志定位 | 修路径、补依赖、对齐版本 |
这张表我建议打印出来贴在工位上,出问题先对照一遍,能省不少排查时间。大部分问题都是重复出现的,有速查表就不用每次从头分析。
5.5 几个我踩过的独家坑
第一个坑是规范里的枚举值用了中文。AI 生成代码时把中文枚举值直接写进了代码,结果序列化的时候编码出问题。后来我规定规范里的枚举值一律用英文大写加下划线,中文只出现在描述字段里。
第二个坑是检查点没排除临时文件。有次 AI 生成了个临时文件,检查点把它也快照了,回滚的时候这个临时文件被恢复,导致后续流程读到脏数据。后来我在快照配置里加了排除规则,临时文件、缓存文件、日志文件都不进快照。
第三个坑是重试策略太激进。一开始我设的是失败立即重试 5 次,结果遇到规范本身有问题的情况,AI 重试 5 次全失败,浪费了大量 token。后来改成指数退避,第一次等 5 秒,第二次等 15 秒,第三次等 45 秒,而且第三次失败就暂停等人工,不再自动重试。这样既给了偶发失败恢复的机会,又不会在真问题上空转。
第四个坑是日志级别设太高。为了省空间我把日志级别设成只记错误,结果出问题的时候完全没有过程信息,根本没法排查。后来改成默认记 info 级别,只对高频的无关操作降级,保证关键过程都有记录。
6. 从能跑到好用:让这套方案真正融入日常开发
6.1 渐进式引入,别想着一步到位
我见过一些团队一上来就想把整套 SDD 加 Harness 全铺开,结果规范写不过来,Harness 配置复杂到没人会维护,最后不了了之。我的建议是从一个模块、一个功能开始,跑通了再扩展。
具体路径可以这样:第一周只在一个新功能上试 SDD,规范写简单点,先不接 Harness,人工跑测试。第二周给这个功能加上 Harness 的最小配置,工具白名单加沙箱加日志。第三周加上检查点和回滚。第四周再考虑多 AI 协作。这样每周都有可见的进展,团队也有时间消化。
渐进式引入的另一个好处是,你能在早期发现这套方案跟你们团队习惯的冲突点。比如有的团队习惯先写代码后补测试,那 SDD 的“先规范后实现”就需要时间适应。早点发现冲突,早点调整,比全面铺开后推倒重来强。
6.2 规范的版本管理
规范是要演进的,需求变了规范就得改。我建议规范文件跟代码一起进版本控制,每次规范变更都有 commit 记录,这样能追溯“为什么这个功能变成现在这样”。
规范变更的流程也要定清楚。我的做法是:规范变更需要走跟代码变更一样的评审,评审通过后才能改。改完规范后,对应的测试要重新生成或更新,然后重新跑一遍验证。这个流程看起来繁琐,但它保证了规范和实现始终同步,不会出现规范说的是一套、代码做的是另一套的情况。
还有个细节是规范的废弃处理。功能下线了,规范不要直接删,标记为 deprecated 并注明废弃原因和替代规范。这样后来的人查历史的时候能看明白来龙去脉,不会一脸懵。
6.3 度量与持续优化
这套方案要持续优化,得有度量。我一般跟踪四个指标:一次通过率、平均返工次数、规范覆盖率、Harness 拦截次数。
一次通过率反映规范和提示词的质量,低于六成说明规范写得太粗或者提示词有问题。平均返工次数反映流程的顺畅度,高于两次说明某个环节有瓶颈。规范覆盖率反映 SDD 的落地程度,低于八成说明还有大量需求没走规范。Harness 拦截次数反映约束的有效性,如果长期为零,要么是 AI 太乖,要么是约束没生效,得查一下。
这些指标不用搞得很复杂,每周花十分钟统计一下,趋势比绝对值更重要。看到某个指标恶化就针对性排查,比盲目优化有效得多。
6.4 团队协作里的角色变化
引入这套方案后,团队角色会发生一些变化。原来写代码的人,一部分精力要转到写规范上;原来做测试的人,一部分精力要转到维护 Harness 和验证器上;原来做架构的人,要负责设计规范的结构和 Harness 的模块划分。
这个变化不是坏事,它让每个人的产出更结构化、更可复用。写规范的人产出的是一份能被反复执行的合同,维护 Harness 的人产出的是能挡住事故的基础设施,这些都比一次性写完就扔的代码更有长期价值。
我在实际使用中发现,团队里最适应这套方案的反而是那些喜欢把需求想清楚再动手的人。他们本来就觉得“先想清楚再写”是理所当然的,SDD 只是把这个习惯形式化了。而那些习惯边写边想的人,需要一段时间适应,但适应之后普遍反馈“返工少了,心里踏实了”。
最后再分享一个小技巧:把规范当成给未来自己的信。你写规范的时候想象一下,三个月后的你完全不记得这个功能的背景,只能靠这份规范来理解。如果这份规范能让三个月后的你快速看懂并放心修改,那它就是合格的。这个标准比任何格式要求都管用。