ChatGPT、Codex实战:为什么AI修好了一个Bug,却可能悄悄制造另一个Bug?
很多开发者用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会员订阅渠道,有需要可自取!
更多推荐


所有评论(0)