ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

AI生成了百万行代码之后:工程治理、Codex实践与代码审查新范式

AI生成了百万行代码之后:工程治理、Codex实践与代码审查新范式 “AI写了100万行代码”这件事先是成了一条新闻随后变成了一个不太好回答的工程问题。OpenAI的确在大量使用AI生成的代码这件事本身并不神秘真正值得拆开看的是他们怎么不让这一百万行代码变成一场事故。代码生成早就不是新鲜事真正让工程界焦虑的是当AI的产出规模达到百万行级别时传统代码评审、所有权归属、依赖管理、以及“到底谁对这段代码负责”的规则全都开始松动。这篇文章我会结合OpenAI Codex的设计思路以及我在真实项目里折腾AI编程工具的体会聊聊“驾驭AI代码”这件事到底意味着什么。1. “100万行AI代码”的真实含义先别纠结数字而是建立衡量维度先说一个反直觉的结论一百万年代码这个数字放在今天的软件工程里既不算大也不算重要。一个成熟的中型公司核心代码加上周边服务随随便便就是几百万行一个大型单体仓库上千万行也不稀奇。所以OpenAI跑出来说“AI写了100万行代码”如果只是字面意义上的行数那不过是毛毛雨。真正的信号是这些代码不是AI自己闷头写完就完事了而是已经和其他人类工程师写的代码一样进入了正式的产品库、和现有系统一起编译、测试、上线。这件事之所以值得认真对待是因为它绕过了一个传统假设软件工程的所有方法论几乎都默认“代码是人在写”。代码评审是人看人的代码模块设计是人为人留接口代码规范是人约束人的风格。现在混入了AI的产出这套游戏规则必须从底层重新审视。AI写代码不是“加速打字”而是改变了一种生产关系的输入来源。1.1 代码行数为什么成了最“没用”的指标我的经验是只要你开始用行数来评价AI编程工具就已经掉进坑里了。行数度量在传统项目里就不可靠在AI生成场景里更不靠谱AI可以在一条表达式里写完的逻辑拆成十行也可以在十行注释后面藏一个错误的实现。你真正需要关心的是两个指标AI代码的占比AI代码的事故率其中一个更隐蔽的问题是AI生成代码的风格往往“过于流畅”。代码读起来很顺结构清楚边界条件看起来处理了但它仍然可能在某个细微的地方出错。行数无法反映这种风险。我见过一个团队接入AI编程助手以后代码产出量每小时翻了一倍但系统稳定性反而下降了。原因很简单AI把“看起来正确”的代码写得更快了而人的review精力并没有跟上。所以当OpenAI说“AI写了100万行代码”时我更愿意把这句话理解为他们已经建立了一套体系让AI代码以一个可控的比例融入正式产品而不是让AI甩开膀子量产垃圾。那些对外公开的AI生成代码占比虽然吸引眼球但内部真正被追踪的一定是“AI代码导致的故障数”、“AI代码被revert的比率”这类质量指标。1.2 真正需要管理的是“AI参与度”我觉得“AI写了100万行代码”这个说法的真正提法应该是“AI参与了100万行代码的开发”。很多代码不是纯靠AI从零生成的而是工程师给出一段思路让AI补全或者AI写了个初稿工程师改了不少。这种“参与度”的管理比单纯给AI标个“作者”复杂得多。我在实际项目中喜欢给代码标注“AI参与度”类似食材溯源AI生成人工修改低于10%AI生成人工修改10%~50%AI辅助主要逻辑人为设计完全人工编写为什么要这么做因为维护成本完全不同。完全AI生成的代码review时要当作“陌生同事的PR”来严格审视高度人工参与的代码信任度可以高一些。OpenAI自己显然也是这个思路比如Codex会在生成代码时保留上下文记录让后续的review者知道这段代码是在什么指令、什么约束下产生的。这种“AI参与度”管理不是为了甩锅而是为了给审查链提供依据。代码出问题不可怕可怕的是出了问题以后你要花两小时才能弄清楚这段代码的意图是什么、哪些约束条件被考虑到了、哪些地方是AI自作主张。溯源能力才是驾驭百万行AI代码的第一块基石。2. OpenAI驾驭AI代码的核心武器Codex的上下文与契约式开发聊到OpenAI怎么驾驭AI代码就绕不过Codex。Codex在2025年正式变成一个agent产品后彻底改变了“AI写代码”在工程体系里的位置。它不再是一个坐在IDE里等你按Tab键的补全工具而是一个能自己打开repo、读懂issue、修改代码、跑测试、甚至提交PR的“虚拟同事”。我觉得Codex最值得学的不是某一个模型有多强而是它背后那套“上下文即契约”的协作方式。这里我展开说说。2.1 从“自动补全”到“自动执行”的本质差异很多人以为自动补全和coding agent的区别只是“动作范围变大了”——一个补函数一个改仓库。实际上两者的工程逻辑有本质区别。自动补全的目标是“减少打字量”它的核心场景是人已经有了清晰的意图AI负责把想法翻译成语法正确的代码。而coding agent的目标变成了“替代人在仓库里执行一系列操作”它的关键词是“执行”和“闭环”。当agent能自己扫描代码库、定位相关文件、修改多处调用、运行测试并迭代时人就从“写代码的人”变成了“给代码提需求的人”。这要求agent必须具备很强的环境感知能力——知道当前仓库的结构、依赖关系、编码规范以及残缺信息下的纠错能力。我在把Codex接入一个中型项目时最大的感受是它会主动看测试用例。生成一个新模块时它会自己去看现有测试的风格模仿已有的断言写法。这一点很多本地补全工具做不到因为它们只盯着当前文件而agent是把整个仓库当作上下文。2.2 “上下文即契约”为什么把需求写清楚比会写代码更重要OpenAI内部在推进Codex落地时特别强调了一个理念把任务描述成一份“契约”而不是一句模糊的话。这个思路对我个人影响很大。以前我们给人派活可以说“把登录模块优化一下”对方会根据经验脑补细节。但给AI派活它不会“脑补”它只会从你给的上下文里猜然后自信地猜错。所谓“上下文即契约”是指你提供给AI的所有信息——问题描述、目标文件、相关代码、测试结果、禁止事项——共同构成了一份对AI行为的约束协议。AI输出的代码本质上是在这组约束下的解。约束越清晰解越可控。我整理过一份比较实用的Codex任务模板大概长这样任务背景当前系统的架构是什么涉及哪些服务。需求描述这次要做什么成功的标准是什么。限制条件不允许改动哪些模块、必须兼容哪个API版本、性能要求。参考上下文已有类似实现、相关配置文件、测试样例。验收方式用哪些测试命令来验证期望得到什么结果。有了这套模板AI生成代码的“脱轨概率”会大幅下降。我之前让Codex重构一个小服务第一版直接改坏了四个调用方原因就是我忘了告诉它“这些接口被外部系统依赖不能改变函数签名”。加了这条禁止事项以后它给出的方案就收敛多了。这就是“契约”的价值。2.3 沙箱执行与验证闭环Codex这类agent能够被信任另一个重要原因是它跑在沙箱里。所谓沙箱执行是说agent的代码修改并不会直接落到主分支上而是在一个隔离环境里执行跑完测试以后再由人审阅合并。这里有一个很多人忽略的细节Codex是带目标性执行测试的。它不只是“能改代码”还会在改动后自动运行相关测试看看是否破坏了现有功能如果测试挂了它会根据报错信息继续调整循环往复直到测试通过。这种“执行—验证—纠错—再验证”的闭环才是它敢自称coding agent的底气。如果只是让AI生成一大段代码然后黏进项目里那它和高级补全没有本质区别。只有把生成、验证、修复这三件事串成一条链AI才算真正参与到软件开发流程里而不是悬浮在生产环境之外。我在自己的项目里复刻了这个闭环每次让AI改完代码我会把它放进容器里跑一轮完整的lint、单元测试和集成测试然后把报错原样丢回给它让它自己修。这个方式看起来笨但效果极好。它逼着AI在一个有反馈的环境里工作而不是一次性赌博式地输出一个“可能正确”的结果。3. AI代码涌入仓库后的四大治理挑战所有权、审查、依赖与可维护性不管训练得多好AI生成代码都会在仓库里留下三类问题看起来都对实际上有隐藏边界风格不一破坏可读性依赖幻觉引入不存在的包或过期的API。如果说Codex这类agent解决的是“能不能生成代码”那接下来这些问题解决的是“能不能长期维护这些代码”。这比生成难得多。3.1 让AI代码可追踪来源标记与责任人声明传统代码的所有权靠“git log”就够了。哪一行谁写的一查便知。AI代码进入后git author那栏只能看到工程师的名字但背后的生成工具、模型版本、参数、当时的prompt全部丢失。一旦出现线上故障工程师会一脸无辜“这段代码不是我想出来的是AI写的。”所以要让AI代码可控第一步就是让代码可追踪。我的做法是在项目里搞了一个自动化标签机制合并AI生成代码时PR描述里必须带上“AI参与度”和“生成工具版本”。更严格的话可以在代码文件头部的注释里打上特殊标记比如# generated_by: openai-codex # date: 2025-06-12 # context: task_2048_refactor_auth # review_status: human-reviewed这不是为了追责而是为了后续的维护者能理解代码的“出身”。一段带标记的AI代码出现bug维护者可以更快判断是prompt理解错了还是模型当时的输出有问题避免把一个意外当成普遍规律。OpenAI内部对这类标记也执行得很细。他们要求每个改动都要与某个work item关联AI生成的代码必须能追溯到触发它的issue。这样后续的代码评审可以沿着责任链反向检查而不是面对一大段凭空出现的代码发呆。3.2 代码审查的新姿势审“意图”而非审“语法”过去人review代码第一件事是看语法、看风格、看结构。但AI生成的代码在语法和风格上往往挑不出大毛病真正的问题是“意图错位”——AI以为自己理解了需求其实它理解偏了。所以AI时代的代码审查重点要从“挑语法毛病”变成“确认意图是否对齐”。审查者要问的不再是“这段代码有没有bug”而是“这段代码是否实现了任务描述里要的那个行为”。这要求审查者手上必须有原始的需求描述而不是只看着diff。我在审查AI代码时的实际操作是先看PR描述里的“任务契约”再跑一遍agent的执行日志看它做过哪些尝试重点检查AI在“边界条件”里的处理比如空数组、超时、权限异常最后才看实现手法。这样做最明显的好处是把review从“逐行阅读”变成了“按目标核验”。效率提升不少而且不太容易漏掉关键问题。OpenAI在Codex的产品设计里一直强调让agent保留执行轨迹本质上就是为了让人review时能够还原AI的思考路径而不是对着一堆最终代码猜来猜去。3.3 依赖与供应链安全AI最容易在看不见的地方翻车AI写代码时最大的安全隐患我首推依赖幻觉。模型会基于训练数据里的记忆生成一段import某个第三方库的代码但这个库可能根本不存在或者版本早已被废弃。人在review时很少去怀疑import语句因为它看起来太正常了。在“100万行AI代码”的假设下哪怕只有百分之一的概率引入不存在的依赖那也是一万个隐患。OpenAI自己的处理手段很直接在codex环境里强行约束依赖解析任何未被环境锁定的包都禁止被agent使用。相当于给AI画了一个“依赖白名单”。我建议任何引入AI代码的团队都做三件事锁定依赖版本锁文件必须通过官方包管理器生成不允许AI自己往配置文件里塞依赖。启用依赖扫描在CI流水线里跑依赖安全检查一旦发现新引入的第三方库立刻告警。禁止AI直接升级依赖升级依赖这种操作要么走专门的安全机器人要么留给人工操作不要让agent顺手做了。依赖问题比代码逻辑问题更隐蔽也更致命。逻辑错了测试大概率能拉出来遛一遛依赖错了可能部署到生产环境才爆雷。4. 从“写代码”到“管代码”工程流程如何被AI Agent重构当AI能写一万行代码、十万行代码以后整个软件工程流程必须跟着变。以前流程的核心是“让人高效地写代码”现在变成“让AI高效地产出可信代码让人专注做决策和兜底”。这不是口号而是实打实的流程改动。4.1 需求到实现AI Agent不是替代需求工程而是加速需求落地很多人担心AI会替代程序员我觉得AI最先替代的其实是“需求的翻译层”。人提出模糊想法AI一手把这个想法变成代码听起来很快但代价是跳过了需求分析这个环节。传统开发里程序员会问产品经理“你说的‘优化搜索’是指响应时间、排序结果还是搜索历史”程序员会追问是因为代码是他在写他必须搞清楚。但AI不会追问至少现在不会。因此在AI Agent参与的流程里需求工程变成了一道刚性工序。你可以不写冗长的PRD但至少要在任务描述里把“验收标准”写清楚。我在项目里让Codex工作前必须先在issue里写上“DoD”Definition of Done没有DoD的任务不允许提给agent。这个习惯让代码返工率低了非常多。4.2 CI/CD流水线需要为AI代码增加“规则防线”传统CI流水线做的事情是拉代码、跑测试、构建产物、部署。AI代码进入后流水线里最好加几道“AI专属检查”否则会很被动。我推荐在流水线里增加这些关卡AI代码来源检查检查PR里是否声明了AI参与度如果没有打回。依赖防篡改对比lockfile变化禁止绕过包管理器改依赖。契约一致性检查如果任务描述里规定了接口不变就自动diff一下公开接口发现变了直接fail。测试范围覆盖检查AI改动涉及哪些模块对应模块的测试覆盖率是否达标。严格来说这些检查不一定要“禁止AI”而是给整个系统设一条底线。AI可以自由发挥但底线不能突破。OpenAI对这类“规则防线”的重视程度非常高他们内部把代码变更的自动安全策略称为“canary gate”一个变更如果在预检阶段没通过连创建PR的资格都没有。4.3 用数据衡量AI代码的“健康度”有了AI代码以后团队不能只凭感觉说“AI写得好不好”必须量化。我建议长期跟踪以下几组数据指标说明理想趋势AI代码占比新增代码里AI参与的比例按团队节奏划定合理区间AI代码审查驳回率第一次review就被驳回的比例下降AI代码回滚率因线上问题被revert的比率下降且低于人工代码AI代码测试覆盖率AI产出代码的单测覆盖率高于基准线AI修复效率从反馈到修复的平均时长越短越好这些指标不是用来考核人而是用来判断“AI在哪个环节需要更多约束”。比如我发现某个服务的AI代码回滚率偏高那很可能是因为这个服务的上下文特别复杂prompt里的契约没能覆盖关键细节。于是我会加强该服务的上下文描述而不是粗暴地禁用AI。OpenAI在公开分享里也提到过类似逻辑他们衡量AI编程工具的成功不是看生成量而是看“代码通过评审的比例”和“线上故障下降的比例”。这两个数字才是驾驭能力的真实体现。5. 我的实操心得与避坑清单在真实项目里“驾驭”AI代码说了这么多OpenAI的做法最后分享一下我自己在项目里折腾AI编程踩过坑以后沉淀下来的几条实操心得。如果你正在考虑把AI大模型编程工具引入团队或者已经被那一堆AI生成的代码搞得头大这些内容应该能用得上。5.1 让AI解释它自己生成的代码是审查第一步不要急着review AI代码的细节。我的习惯是让AI用三句话解释“它做了什么、为什么这么改、有什么风险”。这一步能筛掉一半以上的糊涂账。AI写代码时如果它的解释流利清晰那通常是真的理解了如果它开始含糊其辞用“优化了性能”、“改进了结构”这类空话那就要警惕了——它可能只是从训练数据里拼凑了一段相似代码。实操办法直接把diff丢给AI让AI自己总结。如果总结和PR目标对不上那这个PR基本可以直接打回。5.2 宁可拆小任务也不要把整个模块丢给AI我最早犯过的错是给AI下达大而全的任务“帮我写一个带用户认证、权限管理、第三方登录的模块。”结果AI生成的代码看起来五脏俱全实际上一跑全是问题。后来我换了一种方式把这些需求拆成十几个小任务每个任务只涉及一个明确的变更点分步交给AI执行。小任务的好处有很多上下文更聚焦AI不迷路每次改动范围小人review起来轻松如果某一步出了问题可以快速定位是哪个prompt导致的。这和OpenAI给Codex设定的工作方式一致它们刻意限制agent的“单步变更范围”避免一次改动几十个文件后出事故无法追踪。5.3 随时保留“人工接管”的开关无论AI工具训练得多好团队里都必须有人能catch住它犯错的最后一环。不能因为测试过了、review过了就掉以轻心。我的习惯是在关键模块上保留人工code freeze某些核心服务不允许AI直接修改任何改动必须由人写出初步方案然后再借助AI去补测试或写工具函数。也就是说AI可以做助手、做执行者但不能在这些模块里当“决策者”。5.4 模型版本升级后跑一遍“回归基准测试”大模型迭代很快Codex也在不断升级。很多团队升级完模型后发现某些以前能完成的task现在不行了或者反而变好了。这很正常因为模型的behavior会变。我给团队的建议是维护一个“AI回归测试集”里面放着20个有代表性的任务重构某段函数、补一个测试、修一个bug、写一个接口。每次模型版本升级先跑一遍这20个任务确认输出质量和风格没有明显漂移再放开给全员使用。这是非常划算的保险动作。5.5 让AI代码的决策过程透明可见最后一点也是最容易被忽略的。AI代码不只是代码它背后是一连串的决策过程为什么选用这个方案、为什么排除了另一个方案。这些决策过程如果不可见后续维护者就只能看到结果很难理解来龙去脉。因此我坚持所有交给agent执行的复杂任务都要在PR描述里带上agent的“执行摘要”——包括它读过哪些文件、尝试过哪些方案、为什么最终选择了这个实现。虽然多花一点点时间但半年以后维护这段代码的人会非常感激这份记录。说到底AI写100万行代码并不难难的是这一百万行代码背后还有一套完整的人类审查、追踪、验证、约束机制。OpenAI的技术实力固然强但我觉得他们真正厉害的地方是把“AI当同事”的工程纪律落地到了流程细节里AI负责高速产出人负责定义边界、保持警觉、持续校准方向。这套协作方式其实我们每个人都能用在自己的项目里。
返回列表