无情地面试我关于这个计划的每个方面,直到我们达成共同理解。遍历设计树的每个分支,逐一解决决策之间的依赖关系。对于每个问题,提供你推荐的答案。
一次问一个问题,在继续之前等待每个问题的反馈。
如果可以通过探索代码库来回答问题,则探索代码库。
领域意识
在代码库探索期间,还要查找现有文档:
文件结构
大多数仓库只有一个上下文:
/
├── CONTEXT.md
├── docs/
│ └── adr/
│ ├── 0001-event-sourced-orders.md
│ └── 0002-postgres-for-write-model.md
└── src/
如果根目录存在 CONTEXT-MAP.md,则该仓库有多个上下文。映射指向每个上下文的所在位置:
/
├── CONTEXT-MAP.md
├── docs/
│ └── adr/ ← 系统级决策
├── src/
│ ├── ordering/
│ │ ├── CONTEXT.md
│ │ └── docs/adr/ ← 特定于上下文的决策
│ └── billing/
│ ├── CONTEXT.md
│ └── docs/adr/
惰性创建文件——仅当你有内容要写时才创建。如果不存在 CONTEXT.md,则在解析第一个术语时创建一个。如果不存在 docs/adr/,则在需要第一个 ADR 时创建它。
在会话期间
根据词汇表挑战
当用户使用与 CONTEXT.md 中现有语言冲突的术语时,立即指出。"你的词汇表将'取消'定义为 X,但你似乎指的是 Y——到底是哪个?"
精炼模糊语言
当用户使用模糊或重载的术语时,提出精确的标准术语。"你说的是'账户'——你指的是客户还是用户?这些是不同的东西。"
讨论具体场景
当讨论领域关系时,用特定场景进行压力测试。发明探测边缘情况的场景,迫使用户对概念之间的边界保持精确。
与代码交叉引用
当用户陈述某物的工作方式时,检查代码是否一致。如果发现矛盾,将其暴露出来:"你的代码取消整个订单,但你刚才说部分取消是可能的——哪个是正确的?"
内联更新 CONTEXT.md
当术语被解析时,立即更新 CONTEXT.md。不要批量处理——在它们发生时捕获它们。使用 CONTEXT-FORMAT.md 中的格式。
CONTEXT.md 应该完全没有实现细节。不要将 CONTEXT.md 视为规范、草稿板或实现决策的存储库。它只是词汇表。
谨慎提供 ADR
仅当以下三个条件都为真时才提供创建 ADR:
- 难以逆转——稍后改变主意的成本是有意义的
- 没有上下文时令人惊讶——未来的读者会想知道"他们为什么这样做?"
- 真正权衡的结果——存在真正的替代方案,你出于特定原因选择了一个
如果三个条件中任何一个缺失,跳过 ADR。使用 ADR-FORMAT.md 中的格式。