Seam Engineering
Effort: free — 纯修复纪律:在共享原语上做一次类级修复,替掉 N 个点状补丁。消除:同一个 bug 在每个兄弟位置再修一遍,以及被缓办的中级发现——半年后没人找得到的那个谜之 bug。
一条接缝要么被正确且完整地闭合,要么就没有闭合。 今天的快速补丁,就是六个月后谁也找不着的那个 bug。 这个技能把一份 bug 报告变成一整类被关闭的 bug。
什么时候跑
任何修理:一个上报的 bug、一条失败的测试、一次审计或 bug 大扫除的发现清单。尤其是当你感到那股"就在这儿打个补丁吧"的引力时。
步骤
- 带证据的根因。 修原因,不修症状。写修复之前先亮出证明:一个失败的复现、一行日志、一条指向真正接缝的追踪。没有证据的修复是猜测。
- 给缺陷类起名。 问:这是哪一族错误?同样的错误还可能住在哪儿?用一句话把这个类写下来。
- 纵向修——一次,修在共享原语上。 共享原语是每一例都会流经的那一个函数或模块。修在那里。绝不打 N 个点补丁。绝不"标记坏例然后补偿"。
- 横向扫。 搜出这一类的每个同类兄弟,在同一次改动里修掉,不许"回头再说"。
- 落一个结构性守卫。 一条会在这一类的下一例上失败的测试或自动检查。这个类保持关闭,是因为有东西盯着它,不是因为大家都记得。
- 闭合整条接缝。 列出这次大扫除浮出的每个发现。落地之前,每个发现要么已修复且变绿,要么带着一个明确的、有记录、有证据的"不是 bug"裁决。绝不无声延后。绝不"停在某个文档里"。
硬性规则
- 引入新失败条件的修理,本身就是 bug。 会崩的回滚辅助、会搁浅状态的清理、被改到反过来祝福自己本该抓住的缺陷的测试——全是 bug。把改动重新设计成一个原子单元,或一台显式的崩溃安全状态机。绝不糊弄过去。
- "高危的修了,其余算后续"直接判这个技能失败。 那正是这个技能要杀掉的习惯。被延后的中危 bug 就是未来的悬案 bug。接缝上的每个发现分量相同。
- "凑合能落地"不是一种状态。 接缝不对,就继续迭代——清掉阻碍、升级到更强的模型或评审者、重试——直到它对。
- 共享原语明明存在,却在旁边打点补丁,判这个技能失败。 已有原语拥有这条接缝时,修复就骑在它上面;绕开它的修复会把这个类重新养出来。
- **裁定"不是 bug"需要证据,**不是一次投票。记下查了什么、这个发现为何不成立。
搭配使用
- root-cause-first — 第 1 步背后的调查纪律。
- red-first — 证明修复的那条失败测试,以及第 5 步的结构性守卫模式。
- sniper-testing — 迭代时限定范围的测试;落地时一次全量。
- repair-loop — 这套纪律运行其中的端到端循环。
- incident-closure — "修一下"意味着完整闭环,绝不是选项菜单。