
两年前GitHub Copilot刚放开公测的时候我朋友圈里一半人说程序员要失业另一半说这就是个高级自动补全。两年过去两种情况都没完全应验但我的写码方式确实被彻底改掉了。前前后后我至少试过十几种AI编程工具从最早的Copilot到各类AI IDE、插件、终端里的Agent工具、代码审查机器人中间来回迁移的次数连我自己都记不清。最后固定下来靠的不是某一家“最强AI编辑器”而是一套配合成熟的分工组合。这套组合覆盖了写代码这件事的完整链路补全、对话、改代码、审查。每一步我都不是拍脑袋选的背后都有横向对比和实际踩坑的支撑。这篇内容就把这套组合完整摊开来讲我留下了什么、放弃了什么、为什么这么分以及每天我到底是怎么用它们的。适合正在纠结“AI编程工具到底选哪个”“要不要从Copilot换成Cursor”的开发者参考。1. 两年试错后我现在电脑里固定留的是这四类工具先说结论这套组合不是“四个软件”而是“四类工具”。每一类解决不同环节的问题因为软件开发本来就不是单点动作而是从想法到上线的链条。链条上每一环的瓶颈不一样自然就不存在一个工具通吃所有环节。我目前的主力配置如下类别主力工具备用/尝试过主要负责的环节代码补全GitHub CopilotCursor的Tab补全、Codeium/Windsurf、通义灵码写代码过程中的单行/多行补全保持心流对话式AgentClaude CodeCodex CLI、Cursor Agent模式、Aider跨文件搜索、批量重构、自动执行命令代码审查PR-Agent、Copilot code reviewCodeRabbitPR提交前的自动化粗筛通用大模型ChatGPT / Claude各家大模型Web端架构方案讨论、报错方向分析、知识查询注意表格里的“主力”和“备用”的区别。Cursor是这两年热度很高的AI IDE我也认真用过一段时间但最终没有把它当成唯一主力。原因后面详细说核心逻辑是不同工具的强项不一样硬塞到一个编辑器里反而受限。为什么要把工具拆成四类而不是直接找一个“全家桶”因为“改代码”这件事本身包含了好几种难度完全不同的动作。最简单的场景是写一个函数内部逻辑这时候需要的是即时补全延迟越低越好最好不要打断思路中等难度是改多个文件比如把某个接口调用从A改成B这时候需要模型能理解整个调用链再往上是要不要重构、要不要引入新依赖这种决策这时候需要的不是生成代码而是分析和讨论能力。把四种需求混在一起用同一个工具结果往往是这个工具在哪个方向都差一点。我自己早年就走过弯路。最早我习惯把代码整段贴到ChatGPT网页里让它生成后再贴回来。项目规模小的时候问题不大但一旦代码库到几十个文件这种“复制粘贴式AI编程”就彻底失效了——上下文不够、贴回来的代码对不上现有风格、跨文件调用根本找不到。后来我才想明白不是大模型不够强而是工具形态没有匹配任务形态。真正成熟的组合应该是让每类工具在自己最擅长的位置上干活人只负责衔接和把关。2. 每个工具的去留都是一次真实的选型对比2.1 补全环节为什么Copilot留到了最后代码补全这个赛道现在选手很多GitHub Copilot、Cursor Tab补全、Codeium、通义灵码、CodeGeeX各有特色。我最后留下Copilot不是因为它的模型一定比别人聪明而是它的产品定位和我的使用习惯最匹配。几个关键考量第一跨IDE兼容性。我日常主力是VS Code和JetBrains偶尔还要在远程服务器上改代码。Copilot在主流IDE里都有官方插件体验一致性做得不错。Cursor的Tab补全确实在某些场景下上下文理解更好但它是一个独立编辑器我常用的插件生态、主题配置、快捷键习惯都要重新适应。为了一段补全功能换掉整个工作台对我来说代价太大。第二补全的及时性。补全这个动作的核心指标不是“生成的代码多有创意”而是“快、准、少打扰”。Cursor的Tab补全有时候会思考很久才给结果这种等待会把写代码的心流打断。Copilot在大多数常见语言和框架上的补全几乎是无感的Tab键按下去结果就出来了。第三对项目风格的学习能力。Copilot会读取当前文件和历史代码的风格生成结果基本能对齐已有的命名习惯和结构。这点对老项目尤其重要因为大模型默认的输出风格大概率跟项目的实际写法不一样自动跟随能省掉大量手动调整时间。我踩过的一个坑是同时装了三个补全插件结果它们互相抢Tab键按下Tab都不知道是谁在补全。现在只开一个其余全部禁用。工具组合的前提是每个位置只有一个负责人多个负责人等于没有负责人。2.2 改动环节Agent工具解决了“补全做不了”的事如果说补全解决的是“写一行少一行”的问题那Agent类工具解决的是“跨文件批量改动”的问题。这类工具的代表是Claude Code、Codex CLI、Cursor Agent模式、Aider。我现在的主力是Claude Code选它有几个很实际的理由。首先是命令行形态。Claude Code跑在终端里跟IDE完全解耦。这意味着我可以本地跑、SSH到服务器上跑、在CI容器里跑不必被某个编辑器绑定。团队协作的时候大家编辑器各不相同一条命令就能让所有人在同一套AI工作流里协作省了很多环境折腾。其次是它“先读再改”的能力。传统大模型聊天框只能根据你贴的上下文回答Claude Code这类工具可以主动读取仓库结构、搜索符号引用、顺着函数调用链找到所有相关位置。我之前接手过一个老项目要改一个被十几个文件引用的公共函数签名。人工搜索加修改大概要一个下午用Agent只花了十几分钟过程中它自己定位了所有调用点逐个修改最后跑测试确认没有遗漏。Aider也是开源的优秀方案适合喜欢完全命令行、不希望有闭源依赖的开发者。Codex CLI在某些场景下也很强特别是跟OpenAI生态结合得好的时候。Cursor Agent模式适合动手能力不太强的用户因为它把Agent能力直接内嵌到图形界面里看着更直观。选择的主要逻辑是看你的工作习惯。你如果已经离不开IDE的图形界面就从Cursor的Agent模式入手如果你能接受命令行Claude Code或Aider会更灵活。我个人因为经常要处理服务器上的代码命令行形态的优势非常明显。2.3 审查环节AI先过一遍人再审业务代码审查是团队协作里最容易被拖到最后的环节。程序员写完代码自己看觉得没问题交到Reviewer那边要么因为忙没细看要么看了只关注业务逻辑低级错误反而漏过去。所以我把AI审查工具放进组合里让它做第一道粗筛。它的价值不是替代人审而是把明显的问题在PR提交前就暴露出来。比如未处理的异常分支、与其他文件不一致的命名、明显的性能隐患、日志信息缺失等。我用的是PR-Agent这类开源工具配合GitHub Actions或者本地CLI都能跑。流程是PR创建或者本地提交前工具自动读diff给出问题列表和修改建议。一些小问题它可以直接给出补丁我确认后合并大问题我会根据它的提示重新修改。这里有个注意点AI审查不太理解业务上下文经常会给出“看起来没问题但跟业务目标不符”的结论所以业务层面的Review还是必须靠人。它的价值是让人把精力集中在真正需要判断力的地方而不是把时间浪费在一遍遍提醒别人“这里忘了加空指针判断”上。2.4 通用大模型回到它最擅长的位置——讨论很多人对ChatGPT或Claude网页版的理解就是“让它写代码”在有了Agent工具之后这个功能已经基本被替代。但我仍然保留通用大模型因为它在“讨论”这个场景里有不可替代的价值。写一个具体功能时Agent工具更高效但在做方案选型、接口设计、排查报错思路时网页版大模型的长上下文和灵活交互让我更舒服。我会把一段历史代码、一个报错堆栈、或者一个技术方案的文档粘给它让它帮我梳理逻辑、给出候选方案、评估优劣。这些讨论不需要动代码却决定了后续代码怎么写。比如我之前在研究某个技术栈跟已有系统怎么整合的时候就是让通用大模型先列了几种整合方式对比了各自的风险和工作量才决定走哪条路。这种“先讨论再动手”的模式比直接让AI改代码要可靠得多。毕竟代码改错了可以撤销架构选错了返工成本很高。3. 一套按天运行的工作流需求、编码、联调、审查各用什么工具组合的价值最终体现在工作流里。我用一个典型的新需求开发流程来说明让大家看到每类工具在哪个环节介入、怎么衔接。3.1 新需求从零开始典型的一天早会拿到需求之后我不会直接打开编辑器写代码。我通常先打开通用大模型把需求描述给它让它按照“背景、目标、输入输出、验收标准、风险点”的结构帮我拆解。这个过程的目的是把模糊的需求变成可执行的任务清单同时也逼我自己想清楚边界条件。拆解完任务如果涉及新的模块或者接口设计我会先在通用大模型里讨论方案确定大方向。然后打开终端让Agent根据接口描述生成项目骨架和核心代码框架。比如定义一个REST API描述清楚路由、请求参数、返回结构Agent能在几分钟内生成可运行的代码骨架。骨架有了剩下的就是逐行填充业务细节。这个阶段我回到IDE用Copilot做补全把Agent生成的框架填上真正的逻辑。遇到跨文件的改动比如新增的函数要被其他模块调用我再切回Agent让它搜索所有相关位置并插入调用点。写完代码启动AI审查工具过一遍diff确认没有低级问题后提交PR再让人类同事从业务角度做最终Review。这个过程整理成表格就是这样动作使用工具我在这里花的人工时间需求拆解通用大模型约10分钟方案讨论通用大模型视复杂度而定优先级最高生成骨架对话式Agent基本不花时间等它跑填充业务逻辑代码补全正常写码速度手基本不离键盘跨文件改动对话式Agent只花时间检查diff提交前审查AI审查工具几分钟处理建议3.2 排查报错和线上问题的链路排查问题也是AI工具的高频场景。我跑测试遇到报错第一反应不是自己去翻代码而是把报错堆栈贴给通用大模型让它先帮我缩小范围。它通常能快速指出是哪个模块、哪类错误以及常见的排查方向。方向有了之后再打开Agent让它顺着错误信息在代码库里定位相关位置找到所有调用这个函数的地方帮我分析哪一处最可能是根源。这一步如果人工做要打开编辑器搜索、跳转、阅读多个文件前后可能要半小时。Agent几分钟就能把相关调用链都列出来。最后确定问题原因后小修小补用Copilot直接改涉及多文件就用Agent批量调整。改完重新跑测试通过后提交。这里有个心得不要上来就把报错堆栈甩给Agent让它“自己查自己改”。没有经过分析和确认就直接动手Agent很容易因为理解偏了而改错文件。先让通用大模型给方向再让Agent动手双保险更稳妥。3.3 写测试用例时的人工把关点AI生成测试用例很快这本身没问题但我发现一个问题AI倾向于生成“为了通过而通过”的用例。它会读一遍实现代码然后照着实现写断言结果是测试跑通了但根本没能验证业务逻辑是否正确。我现在让AI写测试时会明确要求它按三类输入分别列用例正常输入、边界输入、异常输入。正常输入保证主流程能走通边界输入测极限情况异常输入验证错误处理逻辑。这个要求写进提示词里生成出来的测试质量会好很多。但即使这样我也不会直接信任AI生成的测试结果。我会自己补一两个极端边界用例并检查断言是否真的在验证目标逻辑而不是在抄实现。测试的价值在于能抓住未来改动引入的回归如果断言本身就是错的那还不如没有测试。3.4 每周做一次“工具体检”工具迭代很快每隔一段时间可能就会杀出一匹黑马。我的习惯是每周留出半小时快速扫一遍AI编程工具圈子有没有新消息看看有没有新工具能补上现有组合的短板。但原则是不轻易换主力除非新工具在某一个环节明显比现在的强出一大截。这个“体检”习惯很重要能帮我避免两种极端一种是永远不换工具死守旧习惯另一种是看到新工具就换天天折腾。前者会错失效率提升的机会后者则永远在适应期真正干活的时间反而少了。4. AI编程工具真正吃性能的地方上下文、索引与提示词很多读者问过我为什么明明用的同一个模型别人觉得AI写代码很猛自己用起来却觉得是“人工智障”答案通常不在模型本身而在上下文管理、索引构建、提示词质量这三个环节。4.1 上下文是预算不是越多越好上下文窗口是AI模型每次交互能处理的文本量。很多工具的宣传里会强调“支持超大上下文”看起来像是优势实际上上下文越大越要小心使用。你如果把整个仓库几十个文件都塞给AI它的注意力会被大量无关代码稀释很容易忽视真正关键的业务逻辑然后生成一个看起来合理但跟项目其他部分对不上的方案。而且这么多token的消耗API成本也很高。我的做法是把上下文当成钱包里的现金精打细算。决定让AI动手之前先明确自己的目标是要它看这个文件的某个函数还是找某个符号的全部引用。能用一句话说清楚需求就不要把整个文件都贴过去能引用文件路径让它自己定位就不要复制粘贴大段代码。Agent工具的好处是它可以自己读文件所以我们只需要给它指个方向让它在范围内自行探索。小步提交也是管理上下文的好方法。改动越小AI读取的上下文越集中生成的质量越高同时小提交也方便人审阅出问题容易回滚。我现在的习惯是把以前整天的大改动拆成每小时的小提交每笔提交只做一件事改动范围控制在几个文件内。4.2 索引不是建完就不用管了Cursor这类工具在第一次启动时会给项目建索引目的就是让AI能快速检索文件内容。索引建得好坏直接影响检索质量。我见过一些同事遇到“AI找不到某段代码”的问题排查半天发现是索引根本没建完或者建索引时把关键目录排除了。实际操作中项目根目录要配置好忽略名单类似.gitignore的规则把node_modules、dist、build等目录排除掉。不然索引全量扫描不仅构建慢还会让AI在检索时被海量无关文件干扰。同时如果你在.gitignore里新加了目录记得同步更新AI工具的忽略配置否则两边不一致还是会出现检索到不该出现文件的情况。对于特大仓库还可以考虑按模块拆分成多个子项目配置。让AI聚焦在相关模块内工作而不是面对整个代码库的所有信息。4.3 提示词不是魔法是结构化的需求描述很多人觉得提示词是玄学其实不是。它就是把需求说清楚的方式。你向一个刚入职的实习生描述任务时会告诉他“把A文件里那个函数改成支持XX参数注意别影响调用方保持命名风格一致改完跑一下测试。”给AI写提示词是一样的道理。我现在用的提示词模板大致是下面这个结构背景我在维护XX项目的XX模块使用XX技术栈。 任务把A接口的请求超时时间从30秒改为60秒并支持通过配置文件覆盖。 输入相关文件路径、依赖关系说明。 约束 - 只修改src/xxx目录下的文件不要动配置文件之外的部分。 - 保持现有的代码风格和错误处理模式。 - 不要引入新的第三方依赖。 输出格式 - 先给出修改计划我再确认。 - 描述变更点然后输出diff。 验收标准 - 修改后原测试全部通过。 - 新增一个测试覆盖超时配置覆盖逻辑。每一行都有意义。“背景”让AI理解上下文“任务”说明目标“约束”限定边界“输出格式”控制工作方式“验收标准”定义完成条件。最关键的其实是约束它决定了AI是老老实实干活还是自作主张给你“优化”一堆无关代码。4.4 组合的思维不仅适用于工具链工具链的组合逻辑其实跟技术架构里的经典做法一脉相承。就像postgresql负责结构化数据存储pgvector负责向量检索两者结合才构成完整的AI应用数据层——单靠任何一个都不可能同时做好两种完全不同类型的数据处理。AI编程工具也一样每个工具专注做好一个环节再通过人的调度把它们串成完整流水线。追求“一个工具解决所有问题”的想法在复杂度上来的项目中往往都会落空。5. 我遇到过的坑以及现在如何防止AI改坏代码用了两年AI编程工具踩过的坑不少。下面列几个最典型的每个都对应一套我现在坚持的防护习惯。5.1 批量改动失控AI改了不该改的文件有一次我让Agent“把所有接口的错误处理统一改造”结果它不仅改了目标目录下的文件还把配置文件、文档、甚至测试夹具都改了一遍。原因是我的任务描述里没限定路径它把所有看起来相关的地方都动了。现在的预防措施是双重的。第一任务描述里必须明确路径边界比如“只处理src/services目录下的接口”并加上“不要改动其他文件”的约束。第二在Agent动手前强制它先输出修改计划包括会涉及哪些文件的清单我确认后再执行。改完后我还要逐个过一遍diff确认没有越界修改。5.2 Agent死循环调用烧掉大量API额度Agent工具在遇到命令执行失败时会自动重试这是它的能力之一。但有时候它会钻进死胡同里反复重试同一个失败的步骤既浪费时间又消耗大量API额度。我第一次遇到时还没发现直到收到账单才反应过来。现在的做法是给每个Agent任务设置明确的迭代上限和超时时间。另外对于高风险操作比如删除文件、执行迁移我会设置成每一步都要人工确认。虽然多了一步操作但可比被AI带着跑偏要好得多。5.3 测试假绿看起来全过实则全废前文提过AI生成的测试可能会“照着实现写断言”。更隐蔽的一种情况是它生成的测试本身有逻辑漏洞断言根本没覆盖到关键行为但测试却显示全部通过。这就是“假绿”——测试报告好看实际上什么也没验证。我吃过一次亏一个模块的测试覆盖率看起来很高结果上线后还是出了bug。排查发现AI生成的测试用例只测了“输入值在正常范围内”的路径边界情况和异常处理全都漏了。从那以后我的规则是AI生成的测试必须先经过人工审查断言逻辑确认它在验证业务行为而不是抄实现。同时我会自己补几个测试用例特别是异常输入和边界情况来确保测试不是摆设。5.4 代码安全与隐私的边界用AI编程工具时最大的隐性风险是代码数据被发送到第三方服务。公共代码库、个人学习项目用这些工具问题不大但公司的商业代码、涉及用户隐私的模块处理起来必须谨慎。我的原则是分场景处理。在个人项目和开源代码上我会放心使用云端AI工具在公司项目上先确认公司是否有明确的数据合规要求优先选择支持私有化部署的方案或者选择那些允许关闭数据上传的编程助手。对于绝对不能外传的代码即使是第三方工具的本地模式我也会保守处理尽量脱敏后再让AI辅助理解逻辑。5.5 订阅成本失控现在的投入分配AI编程工具基本都以订阅制为主。贵的订阅叠在一起每月支出确实不小。我目前的策略是抓大放小补全用一个主力订阅Agent按任务量选择按量付费或订阅档位审查工具能复用就复用团队已有的机器人。预算有限的朋友完全可以先走全免费路线装Continue.dev接开源模型用它做基础的代码补全和对话需要Agent能力时用Aider这类开源工具审查环节用开源的AI Code Review工具。这套方案虽然没有商业工具那么丝滑但在成本为零的前提下已经能跑通从补全到审查的完整链路等体会到了AI编程的价值再考虑付费也不迟。回头来看这两年最大的收获不是某个瞬间AI帮我写掉了一大段代码而是我把“工具该在哪一步介入”这件事想清楚了。补充一个有用的习惯每过两三个月我会重新审视一次自己的工作流看有没有新出现的工具能补上短板。但决定换不换的标准很简单——新工具能不能让某个环节的效率有肉眼可见的提升而不是因为它“火”或“大家都在用”。如果你刚开始搭建自己的AI编程工作流我建议别急着把能装的全装上。先从代码补全开始养成每次改动前看diff的习惯等真遇到多文件重构和跨模块改动带来的痛再引入Agent工具最后再把审查环节交给AI。一步一步来想清楚每加一个工具到底是为解决什么具体问题你的组合就会跟我一样看似普通但每一步都有理由。