简介:AI编程常陷入“越改越错”的死循环。本文剖析了其核心原因:开发者常以报错等“症状级”信息反馈,导致AI在错误架构上缝补。通过解析异步I/O与测试盲区案例,提出人机协作新模式:开发者主导架构设计与验证,AI负责实现,从而突破闭环盲区。
在日常的开发实践中,利用大语言模型辅助编程已成为许多开发团队的常态。然而,不少开发者会遇到一个令人沮丧的现象:当AI生成的代码出现问题时,无论我们如何将报错信息反复喂给它,AI往往陷入“越改越错”的死循环。这并非AI的代码生成能力不足,而是由于我们在人机协作中提供了错误的信息层级,导致AI在错误的架构基础上进行无意义的缝补。
让我们从一个典型的异步编程案例切入。假设我们需要从零构建一个底层网络请求模块,AI成功生成了约两千行C代码,能够顺利编译且通过了初步的单元测试。但在性能基准测试中,开发者发现了一个致命问题:使用Promise并发发起三个预期耗时300毫秒的网络请求,理论总耗时应在300毫秒左右,但实际测量值却高达905毫秒。显然,请求被完全串行化了。
当开发者将“并发请求变为串行,耗时905ms”的报错现象和日志贴给AI后,修复过程陷入了泥潭:
这种“越改越错”的现象根源在于,开发者提供给AI的是“症状”,而非“诊断”。告诉AI“这个函数返回值不对”或“请求没有并发”,AI的注意力就会被局限在具体的函数实现细节上。它会尝试修改DNS解析、Socket创建或HTTP序列化的具体代码行。
事实上,AI生成的每一行代码可能都是符合语法且逻辑自洽的:DNS解析正确,Socket句柄创建无误,HTTP报文拼接也对。问题根本不在于这些微观的代码行,而在于宏观的代码组织方式——AI将I/O的控制权散落在了各个Promise内部,导致事件循环无法统一驱动并发。
要打破这一僵局,开发者必须转变协作思路,停止提供症状级的报错信息,转而提供架构级的诊断指令。
在上述案例中,当开发者停止反馈报错,而是直接给出以下架构约束时:
“Fetch接口不要自行管理事件循环。创建连接后,将句柄注册到全局事件循环中,返回一个pending状态的Promise。所有I/O操作必须由全局事件循环统一调度驱动。”
AI立即给出了正确的实现方案。修改涉及9个文件的协调重构,性能指标瞬间从905ms降至302ms。
同一个AI,为何前三轮屡屡碰壁,而一句架构指令就能药到病除?因为这句指令直接指出了代码的组织架构问题。AI并不缺乏编写具体代码的能力,它缺乏的是对系统架构的整体判断力——即“这些代码应该如何有机组织在一起”的顶层设计能力。当架构方向是错误的时候,AI在细节上的每一次修补都是完美的,但最终拼凑出的系统依然是失败的。
除了架构层面的修偏,AI编程还隐藏着一个更深层的危机:测试代码与业务代码的“同源盲区”。
在修复并发问题后,开发者对代码进行了深度Review,发现在Bench(基准压测)模式下,每一次HTTP请求实际上都失败了——共计16576次请求全部以失败告终。然而,系统输出的测试报告却显示:16576次请求,0错误,完美通过。
导致这一荒谬结果的原因是:AI在编写业务代码时,没有对网络底层返回的错误码进行校验,而是无条件地将调用计入“成功”统计;更可怕的是,AI在编写测试脚本时,同样没有验证HTTP响应状态码,测试断言仅仅检查了“调用次数是否达标”。
由于业务实现和自动化测试是由同一个AI模型在同一上下文中生成的,它们共享了同一套逻辑缺陷。实现代码忽略了错误,测试代码也恰好不检查错误。两者完美配合,互相印证,制造出了一个“一切正常”的坚固假象。
这种闭环盲区极其危险。如果你把这个“0错误”的测试报告再喂给AI,让它继续优化,它当然无法发现问题——它永远无法从自己的输出中发现自己看不见的漏洞。
回答“为什么AI写错后改来改去还是错”这个核心问题,答案不在于AI的智商不够,而在于开发者与AI的协作模式存在结构性缺陷。
错误的协作模式通常是一条死胡同:
AI生成代码 → 运行报错 → 粘贴报错给AI → AI局部修改 → 产生新报错 → 继续粘贴…
这种模式将AI困在了症状级别的修修补补中。开发者应当意识到,报错信息只是表象,当AI连续两次修改未果时,继续提供报错信息已毫无意义。此时必须由人介入,从架构层面进行诊断。
在人机协作中,开发者的角色必须从“代码编写者”转变为“架构设计与审查者”。
针对AI的测试盲区,必须引入人工Review或外部交叉验证机制。
AI代码能力的崛起,并不意味着开发者可以退居幕后。相反,它对开发者的系统架构能力、全局诊断能力以及质量审查能力提出了更高的要求。AI是极其高效的执行者,但唯有开发者才是系统架构的掌舵人。只有建立起“人定架构、机写细节、人审闭环”的协作模式,才能真正发挥AI的潜能,避免在错误的道路上越走越远。