Development
怀疑驱动开发
对每一个非平凡决策进行全新视角的对抗性审查后再确定。当正确性比速度更重要时使用。
自信的回答并不等于正确的回答。怀疑驱动开发引入一个全新视角的审查者,在任何非平凡产出被采纳之前,倾向于质疑和反驳。
何时使用
当满足以下任一条件时,该决策属于非平凡决策:
- 引入或修改了分支逻辑
- 跨越了模块或服务边界
- 断言了类型系统无法验证的属性
- 其正确性依赖于未来读者无法看到的上下文
- 其影响范围不可逆(生产部署、数据迁移、公共 API)
流程
怀疑循环:
- [ ] 第 1 步:声明 — 写下决策声明及其重要性
- [ ] 第 2 步:提取 — 隔离产出物和契约,剥离推理过程
- [ ] 第 3 步:怀疑 — 用对抗性提示调用全新视角审查者
- [ ] 第 4 步:调和 — 将每条发现与产出物文本进行分类对照
- [ ] 第 5 步:停止 — 满足停止条件
第 1 步:声明
用两三行描述决策:
声明:"新的缓存层在规格说明中描述的读密集型负载下是线程安全的。"
重要性:此处的竞态条件会损坏用户数据,且在 QA 中难以发现。
第 2 步:提取
全新视角的审查者需要产出物和契约,而不是推导过程。
- 代码:diff 或函数本身 — 不是整个文件
- 决策:3-5 句描述的提案加上约束条件
- 断言:声明加上证据
剥离你的推理过程。如果你直接给出结论,审查者只会验证你的结论。
第 3 步:怀疑
审查者的提示必须是对抗性的:
对抗性审查。找出这个产出物的问题。
假设作者过于自信。寻找:
- 未声明的假设
- 未处理的边界情况
- 隐含的耦合或共享状态
- 可能违反契约的方式
- 可能破坏的现有约定
- 在意外输入下的故障模式
不要验证。不要总结。找出问题,或者明确说明在彻底检查后未发现任何问题。
产出物:<粘贴产出物>
契约:<粘贴契约>
只传递产出物和契约。不要传递声明。 将结论交给审查者会使其偏向于同意。
第 4 步:调和
对每条发现,按以下优先级分类:
- 契约误读 — 审查者因契约不明确而标记。先修正契约。
- 有效且可操作 — 需要修改的真实问题。修改后重新循环。
- 有效的权衡 — 问题确实存在,但修复成本超过接受成本。明确记录。
- 噪音 — 审查者在缺乏上下文的情况下标记了实际正确的内容。
第 5 步:停止
在以下情况下停止:
- 下一次迭代仅返回微不足道或已考虑过的发现,或
- 完成 3 个循环(升级给用户),或
- 用户明确说"发布"
验证清单
应用怀疑驱动开发后:
- 每个非平凡决策都已明确命名为声明
- 每个非平凡产出物至少经过一次全新视角审查
- 审查者收到的是产出物和契约 — 而非声明
- 审查者的提示是对抗性的("找出问题")
- 发现已与产出物文本进行分类对照
- 满足停止条件(微不足道的发现、3 个循环或用户覆盖)
- 在交互模式下,明确提供了跨模型审查选项