$kernelink route --hydrate --safe

页面加载 /
跳到正文
auth://account/session

登录工作区

使用 Emlog 账户继续访问你的内容与互动记录。

忘记密码?

打开 Emlog 原生登录页

2414.md
workspace / posts
~/posts/2414.md 阅读中

别再让AI把你的代码改崩了:一个技术合伙人的实战避坑手册

别再让AI把你的代码改崩了:一个技术合伙人的实战避坑手册

开篇:那个凌晨三点的线上事故

你有没有经历过这种场面——周末晚上,你让AI帮你重构一个支付模块,它信心满满地返回了200行代码,你复制粘贴跑通了单元测试,合入主干,发版。第二天早上客服电话打爆:退款接口返回500。

你翻开diff一看,AI把原来的事务回滚逻辑删了,换成了一段它自己"觉得更优雅"的异常链。

这不是段子。我认识一个技术合伙人——王先生,他带团队做过金融SaaS、跨境电商中台、工业物联网平台,踩过的AI编程坑比多数人写过的bug还多。他跟我说了一句话我到现在还记着:"AI不是你的副驾驶,它是一个驾驶风格很野的实习生,你得盯着它每一个操作。"

这里先点破两个误区:

误区一:AI写的代码能直接上生产。 大多数时候不能,尤其涉及资金、权限、事务的核心链路。
误区二:AI幻觉是小概率事件。 实际上在复杂工程里,它编出不存在的API、拼错参数名的概率比你想象的高得多。

下面这些东西,是王先生在多个项目里反复验证过的,你今天就能用。


一、三个可以直接照搬的实操技巧

1.1 "三明治提示法":让AI先读懂你的上下文

多数人用AI写代码是这样的:直接说"帮我写一个JWT鉴权中间件"。结果它给你一个通用模板,跟你项目的User模型、Redis缓存策略完全对不上。

王先生在做跨境电商中台时,团队总结了一个固定格式——三明治提示法:

  1. 上层面包:贴一段你现有的关键代码(不超过100行),比如你的User表结构、路由注册方式;
  2. 中间馅料:说清楚你要什么,具体到函数名、入参出参、错误码;
  3. 下层面包:限定约束条件——"只用项目已有的redisClient实例,不要引入新依赖"。

操作步骤:

  • 先把相关文件的核心部分复制到对话里(脱敏后)
  • 用一句话说目标:"在/api/order路由里加一个幂等性校验"
  • 最后补一句:"基于项目现有的checkIdempotent工具函数,返回格式统一用{code, data, msg}"

王先生说他们团队用这个方法后,AI返回代码的"可直接合并率"从不到30%涨到了70%以上。

【金句:AI不读心,你得把心掏出来给它看。】

1.2 "小步验证法":别让AI一次改超过30行

王先生在金融SaaS项目里有个铁律:任何让AI改动超过30行的请求,必须拆成3步。

比如你要AI帮你把一个同步处理改成异步队列。不要说"帮我改成异步"。你要拆成:

  • 第一步:只让它写消息生产者,贴进你现有的publish函数里;
  • 第二步:验证这段能跑通、消息能进队列;
  • 第三步:再让它写消费者逻辑。

他说他见过太多案例,AI一次性改了半个文件,结果把旁边不相关的逻辑也改了,review的时候根本找不出来。小步走,每步跑测试,才是正道。

1.3 "反向验证法":让AI自己找自己的bug

这招是王先生在工业物联网平台项目里摸索出来的。代码写完后,别急着合并,再开一个对话窗口,把这段代码贴进去,说:

"这段代码有没有以下问题:1. 并发安全 2. 空指针 3. 事务一致性 4. 用了项目中不存在的函数名。逐条检查并列出。"

他说这一步能抓出60%以上的幻觉问题。尤其是第4条——AI特别喜欢编一个看起来很合理但你项目里根本没装的包。

【金句:让AI写代码是合作,让AI审代码是制衡。】


二、五个最容易踩的坑

2.1 坑一:让AI"优化"你没完全理解的代码

现象:你觉得一段代码写得烂,丢给AI说"帮我优化"。它返回一个用了Stream API、Lambda、Optional链式调用的"高级写法"。

危害:你自己看不懂,合入后出问题没法改,等于给自己埋雷。

规避方案:只让AI优化你自己完全看得懂、能逐行解释的代码。看不懂的先别动,去学明白再说。

2.2 坑二:跨文件引用时AI"失忆"

现象:你在对话里提到了A文件的函数名,让AI改B文件。它用了A文件里的一个名字,但那个名字在最新版本里已经改了。

危害:编译报错,浪费半小时排查。

规避方案:每次涉及跨文件操作,把两个文件的关键部分都贴出来。别偷懒。

2.3 坑三:把AI的"建议"当"事实"

现象:AI说"你可以用lodash.debounce",但你项目用的是underscore,或者根本没装lodash。

危害:引入新依赖、版本冲突、打包体积膨胀。

规避方案:AI提到任何第三方库,先查你的package.json。它不知道你的依赖树。

【金句:AI推荐的库不是圣旨,是建议,你的依赖清单才是宪法。】

2.4 坑四:让AI写SQL不给表结构

现象:AI写了一段SQL,逻辑看着对,但表名、字段名全是它猜的。

危害:跑起来直接报错,你还得花时间对比真实schema。

规避方案:贴CREATE TABLE语句或者ORM model定义,让它照着写。

2.5 坑五:过度依赖AI生成测试用例

现象:AI生成的测试看着覆盖率很高,但全是"正常路径",边界条件、异常分支基本没覆盖。

危害:你以为测得很全,上线后第一笔异常数据就挂。

规避方案:AI生成测试后,你自己手动补异常场景——空值、超长字符串、并发请求、权限不足。这步不能省。


三、完整案例复盘:王先生团队用AI重构订单超时取消逻辑

背景:王先生团队负责的跨境电商中台,订单超时自动取消功能是用定时任务+数据库轮询实现的,性能差、经常漏单。

目标:改成基于Redis延迟队列的方案。

第一轮输入

王先生让团队里的后端把现有代码贴出来(约80行的cron job逻辑),然后输入:

"基于现有Order模型和项目已有的redisClient(用ioredis),用延迟队列实现订单30分钟未支付自动取消。要求:1. 下单时写入延迟队列 2. 消费者处理取消逻辑 3. 幂等校验 4. 日志记录用项目的logger实例"

中间问题

AI返回了代码,但犯了三个错:

  1. 用了delayed-queue这个库,项目没装;
  2. 消费者里直接调了Order.update,没走项目封装的service层;
  3. 异常处理用了try-catch但没做重试,王先生说他们要求至少重试3次。

修正过程

团队用"小步验证法",先让AI把delayed-queue换成项目已有的Redis keyspace notification方案(王先生之前在工业物联网项目里验证过的)。然后单独让AI重写消费者,限定"只用orderService.cancelOrder方法"。最后补一轮"反向验证",AI自己发现了重试缺失的问题。

最终成果

改动合并后,超时取消的响应时间从原来的"最多等5分钟跑一轮"变成了"秒级触发",漏单率从千分之三降到了零。但王先生也坦言,这个过程前后花了两天——不是AI不行,是你得有耐心跟它磨。

【金句:AI给你80分的代码,你得自己把它打磨到能上线的100分。】


四、你今天就能动手的3件事

  1. 打开你最近一个AI帮你写的函数,用"反向验证法"让它自己审一遍,看看它编了什么不存在的东西。
  2. 下一次让AI改代码,先把相关两个文件的核心代码贴进去,别只描述。
  3. 建一个"AI幻觉记录本",每次发现AI编错的东西记一笔。一周之后你会发现规律,哪些类型的请求它最容易翻车。

最后说句实话

AI编程工具现在确实好用,但它离"替你写生产代码"还有距离。它会编参数名、会用不存在的API、会忽略你的事务边界。把它当一个能力强但需要你盯着的搭档,而不是一个能独立交付的外包。

王先生说得好:"工具再聪明,决定代码质量的还是坐在屏幕前的那个人。"

觉得有用可以收藏转发,评论区聊聊你被AI坑过最狠的一次——我赌评论区比文章还精彩。

收藏 0
手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

comments.cmd 可写入
guest@kernelink:~/posts/2414$ comment --compose
identity.env 访客信息
插入 访客会话 Text + UBB · UTF-8 · LF 0 字符