1. 项目概述:从零到二十五万行代码的实战记录
这个项目是我半年前启动的一个内部业务系统,从第一行代码到二十五万行,几乎全部由AI编码工具生成。我负责架构设计与代码评审,AI负责把架构翻译成具体实现。严格来说,这不是一个“全自动开发”的项目,而是一个“人类定义边界、AI填充细节”的协作项目。
在启动之前,我最大的顾虑并不是“AI写不出代码”,而是“AI写出来的代码能不能用、好不好维护”。事实证明,这个顾虑完全正确。AI生成代码的速度快到令人咋舌——一个中等复杂度的微服务,人工写需要三到五天,AI配合合适的提示词,三个小时就能跑通主流程。但当代码量堆积到十万行以上时,真正的问题浮出水面:模块之间职责不清、命名混乱、重复逻辑遍布各处、上下文割裂导致同一个功能在多处实现。二十五万行代码里,AI生成的占比超过95%,而治理这些代码所花费的时间,占到了整个项目周期的60%以上。
这个项目的核心价值在于回答一个问题:当AI承担了绝大部分编码工作后,人的价值在哪里?我的答案是——治理。这里说的治理不是简单的代码规范检查,而是从架构约束、上下文管理、质量守门、依赖管控、技术债清理等多个维度构建的一套完整体系。下面我把这套体系拆开来讲,包括具体方案、踩过的坑、以及一些只能靠实践才能总结出来的经验。
1.1 为什么说“生成”是最不重要的部分
很多刚开始接触AI编码的人,会把注意力集中在“怎么让AI写出更长的代码”“怎么绕过限制”“哪个工具生成更快”这类问题上。这些关注点其实都偏了。以这个项目为例,AI生成代码的单次成功率大概在40%左右,如果算上“生成后能够直接通过编译+单测”的比例,可能只有20%。但这不是问题——因为AI生成代码的成本极低,失败了大不了重新生成。真正的成本在生成之后:每一段代码都要经过审查、测试、集成、重构,这些活动的复杂度是随着代码量非线性增长的。
举个具体例子。项目早期,我们用AI生成了一批REST API接口的CRUD代码,每个接口大约一百到一百五十行。AI生成这一段代码耗时不到一分钟,但当我们把这些接口接入统一鉴权、动态数据权限、操作审计、异常码映射、日志链路追踪这些横切逻辑时,每个接口都要手工修改。二十五万行代码里,这种“生成快、整合难”的场景比比皆是。所以我的结论是:AI编码项目的真正难点,从来不是生成,而是生成之后的整合、约束与治理。
1.2 治理缺失时到底会发生什么
如果不在早期建立治理机制,代码量到了一定规模后会出现一系列连锁问题。我在这条路上踩过,下面列几个最典型的:
第一,命名空间污染。AI在生成代码时会根据函数名自动推断语义,但如果上下文约束不明确,它会在不同模块里给同一个业务概念起不同的名字。比如订单状态,有的地方叫OrderStatus,有的地方叫OrderState,有的地方干脆用魔法数字。等到跨模块联调时才意识到,已经有三十多个地方定义了“订单状态”的判断逻辑。
第二,重复代码率失控。人工开发时,开发者有“复用意识”,会主动抽取公共方法。AI没有这种意识,它倾向于在每次接到独立任务时新写一份完整实现。我们用SonarQube跑出来的重复代码率峰值达到22%,这个数字在行业里属于偏高水平。
第三,依赖地狱。AI生成代码时会“顺手”引入自己认为合适的依赖库,同一个功能可能被引入多个功能重叠的库。比如JSON解析,项目里同时存在Jackson、Gson和Fastjson三个库;工具类层面,Apache Commons和Guava并存。这不仅增加了镜像包体积,还埋下了序列化行为不一致的隐患。
第四,隐含的业务逻辑分散。人工写的代码,业务逻辑通常会沉淀在Service或Domain层。AI生成的代码则不然,它会把校验逻辑、状态流转、金额计算这些散落在Controller、DTO、工具类甚至前端调用参数里,一改就炸。
这些问题单独看都不致命,但合在一起,团队迭代速度会被明显拖慢。新功能开发一小时,排查已有逻辑三天——这种状态一旦持续,项目基本就变成了一堆只能修修补补的“积木塔”。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 先建立治理基线:任何AI生成代码都必须遵循的规则
AI编码工具不是不能用,而是不能“裸用”。在项目启动的第一周,我就和团队一起定下了一套规则,这套规则后来成了项目能够维持在可控复杂度的基石。所有AI生成的代码,必须满足这些规则才能进入代码库,否则一律退回重新生成。
2.1 仓库结构与模块边界必须由人类定义
在让AI写任何业务代码之前,我们先用一周时间确定了整个仓库的结构。这是整个项目中最关键的一步,因为AI没有全局视角,它只会基于当前对话上下文或当前任务生成代码。如果仓库本身没有清晰的结构,AI会以“点状”方式生成大量逻辑纠缠在一起的代码,之后再去拆就是一场灾难。
我们最终用的是多模块Maven架构,顶层划分为common、domain、application、infrastructure、interfaces五个模块。依赖方向是单向的:interfaces依赖application,`appl
