为什么你的系统“看起来很干净”,但新人一进来就写错代码?

36 阅读2分钟

一、一个奇怪但真实的现象

很多团队都会遇到这种情况:

  • 老系统跑得很稳
  • 代码结构看起来也不算乱
  • 单元测试有一些
  • 接口文档也齐全

但新同事一上手,就必写 bug。

而且这些 bug 的特点是:

  • 不在语法
  • 不在 API 使用
  • 而是在“理解偏差”

这说明一个事实:

系统在“误导使用者”。


二、系统是“认知工具”,不是“代码集合”

我们往往低估了一个事实:

代码不仅是给机器执行的,也是给人理解的。

如果一个系统:

  • 接口语义模糊
  • 状态命名含糊
  • 行为边界不清
  • 副作用隐藏在调用内部

那么它会不断诱导开发者做错事。


三、三种最常见的“误导型设计”

1️⃣ “看起来能用,其实不该用”的方法

例如:

updateOrder(Order order)

看起来很正常,对吧?

但它可能:

  • 修改状态
  • 写日志
  • 发 MQ
  • 改库存
  • 触发补偿

新人会自然认为:

“那我在任何地方调用它就好了。”

然后线上就炸了。


2️⃣ “状态名正确,语义错误”

例如:

  • DONE
  • FINISHED
  • CLOSED
  • COMPLETED

它们在英文里都差不多。

但在业务里,它们可能意味着:

  • 可否退款
  • 可否修改
  • 是否可重试
  • 是否可回滚

名字骗了人。


3️⃣ “默认行为过多”

例如:

  • 不传参数就走默认逻辑
  • 默认开启某些副作用
  • 默认重试
  • 默认补偿

默认行为越多,系统越像一个“黑箱”。


四、为什么优秀系统“限制很多”,但反而更好用?

因为优秀系统遵循一个原则:

让错误变得困难,而不是让正确变得依赖经验。

它们会:

  • 强制调用顺序
  • 强制状态检查
  • 强制显式参数
  • 强制声明意图

这在短期内会被抱怨“麻烦”,
但长期来看:

bug 会急剧减少。


五、真正成熟的系统,都会“教育使用者”

你会发现:

  • API 自解释
  • 错误信息明确
  • 非法调用立刻失败
  • 不给“将就用”的机会

这种系统在“逼人写正确的代码”。


六、一个很多人从未认真想过的问题

如果一个系统必须依赖“老员工经验”才能正确使用,
那它本身就是有缺陷的。