ARTICLE DETAIL

资讯详情

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

AI Coding提速却难维护?掌握这5招让代码既快又干净

AI Coding提速却难维护?掌握这5招让代码既快又干净 一聊到AI Coding我先泼盆冷水最近AI Coding成了圈子里最热的话题GitHub Copilot、Cursor、Codex这类工具用起来确实爽——写个分页查询、搭个脚手架、补个单元测试几分钟搞定。我自己在项目里也用得挺多说实话生成速度有多快后面的维护就有多头疼。团队里经常出现这种情况一个功能以前写一天现在AI半小时出代码人只要半小时改改看起来效率翻倍。可等代码进了主干过了一个月要加新需求、修bug的时候才发现那坨AI生成的代码像一团被猫玩过的毛线没人能捋清楚。更常见的是同一个项目里A让AI生成了一套写法B又让AI生成了一套风格完全不同的实现最后代码库活像个风格大杂烩。这不是AI工具本身“坏”而是我们大多数人还没找到正确使用它的姿势。AI Coding不是“打字机”它更像一个记忆力超强但没有领域判断力的结对程序员你给它多少上下文它就按照那个上下文发挥你没有约束它它就自由发挥。标题问的“写得快代码却越来越难维护”本质不是AI的问题而是我们的工程流程还没跟上AI时代。这篇内容不废话直接讲清楚为什么AI会让代码变难维护以及我在实战中摸索出来的、能让AI代码“既快又能维护”的完整手段。适合所有正在用或准备用AI编码工具的开发者、技术Leader和技术负责人。1. 先搞清楚AI Coding 为什么会让代码变难维护要解决问题先要找根源。我观察了团队里几十个项目、几百次AI辅助开发过程导致维护困难的根源基本集中在四个点上。1.1 上下文窗口有限AI看不到全局AI模型一次能看到的代码量是有限的通常只有几千到几万token。它在你当前文件里写得乐呵但往往不知道这个项目的目录结构、不同模块之间的依赖关系、现有的异常处理约定、数据库表结构、接口返回格式。所以它生成的代码经常是“局部最优但全局劣化”的产物。举例来说我们有个老项目工具类里已经封装了统一的返回值结构ResultT所有接口返回值都必须走这个包装。AI在生成一个新的Controller时根本不知道这个约定直接返回了裸对象还自己搞了个错误码枚举。表面看跑得起来但网络层、前端、网关全都对不上后面花了整整半天统一改造。类似的问题我见过太多不知道现有事务边界直接把两个原子操作揉在一个方法里不知道项目里的日志规范自己又发明了一套日志输出格式不知道缓存策略每次查询都怼数据库。这就是第一层矛盾AI的上下文窗口天生小于工程项目的信息量只要你不主动喂给它全局信息它就一定会在局部信息下做判断而软件工程的铁律是——脱离全局的局部正确最终都会变成全局的错误。1.2 生成风格随机缺乏一致性和可预测性同一个功能今天让AI写明天再让AI写两次生成的代码大概率长得不一样。有时候它喜欢用Optional链式判空有时候又回归if null有时候把逻辑写在Service层有时候全塞进Controller有时候使用Stream处理集合有时候又写传统for循环。这种不稳定性在单人项目里影响还不大但放到团队里就是灾难。代码可维护性的核心之一是“一致性”同样的事用同样的方式做后来的人才能靠模式识别快速理解。AI却天然反一致性——它每一次生成都是概率采样风格跟着训练数据走而不是跟着你的项目约定走。结果就是代码库的熵值快速上升每次维护都像在重新解读一篇新写的外语文章。我的实际感受是用AI编码工具三个月代码混乱程度顶得上过去手动开发一年的累积。这不是夸张因为人类开发者在写代码时至少会遵循自己脑子里的“个人风格”而AI会随机继承成千上万个不同开发者的混合风格。1.3 幻觉与过期API生成“看起来正确”的幻觉代码AI生成代码时会一本正经地给出不存在的库函数、错误的参数顺序、废弃的方法名。遇到冷门版本、快速迭代的框架这种现象特别严重。我踩过的坑包括生成的代码调用了已经被降级的内部接口但编译不报错运行时才炸生成了一个根本不存在的装饰器参数推荐的依赖版本是网络上已有的旧版本和当前工程依赖冲突更离谱的是让AI写一个关于文件上传的校验它胡诌了一个validateFileByMagicNumber()方法这个方法根本不存在但AI还像模像样地给它写了单元测试。这种幻觉的可怕之处不在于它报错而在于它大多数时候不报错。代码能跑测试能过但实际上用的是废弃API、隐性类型转换、或者无效断言。这些东西在功能开发时不会暴露问题维护时却会积累成一颗颗定时炸弹。1.4 复制粘贴被加速代码重复率飙升以前从搜索引擎复制代码还要改一改、检查依赖现在AI直接把经过“包装”的常见逻辑吐出来完整程度极高。好的一面是省事坏的一面是人类天生的“用进废退”——既然AI十几秒就能给出一段完整实现我们就不太愿意自己去抽象、封装、抽公共函数了。我见过一些年轻同事把AI生成的分页查询代码连续复制到七个不同的业务模块里每个模块都因为字段微调而局部改了改名字不同、逻辑相同、但有细微差异。这比“复用同一个方法”多了七个需要分别维护的版本改一个分页规则要动七处。AI让复制粘贴的成本几乎归零也让技术债的积累速度提升了一个数量级。2. 维护难的代价比你想的更具体上面说了AI代码变难维护的根源接下来我要具体说这些根源在现实中造成什么代价。只有把这些代价摆到桌面上你才会真的把“可维护性”当回事。2.1 可读性塌方没人能快速理解原有意图AI生成的代码往往“能跑但不好读”。我见过一个AI生成的函数足足180行里面嵌套了四层if、三处循环、两个try-catch却连一个注释都没有。再往下看方法的命名是一个不知所云的processData入参是两个Object。这代码无论谁来维护都得从头反推业务逻辑读懂它的时间足够自己重写一遍了。更糟的是AI倾向生成“一次性代码”把所有的处理逻辑堆在一个方法里而不是拆成多个意图明确的小函数。因为它要追求生成效率最短路径就是平铺直叙。但人对复杂度的认知带宽有限当函数超过一定规模、嵌套超过一定深度可读性就会断崖式下跌。读不懂后面的修改就不敢动改动风险剧增最后整个模块变成“固定石头”——没人敢碰只能绕道。2.2 可测试性归零逻辑揉成一团单元测试无从下手可维护性的一个重要维度就是可测试性。一个逻辑独立、依赖清晰的函数你可以轻松为它写单元测试而AI把IO操作、业务校验、状态更新、格式化输出全部揉在一起时你要么写集成测试慢且脆要么放弃测试。我们团队曾经要求所有新增代码必须带单元测试结果一位同事用AI生成了一段“Excel导入数据清洗去重合并写库”的巨型方法。他想补单测时崩溃了因为方法内部直接new了数据库Session导入了文件流还调了外部接口——根本没法做依赖隔离。最后他不得不花一下午把方法拆解成五个小函数才勉强写了几个用例。如果一开始生成时就让AI遵循“依赖注入单一职责”这段代码就根本不需要返工。2.3 可修改性恶化修一个bug会引入三个新bug维护中最崩溃的瞬间是什么不是bug本身而是你修好A问题结果B、C、D三个功能同时崩了。AI生成的一大坨逻辑内部大量共享了可变的局部变量而且变量名全是temp、data、list你改一个分支的判断条件影响范围无法控制。因为没有清晰的边界和抽象任何修改都是在雷区里走每走一步都可能引爆旁边的东西。我处理过一个真实事故一个AI生成的处理函数内部用了同一个Map去缓存中间结果多个路径交叉读写它。后来为了修一个字段为空导致的NPE我在前面加了个if(map.containsKey(...))结果另外一个分支因为依赖了“只要走到这里map必然有值”的隐含假设直接炸了空指针。排查了一下午才定位到根因。2.4 团队协作成本飙升Diff噪音让Code Review失效当代码风格不一致时每一次AI生成的改动都可能带来“重排代码”式的Diff噪音——明明是新增一个判断条件Diff里却显示整段函数被重写了因为AI把原来的for循环改成了Stream又把缩进变了。维护者做Code Review时根本看不出真正的业务变更在哪里只能被迫accept或者花大量时间逐行核对。时间一长Review就成了走过场质量防线彻底崩溃。而那些被隐藏在实际变更中的逻辑错误、副作用、潜在bug就趁着Diff噪音悄悄混进了主干。简而言之AI带来的问题不只是“代码丑”而是系统性地侵蚀可读性、可测试性、可修改性和协作流程。这四个维度一旦崩坏软件就进入了“维护黑洞”——每天花大量时间填坑新功能开发速度肉眼可见地变慢团队士气也在反复踩坑中消磨殆尽。既然代价这么沉重那我们总不能因噎废食不用AI。关键在于建立一套“AI编码人工把控”的新工作流。接下来这部分是我在实战里反复打磨出来的方法论每一条都踩过坑。3. 把AI当结对程序员而不是打字机如果只让我用一句话总结使用AI编码的正确姿势那就是不要让AI替你思考要让AI在你思考之后帮你写。什么意思就像你和一个人结对编程你不会上来就说“给我写一个支付功能”而是会先说清楚需求、约束、接口、边界条件然后让他动手。AI也一样你要先把需求讲清楚、约束写明、边界划好它的输出才在可控范围内。下面是落地时会用到的具体操作。3.1 需求先讲清楚用结构化Prompt代替一句话需求很多开发者对AI的抱怨都集中在一句话需求上“帮我写个登录接口”“生成一个用户列表页面”。AI拿到这种输入自然只能按训练数据里的“通用做法”来生成完全不会照顾你的项目上下文代码难维护几乎是必然的。我这里有个真实改进。以前我让AI生成“用户分页查询”时仅仅给了一句“写一个用户分页的service”。输出结果是标准的MyBatis-Plus分页、带PageHelper、Service继承了IService表面很漂亮——但它直接产生了大量和项目无关的依赖还不支持动态条件查询。后来我改用结构化Prompt明确指定使用项目现有的PageResultT返回值封装不要用PageHelper查询条件通过UserQueryDTO传入包含 name、status、deptId 三个可选字段必须在Service层做数据权限过滤Controller只负责参数接收排序只允许按 createTime且Direction通过参数指定生成代码后自行添加必要的javadoc类注释和关键逻辑注释。这样AI生成的代码几乎就是项目里一个老手写的风格拿到主干可以直接用维护起来不费劲。所以我的建议是投入10分钟写Prompt能省下未来10小时的维护成本这笔账怎么算都划算。3.2 拆分任务保持小步提交限制AI的“创作空间”AI最擅长的是“整段生成”但这恰恰是维护的大忌。你看人类高手写代码永远都把功能拆成小方法每个方法做一件事然后组合。AI默认不走这条路所以你得帮它把路画出来。实操上我会把一个大需求拆成一连串小任务每个小任务限定在一个文件内、涉及的行数不超过200行并要求AI在这个范围内生成。比如“写一个支付回调处理”我会拆成解析回调请求、验签查询订单、校验状态更新订单状态、记录流水发送通知、返回响应。每完成一个子任务就立即人工审查、跑测试、然后提交git。这样即使AI生成的某个环节有问题影响面也被限制在单个小提交内可以快速定位、回滚或重写不会出现那种“一次生成几千行出bug无处下手”的困境。另外我还会在Prompt里明确“不要一次性生成整个类的全部方法只需要实现指定方法”对那个AI“想自由发挥”的冲动必须用任务边界约束住。3.3 生成后立即重构将“AI初稿”视为草稿而非成品AI的产出永远只是一个“比较合理的初稿”距离“可维护的代码”还有很大一段距离。我要求团队里所有人把AI生成的代码当成草稿——不是“能用就行”而是从草稿状态开始执行一轮认真的自我重构提取意图把一个超过20行的方法拆成两三个5-8行的小方法每个方法名说明意图清理命名把a、data、item、res改成业务可理解的名字createdOrderItem等消除重复看看新代码有没有和项目里已有代码重复的功能替换成已有的工具方法或服务调用追加注释AI生成的代码往往缺乏“为什么”层面的注释你需要在关键处补上决策依据、边界提醒。这个过程其实很快因为AI已经把逻辑骨架搭好了你做的只是雕花和校直。但这也恰恰是“AI帮你写”和“AI替你负责”之间的分界线。要知道你的名字是写在代码作者上的维护的锅最终由你背。3.4 先写测试再让AI生成实现用测试框住行为“测试先行”是传统TDD的核心与AI协作时这个价值反而更大。因为测试就是可执行的规格说明它比Prompt里的任何自然语言约束都严格、都无歧义。你先把预期行为写成测试再让AI去实现只要测试过了那AI再怎么“创作”都是被框在安全区里的。我在项目里的做法是需要新功能时自己先写测试用例或者让AI生成测试再人工纠正断言先把接口契约、边界条件、异常路径钉死然后才让AI生成实现代码。比如我要写一个“库存扣减”功能我会首先写扣减成功时库存数量正确减少库存不足时抛出InsufficientStockException并且不修改任何数据并发调用时不会出现超卖。然后给AI一句“实现扣减方法满足上述单测”。这种情况下AI生成的实现即使不太优雅至少行为是正确的。后续任何人重构这个功能时也有测试兜底敢放手改。3.5 用Review清单迎接AI产出的代码在团队里推行AI编码后Code Review的检查点必须扩充老一套“看看逻辑对不对”已经不够还需要针对AI产物的特性增加专项审查项。我总结了一份适合所有AI辅助项目的Review清单严格程度按“是否触碰核心链路”调整有没有使用了不存在的库函数或方法幻觉检查特别是那些没有IDE提示的脚本、配置、DSL有没有靠“刚好顺序对”来运行的隐含时序依赖有没有在循环里做数据库查询、远程调用这类低性能操作有没有把可空值直接赋值给基本类型导致潜在NPE/自动拆箱有没有引入了重复的实体类、VO、DTO而不是复用已有的有没有把异常全部吞掉用空的catch(Exception e){}处理有没有绕开权限校验、数据隔离、事务边界有没有遵守项目既有的日志、缓存、配置规范这份清单不一定非要用在每一次小型PR上但至少每隔几次提交应该对照一遍。你会发现它不仅能挡住AI的很多烂代码也能帮团队形成“AI时代的新工程素养”。4. 团队协作与长期维护把“AI味”从代码库里清除个人层面的对策解决“怎么用AI”但一个团队要长期维护一个由AI参与生成的大型代码库光靠个人自觉还不够必须在组织层面建立机制。下面这几条是我在自己负责的团队里踩过不少坑之后沉淀下来的最有效手段。4.1 建立团队级“AI编码规范”先讲约定再讲技术我们团队花了一个下午专门讨论并整理了一份《AI辅助编码规范》。它不像传统开发规范那样写“命名用驼峰”这种细碎内容而是聚焦在“AI应该怎么被约束”上。核心条目包括禁止让AI生成超过200行不经拆分的单文件代码大功能必须拆成小任务逐个生成生成前必须提供项目上下文模块说明、相关已有代码片段、依赖清单禁止裸Prompt所有由AI生成的代码在提交前必须经过开发者自己的人工重构至少包括命名、拆分、消重生成代码必须匹配项目的现有风格模板禁止新引入一套库或设计模式除非经团队评审AI生成的PR描述、commit message需要人工改写为对维护人员友好的完整说明不能只有“add code”。这本来只是一种流程约束没想到落地效果远超预期。因为大家有了共同的操作底线代码库的混乱程度明显下降Review时的冲突也少了很多。4.2 持久化“上下文资产”喂给AI的口粮要迭代说到AI不知道项目约定那我们就想办法让它知道。我给团队建了一个.ai-context/目录放了一份精炼的项目说明文档内容包括项目整体架构和各模块职责一句话说明核心代码规范返回结构、异常处理、日志格式、事务边界本地开发环境、依赖清单和构建命令常用业务概念的术语表比如“订单状态机”里各状态的意义和流转条件最近几次典型重构的决策记录说明为什么选择某种写法。在每次让AI编写新代码前把这份文档中的相关片段粘贴进Prompt或者用支持“项目上下文加载”的工具Cursor里可以配置直接让AI读取。你会发现AI输出代码的“项目味”立刻浓了很多不再是千篇一律的通用写法。更重要的是这个文档是活的。每次AI因为缺少某类上下文而写出不符合项目约定的代码时就补一条内容进去队友们也会持续丰富它。一段时间后这个文档本身就成了团队的“活规范”新人也从里面受益。4.3 架构护栏优先模块化、接口稳定让AI只能“动局部”AI生成的代码之所以容易破坏系统一大原因是我们的架构太“松”模块边界不清晰谁都能直接修改任何一个角落。当AI被请求修改某处逻辑时它可以顺着自己的性子改到相邻模块产生越界副作用。如果架构本身有强约束AI的破坏力会被大大控制。具体做法上我推荐强化模块化设计明确每个模块对外暴露的接口和下沉到内部实现的细节。理想结构是Controller - Application Service - Domain Service - Infrastructure Repository。AI在做某个模块内的功能时只能看到这个模块相关的代码不能跨模块直接访问别家的数据库表、缓存的内部结构。这样即使AI把模块内部写得亂一点影响范围也被挡在边界之内维护时只需关注“接口是否稳定”模块内部的实现随便折腾都行只要行为不变。另一个重要护栏是稳定接口公共方法的签名尽量不要频繁变。AI最容易做的事情就是“为了省事把某个方法的返回值类型变了、参数顺序调了”这种小改动在别的模块看来就是灾难。所以我在Review时特别注重接口变化——凡是公共接口的签名、返回类型有变必须提出充分理由并在改动前全局搜索所有调用点。4.4 用工具强制兜底格式化、Lint、静态分析、CI人的自觉是不可靠的所以要把能机器检查的都交给机器。我们团队的CI流水线里加入了如下门禁格式化检查统一Prettier/Black/GoFmt不符合就构建失败杜绝AI生成的随机缩进风格Lint规则禁止显式any/Object、禁止空catch、禁止未使用的变量、禁止超过三层的嵌套或者用复杂度规则限制静态分析SonarQube检查重复代码率、圈复杂度、安全热点。如果新提交显著抬高了整体重复率就直接打回依赖兼容检查对AI推荐的依赖版本进行自动锁定仅允许使用仓库内POM/package.json中的版本禁止隐式安装新依赖测试覆盖率门槛核心模块的新增代码必须有对应的单测覆盖率低于阈值不允许合并。这些工具是硬性的人再累也有疏漏机器不会。它们把可维护性的“下限”拉高至少保证AI再怎么放飞也不会出现明显的风格灾难和结构性退化。4.5 度量和反馈让技术债“可视化”维护难度是抽象的东西但可以用数据量化出来。我们团队每季度做一次代码健康度体检把以下指标拉出来对比重复代码率、注释率不是越高越好但5%肯定有问题、平均圈复杂度、一次性提交的行数中位数、PR从创建到合并的时长、紧急热修复的次数。你可能会惊讶用了AI编码之后按理说开发效率提升了但上面这些指标往往会恶化——重复率上升、复杂度上升、平均PR行数变大、Review耗时变长。这说明什么说明AI在“快速堆功能”的同时确实在制造隐形债务。有了数据支撑技术Leader就能有理有据地安排专门的“维护窗口期”每个迭代末尾抽出一天做纯重构偿还AI加速制造出来的债务。这个反馈机制还有个额外好处它让团队里每个人都有了“可维护性意识”的数据锚点而不是靠感觉喊口号。5. 常见问题与排查技巧实录用了这套方法论一段时间以后我还是会遇到一些典型问题这里挑几个出现频率最高的附带我的排查思路和解决办法。5.1 AI生成代码格式和项目规范不一致现象AI用4空格缩进项目用TabAI喜欢单引号项目要求双引号AI用了camelCase项目是snake_case。排查先确认IDE和CI里是否安装了统一格式化工具。如果格式化没有生效大概率是因为AI生成的代码里混了一些非标准字符或语法导致格式化工具直接跳过。解决最简单的是强行先跑一遍format再提交更彻底的是在项目根目录放好统一的格式化配置然后在Prompt里加一句“严格遵循.editorconfig和项目内的Lint规则”。如果AI还是我行我素那就在CI门禁上强制格式化检查失败——让机器教AI做人。5.2 AI推荐了不存在的依赖或者用了过期API现象代码里出现一个好看的工具方法编译过了运行才报NoSuchMethodError或者依赖清单里凭空多了一个xyz-utils包。排查先用IDE的“调用层级”看一下这个方法实际来自哪个jar/包然后去Maven仓库/GitHub搜一下这个类的最新版本和废弃标记。很多AI幻觉都来自于训练数据中的旧教程。解决把该依赖版本锁定在私有仓库的父POM里并且让AI生成的代码只允许使用commons-lang3、guava、项目自带util这一类已声明依赖的类。我还会在Prompt里给AI看一小段项目正在使用的原生代码告诉它“只许使用这个仓库里已有的类”。5.3 AI生成了一个大而全的“上帝函数”怎么拆都拆不动现象一个几百行方法内部串了太多逻辑内部变量互相耦合尝试拆分时发现每个部分都要访问同一个共享的状态一拆就破坏原逻辑。排查这种函数往往是一步步堆叠出来的AI生成第一版你看不懂让它再解释一下它顺手又往里加了些逻辑。核心问题在于没有先梳理业务状态流就把一堆操作直接铺在同一个作用域上。解决我的经验是先不以“保持行为不变”为前提而是以“可理解性为最高优先级”重写。具体步骤先用git stash保存原版本再复制一份出来把函数内部的代码逐行翻译成自然语言流程找出流程中的输入、中间状态、输出按“处理输入 - 计算业务状态 - 组装输出”分段抽出三个子函数每个子函数只接收必要参数、返回明确结果用新写的单元测试验证重构后的行为这时测试应当基于需求写而不是依赖老函数的行为。如果老函数的行为本身有bug或者不符合真实需求那就更不应该“保行为”了重写反而是一种止损。5.4 团队里部分同事坚持“AI生成就够用”不肯改代码现象有人提交的PR全是AI原样生成的代码注释一句话不写函数乱命名结构一团糟。你建议他重构他说“功能没问题能用就行”。排查这其实不是技术水平问题而是“可维护性”考核没有被纳入流程。假如Code Review可以放行那在个人看来自然没动力改。解决建议从流程约束下手而不是靠劝。第一步把“AI生成后必须人工重构并补充注释”写进团队定义的可完成标准Definition of Done。第二步在CI里加复杂度/重复率门槛让烂代码直接无法合并。第三步在评审区建立反面案例讨论会把之前踩过的维护坑拿出来复盘让所有人直观看到“现在省十分钟将来还十小时”。我个人还有个小技巧让AI自己评论自己。你可以把一段AI生成的代码贴到Prompt里让它从“可维护性、可读性、性能、安全隐患”四个维度打分找问题。AI通常会列出很多它自己生成时的毛病因为它训练数据里关于“烂代码特征”的语料比“生成好代码”的语料多得多。把这个结果贴在PR评论里作为重构的理由比同事互相说嘴有用得多。5.5 多轮对话后AI越改越乱甚至破坏了原有功能现象你在一个会话里不断让AI“加个字段”“改个逻辑”“修个bug”大约三轮之后它开始把前面已确定的部分也改掉引入多余的错误甚至把A接口的行为改得影响了B接口。排查这本质上是上下文污染。模型把所有历史对话都当成同样重要的上下文新生成时既会受到早期正确指令的影响也会受到近期混乱指令的干扰而且它不具备“删除旧功能”的意识往往会把旧代码和新代码叠加在一起。解决我的操作习惯是当一次会话要执行超过3个不相关的修改时就开一个新会话把最新目标和上下文再完整描述一次每个会话只做“一件事”比如“给订单接口增加一个取消原因字段”就只针对这一个目标不要夹带其他请求如果AI修改的代码造成了回归立刻启动新的修复会话不让AI在原会话里“自己给自己找bug”。其实这条经验也适合传统多人协作一个需求一个分支一个任务一个提交乱改的主因往往是责任边界不清。6. 写在最后我现在的AI编码工作流长什么样说了这么多原则和方法最后分享一下我自己目前的实际工作流算是给你一个可以直接照抄的参考模板。第一步接到需求后我先不打开IDE也不碰AI。拿出十分钟写一段需求说明输入、输出、边界条件、异常处理、以及这个大功能里涉及的项目约定的摘要。这一步本质上是把“思考”从“实现”里剥离出来先做人脑应该做的设计。第二步把需求说明粘贴给AI让它给一个实现方案而不是直接给代码。我会要求它列出用到的类、方法签名、数据流、需要修改的文件清单。然后我审一遍方案觉得合理才进入下一步。这一步能提前把AI大部分“不符合项目架构”的问题拦在生成之前比自己写一堆代码再去改省太多事。第三步等方案确认后再要求AI逐文件、逐小函数生成代码并在每个文件生成完后立即人工走查命名、结构、重复代码。该重构的当场重构不要攒到最后。第四步所有代码生成完后我手写或让AI一起补上核心链路的单元测试并把单测纳入CI。如果之前已经有测试那生成代码前就跑一遍测试确保它是在满足测试约束的前提下实现的。第五步提交PR前对照那份“AI代码Review清单”过一遍同时给PR写清楚本次改动的原因、设计取舍、影响范围方便其他人审查和后续追溯。这套流程跑下来AI节省的时间不再是“敲代码的时间”而是“思考方案后到写出可靠实现之间的转化时间”。该省的时间省掉了该花的思考时间一分也没少而代码的可维护性和纯手工时代相比几乎没有退化甚至因为AI提供多方案对比有些设计反而更规范了。最后留一句我在团队里反复说的话AI只是个放大器你有多强的工程意识它就会放大你的效率你有多懒的编码习惯它也会一样放大你的债务。别把代码库变烂的责任推给AI从今天起把上面的方法用起来让AI既快又干净才是一个现代程序员真正该有的能力。
返回列表