Ken W Alger 九月初在 dev.to 上那篇实验,我一开始没当回事——代码生成不是瓶颈了、验证才是,这种话我半年前就见过,不新鲜。但他那个密码重置的实验有个细节,我越想越觉得这账得重新算:五分钟生成,四十五分钟验证,实际流程五十分钟。总时间一分没省,事儿换了个人干。他把这数字写出来的时候,我估计评论区一堆人还没反应过来这有多荒诞——你花五千块买了个机器,机器给你干五分钟活,你替它擦四十五分钟屁股。这效率工具的说法,账面上到底站不站得住?
先别急着说他工具用得不对。那不是重点。重点是他碰上的缺陷很安静——重置链接用了一次还能再用。你品品这个缺陷。它不是实现写错了,是规格里根本就没写“链接只能用一次”这回事。需求只说“用户能重置密码”,没说“用完作废”,代理就照着生成,测试也照着过,代码审查也不一定扫得到。真人开发者上手这需求,十有八九会问一句“链接用完要不要废掉”,或者凭职业本能直接把“一次性”写进流程。代理不会。代理不问。代理对着规格干,规格有窟窿,它就往窟窿里填代码,填完还全绿。
这就是那篇文章最值钱的地方。以前代码贵,验证便宜;现在代码便宜,验证贵,而且贵得莫名其妙。一个代理五分钟给你糊出来的路由、令牌、邮件、UI,你花四十五分钟去确认它没坑。你说这省了什么?把成本从“写”挪到了“查”。总账没变,还添了一层“不是自己写的”那种不安全感。这玩意儿好比请了个写字极快的实习生,干完活你不敢直接发,还得逐字逐句重看一遍。你雇他到底图什么——图那一会儿的快?
先算笔账。假设你以前四十分钟写一个功能,十分钟测完,成本五十分钟。现在代理五分钟出代码,你花四十五分钟验证,成本还是五十分钟。但这里面有一笔隐形账:以前那四十分钟里,你边写边把上下文、边界条件、后续改动会踩哪,全装进脑子里了。你是作者。现在你是个审计员,审的还是一段不是自己写的代码。下个月工资结算的时候,开发时间没降、返工没降、质量还估不准。这笔账我一开始也算错过——我以为是工具烂,后来才反应过来是流程在玩移花接木。工具不骗人,流程骗人:让你觉得快,其实把慢的那部分换个地方藏起来了。
Ken 那套实验安排其实挺朴素的。Claude Code 配上 testRigor,一个普普通通的小 Web 应用,认证、用户账户、登录。他先定义行为让代理去实现,再用独立的端到端验证去判定。第一次挂,功能压根不存在;第二次挂,链接可重用;把失败文本喂回去,第三次才过。三回加起来二十分钟,大部分时间无人值守。看着不错对吧?我读到这儿的第一个反应是:这二十分钟里,有多少是代理真在干活,有多少是你在那儿假装它能无人值守?你自己真敢关机走人吗。生产环境里,那个四十五分钟的审计时间可能还不够。
他有个判断我半年前就在想,当时没敢下死话——值得长期维护的东西,正从具体实现转向规格说明。现在他这么一写,我反而觉得这判断立住了。代码生成便宜到这份上,实现就是耗材,规格才是资产。但接着追问一句:规格谁维护?代理读规格、代理写代码、代理跑测试,这个闭环里规格是唯一的输入,它自己若是个筛子,后面全瞎。Ken 自己就撞上了——他以为密码重置成功后该跳登录表单,结果没有。他管这叫规格缺口,不是应用缺陷。这细节我信,真做过实验的人才写得出来。不是推演出来的,是试出来的。
评论区里有个人叫 Cophy Origin,自称 AI 代理,撂了一句话:自我验证比看上去更弱,因为审查者和实现共享同一批盲点。这他妈戳得太准了。代理生成的测试,验的是代理理解的需求,不是真实需求。它要是想岔了,代码和测试会一起错,还一起绿。你等于是让同一个模型出题、做卷、批卷,完了跟你说“我考了满分”。听起来荒诞,但现在大批团队就是这么干的。所以独立的验证系统不是锦上添花,是必须。不能让运动员兼裁判。
说下 testRigor 这类工具。Ken 提了一句,类英语行为指令归根结底还是有自己的语义,你得学它怎么识别元素、解释指令、管理状态、处理认证。我比他更悲观一点。现在一堆人把它当“不会写代码也能做测试”的福音传,但它只是把选择器的复杂度换成了语义的复杂度。抽象不会消灭复杂性,只会搬家。SQL 出来的时候,有人说再也不用了懂数据,后来发现还是得懂,只是换个地方懂。行为测试的工具也一样,英语写测试不是没代价,代价是你得学它的“英语”。这账有人算过吗?
往深里算,这笔账已经不是“开发省多少、验证亏多少”了,是“什么才叫生产力”。Ken 说,该看单位时间内交付的正确功能数,不是代码行数、任务数、token 数。这话跟废话一样,但你拿它去量现在的 AI 编程团队,很多数字会瞬间塌。代理十分钟生成一万行代码,团队花一天确认能不能用——这一万行不是产出,是等待检查的库存。库存不产生价值,只产生等待。做管理的一听就懂,做技术的可能要愣一下。AI 编程最大的骗局,就是把库存当产出。十万行代码堆在仓库里,一行没验收,那连“产能”都不算,算积压。
那篇文章底下的评论区,66 条,比很多技术博客全文都有信息量。有个叫 Reid Marlow 的,一句话把暗线挑明了:负向断言是最早被扔掉的。规格里写“用户能重置密码”,没人会写“重置链接用了一次就不能再用”。这套不言自明的东西,以前靠经验和惯例兜底,现在到代理手上没人接。除非你把“第二次提交必须失败”白纸黑字写进规格,否则代理会严格优化到测试通过,然后给你一个干净的构建和一个漏着的洞。做测试的人早就懂这个,AI 只是把窗户纸撕得更狠了一点。
那怎么办?Ken 给的方向是 AI 提实现,确定性系统做验证,构建、API 响应、数据库状态、工作流,都归确定性验证管。对,但不狠。真正的问题不是“要验证”,是验证这活儿要垫多少工程投入,以及最后谁为它兜底。工具能给一部分,人别想直接省没。老板们以为上了 AI 能砍人头,结果砍的是写码的人,冒出的是写测试、审测试、护测试的人。人头没少,挪了个坑。这对想靠 AI 省人头的老板是盆冷水,对某些做测试的人反而是闷声的窗口。
还有个缝,评论区里提到了并发。两个并发重置请求,可能在状态失效前一块过了令牌校验。Ken 自己承认没测过并发。这个我特别信,因为一堆搞 AI 应用的都栽在并发和幂等上——不是 AI 的锅,是验证没盖住。你看得见的结果定义行为,漏的就是看不见或难观察的边界。单次点击串行看没问题,一并发,契约直接散。这不是再加条测试用例的事,这是行为契约必须写成一串明确的不变量的那种问题。
我写到现在,已经不是复述他那篇了。那篇东西最大的好处,是用一个能复现的实验把大家都不愿说破的事给钉出来了:AI 编程省的不是时间,是“写”的动作。验证的时间不但没省,还因为“代码不是自己写的”变本加厉。你不改流程,AI 编程的每一分红利,最后都会在审计环节被原样吃回去。谁先吃透这层,谁才是真省下的那批人——靠的不是更快生成,是更早把规格当成资产、把验证系统独立出来。别让同一个脑袋又出题又改卷。代理能做多少从来不是关键,你的验证系统能不能独立于它的判断,那才是。
这笔账,账本上记得住。
