AI是如何让我们加班一个星期调BUG的,真实经验教训(带血的)

5 阅读3分钟

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 顺手还改了大小端、字段顺序…

那就不只是一周能解决的了。

血的教训

  1. AI 生成的代码,必须逐行 review 常量值——AI 特别喜欢“优化”魔数
  2. 配置类、分片类、序列化协议相关常量,永远不要交给 AI 动,且要写注释警告:
    // 警告:修改此值会导致旧生产数据不可读!!!
    #define HASH_RING_SIZE 32
    

HDB.jpg