乐于分享
好东西不私藏

AI代码能跑,为什么我反而不敢合?

AI代码能跑,为什么我反而不敢合?

1. 以前看到绿色通过,我会放心;现在不会

以前自己写代码,跑通之后我会下意识松一口气。

接口返回正常,页面能打开,测试环境没有报错,基本就说明这件事已经过了第一关。

但现在我用 AI 写代码,看到终端全绿,反而不会马上合并。

不是因为 AI 一定不靠谱。

而是因为它太容易给我一种 “已经完成了” 的感觉。

它会把代码写得很完整。

命名像样,结构整齐,测试也补了,甚至还能顺手把旁边看起来不太优雅的逻辑整理一下。

问题往往就藏在这个“顺手”里。

一个功能能跑起来,不等于它已经能交付。

我现在会先把它拆成四件事看:

● 能跑

● 能测

● 能查

● 能回滚

这四件事,不是一回事。

---

2. 能跑,只是当前路径没失败

“能跑”解决的是最表层的问题:

这段代码在当前输入、当前数据、当前环境下,没有立刻报错。

这当然重要。

但它只是最低门槛。

很多 AI 代码最容易过的,就是这条路径。

比如:

● 正常参数能返回

● 页面能展示

● 接口状态码是 200

● happy path 测试能通过

● 本地环境没有明显报错

这些都只能说明一件事:

当前演示路径是通的。

但真实项目里,真正容易出事的往往不是演示路径。

而是:

● 空值

● 重复请求

● 老数据

● 权限边界

● 外部服务超时

● 历史兼容逻辑

● 旧版本调用方

这些东西,AI 不一定知道。

就算知道,它也不一定知道哪些地方不能“优化”。

---

3. AI最容易制造的是 Demo 幻觉

我现在把这种感觉叫做:

Demo 幻觉。

它不是代码完全不能用。

而是代码在最顺的那条路径上表现得太完整,让人误以为已经可以交付。

这和普通 bug 还不一样。

普通 bug 通常会报错,会失败,会让你知道哪里不对。

Demo 幻觉更麻烦。

它表面上是成功的。

页面能打开,接口有返回,测试也绿。

但它可能只是刚好覆盖了最理想的路径。

这时候最危险的不是 “AI 没写好”。

而是 我自己降低了警惕。

以前我手写代码,虽然慢,但我知道自己碰过哪里。

AI 一次性改多个文件时,我最先失去的是影响面感知。

● 它到底改了哪些旧逻辑?

● 哪些地方是为了当前需求必须改?

● 哪些地方只是它觉得可以顺手整理?

如果这个问题没看清楚,代码越快跑通,我反而越不放心。

---

4. 一个脱敏后的开发场景

举一个脱敏后的场景。

有次是一个订单列表接口要补字段。

前端列表页需要多展示一个 「配送状态」 字段,后端根据已有字段返回:

● 待发货

● 配送中

● 已签收

● 异常

这类需求看起来不复杂。

AI 很快给了一版实现。

本地跑通。

接口返回正常。

测试也补了。

第一眼看,代码甚至挺干净。

但我看 diff 的时候发现,它改了一个旧判断。

原来的逻辑大概是:

2021 年之前的老订单,配送状态可能为空。

这种情况不做强校验,继续按老规则返回空状态。

这段逻辑看起来确实不优雅。

但它是为了兼容历史数据留着的。

AI 不知道这个背景。

它把这个判断改成了更“合理”的错误分支:

配送状态为空,直接返回异常。

对新订单来说,这样写完全说得通。

对历史订单来说,这就是一次潜在事故。

更关键的是,它补的测试也通过了。

因为测试只覆盖了新订单。

2021 年之前那批历史数据,根本没进测试用例。

所以这次真正的问题不是“AI 代码跑不起来”。

恰恰相反,它跑得很顺。

问题是:

● 它把新路径写通了。

● 但把历史兼容路径改坏了。

这就是我现在不敢只看“能不能跑”的原因。

---

5. 能测,不是看有没有测试,而是看测了什么

AI 现在很会补测试。

但我不会因为它补了测试,就直接放心。

我会先看测试在证明什么。

有些测试只是证明:

AI 刚刚写的那条正常路径能跑。

这不够。

尤其是 AI 自己写代码、自己补测试的时候,很容易出现一种情况:

它测试的是它自己的假设。

它认为某个字段不能为空,于是测试里也只放了不为空的数据。

它认为某个状态只会有三种,于是测试里也只测这三种。

它认为异常时返回 error 就行,于是测试也只断言有 error。

这类测试看起来很完整,但实际没有碰到业务真正危险的地方。

所以我现在看 AI 生成的测试,重点不是数量。

而是三个问题:

● 有没有测旧逻辑?

● 有没有测异常路径?

● 有没有测业务边界?

如果没有,绿色通过只能证明它会写一个看起来像测试的测试。

不能证明这段代码真的安全。

---

6. 能查,是上线后能不能定位问题

很多代码在本地都能跑。

但线上出问题时,最怕的是查不到。

AI 写代码有时候会把功能逻辑补齐,但日志非常弱。

比如:

● process failed

● request error

● invalid data

这种日志在本地调试时还能凑合。

但一旦到了线上,几乎没法定位。

到底是哪类数据失败?

哪个关键字段为空?

哪个外部接口超时?

是新逻辑导致,还是老数据触发?

如果日志里没有关键上下文,线上排查就只能靠猜。

所以我现在会把 “能不能查” 提前看。

不是等出问题了再补日志。

而是在合并前就看:

这个功能失败时,我能不能知道它为什么失败?

能跑,是开发阶段的反馈。

能查,是生产环境里的自救能力。

这两件事必须分开。

---

7. 能回滚,是失败后有没有退路

还有一件事很容易被忽略:

回滚。

小改动还好。

如果 AI 只改了一个局部判断,回滚成本不高。

但如果它一次性动了:

● 配置

● 依赖

● 数据结构

● 公共方法

● 权限判断

● 多个调用方

那上线前就不能只问“现在能不能跑”。

还要问:

如果这次失败,我怎么撤回来?

有些改动回滚很简单。

有些改动一旦上线,就会影响数据、缓存、索引、下游调用方。

AI 不会天然帮我承担这个判断。

它可以生成代码。

但它不知道这次上线失败后,我是不是凌晨要起来处理事故。

所以我现在看 AI 代码,越是改动范围大,越会先看回滚路径。

这是工程习惯。

---

8. AI不是不能写生产代码,关键是要有边界

我不想把这件事讲成“AI 写代码很危险”。

AI 当然可以写生产代码。

我现在也会让 AI 写接口、补测试、改重复逻辑、生成草稿实现。

但我不会把所有代码都一上来交给 AI 放开改。

有几类代码,我会非常谨慎:

● 权限判断

● 支付流程

● 数据迁移

● 核心交易链路

● 历史兼容逻辑

● 影响多个服务的公共方法

● 没有测试覆盖的老代码

这些地方不是完全不能用 AI。

但不能让 AI 直接“帮我优化一下”。

更稳的方式是:

● 先让它读代码、解释逻辑、列风险点。

● 再让它给修改方案。

● 最后由人决定改不改、怎么改、改到什么范围。

AI 写出来的代码,也要过 diff。

也要过测试。

也要看异常路径。

也要看日志。

也要看影响面。

也要看回滚。

甚至因为它生成得更快、改动得更集中,我反而更需要先看影响面。

以前我自己一行行写,脑子里有修改过程。

现在 AI 一次性给出结果,我就必须用检查顺序把这个过程补回来。

问题在使用方式。

---

9. 结尾

AI 代码能跑,我现在不会马上高兴。

我会先停一下。

因为 “能跑”只是第一层信号。

真正让我放心的,不是终端里那一片绿色。

而是我能回答下面几个问题:

● 它跑通的是哪条路径?

● 它有没有测到旧逻辑和异常分支?

● 线上出问题时,我能不能查到原因?

● 这次改动失败后,我能不能退回来?

● 它有没有碰到不该碰的业务边界?

如果这些问题回答不上来,本地跑通也只能算第一步。

能跑,是 AI 给我的第一版结果。

能不能交付,还是程序员最后要接住的判断。

你现在用 AI 写代码时,会把“本地能跑”当作完成标准吗?

如果你也遇到过 AI 代码跑通了,但不敢马上合并的时刻,欢迎在评论区聊聊:

你上线前最先看哪一步?

来源备注

无外部资料引用。

本文基于个人工程经验与脱敏开发场景整理,不做行业数据判断。

相关学习资料