FEATURED · 精选文章

AI写80%代码背后:如何让AI辅助开发不失控

发布时间 / 2026/9/18 10:43:47
来源 / 创域科博编辑部
栏目 / 资讯中心
AI写80%代码背后:如何让AI辅助开发不失控 很多人第一次听到代码80%是AI写的这句话脑子里冒出来的画面是人坐在电脑前喝咖啡AI在旁边噼里啪啦把整个系统写完。等真正做了一段时间AI辅助开发再回头看你会发现这个理解偏得离谱。真实情况是——人依然在写代码只不过手指敲键盘的次数少了更多时间花在描述需求、审查产出、验证行为、收拾边界条件上。一家做AI的公司把内部这个数字摆到台面上同时又在公开场合呼吁给AI开发踩刹车这两件事放在一起看着矛盾但如果你亲手维护过被AI大量补全的代码库就知道它们其实指向同一个东西生产速度和验证能力的失衡。这篇不聊虚的就把这个现象拆成几块这个80%到底怎么算出来的、它为什么一边加速一边喊停、以及作为一线开发我怎么让AI写代码但又不至于让项目失控。涉及代码、AI、AI开发的实操细节我会尽量给全也把踩过的坑摊开讲。1. 把80%代码由AI写这个数字拆开看1.1 三种统计口径结论能差出一倍先说结论同样一个团队换个统计口径这个比例可以从三四成跳到八成中间没有谁在撒谎只是口径不同。目前业界常见的算法大致有三种。第一种是字符贡献率也就是IDE插件统计的接受的建议字符数 ÷ 总输入字符数。这是最容易被引用、也最容易虚高的口径。原因在于自动补全会大量命中的是样板代码——import语句、getter/setter、日志打印、参数校验、测试用例的骨架、括号和格式。这些东西确实是你敲进去的但把它们算进AI写的代码水分很大。第二种是有效逻辑行占比。这个口径会剔掉空行、注释、纯格式只看承载业务逻辑的行里有多少来自AI生成。同一个仓库用这个口径算通常比字符贡献率低十到二十个百分点。第三种是首次可运行代码的生成来源。也就是一段功能代码第一版能跑起来的实现是谁给的。这个口径最高因为AI最擅长的恰恰是给一个能跑的初版。统计口径典型数值区间容易高估的原因字符贡献率65%–80%样板代码、格式、补全被计入有效逻辑行占比40%–60%剔除了注释格式仍含大量重复结构首次可运行版本70%–85%只统计从0到能跑这一跳提示看到任何AI写了XX%代码的说法先问一句是按什么口径算的。口径不明确这个数字就没有讨论价值。1.2 敲键量从来不等于工作量我拿一个真实的经验说明。以前手写一个数据导入模块大概三百行里面真正需要动脑的是字段映射规则、异常数据的处理策略、批处理的边界。剩下可能有二百行是重复的解析、赋值、日志、空值判断。AI把这二百行补掉了我实际手写一百行。从字符数看AI干了三分之二但从需要做决策的部分看绝大部分判断还是我做的。所以敲键量下降不等于工作量下降。它只是把工作重心从敲挪到了想和验。一个熟练开发用AI之后写代码的时间占比会从大概六成降到三成多多出来的是需求澄清、方案比对、审查diff、补测试。这不是偷懒是分工变了——你从打字员决策者变成了决策者验收人。如果团队还拿每天提交多少行代码来考核那AI进来之后这个指标立刻失真因为提交的行数涨了但其中需要人思考的比例掉了一大截。1.3 为什么这个数字容易被误读成AI能独立干活数字本身中性但它容易被拿去论证一个它证明不了的结论——AI已经能替代开发了。真实情况是AI生成的代码质量高度依赖三个前提上下文给得足不足、验收标准清不清楚、出了错能不能快速定位。这三个前提里前两个是人的活第三个是工程能力的活。我见过最典型的翻车场景是这样的需求方觉得AI都能写80%了效率肯定翻倍于是一个原本排期三周的需求被压到一周。结果AI确实一天就吐出了一份能跑的初版但这份初版在真实数据上跑了两天就开始暴露各种没考虑的边界排查又花了一周。最后总时长没省反而因为看起来快完成了而反复失信。这个误解的根源就是把生成速度当成了交付速度。生成一个能跑的原型和交付一个能扛住异常输入的模块中间隔着的是验证而验证这一步恰恰不太能靠AI自己完成。2. 一边把活交给AI一边喊暂停这家公司纠结在哪2.1 加速的是生产端没加速的是验证端这家公司的矛盾本质上是研发全链路里只有生产那一环被加速了。代码生成快了但code review还是人肉看测试还是要人写线上问题还是要人排查发布节奏还是被各种检查卡着。生产端像换了个大马力发动机验证端还是原来那根细链条结果就是链条先崩。这不是危言耸听。当一个团队提交频率翻倍、单次提交的代码量也变大时reviewer的负担是成倍增长的。以前一天review五六个diff现在进来十几个每个还更长。人一旦审查不过来就会开始看起来没问题就点通过。这一步开始代码质量的下滑是隐性的——短期没有报错几个月后开始还债。2.2 AI代码欠下的三种债我把这些年接触到的AI生成代码问题归了归类基本逃不出下面三种债。理解债代码是AI写的逻辑人没完全吃透。作者本人都说不清某个分支为什么这么写等出问题需要改的时候没人敢动。测试债AI给的初版往往自带看起来对的错觉但边界测试没跟上。空值、超长输入、并发、时区、精度这些问题在正常路径上根本暴露不出来。依赖债AI喜欢推荐依赖库来解决小问题一个功能引进来三四个包版本还各不一样。这些包长期没人维护某天出一个漏洞整个升级链路全被牵动。2.3 暂停两个字真正的落点其实是可控性很多人把这类呼吁理解成别做AI了这是误读。结合上下文去听它指向的其实是在没有建立起足够验证和监管能力之前不要把能力推得太满。换句话说喊停的对象不是写代码这件事而是无节制地加速而没有相应的安全垫。放到普通团队身上这个逻辑同样成立。你不需要跟着喊口号但你确实需要问自己几个问题AI生成的关键路径代码有没有做二次 review核心模块有没有测试覆盖线上出问题时能不能在半小时内定位到是AI补的那段还是人写的那段这几个问题答不上来那这个团队其实也在裸奔只不过没人在台上说而已。3. 让AI写代码但别失控我现在的日常流程3.1 上下文准备先把AI当成刚入职的外包我最初犯的错是把需求一句话丢给AI期待它给出完美实现。结果它给的东西方向全错来回改更费时间。后来我改用带新人的思路你不交代清楚背景新人当然做不对。具体做法是在动手前先给AI准备好四样东西项目技术栈和版本、相关模块的现有代码片段、这个功能的输入输出约束、团队已有的代码风格约定。哪怕只是把相邻两个文件的代码贴进去生成质量和凭空让它写完全不是一个量级。这一步花的时间大概是五到十分钟但能省掉后面半小时的来回修改。3.2 提示词里必须写进去的约束提示词不是写得越长越好而是要把约束写死。下面这个模板是我改了很多版之后比较顺手的可以直接抄。【任务】实现一个用户导入功能把CSV里的数据批量写入数据库。 【技术栈】 - Python 3.11使用标准库 csv 和 SQLAlchemy 2.x - 数据库为 PostgreSQL已存在表 user_import 【硬约束】 1. 文件可能很大百万行级别必须流式读取禁止一次性 read() 2. 单批提交 1000 行分批 commit失败重试一次 3. 空行、字段数不符的行直接跳过并计数不要抛异常中断 4. 所有异常必须记录到日志日志包含行号和原始内容 5. 不接受引入任何新依赖 【输出要求】 - 只给核心函数带类型注解 - 关键判断处写一行注释说明意图关键在【硬约束】这一段。你把禁止一次性read这种要求写进去它就不会给你一个内存爆炸的写法你把不接受新依赖写进去它就不会顺手给你塞一个第三方包。约束越具体后面对账越省事。3.3 验收AI代码要按别人的代码标准审一个心态上的转变很重要——把AI生成的代码当成同事提交的PR来审而不是当成自己的草稿。自己的草稿容易糊弄别人的PR你会认真看。我现在的验收清单大致是这几条正常路径跑一遍确认基本功能对构造异常输入空文件、只有表头、字段缺失、超长字段、含特殊字符的字段看资源释放文件句柄、数据库连接、锁有没有在异常路径下被正确释放看日志报错时能不能凭日志定位到具体行看有没有偷偷引入依赖或调用了不存在的接口。这个清单花不了太多时间但能挡掉大部分会在线上炸的坑。尤其是异常输入和资源释放这两条AI生成的代码在这两块翻车概率最高。3.4 一个可复用的项目级配置如果是长期用AI写代码的项目我会在仓库根目录放一个约定文件不少工具会自动读取它把项目的基本规矩固化下来。内容大概长这样项目订单服务Java 17 Spring Boot 3 规范 - 分层controller / service / repository不要跨层调用 - 统一返回体 ResultT禁止 controller 直接返回实体 - 异常统一走 BizException禁止到处 try-catch 后吞掉 - 金额一律用 BigDecimal禁止 double - 时间统一用 Instant对外再格式化 - 新增依赖需在 PR 里单独说明这个东西的价值在于它让AI每次生成代码时都自动带上项目上下文不用你反复在提示词里重复。团队里多人协作时尤其明显大家的产出风格会趋于一致review成本直接降下来。4. AI生成代码最常埋的几类雷4.1 幻觉依赖和不存在的接口AI最擅长自信地编造。它会给你一个看起来非常合理的函数名比如client.fetchBatchAsync()问题是这个方法在你的依赖版本里根本不存在。它在训练数据里见过类似的用法但和你的版本对不上。排查方法很简单但必须做生成的每一处外部调用都去实际的依赖源码或文档里核对一遍。别嫌麻烦编译报错还算好的最怕的是它编了一个同名但签名不同的方法编译能过运行时行为完全不是你要的。4.2 边界条件和异常处理被悄悄吃掉这是翻车最密集的地方。你让它写一个取数据的函数它给你一个正常路径很漂亮的实现然后数组越界没判断除数为零没处理空集合进来直接.get(0)网络超时没有兜底并发场景下共享变量的读写没加保护。这些不是AI不会而是它默认了输入是正常的。你不在提示词里明确要求处理异常它就按最省事的路子写。所以我的习惯是凡是AI生成的、涉及外部输入或资源的函数一律手动过一遍异常路径。常见雷区典型表现排查动作幻觉依赖调用不存在的方法/包逐个核对依赖文档边界缺失空值、越界、除零构造极端输入跑一遍资源泄漏异常路径下连接未关看finally/try-with-resources并发问题共享变量无保护检查是否有竞态精度问题金额、比例用浮点强制用高精度类型4.3 安全相关的校验容易被省略AI生成的代码在功能上通常没问题但在安全上常常是裸的。比如它给你一个拼接SQL的查询、一个没有做参数校验的接口、一个把用户输入直接写进文件路径的实现。它不会主动帮你防注入、防路径穿越、防越权除非你明确要求。我的做法是凡是涉及外部输入的入口生成之后必查三件事输入有没有做白名单校验、拼接有没有用参数化、返回的错误信息会不会泄漏内部细节。这三条是底线不能靠AI自觉。4.4 性能问题藏在看起来优雅里有些AI代码写得很漂亮读起来舒服但性能上有隐患。典型的有循环里查数据库N1查询、大列表反复流式转换、把整张表拉进内存再过滤、在热路径里做字符串拼接。这些在测试数据量小的时候完全看不出来一上量就原形毕露。所以我养成了一个习惯凡是AI生成的处理集合或数据的代码我都会问自己一句这段在百万级数据下会怎样。答不上来就先加个压测别等到线上才发现。5. 从辅助编码到AI应用开发这些经验能直接迁移5.1 写业务代码和搭AI应用验证逻辑是相通的热词里AI应用开发AI agent开发AI大模型应用开发这些方向现在很火很多人以为入了这个大模型的门前面的工程经验就不算数了。恰恰相反。你让Agent去调用工具、生成代码、执行动作它同样会幻觉、同样会漏掉边界、同样会在异常路径上翻车。AI帮人写代码遇到的所有验证问题Agent替人干活时会原样再遇到一遍而且更危险因为Agent的动作可能是不可逆的。所以做AI应用开发时我在辅助编码里攒下的那套约束写死、产出当PR审、异常必构造的思路直接就派上用场。区别只在于以前审的是代码文本现在审的是Agent的执行轨迹。5.2 Agent和工具调用里哪些活绝对不能全交给模型一个我在实践里反复确认的原则有副作用、且不可逆的操作必须留人工确认或硬性校验不能让模型自己拍板。比如删除数据、发起支付、对外发送消息、修改权限。这些动作让模型自主执行一旦它理解偏了后果是人来不及拦的。相对安全的、可以放开的是只读查询、信息提取、草稿生成、代码建议。这些即使错了人还有机会在应用上线前拦住。做AI应用开发的时候把这根线画清楚比纠结用哪个模型、哪个框架重要得多。5.3 团队层面怎么定规矩如果你们团队也在大量用AI写代码我建议尽早定几条规矩别等到出了问题再补。首先关键模块强制人工复核。支付、权限、数据删除这类AI可以给初版但必须有人逐行看。其次测试覆盖率不能因为AI而下降。反而应该提高因为AI生成的代码里隐藏的边界更多。再就是依赖引入要收敛。AI推荐一个包很容易但每多一个包就多一条维护链定期清理。最后留个记录标明哪些代码用了AI辅助。这不是为了追责是为了出问题时能快速锁定排查范围。工具有commit message、代码注释好几种方式选一种坚持下来就行。6. 我自己的做法和一些不太上镜的体会说到底我对80%代码由AI写这件事的态度比较平淡。数字高不高不是重点重点是团队有没有能力接住这个数字带来的变化。我自己现在的习惯是让AI多写但把节省下来的时间几乎全部投到验证上。生成快了不假但我并不追求更快提交而是追求提交了就不用返工。踩过的坑里印象最深的一次是有个数据清洗脚本AI给了一版特别干净的实现正常数据跑得飞快我就直接上了。结果生产数据里有一列偶尔是空的那个脚本直接崩在了一个没判空的位置导致整批任务中断。后来我加了一条死规矩凡是AI生成的、要处理真实数据的代码上线前必须用带脏数据的样本跑一遍。这条规矩帮我挡了后面好几次类似的雷。还有一个体会是用AI写代码这事儿收益和你的判断力强相关。判断力强的开发AI是放大器产出和速度都上台阶判断力还不够的人AI生成的东西他看不出问题反而会积累更多隐患。所以与其纠结要不要用AI写代码不如把精力放在提升自己审查代码、构造测试、定位问题的能力上。这部分能力恰恰是AI目前替代不了、也是决定你在这个行业里走多远的东西。至于那家一边用AI一边喊暂停的公司我理解它其实是在提醒所有人能力跑得太快的时候记得看一眼自己的安全垫够不够厚。对普通开发者来说这个提醒比80%这个数字本身有用得多。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻