图 05 · 原型边界
如何在不直接上线原型代码的情况下保留原型的决策?
双轨桥梁图:左侧是原型轨(可扔掉的代码,用来回答设计问题),右侧是生产轨(从决策开始,重新构建)。两轨在决策点相遇,原型代码被丢弃,只有决策被保留。
什么时候值得做原型?
- 存在一个具体的设计问题,可运行的实验比讨论更便宜
- 有两个以上的选项,性能或 DX 差异需要实测才能判断
- 原型结果可以转化为一个 ADR(架构决策记录)
不适合做原型的情况:如果问题可以通过 /research(文档查阅)回答,原型浪费时间。
原型代码为什么要丢弃?
原型优化速度而非质量:没有测试、没有错误处理、耦合严重。把原型代码硬推进生产轨会积累技术债。决策点的作用是提取观察到的「事实」,丢弃实现的「捷径」。
实例:EventEmitter vs 直接回调
原型轨内容
用 Vitest bench 在 1k/10k/100k 实体规模下运行两种实现,测量每次 activate() 的平均耗时和 GC 压力。测试文件约 120 行,不含任何错误处理。
决策点提取的 ADR
ADR-003: 使用直接回调而非 EventEmitter
理由:在 10k 实体下快 2.3×,且测试中不需要 mock EventEmitter。代价:需要自己管理取消注册。
线性阅读顺序:识别一个具体的设计问题(哪种实现更好)→ {prototype} 构建可扔掉的实验 → 观察结果(基准测试、DX 测试)→ 决策点:提取 ADR,丢弃原型代码 → 生产轨从 /grill-with-docs 更新 CONTEXT.md 开始 → /to-spec 在决策约束下重写 → /to-tickets → /implement → {tdd} → {code-review}。