几乎每一次真正难解的线上问题,都会走到一个相同的死胡同:
“这块逻辑一直都是这么跑的。”
这句话一旦出现,排查就会变得异常艰难。
因为它意味着一件事:
问题已经不在“哪里写错了”,
而在“哪些东西我们从来没怀疑过”。
一、一个真实到令人不安的场景
你在排查一个偶发问题:
- 请求链路完整
- 日志没有明显异常
- 数据也看起来合理
- 复现概率极低
于是大家开始说:
- “这个模块很老了,很稳定”
- “这里是核心逻辑,应该没问题”
- “是不是下游抖了一下”
你发现所有人都在绕开某些区域。
不是因为它们没问题,
而是因为:
它们“看起来”太理所当然了。
二、工程里最危险的不是未知,而是“未被质疑的已知”
我们通常害怕:
- 新模块
- 新代码
- 新人写的逻辑
但真正制造事故的,往往是:
- 运行了三年的代码
- 没人敢删的判断
- 没人记得为什么存在的字段
- “当初为了兜底”加的补偿逻辑
这些代码有一个共同点:
它们早已从“实现”变成了“信仰”。
三、为什么“默认正确”的东西最容易出问题?
因为它们具备三个特征:
1️⃣ 几乎没有监控
老逻辑通常只关心结果:
- 成功了就算
- 失败了重试
但没人长期关注:
- 触发频率是否异常
- 是否正在“勉强成功”
- 是否在偷偷制造副作用
2️⃣ 没有明确的失败语义
很多老代码的失败方式是:
- catch 掉异常
- 返回默认值
- 继续往下走
这让系统看起来“很稳”,
但实际上:
失败信号被彻底吞掉了。
3️⃣ 它们影响范围巨大,但边界模糊
一段老逻辑往往:
- 改状态
- 发消息
- 写缓存
- 触发异步
但这些副作用分散在系统各处,
导致你很难判断:
“如果我动它,会发生什么?”
于是大家选择:
不动。
四、真正的技术债,不是“代码写得烂”
而是:
你已经无法明确说出:
这段逻辑存在的理由,
以及它今天是否仍然必要。
当一个系统中:
- 存在大量“没人敢删”的代码
- 存在大量“应该没问题”的模块
那么系统的稳定性,其实是在靠运气维持。
五、成熟团队会刻意做一件“很危险”的事
他们会定期问一个问题:
“如果今天我们把这块逻辑删掉,会发生什么?”
不是为了真的删除,
而是为了:
- 重新理解它
- 验证它的价值
- 明确它的边界
- 决定它是否还值得存在
很多时候,真正的修复不是加代码,
而是确认哪些代码已经不该存在。
六、一个非常实用的判断标准
如果一段逻辑:
- 你不清楚它的触发条件
- 你不确定它的副作用
- 你无法写出“什么时候不该执行它”
那么它已经不是“稳定代码”,
而是潜伏风险。