1️⃣ 一个残酷事实:绝大多数系统不是死于事故,而是死于日常
我们总喜欢复盘事故:
- 双 11 扛不住
- 大促雪崩
- Redis 打满
- 数据库锁死
但如果你认真看一家公司 3~5 年的系统历史,会发现一个更残酷的事实:
真正让系统变得不可维护的,不是某一次事故,而是无数次“没出事的妥协”。
一次没出事,没人重构
一次没出事,没人补设计
一次没出事,没人删代码
系统就是这样开始“腐烂”的。
2️⃣ 腐烂的第一阶段:系统开始“容忍不一致”
最初只是:
- 字段含义不统一
- 状态含义模糊
- 某些接口返回“差不多对”
- 某些异常“先 catch 掉”
于是你会听到这些话:
“这个状态其实有点歧义,但现在先这样吧”
“这个字段老系统就这么用的”
“这个逻辑没人敢动”
这不是 bug。
这是系统免疫系统失效的开始。
3️⃣ 腐烂的第二阶段:系统开始“依赖隐式规则”
慢慢地,系统中出现了:
- “这个接口只能在某个顺序下调用”
- “这个字段只有在某种组合下才有意义”
- “这个 MQ 不能重放”
- “这个任务只能凌晨跑”
但这些规则:
- 没写在代码里
- 没写在文档里
- 只存在于老员工脑子里
于是系统变成:
不是你不会写代码,而是你不知道“哪些代码不能动”。
4️⃣ 腐烂的第三阶段:系统开始“抗拒变化”
这时候会出现经典症状:
- 新需求越来越慢
- 改一个地方,线上出三个问题
- 回滚成本极高
- 测试覆盖率形同虚设
- 新人 3 个月不敢独立改代码
系统开始进入一种危险状态:
不是不能跑,而是不能改。
而“不能改的系统”,本质上已经死了。
5️⃣ 最致命的一点:腐烂是“无感知的”
最恐怖的是:
- 没人报警
- 没有监控能告诉你“系统正在变烂”
- KPI 依然完成
- 用户还能用
直到某一天:
- 你想拆一个模块
- 你想做一次架构升级
- 你想引入新业务模型
然后发现:
系统的结构已经不支持任何理性的演进。
6️⃣ 真正成熟的团队,做的不是“防事故”,而是“防腐烂”
顶级团队关心的不是:
- QPS 能不能扛
- CPU 会不会满
而是:
- 语义是否清晰
- 边界是否稳定
- 状态是否可解释
- 历史行为是否可追溯
- 旧逻辑是否在悄悄运行
他们做的是:
- 删代码
- 删状态
- 删字段
- 删分支
- 删隐式规则
因为他们知道:
系统的最大敌人,从来不是压力,而是复杂度的失控。