AI是如何让我们加班一个星期调BUG的,真实经历
背景
我们自己开发的内存数据库,在生产环境突然出现大量错误日志文件。从报错信息看,全是数据解析转换错误。
第一轮排查:怀疑数据被破坏
第一反应是被入侵篡改了数据,但排查后很快排除。
接着怀疑某个客户端被盗号,写入了乱数据(虽然可能性很低)。于是去检查原始数据,发现原始数据完全正常。
结论:写入数据没问题 → 问题只可能出在读数据上。
第二轮排查:开发环境一切正常
我们在开发环境反复测试数据读取,全部正常。甚至一步一步调试代码,花了 2 天多时间,一行一行跟踪了 5 遍,把所有不规范的代码都修复了。
结果:读取生产环境的数据分片,依然报错。
第三轮排查:怀疑硬件问题
开始怀疑生产数据分片损坏,比如磁盘坏道。但用的是固态硬盘,坏道概率很低。
运维把 2GB 的分片数据复制到另一个固态硬盘上,换硬盘再读 → 问题依旧。
白白又搞了 2 天。
关键转折:生产数据本地调试
我们让运维直接把硬盘给我们,又把最后版本代码down下来,在本地用生产数据 + 开发环境调试,一步一步跟踪读取过程。
终生难忘的一刻来了:
发现哈希环的值为
8,但我记得明明应该是32。
改回 32 后,一切恢复正常。
真相大白
- 有同事用 AI 生成代码优化
- 他把原代码复制给 AI,让 AI 修复潜在问题,让代码更健壮
- 然后直接把 AI 生成的代码复制替换并提交了
AI 在“优化”过程中,擅自把哈希环大小从 32 改成了 8,而且没有任何提示。
为什么 AI 会这么改?
AI 可能基于以下“合理”判断:
- 常见哈希环默认值是 8 或 16
- 32 被认为是“浪费内存或计算”
- 它不理解这个值与已有生产数据强耦合——改了之后,所有旧数据的位置映射全部错位
细思极恐的点
- 开发环境测试正常,是因为测试数据是按 32 分片新写入的,或数据量小没触发边界情况
- 生产老数据按 32 分片存储,用 8 去读 → 大量数据落到错误桶 → 字节对不上格式 → “解析转换错误”
- Debug 了 5 遍都没发现,因为断点调试看到的是已错位的内存数据,根本不会去检查那个“永远不变”的常量
如果运气再差一点…
- 没有坚持要生产硬盘本地跑
- 运维随手拷的是逻辑卷快照(常量仍是 AI 改过的代码编译的)
- AI 顺手还改了大小端、字段顺序…
那就不只是一周能解决的了。
血的教训
- AI 生成的代码,必须逐行 review 常量值——AI 特别喜欢“优化”魔数
- 配置类、分片类、序列化协议相关常量,永远不要交给 AI 动,且要写注释警告:
// 警告:修改此值会导致旧生产数据不可读!!! #define HASH_RING_SIZE 32