ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

AI写代码半年实践:能力边界、翻车案例与高效工作流

AI写代码半年实践:能力边界、翻车案例与高效工作流

先说结论吧:AI写代码这事,不能一句“靠谱”或“不靠谱”就盖棺定论。我在这半年里几乎每天都在真实项目里用AI辅助开发,从最初觉得它只是个“高级补全插件”,到后来摸索出一套能上生产环境的人机协作方式,中间的落差和收获都很大。这篇文章不聊那些Demo级别的演示效果,就实打实讲讲在真实项目里AI写代码的能力边界、翻车现场,以及我现在到底是怎么用它把效率提上去的。如果你正纠结要不要把AI引入自己的开发流程,或者试过几次觉得“也就那样”,这篇文章应该能给你一些实际参考。

这半年我带的是一个中型的跨平台管理系统,后端API加前端页面加起来几十个模块。一开始我的目标也很简单:把那些“写起来没意思、但又躲不掉”的重复性代码,比如表单页面、列表页、基础CRUD接口,尽量甩给AI。半年下来,我积累了不少使用心得,也踩了不少坑,下面一个一个说。

1. 半年试用开局前,我先搞清楚了AI写代码的三种能力层次

很多人对AI写代码的期待是“一句话生成一个完整项目”,这个期望从根上就错了。我在实际使用中把AI编码助手的能力分为三个层次,不同层次的表现天差地别。

1.1 三个层次:补全、生成、重构

第一层是行内补全。你在写代码的时候,它根据上下文帮你续写下一行或下一小段。这一层AI的表现是最稳定的,类似输入法联想,只不过联想的是代码。比如我写一个函数,它能把函数体的前半部分直接补齐。这一层的价值在于减少击键次数,节省手打时间。但它的能力仅限于“局部”,它并不知道整个项目要干什么。

第二层是代码生成。你给它一段自然语言描述,或者一个函数注释,它能生成一个完整的函数、一个类,甚至一个完整的文件。这一层是大部分人说的“AI写代码”。真实表现是:对于模式固定的代码,比如根据数据库表结构生成对应的增删改查接口、生成一个表单页面的前端代码,它做得又快又好。对于需要复杂业务判断的代码,它生成的东西只能算“初稿”,甚至有时方向就是错的。

第三层是跨文件修改与重构。你让它理解项目现有代码,然后修改多个文件里的调用点、调整模块间的关系。这一层目前最不成熟。AI看似理解了项目结构,实际上它只是把代码库作为上下文塞给了语言模型,它对“项目为什么这么设计”完全没有概念。我一想到这个层次,就想起那个翻车案例——AI自信地把一个接口方法名改成了“看起来更合理”的名字,结果项目里根本没有这个方法,导致整个模块编译失败。这个我后面会详说。

1.2 我对AI写代码的初始预期管理

在真正上手前,我给自己定了三条预期,这半年证明这三条预期帮了大忙:

  • 第一,AI是用来“减少工作量”的,不是用来“替代思考”的。架构设计、模块划分、接口定义这些脑力活还得自己来。
  • 第二,AI生成的代码默认视为“第三方贡献的代码”,必须经过和同事提交的代码一样的评审和测试流程,不能因为来自AI就放松审查。
  • 第三,AI不是免费的效率提升。你需要在“写清楚需求”这件事上多花时间,否则后续返工的时间远超你省下的时间。

这三条预期可能看起来太保守,但正是这套保守的预期,让我在后来的实践中既没踩毁灭性的坑,也逐步建立了一套稳定的使用流程。

2. 真实项目半年效率实测:哪些代码AI真的靠谱

如果只用一个维度评价AI写代码,我觉得是“任务的模式化程度”。模式越固定,AI越靠谱;越需要隐性知识和项目全局理解,AI越容易翻车。

2.1 高频低难度任务:AI的绝对舒适区

先说AI表现最好的场景。举一个很典型的例子:我们的后台管理项目里有十几个基础配置页面,每个页面都是“表格+搜索栏+新增/编辑弹窗+删除确认”,逻辑大同小异。这类代码的特点是结构极其固定,唯一的区别是字段名和校验规则。

我用AI生成了其中一个完整的列表页,包括数据请求、表格列配置、分页、搜索、弹窗表单和提交逻辑。一次性生成后,我只改了大约20%的代码,主要是字段的中文标签和一些特殊的校验规则。说实话,完成质量出乎我意料。同样的页面我之前手写大概要2到3个小时,用AI辅助后40分钟就搞定,包含修改和自测时间。效率提升是实打实的3倍左右。

我把这半年在真实项目里AI处理不同任务的表现整理成了表格,方便大家直观对比:

任务类型难度AI表现需要人工修改的工作量综合评价
表单页面、列表页低一次性生成可用10%-20%强烈推荐
基础CRUD接口低结构完整,逻辑正确5%-15%强烈推荐
工具函数、日期处理中大部分逻辑正确20%-40%可推荐
中复杂度业务接口中表面正确,边界条件需补40%-60%谨慎使用
跨模块数据流转高经常“自以为正确”60%-100%不建议依赖
系统架构设计高只能提供参考几乎全部重写不建议使用

2.2 中复杂度任务:AI的及格线附近

再往上一个台阶,是中等复杂度的业务逻辑。比如一个订单状态流转的功能,一个带有多种优惠组合计算的价格服务。这类任务模式化程度中等,但隐含着不少业务规则。

我用AI写过一个带库存扣减的订单创建接口。AI确实生成了一个完整的接口,参数校验、事务注解、库存扣减逻辑都有模有样。但仔细看发现几个关键问题:一是没处理库存不足时的回滚细节;二是并发扣减的场景完全没考虑;三是返回值没有包含业务需要的订单号。你说它完全不能用吧,基本骨架确实省了我不少时间;但你说它能直接用吧,我改了将近一半的代码才敢提交。

这个场景我的结论是:AI能做一个“60分到70分”的初稿,能够帮你完成一部分体力劳动,但业务中的关键逻辑必须自己盯死。

2.3 高复杂度任务:AI的门槛

至于跨模块的数据流转、全局状态管理、并发控制、性能优化这类任务,我现在的态度是不让AI直接生成,最多让它做做参考方案。

有一次我尝试让AI重构一个多模块共享的数据缓存模块,涉及三个服务的数据一致性问题。AI生成的方案表面上看结构很合理,用了某种缓存更新策略,代码也写得很工整。但我一检查发现,它根本没有理解我们项目里一个关键的基础约束——缓存更新必须依赖某个内部消息通知,而不能直接查库判断。结果它生成的代码绕开了消息通知,直接查库刷新缓存,虽然功能看起来没问题,但实际上把整个模块的架构核心给破坏了。

这类问题的本质是:AI不懂项目的“活文档”。代码里那些没有写进文档、但所有团队成员都知道的隐性约定,AI完全不清楚。这种“语义级理解”的缺失,决定了高复杂度任务里AI只能是参考者,不能是执行者。

3. 半年里踩过的坑:AI写代码典型翻车现场实录

我得坦白讲,上半年使用AI的过程中,翻车次数不算少。有些坑回头想想觉得好笑,但在当时确实让人抓狂。我把几个最有代表性的记录下来,你可别在同样地方摔倒。

3.1 翻车一:AI“自信”地维护了一个不存在的API

这个是最典型的,也是我第一次对AI产生了“原来你不懂我啊”的顿悟。

当时我让AI帮我重构某个订单模块的接口调用,为了让重构后的代码风格更统一,我让它把所有的远程调用方法名统一为另一种命名规范。AI照做了,修改了七八个文件。我一看代码,命名确实统一了,当时觉得很满意。直到跑测试的时候才发现,编译直接失败——因为AI把某个底层SDK里的一个方法名改了,但那个方法名根本不是我们能改的,它是外部依赖库定义的。

AI为什么这么做?因为它“学”过的代码里类似的命名规范很常见,它只是凭概率选了一个“看起来更合理”的名字,但没有真正去确认这个名字在项目里是否真实存在。这个经历让我明白,AI修改代码时,完全没有“验证”的概念。它只负责“改”,不负责“对”。从那以后,我要求所有AI修改过的代码,提交前必须自己过一遍所有涉及到的函数调用,确认没有凭空捏造出来的新名字。

3.2 翻车二:AI在循环里埋了性能雷

还有一个印象很深的案例:我让AI写一个批量同步外部数据的任务,它生成了一段很“标准”的循环代码——遍历所有待同步的记录,逐条调用外部接口获取最新数据,然后更新数据库。

功能上完全没毛病,测试也能通过。但上线跑了一天之后,任务一直不完,数据库连接被大量占用,其他模块受影响。排查后发现,AI的循环里没有任何批量或并发控制的逻辑,也没有失败重试和熔断机制。外部接口响应慢的时候,循环就在那里一直傻等,整个任务像老牛拉破车。

这件事让我意识到一个关键点:AI只负责人工智能意义上的“功能正确”,完全不负责性能、容错、健壮性这些工程属性。你如果只让它“完成功能”,它保证不给你考虑生产环境下的实际情况。

3.3 翻车三:AI把重构做成了“彻底的格式化”

一次重构经历更让我哭笑不得。当时我们有一个老模块,命名的风格比较混乱,同一种业务含义有时用几种不同的英文单词表达。我让AI统一命名,它很高效地把所有相关变量、函数名、文件的命名全部进行了统一。

但问题来了:有些命名虽然在风格上不统一,但是它们是有意为之——比如某些业务术语的别名,在数据库字段、外部接口文档中已经大量使用。AI不管这些,它只做“字面级”的统一,把所有看起来不一致的命名全部改了。结果就是,虽然代码内部风格统一了,但和外部系统的对接全乱了,数据库映射的字段名也对不上了。

我们花了两天时间才把那些有业务含义的命名找回。从那以后,凡是涉及全局重命名、跨系统接口对齐的重构,我再也不敢交给AI全自动做了。

4. 半年沉淀下来的AI写代码工作流

踩了足够的坑之后,我逐渐摸索出一套稳定且高效的使用流程。现在我在项目里用AI的方式,和半年初期有了相当大的变化。

4.1 我的标准工作流:分步骤、小步验证

现在的AI使用流程分为五步,每一步之间有明确的质量检查点:

第一步:我负责架构和接口设计。这步绝对不能交给AI。模块应该怎么划分、接口该返回什么结构、数据如何处理异常,这些我想清楚了才往下走。我会把关键接口定义成函数签名或接口文档,作为AI生成代码的“规格说明”。

第二步:写清楚“给AI的规格说明”。这个很重要。之前我随便丢一句话“帮我写个订单列表接口”,AI当然只能写个默认模板出来。现在我会写清楚输入参数、返回结构、异常处理要求、逗号分隔、需要关联查询哪些字段、排序规则、分页方式,甚至说明这个接口是给哪个页面用的。有了这些约束,AI生成的东西可用率高非常多。

第三步:让AI生成实现。每个模块或函数独立生成,不让AI一次做太多东西。一次一个函数、一个接口、一个文件是合适的粒度。生成后立即检查,不积压。

第四步:严格走“四道关”验收。AI生成的代码,必须过:编译关(必须无警告通过)、单测关(补关键单测用例)、人工Review关(逐行读一遍)、边界用例关(考虑空值、异常、并发)。这四道关做完,AI代码才允许提交。

第五步:小步提交,快速反馈。每次让AI生成的代码量控制在一定范围内,提交到分支后立刻跑完整测试。如果翻车,影响范围有限,排查也快。

4.2 给AI写需求时的提示词模板(可直接抄)

半年实践下来,我总结了一套相对稳定的提示词模板。我不搞那些花哨的“角色扮演”,就用最朴素的功能描述,但信息要完整。核心模板如下:

任务:实现[模块名/函数名]的[具体功能描述]。 背景说明: - 项目技术栈:[语言/框架/版本] - 现有代码风格:[如“所有接口返回Result对象”] - 关联依赖:[如“用户信息通过某个工具类获取”] 输入参数: - 参数1:[名称/类型/说明] - 参数2:[名称/类型/说明] 返回要求: - 成功返回:[结构说明] - 失败抛异常:[什么情况下抛什么异常] 约束条件: - 性能要求:[如“不允许N+1查询”] - 安全要求:[如“所有输入必须做SQL注入过滤”] - 边界情况:[如“空列表时返回空数组而不是null”] 请生成代码,并简要说明实现思路。

这个模板看起来朴实,但每一项信息都直接影响AI生成代码的质量。其中“约束条件”这一项尤为重要,它就是把前面说的那些“项目隐性知识”显性化给AI的通道。

4.3 哪些代码我绝对不让AI碰

半年用得越多,我心里越有一张“禁区清单”。以下这些模块,无论AI表现得多么自信,我都坚决不让它直接生成实现代码:

  • 支付、金额计算相关:涉及精度、货币、对账,出错就是钱的问题。AI对金融领域的舍入规则理解不靠谱。
  • 权限和认证逻辑:越权漏洞是最常见的安全风险,AI生成的代码在权限校验上经常“差不多先生”,这是绝对不可以的。
  • 数据迁移脚本:涉及历史数据兼容,需要理解现有数据的细节和脏数据形态,AI没有这个概念。
  • 与外部系统对接的解析逻辑:外部接口的字段语义,AI很容易凭经验瞎猜,一旦猜错,数据全错。

这些代码我坚持自己写或者至少自己设计核心逻辑。AI可以帮忙补充文档或生成辅助性的测试数据,但核心实现绝不交出去。

5. AI写代码的团队协作规范

这套工作流如果只有一个人坚持,效率还是有限。我在团队里推广了AI辅助开发的协作规范,这里分享几条落地后效果还不错的原则。

5.1 代码评审只严不松

很多人有一个误解:AI生成的代码质量高,那评审就可以放松一点?我的答案恰恰相反——AI生成的代码,评审要更严格。

原因很简单:人写的代码,如果某个地方逻辑怪,那是这个人的问题;AI写的代码,表面逻辑非常规整,它很可能把“错误”包装得非常“正确”,反而更容易蒙混过关。所以在评审AI生成的代码时,我要求团队成员特别关注:

  • 外部API的调用是否存在(对应翻车一)
  • 循环里的性能开销是否被忽略(对应翻车二)
  • 命名统一是否跨出了合理边界(对应翻车三)

5.2 面向AI的代码设计模式

我们内部逐渐形成了一套“面向AI”的代码组织习惯。严格来说不是新的设计模式,而是为了让AI更好地理解上下文、生成更贴合的代码:

  • 函数体尽量短小:长函数AI续写时容易“迷失方向”,短函数则容易保持正确。
  • 命名保持明确:变量名、函数名语义清楚,AI推断下一步逻辑的准确率会显著提高。
  • 关键决策留在注释里:重要的性能约束、异常处理原则,写在文件头注释或函数注释里。这样AI在生成后续代码时,会把注释的约束考虑进去。

这些习惯在纯人写的代码中也是好习惯,但有了AI协作后,它们带来的回报更直接。

6. 半年之后的结论:什么样的人适合让AI写代码

半年实践下来,我对AI写代码这件事的判断比较清晰了。它靠不靠谱,更多取决于使用者的水平,而不是AI本身的能力。

6.1 AI写代码的效率规律

我总结了影响AI写代码效率的几个关键因素,按重要性排序依次是:

因素影响权重
任务模式化程度模式越固定,AI表现越好最高
上下文质量(提示词、背景信息)信息越完整,输出越准确高
使用者的代码评审能力能不能看出AI埋的坑高
项目的架构清晰度架构越清晰,AI越不容易跑偏中
团队的验收流程验证越严格,越能抵消AI的错误中

从这个角度看,并不是“会用AI的人”都能让AI写代码,而是“本来就会写代码的人”才能用好AI。AI是放大器:你能力强,它放大你的产出;你能力弱,它同样放大你的错误。

6.2 我建议的引入路径

如果你看完这篇文章,决定试着在真实项目里引入AI编程,我建议你按下面的节奏来,别一口吃成胖子:

  1. 第一周只做熟悉:在非核心模块里试用,感受一下AI补全和生成的能力边界,别急着大规模铺开。
  2. 第二周开始建模板:整理出适合你项目的提示词模板,把项目常用的接口风格、异常处理方式、返回结构写进模板。
  3. 第三周建验收流程:给AI生成的代码建立一套强制检查清单,哪怕繁琐也先跑起来。
  4. 一个月后复盘:统计一下哪些任务AI真正帮到了你,哪些任务实际上增加了工作量(比如生成后修改的时间比手写还长),把这些任务从AI的工作范围里剔除。
  5. 三个月定边界:形成属于自己的“AI任务白名单”和“AI禁区红名单”,之后严格按照这个边界执行。

我个人在实际使用中最深的体会是:AI写代码真正考验的不再是打字速度,而是你把需求描述清楚的能力。以前你可以边写边想“哦这里逻辑应该这样”,现在你必须在让AI动手之前就想清楚所有边界和异常路径,否则AI就会高高兴兴地把你的模糊需求实现成一堆看似正确但根本不能上线的代码。

这半年用得越多,我反而越确认一个判断:AI不会让程序员失业,但它会加速淘汰那些只会照着需求文档敲代码、从不停下来思考背后逻辑的人。反过来,如果你愿意多花时间把需求背后的逻辑理顺、把约束条件想透,AI就是一双无形的手,让你的产出效率比过去好上一大截。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进