“能编译、能跑、单测全绿,上线还是炸了”——这个场景这两年我见得太多了。说句实话,AI 写的代码本身挺冤的,因为问题基本不出在“AI 写代码”这一步,而是出在验收。很多人把“编译通过 + 单测通过”直接等同于“可以上线”,这中间的鸿沟大到你不敢想象。今天我想用一个亲历的案例,把这条鸿沟拆开讲清楚,顺便给出一套我在团队里反复打磨过的验收流程,希望能给正在用 AI 辅助写代码、又担心上线翻车的朋友一些参考。
这套内容不挑技术栈,也不挑团队规模。不管你是独立开发者、三五人的小团队,还是正在建立质量体系的工程团队,只要你的代码里有 AI 生成的成分,验收环节就必须重新设计。看完你会明白:为什么传统的“跑一下测试看看”不再可靠,以及怎样用一套结构化、分层级的验收流程,把“看着能用”变成“真能用”。
1. 先搞清楚:AI代码的“绿”和人类代码的“绿”不是一回事
1.1 编译通过只代表“语法没毛病”,不代表“逻辑没毛病”
很多人的第一道把关就是编译。编译能过,立刻觉得心里踏实了。但这道关卡的含金量,比想象中低得多。编译器的职责是检查语法、类型、引用关系是否成立,它根本不知道你的业务逻辑对还是不对。你可以写一段编译完全通过、类型完全正确的代码,把用户余额扣成负数,编译器照样给你亮绿灯。
AI 生成代码时尤其容易出现这种情况。因为大模型在生成代码时,天然会往“语法最流畅、结构最标准、接口最常见”的方向去写,而这些恰好是编译器最认可的东西。换句话说,AI 代码很容易在“编译器视角”下显得非常漂亮,但在“业务视角”下可能就是一场灾难。
举个例子。我见过一段 AI 生成的订单支付回调处理代码,函数签名、类型标注、空指针保护都写得工工整整,编译一次通过。但细看逻辑:它把“支付回调可能重复到达”这个分布式系统的基本常识完全忽略了,没有做幂等处理。结果上线第二周,某渠道商的重试机制触发了一次重复回调,用户被重复扣款,客诉直接爆掉。编译通过,不代表任何东西。
提示:编译通过只是最低门槛,它验证的是“代码能跑”,而不是“代码跑得对”。把所有希望寄托在编译上,等于用验钞灯检查食品保质期,工具都对不上场景。
1.2 单测全绿的三个盲区
单测全绿给人的安全感,很多时候是虚假的。这里至少有三个盲区,AI 生成代码的场景下会被放大得很明显。
盲区一:测试是你自己写的。AI 生成了业务代码,你让 AI 顺手把单测也写了,然后再用这套测试去检验 AI 的代码。这就等于考生自己出题自己答,还是同一个 AI 出的题和答案,逻辑风格天然自洽。哪怕业务代码里藏着边界条件漏判,AI 生成的测试里也大概率不会覆盖到,因为它压根就没有“故意刁难自己”的动机。
盲区二:断言太弱。很多单测只验证“函数没抛异常”或者“返回值不为空”,这种断言本质上是白给的。更隐蔽的是“断言值与实现逻辑同源”:比如 AI 生成了一段排序代码,又生成了同样的排序逻辑来验证排序结果,两个实现错在同一个地方,测试照样全绿。这种测试测的不是“对不对”,而是“稳不稳”,稳定性掩盖了错误性。
盲区三:只覆盖正路径。AI 生成的单测绝大多数是 happy path 测试。参数正常、数据存在、依赖可用、没有并发、没有超时、没有重试、没有权限问题。但线上炸掉的点,几乎全在 reverse path 和 edge case 里:数据为空、参数越界、依赖超时、重复请求、并发竞争、权限不足。你的单测全绿,只能说明“在正常条件下看起来没问题”,离“线上稳定”还差着一整个异常世界。
1.3 AI生成代码的典型“病灶”
除了上述盲区,AI 生成代码本身还有几类反复出现的“病灶”,验收时必须重点盯防。
第一类,边界缺失。AI 倾向于按“常规数据”生成逻辑,对数组越界、数值溢出、字符串超长、时间跨年、时区变化这类边界条件,往往处理得相当随意。我见过一段 AI 生成的报表聚合逻辑,在处理 30 天和 31 天的月份时用了错误的区间算法,结果每月 31 号的数据都会少算一天,连续错了三个月才被发现。
第二类,重复代码。AI 特别喜欢复制粘贴式地生成相似逻辑,因为这是它在训练语料里学到的最常见模式。结果就是你拿到一个函数,里面有三段极其相似的循环,只有个别参数不同。这种代码单测容易全绿,但维护成本和隐藏 bug 的概率会成倍上升,改一处漏三处的坑,我踩过不止一次。
第三类,过度抽象。和重复代码相反,有些 AI 会在小场景里硬套设计模式,生成一大串接口、工厂、适配器。代码是“高级”了,但别人读起来要绕三个弯,而且抽象层一多,数据传递过程中很容易出现隐性转换错误。
第四类,对“外部依赖”过于乐观。AI 生成的代码假设外部系统永远按文档响应,永远不会慢,永远不会超时,永远不会返回意外数据。但现实世界里,数据库会慢、消息队列会堆积、第三方接口会抽风。AI 代码很少主动考虑失败降级、超时控制、重试退避这些“脏活”,而这些恰恰是线上稳定性最关键的细节。
注意:这里的“病灶”不是 AI 独有的,人类新手也会写。但因为 AI 生成的代码量可以非常大、速度可以非常快,这些病灶会以更高的密度涌入代码库。如果验收环节不加干预,等于在给线上环境埋地雷。
2. 把验收拆成四层:需求、代码、运行、业务
想要回答“能不能上线”,必须把验收拆成四个互不替代的层面。只做其中任何一层,都会出现“全绿照样炸”的情况。
2.1 需求层验收:没有行为契约,AI只能靠猜
我反复跟团队强调一个观点:AI 写代码本质上是一个“猜需求”的过程。你给它一个自然语言描述,它根据训练语料里的概率分布,猜一个最像的答案。你如果只描述“实现订单超时自动取消”,AI 大概率猜一个定时任务加状态更新的实现。但它猜不到:超时阈值从哪里配置?哪些状态的订单可以被取消?取消后库存要不要回补?回补失败该怎么处理?取消通知走什么渠道?这些业务规则如果没有被显式定义,AI 猜错是必然的,猜对才是运气。
所以需求层验收的第一件事,就是把“模糊描述”转成“行为契约”。所谓契约,就是一组明确的、可验证的规则,每个规则都回答一个具体的业务问题。比如:
- 订单支付后超过 30 分钟未发货,系统自动标记为“待处理”,不直接取消;
- 只有状态为“已支付”的订单可以被取消,已发货订单必须走人工审核;
- 库存回补采用异步方式,回补失败进入重试队列,最多重试 5 次;
- 取消操作必须幂等,重复提交取消请求不能产生重复回补。
这些规则不能靠 AI 猜,必须由产品经理或业务负责人明确写下来。写下来之后,用自然语言描述即可,然后可以基于这些描述去设计验收测试。需求层验收的价值在于:它把“AI 猜的可能对”变成“AI 猜的必须对”,把模糊性变成了可检查性。
2.2 代码层验收:审查AI代码的结构与可维护性
代码层验收重点关注的是:这段代码值不值得留在这个代码库里。AI 能生成代码,但 AI 不为代码的长期维护负责,这个责任永远在人身上。代码层验收通常看几个维度:命名是否清晰、函数是否单一职责、是否存在重复逻辑、抽象是否过度、是否引入了不必要的复杂依赖。
这里我要提一个特别容易忽略的点:审查 AI 代码时,不要只看它“写了什么”,还要看它“为什么这么写”。AI 的推理过程你是拿不到的,它只会给你一个结论。所以审查时遇到任何一个让人困惑的写法,第一反应不是“可能是我理解不到位”,而是“这里需要问清楚”。我在实操中养成了一个习惯:凡是审查 AI 生成的代码,每条逻辑分叉都要在代码注释里写明业务依据。AI 生成代码没有注释,我就要求开发人员补上,补不上就说明他自己也没理解,这段代码就得重写。
代码层验收的工具落地不复杂,就是 Code Review 加静态检查。静态检查工具能抓出一部分问题,比如重复代码、复杂度超标、明显的反模式。但更核心的是人工审查,尤其是审查 AI 代码时的对抗心态:默认它有问题,然后一条条去推翻自己。这种“有罪推定”的审查模式,对 AI 代码特别有效。
2.3 运行层验收:性能、并发、资源、稳定性
代码能编译、逻辑看着没毛病,不代表它能扛住真实的运行环境。运行层验收解决的是“让它在一个不友好的环境里跑一跑”的问题。
这一层最容易暴露 AI 代码的“乐观病”。AI 生成的代码往往不会考虑这几个问题:数据量从 100 条涨到 1000 万条时,原来的算法还撑得住吗?并发从 10 涨到 1000 时,共享资源会不会竞争崩溃?依赖接口从 10ms 涨到 3s 时,有没有超时保护和降级方案?线程池满了之后,新的请求是排队、拒绝还是直接把进程搞挂?内存缓存没有淘汰策略时,会不会 OOM?
运行层验收的实操,至少包含四类测试:性能基准测试、并发压力测试、资源消耗监控测试、稳定性测试(长时间运行观察是否有内存泄漏、连接泄漏)。这些测试可以在测试环境做,也可以在预发环境用模拟流量做。工具上,压测可以用 JMeter 或者 wrk、k6,监控可以用 Prometheus 加 Grafana。关键是“用接近线上的数据量和并发模型去跑”,而不是拿三五条数据点一下“通了就行”。
2.4 业务层验收:用真实流量和真实数据说话
这是最接近“上线能不能炸”的答案的层面,却也是最容易被跳过的一层。业务层验收要回答的问题是:把这段代码放到真实业务里,用户会怎么用?真实数据会长什么样?真实流量高峰会不会触发未知问题?
SQL 上的一个经典例子:AI 生成的查询语句在测试环境跑 100 条数据是毫秒级,但生产环境对应的大表有 2 亿行,索引又没设计对。同样一条 SQL,在测试环境全绿,到生产环境直接拖垮数据库。这个问题在代码层、单测层永远发现不了,只有在业务层用真实数据规模去试才会暴露。
业务层验收的手段通常是:全量数据导入预发环境,跑一遍核心业务链路;用脱敏的生产数据做比对测试;新功能接入影子流量,把线上真实请求复制一份打到新版本上,既不影响真实用户,又能看新旧逻辑输出是否一致。影子流量是很多团队忽视但极其好用的手段,尤其是 AI 生成代码这种“看着对但实际容易错”的场景,用真实流量去校准,比任何测试数据都可靠。
3. 实操:搭一条“抗炸验收流水线”
四层验收讲完之后,接下来是实操环节。我给团队搭过一套“抗炸验收流水线”,每一步都对应前面讲的一个问题域。这里把完整流程拆解出来,你可以直接抄作业。
3.1 把需求转成行为契约:先写验收测试
流水线的第一步,是给需求“定规矩”。我们团队现在用的方式叫“先写验收测试,再写业务代码”,这个做法在 AI 辅助开发流程里尤其好用。
具体做法:拿到需求之后,先用 GWT(Given-When-Then)风格写出行为验收测试。GWT 的写法非常简单,就是三段式描述:给定什么前提,当发生什么动作,那么应该得到什么结果。这种描述既是需求文档,又是测试用例,可以翻译成 pytest 或 JUnit 风格的测试。
举个例子,针对前面提到的“订单取消幂等”需求,验收测试可以写成:
def test_cancel_order_is_idempotent(): # Given: an order already in "cancelled" status order = create_order(status="paid") cancel_order(order.id) # When: calling cancel for the second time result = cancel_order(order.id) # Then: inventory should be replenished exactly once, no duplicate assert result.code == 0 assert inventory_replenished_times(order.id) == 1这段测试代码的意思是:如果 AI 生成的取消逻辑没有做幂等处理,第二次取消时会再次触发库存回补,测试直接失败。这就是行为契约的力量——它把需求从“话”变成了“可执行、可验证的检查项”。
编写验收测试时有几个要点:一是每条规则都要至少对应一个正向用例和一个反向用例;二是优先覆盖异常分支,而不是正常分支;三是测试数据要贴近生产的形状,包括空值、超长字符串、重复键、并发请求等。
提示:验收测试写好后,先运行一遍,确认它是失败的。如果它一开始就通过,说明这测试写得没意义,等于没有设置门槛。
3.2 给AI代码做“体检”:一份审查检查单
代码审查不能靠随机印象,我整理了一份针对 AI 生成代码的检查单,每次 review 都按清单逐项过。这份清单不需要很长,但每条都直击痛点。
第一,幂等性。这个操作如果被执行两次、十次,结果是否一致?很多 AI 代码压根没考虑过重复执行,但线上重试机制几乎无处不在。
第二,边界与默认值。所有数组索引、时间边界、数字阈值,有没有显式检查?所有空值分支,是默认返回还是抛异常?AI 很喜欢写“省心”的默认值,但省心往往意味着掩盖错误。
第三,外部依赖假设。调用了外部接口,有没有超时控制?有没有失败重试?重试有没有退避策略?依赖彻底挂了之后,这段代码是优雅降级还是把进程拖垮?
第四,并发与线程安全。静态变量、共享内存、数据库连接、文件句柄,是否存在并发访问的问题?AI 生成代码经常忽略锁、事务、原子操作这些并发控制手段。
第五,资源释放。数据库连接、网络连接、文件流、分布式锁,是否在使用完成后正确释放?AI 生成的代码里,连接泄漏是高频问题,尤其在大循环里创建连接不关闭,压测时直接耗尽连接池。
第六,日志与可观测性。这段代码有没有输出足够的日志?出了问题时,基于现有关键字能不能定位到是哪个环节的问题?AI 生成的代码在日志完整性上通常很弱,喜欢静默失败,这对线上排查来说是灾难。
审查时按照清单逐条打勾,任何一条过不去,都要回到修改循环里。检查单可以在团队内部共享,甚至根据踩坑记录不断扩充关键词。比如后来我们加了一条“金额计算是否使用精确类型”,就是因为在一次事故里 AI 生成的代码用浮点算金额,精度偏差导致对账不平。
3.3 边界与异常测试矩阵:把程序往死里逼
行为契约测的是“业务规则对不对”,边界与异常测试矩阵测的是“程序在各种极端条件下会不会崩”。我习惯把边界条件整理成一个测试矩阵,覆盖六大类:
| 类型 | 典型输入/场景 | 验收重点 |
|---|---|---|
| 数值边界 | 0、负数、极大值、NaN、溢出点 | 是否能优雅处理,还是直接抛异常 |
| 时间边界 | 跨日、跨月、跨年、闰年、时区变化 | 日期计算是否正确 |
| 数据规模 | 0 条、1 条、超大列表、超长字符串 | 是否会 OOM、超时或性能急剧下降 |
| 空与缺失 | null、空字符串、空集合、缺失字段 | 是否空指针、默认值是否合理 |
| 重复性 | 重复请求、重复消息、并发重复 | 是否幂等,是否产生脏数据 |
| 依赖故障 | 下游超时、熔断、慢响应、异常返回体 | 是否有降级、重试策略,是否拖垮本系统 |
每个维度都要至少设计一个具体的测试用例。比如数值边界,不仅测 0 和负数,还要测最大值加 1 会怎样;时间边界要测 2 月 29 日和 12 月 31 日 23:59:59 这种极端时点;数据规模要测 10 万条记录输入时,接口响应时间是否还在可接受范围内。
这一步骤很容易让人枯燥,但它是守住线上稳定性的重要防线。AI 写代码时不会替你想这些极端情况,人就得补位。
3.4 压测与故障注入:验证它在坏环境里的表现
很多人理解的压测是“把并发调高,看看会不会炸”,这只是其中一半。另一半是故障注入——主动把环境搞坏,看看代码会不会死给你看。这两件事要合起来做,才能真正验证 AI 代码在真实世界里的韧性。
压测的实操要点:先确定压测目标,比如核心接口预期 QPS、P99 延迟、错误率上限;然后从低并发逐步往上加,观察各项指标的变化曲线;重点关注拐点,也就是从哪个并发开始,延迟和错误率开始急剧上升。这个拐点就是系统的真实容量上限,上线前要心里有数。
故障注入的实操场景包括:
- 让后端某个接口强制超时 5 秒,观察 AI 生成代码是否触发超时保护,还是整条链路被卡死;
- 把数据库连接池调小一半,观察代码是否耗尽连接;
- 随机杀掉依赖进程,观察代码是否能熔断降级;
- 模拟消息重复发送,观察消费者是否幂等;
- 把磁盘空间打满,观察日志是否会异常退出。
故障注入工具可选的很多,行业里常用的是 Chaos Mesh、ChaosBlade 这类混沌工程工具,也可以用脚本模拟一些简单的故障。关键是掌握力度,先在测试环境里做,不要一上来就在预发环境搞大动作。
这一步做完,你对 AI 代码的“坏环境表现”就有数了。如果它在故障面前脆弱得不堪一击,那至少是在测试环境里碎的,而不是在用户面前碎的。
3.5 灰度与影子流量:上线前的最后一关
流水线走到这一步,代码十九八九能上线了,但还差最后一层保险:灰度发布和影子流量。
灰度发布不用多说,就是把新版本先放给 5% 或者 10% 的流量,观察指标稳定后再逐步放开。但这里有一个细节:灰度不仅是“看有没有报错”,还要看业务数据是否符合预期。比如 AI 生成的新版订单状态机,灰度期间就要比较新旧两个版本的状态流转结果是否一致,不一致的地方,哪怕没有报错,也必须叫停。
影子流量是我个人非常推荐的手段,特别适合 AI 生成的逻辑验证。原理很简单:在测试环境部署一套新版本,把线上真实请求复制一份,打到新版本上。新版本的输出会被记录下来,但不会影响真实用户。然后拿新旧版本的输出做比对,比如订单金额、库存变动、状态流转、返回码,只要存在不一致,就说明新版本的逻辑和线上行为有偏差。
影子流量看起来高大上,实现起来也不难。在服务框架层加一个 filter,线上请求到来时复制一份,打到预发环境,就完成了流量复制。有些网关层工具也自带流量复制的能力。没有这种条件的中小团队,也可以用日志回放的方式变相实现:把生产日志里真实请求参数抽出来,在预发环境逐个重放,比对结果。数据量少一点,但也能覆盖真实数据和真实参数情况。
注意:影子流量只适合同幂等或只读逻辑,如果新版本会被动写数据,就必须在隔离环境里做好数据清理方案,避免污染测试数据。
4. 一个“全绿”模块是怎么在高峰期炸掉的
上面说的是方法论。下面我用一个真实发生过的案例,把“全绿上线即炸”的完整链条复盘一遍。细节做了脱敏处理,但流程是真实的,非常有参考价值。
4.1 项目背景与“顺利”的验收过程
某电商公司的会员积分模块要做一次重构,核心是“积分过期提醒”功能。原来的实现是定时任务批量扫描,新方案要改为积分变更时实时判断、实时提醒。团队里一位开发者使用了 AI 辅助编程,在一个小时内生成了核心模块:积分变更监听、过期时间计算、提醒消息发送、阈值配置读取。旁边配套的单测也是 AI 生成的,三十多个测试用例,编译顺利,全部通过。
当时走了一遍常规验收流程:编译通过,单测全绿,冒烟测试通过,代码评审走马观花看了十分钟,觉得逻辑清晰,就进入了发布清单。没有写行为验收测试,也没做压测,更没有影子流量比对。因为大家都觉得:“AI 写的代码结构那么规范,测试又全绿,还能有什么问题?”
4.2 炸机过程复盘:从报警到定位
上线后的第二天上午十点半,积分系统开始大量报警。现象是:消息队列消费出现积压,消费者线程全部卡死,接口响应时间从 50ms 飙升到十几秒。技术团队紧急回滚,前后大概持续了二十分钟,期间所有和积分相关的操作全部不可用。
初步定位发现,卡死发生在“提醒消息发送”的逻辑里。AI 生成的代码在发送提醒前,会调用外部营销系统的黑名单接口。由于没有设置超时时间,黑名单接口有一次偶发变慢,单个请求耗时从 100ms 变成了 15 秒。而排队等待的线程都是共享同一个线程池,线程池很快被占满,后续所有消息处理全部排队。更麻烦的是,黑名单接口没有重试退避策略,线程池里每个线程都在死等同一个慢接口,形成线程池饥饿。
4.3 根因分析:验收漏洞一对一定位
回过头来看,这个问题拆解之后,完全落在我前面讲的验收漏洞里:
第一,没有行为契约。需求文档只写了“发送提醒前需要做黑名单过滤”,但“黑名单接口调用超时时间”“失败是否阻断主流程”“线程池隔离策略”这些关键行为完全没定义。AI 按照最常见的写法,把黑名单过滤做成了同步阻塞调用,而且没设超时。
第二,单测全绿没有覆盖异常依赖。AI 生成的单测里,黑名单接口的响应全部是“正常返回不在黑名单”,没有一个用例模拟“接口超时”或“接口返回 500”。所以代码里对失败场景的处理完全缺失,测试却没有暴露出来。
第三,没有运行层故障注入。如果当时做一次“下游依赖延迟模拟”,把黑名单接口延迟改成 10 秒,压测一下,这个问题百分之百会在上线前暴露。但流程里压根没有这一步,就这么带着雷上线了。
第四,没有影子流量比对。新模块上线前的预发验证,用的是造出来的测试数据,一切正常。但真实生产流量模型下,用户积分变更频率、消息并发量、下游依赖的慢响应,这些在测试数据里完全没有体现。如果做了影子流量复制,真实请求打上去,立刻就能看到线程池打满的趋势。
4.4 修复与流程改进
修复本身不复杂:给黑名单接口加超时(500ms)、加快速失败、熔断降级;把黑名单过滤从主流程改为异步化,失败后仅记录日志并放行;给消息处理线程池做隔离,避免一个慢依赖拖垮整个消费者组。改完之后,同样的故障注入测试,系统表现完全稳定。
比修复更有价值的是流程改进。这次事故之后,这个团队把验收流程从“编译 + 单测 + 冒烟”升级成了四层体系,每个新功能上线前必须通过:行为验收测试、审查检查单、边界测试矩阵、压测故障注入、灰度或影子流量比对。后面的半年里,再没有出现过一次“单测全绿上线炸”的事故。
5. 常见问题与排查技巧实录
最后这部分,我把日常验收中遇到的高频问题、危险信号和排查技巧整理出来,方便你对照自查。
5.1 验收中的“假绿”信号速查表
| 信号 | 真实含义 | 应对建议 |
|---|---|---|
| 编译一次通过,且零警告 | 可能是 AI 按最“标准”的方式写,并不代表逻辑正确 | 增加行为验收测试 |
| AI 同时生成了业务代码和单测 | 测试和实现可能是“同谋”,错也错得一致 | 人工补充独立测试用例,尤其是异常分支 |
| 单测全绿但断言全是“不为空”“无异常” | 测试形同虚设 | 检查断言强度,强制要求断言具体业务结果 |
| 代码结构极其工整但没人理解 | 逻辑来源不明,风险集中地 | 让开发补注释和业务依据,补不上就重写 |
| 压测到预期并发就过,没有找拐点 | 容量边界未知 | 加大压力直到出现指标拐点,记录真实上限 |
| 下游依赖从来没模拟过故障 | 依赖一抖就炸 | 加入故障注入场景 |
| 新逻辑只在造数据上验证通过 | 真实数据形状未知 | 加入影子流量或本地数据回放步骤 |
5.2 快速揪出AI代码隐藏问题的技巧
技巧一,追问“两个分支”。看到一个 if-else 分支,立刻问:如果条件反过来会发生什么?AI 经常会把注意力放在主分支上,else 分支写得极简,甚至就是空操作。这个空操作在线上往往意味着功能静默缺失。
技巧二,搜“乐观放弃异常”。AI 代码里经常出现大段 try-catch,但 catch 块里只是打日志或者直接吞掉异常。一个很实用的排查操作:全局搜索空 catch 块,把每个空 catch 揪出来,逐个追问“这里真的可以不用处理吗”。十有八九能挖出隐患。
技巧三,观察重复代码块。把代码里相似度高的片段截出来对比,看差异点在哪里。AI 生成的重复代码,经常是某个条件参数不一致导致的复制粘贴。这种地方最容易出现改一处漏三处的问题。
技巧四,做“数据形状测试”。不要只看常规参数,专门构造一批畸形数据:字段缺失、类型正确但语义相反、金额为负、时间戳为零、列表为 null。AI 代码在畸形成数据面前的崩溃率,远高于人类写的代码。
5.3 团队落地:把验收变成卡点而不是走过场
流程定得再好,落地时容易流于形式。这里给出三条实操建议。
第一条,把验收环节写进 Definition of Done。任何需求,只有在四层验收全部通过后,才算真正“完成”。不通过的,不能进入发布分支。这一条要写进团队的开发规范里,而不是靠个人自觉。
第二条,指定“验收责任人”。AI 辅助开发模式下,写代码的人往往就是提出需求的人,对需求漏洞缺乏洞察。比较有效的做法是让另一个了解业务但没参与编码的人做最终验收,或者至少让开发者在验收阶段把“为什么这段逻辑这么写”讲清楚,能讲清楚的才放行。
第三条,用事故复盘反哺验收清单。每一次线上事故,无论大小,都要回填到验收清单里。比如“浮点数计算金额导致对账不平”,复盘之后,这条就永久写进代码审查检查单。这样验收流程会越来越贴近你自己的业务风险,而不是一套通用但无感的模板。
我个人在实际操作中的体会是:AI 辅助编程最大的风险不是“代码写得差”,而是“它让差的代码看起来太好了”。编译、单测、代码格式这些表象层面的东西,AI 几乎都能做到无可挑剔,但真实世界的复杂性它没有感知。把验收的重点从“代码能不能跑”拨向“代码在真实业务里撑不撑得住”,需要的不是更多工具,而是一套更严谨的思维习惯。每当看到 AI 生成代码第一眼觉得“漂亮得像教科书”的时候,反而要提高警惕,默认它有隐藏问题,然后一条条去证明它没问题。这套流程跑顺之后,你既享受 AI 带来的效率提升,又不用在凌晨三点被报警电话叫醒,收益远比想象中大。