后端系统里,最难修的从来不是 Bug,而是“大家都默认正确的东西

39 阅读3分钟

几乎每一次真正难解的线上问题,都会走到一个相同的死胡同:

“这块逻辑一直都是这么跑的。”

这句话一旦出现,排查就会变得异常艰难。

因为它意味着一件事:

问题已经不在“哪里写错了”,
而在“哪些东西我们从来没怀疑过”。


一、一个真实到令人不安的场景

你在排查一个偶发问题:

  • 请求链路完整
  • 日志没有明显异常
  • 数据也看起来合理
  • 复现概率极低

于是大家开始说:

  • “这个模块很老了,很稳定”
  • “这里是核心逻辑,应该没问题”
  • “是不是下游抖了一下”

你发现所有人都在绕开某些区域

不是因为它们没问题,
而是因为:

它们“看起来”太理所当然了。


二、工程里最危险的不是未知,而是“未被质疑的已知”

我们通常害怕:

  • 新模块
  • 新代码
  • 新人写的逻辑

但真正制造事故的,往往是:

  • 运行了三年的代码
  • 没人敢删的判断
  • 没人记得为什么存在的字段
  • “当初为了兜底”加的补偿逻辑

这些代码有一个共同点:

它们早已从“实现”变成了“信仰”。


三、为什么“默认正确”的东西最容易出问题?

因为它们具备三个特征:

1️⃣ 几乎没有监控

老逻辑通常只关心结果:

  • 成功了就算
  • 失败了重试

但没人长期关注:

  • 触发频率是否异常
  • 是否正在“勉强成功”
  • 是否在偷偷制造副作用

2️⃣ 没有明确的失败语义

很多老代码的失败方式是:

  • catch 掉异常
  • 返回默认值
  • 继续往下走

这让系统看起来“很稳”,
但实际上:

失败信号被彻底吞掉了。


3️⃣ 它们影响范围巨大,但边界模糊

一段老逻辑往往:

  • 改状态
  • 发消息
  • 写缓存
  • 触发异步

但这些副作用分散在系统各处,
导致你很难判断:

“如果我动它,会发生什么?”

于是大家选择:
不动。


四、真正的技术债,不是“代码写得烂”

而是:

你已经无法明确说出:
这段逻辑存在的理由,
以及它今天是否仍然必要。

当一个系统中:

  • 存在大量“没人敢删”的代码
  • 存在大量“应该没问题”的模块

那么系统的稳定性,其实是在靠运气维持。


五、成熟团队会刻意做一件“很危险”的事

他们会定期问一个问题:

“如果今天我们把这块逻辑删掉,会发生什么?”

不是为了真的删除,
而是为了:

  • 重新理解它
  • 验证它的价值
  • 明确它的边界
  • 决定它是否还值得存在

很多时候,真正的修复不是加代码,
而是确认哪些代码已经不该存在


六、一个非常实用的判断标准

如果一段逻辑:

  • 你不清楚它的触发条件
  • 你不确定它的副作用
  • 你无法写出“什么时候不该执行它”

那么它已经不是“稳定代码”,
而是潜伏风险