THINKING / 思考

AI 写代码之后,谁来判断哪里不能错

讨论代码实现中隐藏的取舍,以及人类审查为什么仍涉及目标、风险和责任。标题不再暗示已有事故统计,文章聚焦在怎样定义并判断不能出错的部分。

文章目录

问题从来不是 AI 会不会写代码, 而是:哪些东西一旦写成代码,就已经在“替人类做决定”。


一、一个看似合理、但其实危险的直觉

最近常能听到一种判断:

既然大语言模型已经能写代码了, 那为什么还要人类审查实现细节? 能不能让 AI 直接生成最终程序,人类只看结果, 甚至连结果验证都交给 AI?

这个想法在逻辑上并不荒谬,甚至在某些封闭领域已经成立。 但一旦放进真实的软件工程环境,问题会立刻暴露。

核心原因只有一句话:

世界本身是不可完全验证的。


二、代码并不是“需求的翻译”,而是“妥协的冻结形态”

很多人下意识认为:

代码 = 把需求写出来

这是一个极其危险的误解。

更接近现实的描述是:

代码,是在某一个时间点,对一组互相冲突的目标所做出的、暂时稳定的选择集合。

这些冲突包括但不限于:

  • 正确性 vs 性能

  • 长期可维护性 vs 交付速度

  • 安全性 vs 易用性

  • 架构纯度 vs 现实历史包袱

这些目标不可能同时最优,于是必须做选择。

当团队说出那句经典的话:

“先这样吧。”

妥协就被冻结进了代码里。

代码不是中立的技术产物,而是:

  • 决策

  • 风险分配

  • 责任边界

的凝固形态。


三、为什么“重构 ≠ 优化代码”,而是“重新解冻妥协”

很多团队把重构理解为:

把代码写得更优雅、更快、更清晰

但真正的重构,几乎总是在做另一件事:

把过去默认接受的选择,重新拿出来谈。

每一次真正的重构,都会重新触碰这些问题:

  • 这个字段为什么允许为空?

  • 这个错误当初为什么被吞掉?

  • 这个接口为什么这样设计?

  • 这个状态为什么是隐式的?

如果一次“重构”:

  • 没有争论

  • 没有重新定义边界

  • 没有重新评估风险

那它大概率只是整理,不是重构。


四、AI 写代码真正擅长的是什么?

一句话概括:

AI 非常擅长解决“怎么写”,但并不擅长决定“该不该这样写”。

AI 的优势前提是:

  • 目标明确

  • 语义稳定

  • 风险可回滚

  • 错误可被测试捕获

也就是说,它最适合处理的是实现不确定性。

但很多事故频发的团队,犯了同一个错误:

用 AI 压缩了本该由人类承担的“语义不确定性”。


五、AI 辅助率很高,但事故频发的真正原因

这些团队通常有非常相似的症状:

  • PR 合并很快,但线上回滚频繁

  • 代码看起来专业统一,但边界条件混乱

  • 测试很多,但事故总是“没测到那一类”

  • 没有人能完整讲清关键业务链路的判断逻辑

问题不在于 AI 写得不好,而在于:

妥协被自动冻结了,但没有被显性讨论。

AI 写出的代码“看起来合理”, 人类就默认接受了其中隐含的选择。

事故发生后才发现:

“我们从来没有明确决定过要这样。”

但代码已经替你决定完了。


六、一个关键判断框架:AI 可替代性 × 事故半径

要正确使用 AI,必须引入一个工程视角的坐标系:

横轴:事故半径(错了会影响多大) 纵轴:AI 可替代性(语义是否稳定、可形式化)

四个区域的结论非常明确:

  • 高替代 × 低事故: UI 样板、DTO、算法、工具函数 👉 AI 写得越多越好

  • 高替代 × 高事故: 登录态流转、权限判断、支付前置校验 👉 AI 可写,但必须被严格围栏

  • 低替代 × 低事故: 页面交互、弱业务逻辑 👉 人类主导,但风险可控

  • 低替代 × 高事故(绝对禁区): 金融结算、权限最终裁决、合规逻辑 👉 任何黑盒化,都是在埋雷

一句话总结:

凡是出事后需要人出来解释甚至道歉的地方, 就不能是黑盒。


七、为什么金融 / 支付系统极度执着于“可读性”

很多工程师不理解:

为什么金融系统代码又慢又啰嗦?

原因很简单:

它们运行在一个“不可逆世界”里。

  • 性能慢,可以优化

  • 逻辑错,可能是法律和信任灾难

所以这些系统优先保证的不是极致性能,而是:

任何一个行为,在事后都能被清楚解释。

在这里,代码首先是证据,其次才是程序。


八、真正低事故率、高 AI 使用率的团队是怎么做的?

这些团队不是少用 AI,而是分清责任。

人类只负责三件事:

  1. 不变量:什么永远不能发生

  2. 冻结点:哪些决定一旦做出不可回退

  3. 事故半径:错了影响谁、如何止血

AI 负责:

  • 实现

  • 补测试

  • 枚举边界

  • 提出方案

但 AI 永远没有“冻结权”。

PR 审查不再问:

“代码写得好不好?”

而是问:

“这里冻结了什么?” “事故半径多大?” “有没有跨越不可黑盒的边界?”


九、一句不太讨好,但非常现实的结论

代码是一种社会技术,不只是计算技术。

只要软件还面向人类、运行在开放世界中, 就一定需要:

  • 可读

  • 可解释

  • 可介入

AI 会极大提高实现效率, 但它永远不该替人类承担拍板与负责的角色。


最后一行送给工程团队

AI 负责“怎么实现”, 人类负责“哪里不能错”。

如果这条边界守不住, 事故只是时间问题。