很多开发者用ChatGPT、Codex修Bug时,最开心的时刻通常是:

问题复现不了。

测试通过了。

AI也告诉你:

“已修复。”

看起来任务结束。

但真实项目里,一个更麻烦的问题经常出现在后面:

这个Bug确实没了。

可另外一个地方开始异常。

最让人头疼的是:

新问题和刚才那个修复,看起来完全没有关系。

于是你会怀疑:

“是不是AI又改坏了别的地方?”

很多时候,答案是:

有可能。

不是因为AI乱写代码。

而是因为软件系统里真正危险的,不只是“这个Bug有没有修好”。

而是:

为了修这个Bug,系统里原来哪些隐含关系被一起改变了。

这就是AI Coding里一个很典型的问题:

Local Fix(局部修复)成功,不代表 System Impact(系统影响)安全。


一、真实场景:登录Bug修好了,订单接口却开始异常

假设你让Codex修一个问题:

“用户登录后,偶尔会丢失Session。”

AI开始分析。

最后定位到:

Session刷新时机不稳定。

于是它修改:

Token刷新逻辑。

Session更新顺序。

异常处理。

补充测试。

测试全部通过。

登录问题也消失。

看起来很完美。

但上线后,你发现:

某些用户在下单时偶尔被判断为未登录。

你开始调查。

最后发现:

订单模块一直依赖一个旧行为:

Session更新之前,旧Token还会保留一个很短的窗口。

而AI为了彻底修复登录问题,把这个行为“修正”了。

于是:

登录更稳定了。

订单流程反而被影响。

这就是最典型的情况:

AI修对了当前Bug,却改变了其他模块长期依赖的旧行为。


二、为什么会发生?因为真实项目依赖的不只是“正确代码”

软件系统里有很多关系,不会明确写成:

“这个地方依赖那个地方。”

有些依赖是显性的:

函数调用。

接口依赖。

数据库关系。

这些AI比较容易发现。

但还有一类依赖更麻烦:

隐式行为依赖。

比如:

某个接口虽然文档说返回A,但历史上一直也允许B。

某段异常处理看起来多余,但下游服务已经依赖这个行为。

某个字段理论上可以为空,但老系统默认它永远有值。

这些东西可能:

没写进文档。

没写进测试。

甚至代码里也没有明显说明。

但系统已经围绕这些行为运行很多年。

AI看到的是:

“这里有问题,可以修得更规范。”

真实工程里却可能是:

“这里虽然不漂亮,但其他地方已经依赖它了。”


三、工程机制:Bug修复真正扩大的是 Regression Surface

可以把一次Bug修复看成两个东西。

第一:

Fix Scope

你真正想修的范围。

比如:

Session丢失。

第二:

Regression Surface

这次修改可能影响的其他行为范围。

很多AI任务的问题就在这里:

Fix Scope很小。

Regression Surface却可能很大。

例如你只想修一个状态判断。

但这个状态被:

登录。

订单。

支付。

消息推送。

权限系统。

共同使用。

那一次小改动,回归面就已经扩散到多个业务路径。

所以真正需要关注的不是:

“AI改了几行。”

而是:

这几行代码位于多少条业务链路的交叉点。


四、为什么AI比人更容易触发这种问题?

不是因为AI一定更差。

而是AI有两个特点。

第一:

它很擅长局部优化。

看到不一致。

它会想统一。

看到重复逻辑。

它会想抽象。

看到异常分支。

它会想简化。

这些操作单独看都合理。

但真实项目里:

局部更合理,不一定代表系统更安全。

第二:

AI执行速度快。

人自己修Bug时,可能只敢改一个地方。

AI很容易顺手完成:

逻辑调整。

测试补充。

结构整理。

相关模块优化。

结果是:

修复范围很快扩大。


五、为什么测试通过,也可能还是产生新Bug?

因为测试只能覆盖:

你已经想到要测试的行为。

但回归Bug经常发生在:

你没有意识到存在依赖的地方。

例如:

登录测试全部通过。

订单测试也通过。

但“用户刚刷新Session以后立刻下单”这个组合场景没人测。

问题就藏在这里。

所以:

Test Coverage ≠ Regression Coverage

测试覆盖率高,不代表所有行为关系都被覆盖。

尤其复杂系统里,很多Bug来自:

模块之间的组合行为。

不是单个模块内部。


六、为什么未来这个问题会越来越明显?

因为Agent一次修改的范围会越来越大。

以前AI主要:

改一个函数。

现在:

改多个文件。

以后:

可能直接完成一个Feature。

甚至自主完成跨模块任务。

这意味着:

一次任务带来的潜在回归面也越来越大。

而且Agent越自主,人越少看到中间过程。

所以未来AI Coding的风险会从:

“这行代码写错了吗?”

逐渐变成:

“这次变化有没有打破系统原来隐藏的平衡?”

这就是更难的工程问题。


七、自测指标:回归半径

这里可以建立一个指标:

回归半径

意思是:

一次AI修改,可能影响多少原本不属于当前任务的行为。

可以看四个信号。

第一,修改的代码被多少模块调用?

调用越多,回归半径越大。

第二,修改是否位于公共层?

比如:

认证。

权限。

数据库公共层。

工具库。

公共组件。

这些地方回归风险通常高。

第三,是否改变了历史行为?

哪怕新行为更合理,只要旧行为长期存在,就值得警惕。

第四,AI是否修改了当前Bug以外的逻辑?

如果有,回归半径明显扩大。


八、怎么降低AI修Bug带来的回归风险?

第一:要求最小修复,而不是顺手优化

告诉AI:

只修当前Bug。

不要重构。

不要统一无关逻辑。

不要修改公共行为。

这能明显缩小Regression Surface。


第二:让AI列出“行为变化清单”

不要只问:

改了哪些文件。

要问:

这次修改改变了哪些可观察行为?

例如:

Token刷新时机改变。

异常返回方式改变。

缓存失效顺序改变。

这比文件Diff更重要。


第三:专门找受影响调用方

让AI回答:

哪些模块依赖这段逻辑?

哪些业务路径可能受影响?

哪些地方需要补回归测试?

这一步是在主动扩大你的风险视野。


第四:优先增加回归测试,而不是只验证当前Bug

除了:

“Bug不再复现。”

还要测:

旧行为。

边界场景。

上下游组合场景。

真正高价值的是:

证明这次修复没有破坏原来稳定的路径。


九、为什么回归风险高时,不应该先追求更强AI?

如果你现在的问题是:

AI修一个地方,经常影响另一个地方。

那第一反应不应该是:

“模型不够强。”

因为真正缺的是:

变更控制。

调用链分析。

回归测试。

任务边界。

更强AI如果改得更快、更广,反而可能放大这个问题。

所以应该先提升:

Regression Management。


十、什么时候Plus通常够用?

如果你的工作主要是:

局部Bug。

小范围功能修改。

独立模块。

依赖关系简单。

AI的修改容易验证。

那么:

Plus通常已经够用。

因为你的回归半径本身不大。


十一、什么时候Pro才真正匹配?

更接近Pro的状态是:

你已经有比较成熟的回归控制流程。

能够:

分析调用链。

限制修改范围。

补回归测试。

检查行为变化。

定位高风险公共模块。

在这个基础上,你仍然持续需要:

大型Repository。

复杂跨模块Bug。

长时间Agent执行。

多个复杂任务并行。

这时候更高AI能力才更容易真正转化成效率。

判断逻辑不是:

“Bug越来越复杂,所以我要Pro。”

而是:

“我已经能够控制复杂修改的回归风险,现在AI侧能力才开始成为瓶颈。”


最后:真正危险的Bug,不一定是AI没修好,而是它修得太“正确”

AI修Bug最容易让人放心的一刻,是:

当前问题消失了。

但工程里真正难的是:

修复一个问题,同时不破坏其他已经稳定运行的东西。

这也是为什么未来AI Coding里,开发者真正需要关注的,不只是:

Fix成功率。

还包括:

Regression Surface。

因为很多系统事故都不是来自:

“这个Bug还在。”

而是来自:

“这个Bug修好了,但系统其他地方的旧平衡被一起改掉了。”

如果你的项目简单、回归半径低:

Plus通常够用。

如果你已经有成熟回归控制体系,而复杂跨模块Agent任务不断增加:

Pro才真正开始匹配。

未来真正成熟的AI修复,不是:

“Bug没了。”

而是:

Bug没了,系统其他地方也仍然像原来一样稳定。

持续更新Codex、大模型开发相关技术内容。
长期使用各类代码大模型,整理了稳定的AI会员订阅渠道,有需要可自取!

Logo

AtomGit AI 社区提供模型库、数据集、Agent、Token等资源

更多推荐