ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

从代码补全到Agent式开发:AI编程三年进化全解析

从代码补全到Agent式开发:AI编程三年进化全解析

2023年年初那会儿,我还在朋友圈里跟人争论AI编程到底是不是个玩具。当时GitHub Copilot刚火起来,大家嘴上说“AI取代程序员”,实际用起来也就是个高级点的自动补全,生成个冒泡排序还要我手动改半天变量名。三年过去,现在再回头看,我只能说:这东西的进化速度,已经不是按“版本号”跳的,而是按“物种”跳的。我最近在做的一个中型项目里,AI不光帮我把Spring Boot的服务框架搭完了,连异常处理策略、分页查询边界、甚至是某个第三方SDK的过期方法替换,都提前帮我踩了坑。

这篇文章我就围绕“这三年AI编程到底进化成了什么”这条主线,把2023年到2026年这段时间里, AI编程工具从代码补全到Agent式开发的变化拆开写一写,包括背后的关键技术点、我在真实项目里的实操记录、以及那些花了真金白银才踩明白的坑。

1. 从“高级补全”到“Agent同事”:三年演变全景

1.1 2023年:Copilot带起来的“自动补全幻觉”

先说第一阶段,也就是很多人记忆里“AI编程就是个玩具”的时期。2023年年初,以GitHub Copilot为代表的工具,本质上做的是单行或单块的代码续写。它的底层逻辑是:你写一个函数名,它预测你大概想干嘛,然后帮你把这几十行补完。

但那个阶段的体验确实拉胯。我记得当年让它生成一个“从Excel导入数据到MySQL”的功能,它确实写出来一段Python代码,看起来头头是道,但里面既有pandas的read_excel,又有csv.reader,两种库混着用,还漏了workbook.close()。当时圈子里有个很经典的吐槽:Copilot写代码的正确率大概在60%,剩下40%是格式漂亮的垃圾。你让初级程序员去改,半个小时改不出来;让中级程序员去改,觉得不如自己重写。

但有一件事大家当时忽略了,就是代码补全模型的训练数据规模。2023年的Codex模型(背后是Codex-003这种)训练数据虽然已经是海量,但上下文窗口只有几千个token,这意味着它根本看不完你的整个项目结构,只能看当前文件里上下各几十行。它不知道你的UserService里已经有一个getUserById了,也不知道你的项目统一用Result<T>做返回体,于是它生成的就是“通用代码”,而不是“你的项目的代码”。

1.2 2024年:Chat模式爆发,生成从“段”变成“模块”

到了2024年,真正的变化来自两个方向。第一个是多轮对话式编程的普及,代表工具是ChatGPT的代码解释器、以及集成在IDE里的Copilot Chat;第二个是上下文窗口的大扩容,从几千token涨到了几万甚至十几万token。

这一阶段的AI编程,不再是一个“自动补全”,而是一个“能跟你讨论方案的结对程序员”。你可以直接对它说:“帮我写一个订单超时自动取消的实现方案,要求:延迟队列,支持重试,数据落在MySQL,用Spring Schedule做兜底。”它会给你一整套方案,包括表结构、SQL、Java代码、配置项、甚至单元测试。

我当时在一个电商项目里做过一个A/B测试配置后台,按老办法写至少需要三天:建表、写Mapper、写Service、写Controller、写前端页面、联调。那一次我用Cursor配合Claude 3.5 Sonnet,从建表语句到接口文档生成,总共花了大概4个小时,而且生成的代码和我团队现有的代码风格非常接近,因为我把项目的.editorconfig和几个典型类的代码直接喂给了它,让它“照着这个风格写”。

最关键的变化是,生成的不再是“一段函数”,而是“一整套业务模块”。这种变化带来的效率提升,已经不是30%、50%的问题,而是同一个需求,过去的排期是3天,现在可以压缩到1天以内。

1.3 2025年到2026年:Agent式编程,AI开始“自己动手”

真正让它从“玩具”变成“怪物”的,是2025年下半年开始陆续落地的Agent模式。代表性产品包括:Claude Code、Cursor 2.0的Composer模式、GitHub Copilot Agent、以及OpenAI Codex(就是现在那个付费AI编程软件,按次收费,贵得让人肉疼)。

Agent模式和Chat模式最大的区别在于:Chat模式是你问一句它答一句,Agent模式是你下达一个任务,它会自己拆解步骤、自己读文件、自己跑命令、自己看报错、自己修bug,全程几乎不需要你插手。

我用一个实际场景说明这个区别。需求是:“给项目加一个飞书机器人告警功能,当接口错误率超过5%时,往指定群发告警。”

  • 如果是2024年的Chat模式,它会给你一大段代码、一个依赖坐标、几段配置,然后你手动粘贴到项目里,跑起来报错再回来问它“这个依赖导不进去怎么办”。
  • 如果是2025年底的Agent模式,它直接会做这些事:先读你项目的pom.xml,确认Java版本和Spring Boot版本;再扫描现有的配置类风格,决定是用@ConfigurationProperties还是@Value;然后写代码、写配置、加依赖;接着自己跑mvn compile,看到编译报错后自动修;最后还会告诉你“建议在application-prod.yml里单独配置webhook地址,并且用@Profile("prod")限制只生效于生产环境”。

你听到这个过程,第一反应是什么?我当时的第一反应是后脊梁发凉。因为这就是一个中级程序员接到任务后的标准执行路径:看项目、定方案、写代码、跑编译、修bug、给建议。它唯一的缺陷可能是没有参与需求评审,但说实话,很多外包初级干这个活的质量还真不如它。

到2026年初,这类Agent工具的能力还在继续扩展。Codex的云端Agent版本,甚至能直接在你本地的命令行里执行各种操作,包括跑构建、跑测试、提交Git、提交PR(需要授权)。我试过一次它提交的PR,commit message写得比我自己写的还规范,有type有scope有正文,团队成员还以为是哪个规范控发的。

2. 技术底座的秘密:为什么能进化这么快

2.1 上下文窗口:AI的“长期记忆”是质变的起点

要说这三个进化阶段的分水岭,变量只有一个最核心——上下文窗口(context window)。2023年做代码补全时,模型一次只能“看到”几千个token,相当于你同事每次和你讨论问题时,只能看到你电脑屏幕里当前打开的这一页代码。你让他写一个函数,他连周围有什么可用工具都不知道。

到了2024年,上下文窗口涨到10万token级别,这等价于你给同事开了一个“整个项目的只读权限”,他翻完几个关键文件再给你写方案。到了2025年,Claude的上下文窗口达到20万token,而一些Agent工具通过递归索引的方式,把整个仓库的目录结构、类之间的关系、甚至Git提交历史都压缩成了结构化摘要,塞进上下文里。相当于这个同事不仅看了你的代码库,还了解了你团队过去半年的提交习惯、编码风格、甚至哪些代码经常被改。

我把这个比作“AI的长期记忆”。没有长期记忆的AI编程,只能给你零碎的答案,有长期记忆之后,它才能给你一套“符合你项目语境”的方案。这就是为什么同一个AI模型,在2023年被你骂成傻子,到2025年却能帮你把代码重构得明明白白——因为同样是写代码,它的信息输入从“只看一行”变成了“通读全库”。

2.2 从“生成文字”到“执行动作”:Agent化的技术飞跃

第二项关键能力是工具调用。2023年的Copilot只能输出文本,你把它生成的内容复制到编辑器里;2024年的Chat模式稍微好一点,能通过API返回结构化的代码块;2025年的Agent模式直接接上了Shell执行、文件读写、命令运行、Git操作这些真实工具链。模型的能力从“生成一段建议”变成了“执行一个任务”。

这种转变背后的工程实现非常复杂。AI需要学会在“写代码”和“跑命令”之间切换:写完一个文件,自己跑一遍测试;看到测试失败,定位到报错行;再回头改代码;再跑。整个过程需要处理执行超时、错误截断、环境变量、路径转换等一堆工程细节。这也是为什么Claude Code和Codex这类工具不是“加个Chat界面”那么简单,它们背后是一整套Agent运行时系统。

我举个真实体验:有一次我自己用Cursor的Agent功能,让它给一个多模块Maven项目添加全局异常处理器。它做完之后,居然主动去检查了其他模块里是否有try-catch吞掉异常的旧代码,并把它们标记为“问号”状态——意思是“这几处可能是隐患,建议处理”。这不是普通代码补全能做的事,这是因为它能读取整个项目的文件树,并且能结合问题上下文,自己决定下一步要探索哪些文件。

2.3 向量检索与仓库索引:不是理解,而是找不到头绪时先“翻出错地方”

还有一个隐藏技术是代码库嵌入(Repository Index)。为了让模型在长上下文之外还能精准定位到相关代码,2024年下半年开始,Cursor、Sourcegraph等工具引入了一种类似RAG的方案:把你的整个代码库切成片段,转成向量存起来,遇到问题时先在向量数据库里做相似度匹配,找到最可能的几个文件,再把这几个文件的内容放进上下文窗口,让大模型分析。

这就解决了“上下文再大也装不下整个大型项目”的问题。你没带过AI的时候可能体会不到:在一个几十万行的老项目里,你问AI“我们项目里处理用户余额的地方在哪个文件”,它能在几秒内给你列出三个候选文件,并告诉你各自的特点。这种“先检索后生成”的架构,是AI编程从“什么都答不上来”进化为“精准回答”的关键一步。

不过也要泼一盆冷水:这一层做得再好,也只是“工具能翻对页面”。AI真正生成代码的决策,仍然依赖底层的基座模型能力。2025年各家大厂疯狂堆参数的编程模型(有专门用于编程的Code模型系列,也有把推理能力拉到AGI方向的通用模型),本质上是让AI在“找到代码位置”之后还能“做出合理设计”。

3. 实操工作流:从“自己写”到“监督AI写”的转变

3.1 我的AI编程工作流长什么样

截至2026年初,我自己在真实商业项目里跑顺的AI编程工作流,大概是下面这样:

  • 工具链:IDE用VS Code + Cursor插件,主力Agent用Claude Code(长期任务)和Codex(重活),大模型用自己公司部署的私有化环境(数据敏感项目)或者云端旗舰模型(开放项目)。
  • 提示词规范:每个任务开头固定写三段,第一段是“角色定义”,第二段是“任务边界”,第三段是“交付标准”。

这个工作流的本质变化在于:过去我是“写代码的人”,AI是“补全工具”;现在我是“提需求、做评审、兜底”的人,AI是“执行者”。有一次我统计过,在一个中等复杂度的业务模块里,我实际写的代码比例大概只有15%,剩下的85%是AI生成后我审阅修改的。看似我变“懒”了,但我的核心工作变成了:把模糊的产品需求翻译成AI能理解的精确指令,以及对AI产出的代码做结构性的审核。这个工作要求的能力,恰恰是中级以上程序员才具备的“系统设计能力和代码审查能力”。

3.2 传达需求的结构化模板:AI编程提示词必须这么写

很多初学者用AI编程工具,效果不理想,问题八成出在提示词写得像“和同事聊天”。但Agent模式下,你把AI当“外包同事”是不够的,它需要更结构化的上下文。我经过大量尝试,沉淀了一个可以直接照抄的提示词模板,核心包括:背景约束、输入信息、预期产出、约束条件、验收标准。

看一下模板:

【背景】这是XX项目,基于Spring Boot 3.2 + MyBatis-Plus,项目统一返回格式为Result<T>,异常处理由全局GlobalExceptionHandler负责。 【任务】新增一个用户积分明细查询接口,支持按时间范围、积分类型筛选,并支持分页。 【约束】请使用现有PageResult类作为分页返回结构;SQL逻辑使用LambdaQueryWrapper实现,禁止写原生SQL;积分类型枚举使用已有的IntegralTypeEnum。 【验收】代码需包含对应的单元测试;测试用H2内存数据库跑通;最终给出文件改动清单。

你会发现它不像一个“聊天对话”,更像任务工单。你不是在问它“怎么写”,而是告诉它“照着我的项目规矩去写”。这样做的好处是AI不会自由发挥出和项目风格不一致的代码。编码风格这种东西,新人入职后至少两三个月才能逐渐适应,AI只要你把规矩说清,它一次就能对齐。

3.3 实测:用Codex跑一次“翻新遗留项目”的全程记录

还有一种场景更能体现AI编程的冲击力,就是老代码翻新。我手头有一个用了四年的Spring Boot支付模块,里面用了一堆已过时的RestTemplate调用,还有各种魔法数字和重复代码。过去这种活,团队里的中级程序员看一眼就头大,说“改动风险太大,不如不动”。

2026年1月,我试了一次用OpenAI Codex的Agent模式来处理。我给它的指令是:“把payment-service模块中所有RestTemplate调用迁移到WebClient,保持接口行为不变,并补充迁移说明文档。”

然后它做的事情:先扫描了整个模块里所有使用RestTemplate的地方,一共是17处;然后逐个分析每处的调用方式,区分是同步调用还是异步回调,是POST还是GET,是传JSON还是传表单;接着统一创建一个PaymentWebClientConfig配置类,定义好连接池、超时;再逐一把17处调用替换成WebClient写法,其中有三处涉及到ResponseEntity解析的边界情况,它额外写了两个辅助方法处理;最后跑了一遍集成测试,发现有一个接口在补偿方案中使用了旧的HttpEntity类型,自动修正后,测试全绿。

全程耗时:48分钟。中间它跟我说过一句话:“第12处调用属于重试逻辑中的幂等分支,建议同时把重试注解加上。”这个建议,说实话,比我团队里那个干了三年的中级工程师想得都周全。

当然,那个工程师看到结果后受到了巨大冲击,这确实是个现实问题。但另一方面,他后来自己也学起来这个工具,现在效率提升了一倍不止,而且做的是更有创造性的需求分析工作,反而是好事。

4. 光鲜背后的坑:AI编程避坑与问题排查实录

4.1 翻车案例一:看起来都对,跑起来全错

AI编程最大的幻觉是“它能生成很长的代码,但可能一开始方向就错了”。我碰到过一次:让它把项目从Spring Boot 2.x升级到3.x,它生成了一整套改动方案,看似很完整,但它忽略了javax.servlet到jakarta.servlet的包名迁移,导致整个项目的启动类直接变成“找不到类”。

那段报错信息我已经不想再看了。关键是,它生成代码的时候已经把包名都带上了,import javax.servlet.*到处都在,但Spring Boot 3.x完全用的是Jakarta命名空间。这种错误,AI在代码生成阶段几乎不可能发现,因为它的训练数据里新旧代码都有,它只会“生成为常见的写法”,不会去“校验版本的兼容性”。

避坑策略:面对框架升级、依赖迁移这类“横切式”改造任务,不要指望AI一次性搞定。正确做法是先让它输出“改动影响清单”,把涉及变更的文件列举出来,你人工再审一遍,确认没有遗漏。然后再让它分批改,每批改完立刻编译、跑测试,通过了再进行下一批。我把这个称为“AI编程的蜈蚣原则”:一百只脚不可怕,但你不能让它一口气全脱了。

4.2 安全坑:AI生成的代码做不好权限校验

第二个大坑出现在安全领域。AI生成业务代码时,默认的倾向是“把功能写出来”,而不是“把权限管起来”。我有一次用一个低代码平台自动生成后台管理接口,生成出来的列表接口里,没有加任何“当前用户只能看到自己数据”的过滤条件。代码本身跑起来没问题,能查到所有数据——但放到生产环境,这就是一个越权漏洞,可以查看全公司客户的订单信息。

这个问题的根源在于:模型的训练数据里,“用户权限体系”是一个复杂的多版本内容,不存在一个“标准答案”,所以它倾向于生成最简单直接的查询逻辑,也就是不带权限过滤的版本。

避坑策略:用AI生成的任何接口,你都必须自己先检查一遍“谁可以访问这个接口”“是否可以访问不该访问的数据”。尤其是涉及用户维度、租户维度、组织维度的数据查询,建议在任务描述里强制要求“增加当前用户过滤条件,并从Session中获取用户ID”。如果项目有成熟的权限框架,比如Spring Security、Shiro、Casbin,也一定在提示词里明确指出来,要求AI“使用XX框架已有的注解和工具方法”。

4.3 复用陷阱:AI喜欢重复造轮子

第三个非常典型的坑,是AI倾向于“自给自足”,不喜欢“复用现有代码”。原因也很简单:它的训练数据里“写一个完整工具类”的样本量远大于“引用项目中已有的某个私有工具类”的样本量。它在生成代码时,很难主动发现你的项目里已经有一个DateUtils或者ExcelExporter,于是它又写了一个新的,甚至命名冲突了,直接导致编译不通过。

我印象最深的一次,是让AI做一个“把查询结果导出为Excel”的功能。它生成了一整套Apache POI写入逻辑,实现了样式、合并单元格、日期格式,看起来非常完整。但问题是,我们的项目里已经封装了一个ExcelExportUtil,统一的导出场景都用它,新代码完全重复且导出的文件风格和团队其他模块不一致。

后来我把ExcelExportUtil这个类的代码和它的一行注释(说明“所有Excel导出统一使用本工具类”)放进了提示词上下文,AI立刻就改变了方案,输出变成了调用工具类的简洁版本。

避坑策略:当你的项目里已经有既定的封装和工具类时,把它们的类名、方法签名、甚至一两个典型调用示例直接贴进提示词里,强制AI在生成前先“查重”。如果用的是Cursor这类工具,还可以在对话前先把工具类文件打开,AI能看到的话它天然会更倾向于复用。

4.4 不可替代的部分:AI编程的边界

说完这些坑,必须清醒地认识到另一件事。AI能写代码,但它不能承担需求变更的责任,也不能平衡业务方和技术维护之间的取舍。我见过一个团队因为太依赖AI,把客户要的对账功能写出了一个非常规整的技术方案,但完全忽略了对账在业务上的“追溯、冲正、不可篡改”的边界,导致交付后客户验收不通过,又回炉重做了。这不是AI的错,而是需求理解和设计决策的缺失。

所以我自己对AI编程的边界理解是:AI适合解决“已明确定义的技术任务”,不适合解决“未明确定义的业务问题”。后者需要人来完成需求澄清、方案权衡和干系人管理,这些能力模型并不具备。

5. “超越中级程序员”的真实含义:是初级的危机,也是高级的助手

5.1 初级程序员的岗位正在发生结构性变化

关于“AI或将取代初级程序员”这个话题,我的判断是:它不会直接砍掉所有初级岗,但会大幅压缩初级程序员的“打杂期”。过去一个新入职的程序员,前半年可能在做表单页面、写CRUD、改接口文档,这些都是AI现在最擅长的领域。如果企业发现花几千块钱一个月订阅AI工具,效率比招一个人高几倍,那确实没理由再招“纯执行型”的初级。

我认识的一位中型公司CTO,2026年招人策略已经从“招3个应届生慢慢培养”变成了“招1个应届生配一个AI Agent订阅”。那个应届生干的是什么活呢?做需求拆解、让AI写代码、自己主导测试和上线。相当于他的岗位定义直接从“写代码”跳到了“做过程管理”。这个转变对个人能力的要求全变了:懂代码、懂业务、懂AI工具,三者缺一不可。

5.2 程序员真正的护城河

那么面对所谓“AI超越中高级程序员”的说法,我们这些老程序员到底慌不慌?我的真实感受是:慌的不是被超越,而是发现自己过去引以为傲的一些“技能”变得不值钱了。

比如以前背得滚瓜烂熟的Java八股文,问什么都有标准答案;比如那些写了无数遍的工具类;比如那些从网上扒来的代码片段。这些东西确实价值在被AI稀释。但另一方面,我越来越觉得真正值钱的变成了:

  • 能把模糊业务变成可执行技术方案的能力
  • 能在多个技术路线之间做权衡取舍的能力
  • 能在复杂系统中定位根因、给出修复方案的能力
  • 能让团队每个人发挥最大效率的管理协调能力

这些能力AI还没有,而且短时间很难有。所以准确的说法不是“AI超越了中高级程序员”,而是“AI把程序员这个职业里重复性劳动的部分抹平了”,留下的工作才是真正需要人去做的部分。

5.3 我的个人建议:如何不被AI废掉

如果你现在还在用纯手工的方式写大量重复代码,我的建议很简单:立刻开始使用AI编程工具,把它当成你的一部分。但使用方式不要太“躺平”,而是要刻意练习以下三件事:

  1. 坚持做代码评审。AI生成的每一行代码,你都要能说出它为什么这么写,有没有更优方案。如果你看不懂AI写的代码,那是你的知识储备有窟窿,这正是去补这些窟窿的机会。
  2. 坚持写设计文档。把AI当成一个快速实现者,你自己当架构师。你负责定义模块边界、数据流、异常策略,AI负责把文档变成代码。这样一来你越写越强,AI只是你的加速器。
  3. 坚持做复盘总结。每隔两周回头看看AI生成的代码里,哪些地方你纠正了它,哪些地方你学到了新思路。把“和AI协作”本身当成一项技能来修炼。

我在实际工作里已经形成了一套习惯:每天上午花30分钟,把当天要做的几个任务用结构化提示词拆好,AI跑起来之后我就去做需求评审、看文档、和别人聊天讨论架构。下午集中一小时审阅AI产出的代码,该打回打回,该重构重构。这样一天下来,我的产出量是以前的三倍,而大脑的消耗反而比以前低,因为写那些模式化的代码真的挺累的。

6. 最后一个建议:把AI当成“团队里最卷的实习生”

如果你问我这三年的体会浓缩成一句话,那就是:AI编程不是一个工具,它是一个不断学习、永不疲倦、但没有业务判断力的团队成员。你要做的是给它清晰的任务边界,给它你的项目规范和上下文,它就能完出让你惊讶的活;但你要是把一团乱麻扔给它,它还你的一定也是一团漂亮的乱麻。

最后再分享一个小技巧:当你发现AI写的代码“能跑但总差点意思”的时候,不要急着骂它。把它的代码拿过来,你自己改一改,然后把它“原来的代码”和“你改后的代码”同时扔回到对话里,告诉它——“以后遇到类似场景,参考我改后的版本。”你会发现经过两三次“调教”,它的产出风格会越来越贴近你自己的习惯。这件事,我愿称之为“AI编程的驯化”,驯化好了,它是你团队里最卷的那个实习生;没驯化好,它就是一个会写代码的猪队友。

希望这三年我的这些实操经验,能让正在犹豫要不要深度使用AI编程的人少走一些弯路。工具就在那里,用不用、怎么用,最终决定了你是被替代的那个,还是把它用得飞起、一个人活成一个团队的那个。这句话很残酷,但它就是这三年AI编程进化史里最真实的注脚。

RELATED READING

延伸阅读

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