AI编程实战:3个落地技巧+5个坑,别让AI改坏工程
开篇:凌晨两点,AI把我坑惨了
凌晨两点,你盯着屏幕,AI刚刚帮你改完的订单回调代码,在测试环境跑得好好的,一上预发就报错:重复扣款。你翻diff,发现它把原来的幂等校验删了,换成了一个你没见过的Redis工具类。你骂了一句,回滚,重来。
这不是AI不行,是你用错了姿势。我见过太多后端和全栈开发者,用AI编码时掉进两个误区:误区一,把AI当搜索引擎,问“Java怎么实现分布式锁”,它给你一段看似合理的代码,但没结合你的Redis版本、你的锁粒度、你的业务幂等键。误区二,把AI当替身,让它一次生成整个Service,你复制粘贴,编译过了,但你不知道它为什么这么写,出问题只能干瞪眼。
下面这三招,是我踩了半年坑之后,真正能落地的实操方法。
一、高效实战技巧:3个可直接照搬的方法
1.1 给AI画“施工图”:接口+伪代码+约束
别上来就让AI写代码。你先花5分钟,把接口签名、数据结构、关键注释写出来。
操作步骤:
- 先写接口:
deductPoints(Long userId, Integer amount, String bizType) - 用注释写清规则:幂等键用
bizType+userId+orderId,事务边界在方法内,并发场景用乐观锁,失败抛BizException。 - 最后加一句:“只实现这个方法,不要改其他文件,不要引入新依赖。”
案例:我做一个积分扣减接口,第一次直接让AI“写个扣积分逻辑”,它生成了先查再改再保存,没锁。我换成施工图方式,把幂等和乐观锁写进注释,AI生成的代码直接能用,只改了一个BigDecimal比较的equals问题。
你给AI的约束越像施工图,它返工的概率越低。
1.2 小步快跑:函数级生成+单测
不要一次生成整个文件。把任务拆成小于50行的函数,一次只让AI写一个。
操作步骤:
- 拆函数:比如订单状态机,拆出
canTransition(from, to)、getNextStatus(action)。 - 一次只让AI实现一个函数。
- 写完立刻跑单测,通过再继续下一个。
案例:重构订单状态机时,我一开始让AI重写整个Service,结果编译不过,还改乱了原来的状态流转。后来我只让它写canTransition,手动集成到原类里,半小时搞定,没影响其他模块。
AI不是不能写大代码,是你不能让它在黑盒里写大代码。
1.3 让AI当审查员,而不是生成器
自己先写第一版,再让AI以审查者身份找问题。
操作步骤:
- 写完代码,把代码和上下文贴给AI。
- 提示词:“你是资深后端,请找出这段代码的边界条件、并发问题、SQL注入风险,按严重程度排序。”
- 根据它的反馈,自己判断哪些要改。
案例:我写了一个分页查询,AI指出深分页limit 100000, 20性能差,建议游标分页。我改了之后,接口耗时从800ms降到60ms。
AI最好的角色不是码农,是你的代码审查员。
【金句:把AI当施工队,你画图纸;把AI当替身,你等着背锅。】
二、高频避坑要点:5个最容易踩的坑
坑1:幻觉API
现象:AI编造不存在的方法、类、库。比如告诉你RedisTemplate.setIfAbsentWithExpire(),实际没这个方法。
危害:编译失败,或者运行时NoSuchMethodError。
规避:要求AI“只使用我提供的依赖版本”,让它先列依赖清单,你确认后再生成代码。
坑2:改坏原有工程
现象:AI重写时删掉兼容代码、改动公共方法、调整包结构。
危害:影响其他模块,上线后出现诡异bug。
规避:生成前先git commit,只让AI改指定文件或函数,生成后仔细看diff,不要无脑git add .。
坑3:忽略并发与事务
现象:AI生成“查询-修改-保存”逻辑,没加锁,没考虑事务传播。
危害:数据不一致,重复扣款、超卖。
规避:明确告诉AI并发场景,要求加乐观锁或分布式锁,并让它解释为什么这么加。
坑4:测试只覆盖happy path
现象:AI生成的单测只测正常流程,不测异常、边界、空值。
危害:边界问题漏到线上。
规避:让AI先列边界条件清单,再写测试;自己补异常case,比如金额为0、userId为空、重复请求。
坑5:长对话上下文丢失
现象:聊了十几轮后,AI忘记之前的约束,代码风格不一致,重复逻辑。
危害:代码越改越乱,最后你都不知道哪版是对的。
规避:重要约束写进系统提示词或开头,每隔几轮总结成“项目规约”再喂给AI。
【金句:AI不会累,但会忘。你的约束,就是它的记忆锚点。】
三、真实完整案例复盘:优惠券叠加计算
去年我在一个订单系统里,要支持多张优惠券叠加:满减、折扣、品类券,还有互斥规则。原有代码一个方法300行,没人敢动。
我决定用AI辅助重构。
第一步:写契约
我先定义CouponContext和DiscountResult,写清规则:同类券只能选一张,满减优先于折扣,品类券限定商品。
第二步:输入提示词
“你是一个资深Java后端,请基于以下接口和规则,实现CouponCalculator.calculate。要求:1. 只修改指定类;2. 使用策略模式;3. 每个策略类不超过80行;4. 给出单元测试。规则如下:……”
第三步:中间问题
AI第一次生成,把所有策略塞进一个类。我反馈:“拆成独立策略类,用Spring注入。”第二次生成时用了@Autowired字段注入,项目是构造器注入,我要求统一。第三次发现AI用BigDecimal.equals比较金额,我让它改compareTo。
第四步:最终成果
生


