ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

当AI写出80%代码:验证瓶颈与工程体系如何重构

当AI写出80%代码:验证瓶颈与工程体系如何重构 上周三下午同事甩给我一张截图标题是代码80%是AI写的这家AI公司呼吁暂停AI开发。他问我这不是自己打自己脸吗一边把研发流水线交给AI一边又站出来喊停。我说这事儿恰恰不矛盾而且它把这个行业最真实的一面给掀开了——AI编程已经不是要不要用的问题而是用到什么程度会出事的问题。80%这个数字不是炫耀更像是一份体检报告只不过指标是红的。我做了十多年一线开发从早年手写SQL拼字符串到现在带着团队用AI agent跑代码审查、写单元测试、生成样板逻辑中间踩过的坑能装一箩筐。今天这篇不聊虚的就围绕代码大量由AI产出这个现象把它背后的工程逻辑、真实收益、隐形成本和实操方法掰开揉碎讲清楚。不管你是刚接触AI应用开发的新手还是已经在团队里推AI编程流程的老兵都能从里面找到能直接抄作业的东西——尤其是那些看起来跑得通、上线就炸的坑我会把排查链路一条条摆出来。先说清楚一件事我全程不站队暂停论也不盲目吹AI。我只讲工程事实以及一个普通开发者在大模型深度参与写代码之后该怎么调整自己的姿势。1. 一家AI公司的反水80%代码由机器产出到底意味着什么1.1 乍看矛盾的新闻其实是一次精准的自我暴露很多人第一反应是作秀但如果你真在一线写过代码会明白这个组合出现的必然性。一个公司的代码由AI贡献80%说明它的研发节奏已经被AI能力绑定了。这时候站出来说我们该慢一点往往不是因为良心发现而是因为他们是第一批撞到墙的人。跑得最快的团队最先看到悬崖。这个逻辑跟自动驾驶很像。真正天天跑L4路测的团队反而对全无人驾驶明天落地最谨慎。不是因为他们技术差恰恰是因为他们知道剩下那5%的corner case有多难搞。同样的AI写代码在生成这一环早就过剩了难的是验证和担责这两环。代码基越大验证成本就越指数级上涨。我自己带过一个中等规模的后端项目峰值时候AI生成代码占到提交量的七成左右。一开始爽得不行需求进来提示词一写半小时出几百行。但三个月后我们做了次统计发现修复AI引入缺陷所花的时间已经接近它帮我们省下的时间。这个省时间的账很多人根本没算过。1.2 80%这个数字到底是怎么算出来的这一点特别值得掰扯因为不同口径下差距巨大很多人被数字忽悠了。统计口径典型数值区间实际含义按代码行数60%-85%包含大量样板、getter/setter、配置文件按函数个数40%-70%小函数占比高AI擅长拆小颗粒按核心业务逻辑15%-40%真正决定系统行为的部分按人工修改后留存30%-55%计入人类重写、纠错的部分你看同样的项目换一个统计维度结论能差三倍。所谓80%代码是AI写的大概率是按行数或按提交量统计的这里面塞满了自动生成的DTO、单元测试桩、类型定义。真正决定业务正确性的那段代码人类参与度往往远高于80%。提示当有人拿AI写了X%代码说事时先问一句统计口径。行数统计是最容易注水的指标就像用代码行数衡量绩效一样不靠谱。1.3 为什么写得越快喊停的人越焦虑实验室里让AI写一个快速排序三秒钟出结果还能顺便给你加注释、加边界判断、加测试用例。但真实业务系统不是算法题它长这样依赖三十个内部服务跑在两种数据库上有历史遗留的兼容分支还有一堆没人敢动的老代码。AI擅长的恰恰是孤立问题而工程系统的价值恰恰藏在关联里。当你把80%的代码生成工作交给AI你其实是把局部正确的产出大量注入到一个需要全局一致的系统里。短期看交付快了长期看系统的一致性在被悄悄侵蚀命名风格开始分裂错误处理方式五花八门日志格式三套并存。这些不是bug但它们比bug更难修。这就是那家公司呼吁暂停的现实基础——不是AI不行是工程的消化能力跟不上生成速度。消化能力包含代码审查、测试、部署验证、故障响应这些都是慢工序你前端生成得再快后端堵住了就是白搭。2. AI写代码的真实工作流从提示词到合并请求中间发生了什么2.1 我在项目里跑通的AI编程闭环先给大家看一眼我们团队现在实际用的流程跑了大半年相对稳定。它不是让AI写代码这么简单而是一整套需求进入后先由人写一份结构化的任务描述包含输入输出、边界条件、依赖模块、验收标准。把这份描述连同相关模块的代码上下文一起喂给模型让它在给定上下文里生成代码而不是凭空写。生成结果先过静态检查类型、lint、格式化不通过的直接打回重生成。通过静态检查的代码再跑单元测试。测试用例优先由人写关键路径AI补充边缘用例。人工审查重点看逻辑分支、异常处理、并发安全、资源释放。合并进主干进入CI流水线。这里每一步都有讲究。第一步那个结构化任务描述其实就是提示词工程的核心产物很多人跳过它直接开写结果就是模型输出一堆看着对、用着错的代码。2.2 提示词的质量决定产出下限上下文决定上限我踩过最深的坑就是我认为模型知道。比如我让它写一个订单超时取消的逻辑它给我生成了一个漂亮的定时任务但完全没考虑我们系统用的是延迟消息队列。为什么会这样因为我没给上下文。模型不读心它只读你给的token。后来我总结出一个可复用的提示词模板实测能显著降低返工率任务为订单模块实现超时自动取消。 技术栈Java 17 Spring Boot 3消息中间件使用延迟队列。 约束条件 1. 超时时间从配置读取默认30分钟。 2. 只取消未支付订单已支付订单忽略。 3. 取消后需发送一条通知事件事件格式参考 OrderEvent 类。 4. 必须处理消息重复消费幂等。 5. 日志使用 log.info关键节点必须打点。 输出要求只给出核心方法实现和必要的类定义不要解释。这个模板里技术栈、约束、输出要求缺一不可。技术栈决定了API幻觉的概率约束决定了逻辑正确性输出要求决定了你是不是要在一堆废话里捞代码。注意如果你用的是具备长上下文能力的模型把相关类的源码直接贴进去比用自然语言描述我们的OrderEvent长这样要靠谱十倍。上下文里的真实代码是压制幻觉最有效的手段。2.3 审查环节才是真正的瓶颈生成快不代表交付快。我们做过计时统计一个中等复杂度的功能AI生成代码平均耗时8分钟但人工审查加修改平均要花45分钟以上。也就是说省下的是打字时间没省下思考和验证时间。很多人推广AI编程时候只算前半段账忽略了审查成本。更麻烦的是审查AI写的代码比审查人写的代码更累。原因很简单人类同事写代码有惯性风格相对稳定你能预判他的思路AI每次都是随机一位资深工程师的水平风格漂移大你还得防着它在某个不起眼的地方埋了个逻辑反转。我现在的做法是把审查重点从代码风格转移到行为和边界。风格交给格式化工具人只看三件事——这个分支覆盖全了吗异常路径处理了吗有没有引入新的外部依赖尤其是最后一条AI非常喜欢给你悄悄引入一个新库来解决小问题这在供应链安全上是个雷。3. AI辅助编程暴露出来的四个硬伤3.1 看起来能跑实际边界条件全错这是最典型的坑。你让AI写一个计算两个日期之间工作日天数的函数它给你写得漂漂亮亮工作日判断、周末跳过都有。你测了一个正常case通过。上线之后发现跨年的时候少算了一天因为它没处理闰年里的节假日偏移。我在实际项目里遇到的经典案例AI生成的金额计算用了double而不是BigDecimal。单元测试跑的数值恰好不涉及精度丢失全绿。结果生产环境一笔9.9元的订单金额对不上。这种错不是逻辑错是领域认知错。模型知道Java有BigDecimal但它不知道钱这个语义下必须用BigDecimal。怎么防两个字场景。让人在提示词里明确领域约束或者在审查时专门盯着数据类型。金融、时间、并发、字符编码这四个领域是精度问题的重灾区必须人工过一遍。3.2 依赖库版本与API幻觉大模型有个很麻烦的特性它会自信地编造。你问它Spring框架里某个类的某个方法它可能给你一个存在但签名不对的或者干脆是它自己拼出来的。尤其是新版本API模型的训练数据里可能根本没有。我遇到过一次AI给了一段用到了某个HTTP客户端的新式链式调用看着特别现代。结果一编译方法不存在。它把两个不同版本的API特征混在一起了。这类问题的排查很费劲因为报错信息指向的是方法找不到你得反查到底是哪个版本才有这个方法。幻觉类型表现形式排查方式方法不存在编译报错找不到符号查官方文档对应版本签名不对参数类型或数量不匹配对比IDE提示依赖版本错配运行时NoSuchMethodError查依赖树配置项名称错启动时配置未生效查配置元数据应对方法很朴素编译和静态检查必须是流水线的第一道闸门。任何AI生成的代码没通过编译不许进入下一环。这一步能拦掉至少三成的问题。3.3 安全漏洞AI会顺手写出攻击面这个可能是最被低估的风险。AI模型在生成代码时对安全边界的意识是不稳定的。你让它写一个根据用户ID查询用户信息的接口它可能直接拼SQL字符串而不是用参数化查询。它也可能把用户输入直接拼进命令行、直接写入日志。我做过一次内部扫描把AI生成的接口代码用静态安全分析工具跑了一遍SQL注入、日志注入、路径穿越这三类问题出现的概率明显高于人工代码。原因很直接模型在训练时见过大量教学示例而教学示例为了简洁常常省略安全处理。注意任何由AI生成的、涉及外部输入的代码都必须过一遍静态安全扫描。这不是可选项是必选项。把安全扫描工具接进CI让它自动拦住问题代码。还有一个更隐蔽的AI生成的测试代码本身可能有逻辑缺陷导致测试假通过。比如断言写得太弱assertNotNull代替了assertEquals测了等于没测。3.4 测试覆盖率好看但自己给自己打分AI写完业务代码你让它顺便写测试它经常能给你堆出很高的覆盖率。但覆盖率是个很容易骗人的指标。它只能说明这行代码被执行过不能说明这个断言验证了正确行为。我见过最离谱的一次AI生成的测试里把被测函数的期望值直接等于函数自己的返回值——也就是说assertEquals(func(x), func(x))这种结构。它永远通过但什么都没验证。这类测试你要是不细看覆盖率报表上一片绿色会给你巨大的虚假安全感。我的对策是关键路径的测试必须由人写或者至少由人审。AI写的测试可以用但要重点看断言部分。断言弱、边界少、mock过度是三个典型特征。4. 当代码大量由AI产出工程体系该怎么改4.1 代码审查策略从看风格转向查风险传统代码审查花大量时间在命名、缩进、注释上这些在AI时代可以完全自动化。人力应该被重新分配到高风险区域。我们现在的审查清单大概长这样是否存在不安全的输入处理是否引入了新的第三方依赖版本是否明确异常分支是否覆盖失败时是否可回滚并发场景下是否有共享状态资源连接、文件、流是否确保释放是否有硬编码的配置、密钥、地址这份清单每次审查都要走一遍。看起来麻烦但习惯了之后一个PR的审查时间能压到十五分钟以内而且漏掉的概率大幅下降。4.2 测试重心前移验证而不是事后补救AI生成代码的节奏很快如果验证跟不上就会形成生成—积压—集中爆发的雪崩。所以测试必须前移最好在生成的同时就把验证条件定义好。我们现在的做法叫先写验收标准再生成代码。也就是说先由人把输入输出、边界条件、异常场景写成一份清单甚至写成测试用例骨架然后让AI在这份标准下去实现。这样代码和验证是绑定的返工率明显降低。做法AI生成用时返工率整体交付周期先写后测事后补测试快高长先定标准再生成略慢低短边生成边验证中等最低最短数据不一定精确但趋势很稳定把验证前置总周期反而更短。这跟慢就是快是一个道理。4.3 依赖治理AI最喜欢悄悄加库AI解决一个看起来复杂的问题时倾向于引入一个专门的库。你让它解析HTML它给你装个解析器你让它处理日期它给你换个日期库。短期看是省事长期看是技术债堆积加供应链风险扩大。我们现在的规矩是任何新增依赖都要人工确认并且必须在PR描述里说明理由。这个规则不是为了卡人而是因为AI本身没有这个项目已经有工具类了的全局认知。你不卡它就会重复造轮子最后项目里三套日期处理方式并存。供应链安全这两年也越来越重要。一个库被投毒、被植入后门影响面可能是整个系统。AI生成代码时对依赖的来源、维护状态、安全记录没有任何判断力这个判断必须由人来补。4.4 开发者能力结构的变化如果你的工作主要是把需求翻译成CRUD代码那确实会比较焦虑。但我观察到的一线情况是真正被替代的不是开发者而是翻译型工作。新的能力结构在往两个方向走一是问题定义能力。你能不能把模糊需求拆成清晰的、可验证的任务描述这直接决定了你指挥AI的效率。这本质上是系统设计能力只是输出对象从人变成了模型。二是工程把关能力。你能不能看出AI产出里的隐患能不能设计出拦住问题的流程。这是从生产者向质检员架构师的转变。我自己这两年最值钱的技能不是写得快而是一眼看出哪里有问题。这个能力没法速成得在真实项目里被坑过才长出来。5. 呼吁暂停AI开发背后的真实诉求不是停是换个节奏5.1 暂停论的几种版本别被情绪带走行业里喊暂停的声音其实内核并不统一至少能分出三种第一种是安全派担心能力发展速度超过安全对齐速度这个层面讨论的是长期风险。第二种是工程派说的其实是消化能力跟不上生成速度呼吁的是工程流程的成熟这家公司更接近这一类。第三种是商业派纯粹是节奏和利益博弈。对一线开发者来说第三种跟你没关系第一种太远真正和你相关的是第二种。因为你的日常痛点就来自这里需求进来得快、代码生成得快、但验证和上线还是那么慢中间积压了一堆未经验证的代码。所以别被暂停两个字带节奏。它落到工程上讲的就是一句话把生成速度压到验证能力能承受的范围内。这不是倒退这是工程常识。任何系统的吞吐量都取决于最慢的那一环。5.2 一线开发者真正该盯住的三件事与其关心行业大佬吵什么不如盯住自己手里的三件事第一你的验证能力有多强。测试覆盖率、自动化程度、CI流水线是否能在十分钟内跑完一次完整验证。这是你的真实产能上限。第二你的代码是否可追溯。每一段AI生成的代码未来出问题时你能不能快速定位它是什么时候、因为什么需求、由谁审查进来的。这不是合规要求这是排障需要。第三你的团队有没有共同约定。提示词模板、审查清单、依赖准入规则这些约定听起来琐碎但它们是让AI产出可用的前提。没有约定的团队AI写得越多系统越乱。5.3 给团队落地AI编程的几个实操建议如果你要在团队里推AI编程流程我按优先级给你几条先从非关键路径开始试点比如工具脚本、内部后台、测试辅助代码。别一上来就用在核心交易链路。建立共享的提示词库。把跑通的好提示词沉淀下来新人直接复用能少走很多弯路。把静态检查和测试设为强制闸门。没过检查的代码无论谁写的一律不许合并。依赖准入白名单制度。新增库需要review避免供应链风险。定期做AI代码专项扫描。用安全工具扫一遍AI占比高的模块把隐患提前暴露。这几条里第3条是底线第4条最容易被忽略但影响最大。我在项目里见过最严重的生产事故起因就是AI引入了一个不活跃的第三方库出问题后没人能修。6. 我自己用AI写代码的边界与工具箱6.1 哪些活我放心交给AI哪些我坚决自己来干了这么久我给自己画了一条清晰的边界线。这条线不是拍脑袋定的是被坑出来的。放心交给AI的样板代码比如DTO、VO、简单的映射转换。工具函数输入输出明确、纯逻辑、无外部依赖的。单元测试骨架尤其是参数化测试的排列组合。代码注释和文档初稿。正则表达式和各种格式转换这类我以前最头疼现在直接扔给AI效果很好。报错信息的解释和初步排查方向。坚决自己来的涉及金额、时间、并发的核心逻辑。安全相关的代码认证授权、加密解密、输入校验。数据库迁移脚本和schema变更。系统间的接口契约设计。性能敏感的代码路径。这条线的判断标准其实很简单出错代价越高的地方人类参与度越高。金额算错要赔钱权限写错要出事迁移脚本写错可能丢数据。这些地方AI可以给建议但最终敲定的必须是人。6.2 我的工具箱和选型逻辑工具选型这一块我不做具体品牌推荐因为各家产品迭代太快今天好用的明天可能就变样了。但我可以说说选型逻辑这个更耐用。第一看上下文能力。能不能把整个相关模块的代码喂进去是决定输出质量的关键。上下文窗口越大幻觉越少。第二看与现有工程的集成度。能不能直接读代码库、能不能在IDE里生成diff、能不能跑测试这些决定了工作流的顺畅程度。脱离工程的AI工具用起来很别扭。第三看可控性。能不能配置、能不能定制提示词、能不能接入内部规范决定了你能不能用它来维护一致性。这三条里第一条最影响效果第三条最影响长期。很多人只看第一条用起来发现输出风格和项目格格不入最后放弃。6.3 一个我用了很久的人机分工口诀最后分享一个我自己总结的分工口诀四个字概括想人写抄AI。想指的是设计、判断、取舍写指的是实现、填充、重复。设计和判断必须人来实现和填充可以交给AI。反过来用——让AI去设计、让AI去判断然后用AI的输出去填就会出大问题。这个口诀在实践里特别管用。每次我准备把一个任务交给AI之前先问自己这个任务的想部分我做完了吗如果没做完先别让AI动手。因为AI会用它自己的想来填补你留下的空白而这个想很可能不符合你的语境。6.4 关于暂停这件事我的个人看法回到标题那件事。我个人不认为AI开发应该停但它确实需要一个刹车片。这个刹车片不是限制能力而是限制速度。就像跑车一定要配好刹车不是因为跑不快而是因为能刹车才敢开快。对一线开发者来说这个刹车片具体就是一套能拦住问题的验证流程一组能追溯来源的记录一份团队共同遵守的约定。有了这些AI写80%代码也好90%也好你都接得住。没有这些哪怕只写30%系统照样会失控。我在实际使用中发现真正决定AI辅助编程成败的从来不是模型有多强而是你有没有把验证这一环做好。模型再聪明你不验证它就是高速公路上没刹车的车。反过来哪怕用的是普通模型的普通版本只要验证到位、边界清楚产出照样能稳定上线。最后再分享一个小技巧每次AI给你生成一大段代码之后别急着复制先让它自己解释一遍这段代码在边界条件下会怎么表现。这一问经常能帮你挖出它没考虑到的case。问一次的成本很低但能省下你上线后排查故障的整个晚上。这个习惯我坚持了快一年救过我不止一次。
返回列表