1. 先搞清楚:AI Coding 到底是个什么东西
1.1 从"自动补全"到"能自己干活的实习生"
很多人第一次接触 AI Coding,脑子里浮现的还是那种"打几个字,它帮你补全一行代码"的印象。这个认知大概停留在两三年前。现在的 AI Coding Agent,已经完全不是同一个物种了。
我更愿意把它理解成一个超级聪明、博学多才、但需要你带一带的实习生。这个比喻不是随口说的,它精准对应了三个特征:第一,它知识面极广,主流语言、框架、设计模式、常见库的用法它基本都见过;第二,它理解能力很强,你用自然语言描述需求,它能翻译成可执行的代码;第三,它没有你项目的上下文,不知道你们团队的规范、历史包袱和那些"不能碰"的坑,所以需要你给它喂信息、划边界。
所谓 AI Coding Agent,核心区别在于"Agent"这个词。普通的代码补全工具是被动的,你敲一个字符它猜下一个;而 Agent 是主动的,你给它一个任务,它会自己规划步骤、读写文件、运行命令、看报错、再修改,循环往复直到任务完成。这个"感知—决策—执行—反馈"的闭环,才是它和传统工具的分水岭。
1.2 它到底能帮你干什么活
把能力拆开看,一个成熟的 AI Coding Agent 通常覆盖这几类任务:
- 代码生成:从零写一个函数、一个模块,甚至搭一个项目骨架。
- 代码理解:读一个陌生仓库,告诉你这个函数被谁调用、那个配置在哪里生效。
- 重构与迁移:把回调改成 Promise、把旧版本 API 升级到新版本、把一段逻辑抽成独立模块。
- 调试排错:把报错贴给它,它能定位到具体行并给出修复方案,甚至自己跑测试验证。
- 测试编写:根据现有代码补单元测试,覆盖边界条件。
- 文档与注释:给函数补文档、给项目写 README。
适合谁来用?我的判断是:有基础的人收益最大,纯小白要谨慎。因为 Agent 会犯错,而且错得很自信。你得有能力判断它给的东西对不对,否则就是"实习生把活干砸了,你还看不出来"。所以这篇内容的目标读者是:写过一些代码、想提升效率、但还没系统用过 AI Agent 的开发者。
1.3 一个必须先建立的预期
在往下讲之前,我得先把预期管理好。AI Coding Agent 不是"许愿机"。你说"帮我做个淘宝",它做不出来。但你说"帮我实现一个商品列表接口,用现有的 ORM,返回分页数据,字段按这个 schema",它能做得又快又好。
任务颗粒度决定了它的表现。颗粒度越细、约束越明确、上下文越充分,产出质量越高。这个规律贯穿全文,后面所有的技巧本质上都是在服务这一条。
2. 核心原理拆解:它为什么能"自己干活"
2.1 Agent 的工作循环:一个不断试错的闭环
要理解 Agent 为什么强,得先看它的运行机制。抛开各家实现细节,一个 Coding Agent 的核心循环大致是这样的:
- 接收任务:你给它一句自然语言指令。
- 规划:它把任务拆成若干子步骤,决定先做什么。
- 调用工具:读文件、搜代码、执行命令、写文件——这些都是"工具调用"。
- 观察结果:看命令输出、看报错、看文件内容。
- 修正:根据结果调整下一步,回到第 3 步。
- 收敛:直到任务完成或达到停止条件。
这个循环里最关键的是工具调用能力。一个只能"聊天"的模型和一个能"动手"的 Agent,差距是数量级的。因为能动手就意味着能验证——它写完代码可以自己跑一遍,报错了能自己看,这比"盲写"靠谱太多。
提示:判断一个 AI Coding 工具是不是真 Agent,就看它能不能自主读写文件、执行命令。只能对话不能动手的,本质还是聊天机器人。
2.2 上下文窗口:实习生的"短期记忆"有多大
Agent 的另一个核心概念是上下文窗口,你可以理解为它的短期记忆容量。你给它的所有信息——任务描述、读进来的文件、命令输出、历史对话——都塞在这个窗口里。
这带来两个直接后果。第一,窗口是有限的,塞太多东西它会"忘事",或者开始抓不住重点。第二,塞什么很关键,你把整个仓库几万行代码全丢进去,它反而找不到关键信息,还不如精准地给它三个相关文件。
所以实际使用中,一个高频技巧是:别让它自己瞎找,你直接告诉它该看哪些文件。比如"修改src/utils/date.ts里的格式化函数,参考src/utils/number.ts的写法",比"帮我改一下日期格式化"高效得多。这就是在帮实习生缩小搜索范围。
2.3 工具调用:它手里的"工具箱"
不同 Agent 手里的工具集不一样,但常见的无非这几类:
| 工具类型 | 作用 | 典型场景 |
|---|---|---|
| 文件读取 | 读取指定文件内容 | 理解现有代码 |
| 文件写入 | 创建或修改文件 | 生成新代码 |
| 目录搜索 | 按名称/内容查找 | 定位相关文件 |
| 命令执行 | 运行 shell 命令 | 跑测试、装依赖、构建 |
| 网络检索 | 查最新文档 | 遇到不熟的库 |
工具越多,Agent 能做的事越多,但出错的面也越大。比如命令执行这个工具,如果 Agent 判断失误,可能跑出一条删文件的命令。所以成熟工具一般都会加确认机制,或者限制危险操作。你自己用的时候,也要对"它会执行命令"这件事保持警觉。
2.4 为什么它有时候"很聪明",有时候"很蠢"
这个现象背后其实是信息充分度的问题。当任务描述清晰、上下文给足、约束明确时,Agent 表现接近一个熟练工程师;当任务模糊、上下文缺失时,它就开始"脑补",而脑补出来的东西往往似是而非。
我踩过的一个典型坑:让它"优化一下这个查询",它二话不说加了个索引,但那个表数据量很小,加索引纯属浪费,还拖慢了写入。问题不在它笨,而在我没说清楚"这个表读多写少还是写多读少、数据量级多大"。它缺的是业务上下文,不是技术能力。
3. 实操上手:从零跑通第一个 Agent 任务
3.1 环境准备与工具选型思路
工具选型这块我不点名具体产品,只讲选择逻辑,因为这类工具迭代太快,今天推荐的明天可能就变了。你按这几个维度去挑:
- 是否支持工具调用:能不能读写文件、跑命令,这是硬门槛。
- 上下文管理能力:能不能自动检索相关文件,还是全靠你手动喂。
- 权限控制:执行命令前要不要确认,能不能设白名单。
- 与现有工作流集成:是独立 CLI,还是嵌在编辑器里,还是走 API。
- 成本:按 token 计费的,长任务可能烧得比较快,心里要有数。
我的建议是:先用一个集成度高的现成工具跑通流程,别一上来就自己搭。自己搭 Agent 框架是另一个话题,对扫盲阶段来说是过度工程。
3.2 第一个任务:让它读懂一个陌生函数
别一上来就让 Agent 写大功能,先做"阅读理解"练手。找一个你项目里稍微复杂点的函数,让它解释。
指令可以这样写:
请阅读 src/services/order.ts 中的 calculateDiscount 函数, 用中文解释它的输入、输出、核心逻辑,以及它依赖了哪些外部函数。 不要修改任何文件。注意最后那句"不要修改任何文件"——这是安全护栏。新手最容易犯的错就是没限制它的动作范围,结果它顺手改了一堆东西。养成习惯:只读任务明确说只读,写任务明确说改哪个文件。
跑完之后,你对照自己的理解看它说得对不对。这一步的价值在于:你能快速判断这个 Agent 的"理解水平"到底靠不靠谱,为后续信任度打基础。
3.3 第二个任务:让它写一个独立的小函数
理解能力验证完,进入生成环节。挑一个边界清晰、依赖少的函数,比如"把秒数格式化成1h 23m 45s这种形式"。
指令模板:
在 src/utils/time.ts 中新增一个函数 formatDuration, 输入是秒数(number),输出是形如 "1h 23m 45s" 的字符串。 规则: - 小时为 0 时不显示小时部分 - 分钟为 0 且小时也为 0 时不显示分钟部分 - 秒数始终显示 - 输入为负数时返回 "0s" 请同时补充对应的单元测试。这个指令好在哪?规则列得清清楚楚,边界条件都点到了。你会发现,指令写得越像一份需求文档,产出越接近你要的。这就是前面说的"颗粒度"。
3.4 第三个任务:让它修一个真实的 bug
前两步是热身,这一步才是日常高频场景。找一个你手头真实的、不太复杂的 bug,把报错信息、复现步骤、相关文件一起给它。
运行 npm test 时,src/cart.test.ts 里的 "should apply coupon" 用例失败, 报错是:Expected 90 but received 100。 相关逻辑在 src/cart.ts 的 applyCoupon 函数。 请定位原因并修复,修复后重新运行该测试确认通过。这里的关键是让它自己跑测试验证。这是 Agent 相比纯聊天工具最大的优势——它能闭环。你不需要自己复制报错再贴回去,它自己就能看到结果并迭代。
3.5 一次完整任务的现场记录
我拿一个真实的小任务走一遍,让你感受下节奏。任务:给一个已有的 Express 接口加参数校验。
第一轮,我给的指令是"给/api/user这个 POST 接口加参数校验,name 必填且长度 2-20,age 必填且是 0-150 的整数"。Agent 先读了路由文件,然后告诉我它打算用项目里已有的校验库,问我要不要继续。这一步它做得对——先确认再动手。
第二轮,我确认后,它改了路由文件,加了校验逻辑。然后它自己跑了一下测试,发现有个老测试因为新增校验挂了。它主动报告:"新增校验导致user.test.ts中一个用例失败,因为该用例没传 age 字段,是否需要我更新这个测试?"
第三轮,我让它更新测试。它改完,测试全绿。
整个过程我基本只做了三次确认。这就是 Agent 的威力——它把"改代码—跑测试—看结果—再改"这个循环自己跑完了,我只在关键决策点介入。如果换成手动,光是来回切终端跑测试就得花不少时间。
4. 把 Agent 用好的关键技巧
4.1 指令写法:像写需求文档一样写 Prompt
这是全文最重要的一节。Agent 的产出质量,八成取决于你的指令质量。我总结了一个好指令的要素:
- 目标:要做什么,一句话说清。
- 范围:改哪些文件,别碰哪些文件。
- 约束:用什么库、遵循什么规范、有什么边界条件。
- 验收标准:怎么算做完了,比如"测试通过"。
- 输出格式:需要它给你什么,比如"只给 diff"。
对比一下:
差的指令:"帮我优化下这个函数。"
好的指令:"优化src/utils/parse.ts里的parseConfig函数,目标是减少嵌套层级、提升可读性。保持函数签名和返回值不变,不要引入新依赖。改完后确保parse.test.ts全部通过。"
后者几乎不会跑偏,前者大概率给你一堆用不上的改动。
4.2 上下文投喂:给它"刚好够用"的信息
前面提过,上下文不是越多越好。我的经验法则是:给直接相关的文件,加上必要的背景说明,别给整个仓库。
具体操作上:
- 涉及具体函数,直接把那个文件路径给它。
- 涉及跨模块调用,把调用方和被调用方都给。
- 涉及业务规则,用一两句话把规则说清楚,别指望它从代码里猜。
注意:如果你发现 Agent 反复理解错同一个概念,多半是上下文里缺了关键信息。这时候别急着骂它,先想想是不是自己没交代清楚。
4.3 分步执行:大任务拆成小任务
一个反直觉的结论:让 Agent 一次做太多,反而更慢。因为任务一大,它规划容易乱,中途跑偏了你还得回滚重来。
正确做法是把大任务拆成有明确验收点的小任务,一个一个来。比如"给项目加用户认证"这种大活,拆成:
- 设计用户表结构,写 migration。
- 实现注册接口 + 测试。
- 实现登录接口 + 测试。
- 加鉴权中间件 + 测试。
每一步做完确认无误再进下一步。这样即使某步出错,影响范围也小,回滚成本低。
4.4 让它自己验证:测试是最好的"监工"
Agent 最大的优势是能自己跑验证。所以凡是能写测试的场景,都让它写测试并跑通。这相当于给它配了个自动监工,它自己就能发现错误并修正。
我甚至会在指令里明确要求:"改完后运行相关测试,如果失败请自行修复直到通过,修复过程中不要修改测试的断言逻辑(除非断言本身写错了)。"最后那句括号很重要,否则它可能为了让测试通过,直接把断言改宽松——这是典型的"作弊"行为。
4.5 版本控制:给 Agent 配一个"后悔药"
这条是血泪教训。用 Agent 之前,确保你的代码在版本控制里,且工作区是干净的。这样它改砸了,你一条命令就能回滚。
更进一步,可以让 Agent 每完成一个独立任务就提交一次。这样历史清晰,出问题也好定位。我见过有人让 Agent 一口气改十几个文件,结果中间某步错了,想回退都不知道退到哪,只能手动一个个改回来,比不用 Agent 还累。
5. 常见问题与避坑实录
5.1 它改了我没让它改的文件怎么办
这是新手最常遇到的惊吓。原因通常是指令里没限定范围,Agent 为了"把任务做好",顺手改了它认为相关的地方。
应对方法有三层:
- 预防:指令里明确写"只修改 X 文件,其他文件不要动"。
- 拦截:用带权限确认的工具,每次写文件前要你点确认。
- 补救:靠版本控制回滚,
git checkout一下就好。
如果已经改了,先别慌,用git diff看看它到底动了什么,往往没你想的那么糟。
5.2 它写的代码能跑但很"丑"
Agent 生成的代码经常功能正确但风格诡异:命名随意、嵌套过深、重复代码多。这不是它不会写好,而是它不知道你的规范。
解决办法是给它"风格样本"。在指令里加一句"参考src/utils/format.ts的代码风格",或者项目里放一个CONTRIBUTING.md说明规范,让它读。很多工具会自动读取项目根目录的规范文件,这个习惯值得养成。
5.3 它陷入死循环,反复改同一个地方
有时候它会卡在一个错误上,改了又错、错了又改,来回好几轮。这通常是因为它没找到真正的根因,只是在表面打转。
这时候你要主动介入,别让它继续烧 token。做法是:打断它,把更完整的报错或更明确的线索给它,或者干脆自己定位到问题,再让它执行修复。Agent 不是万能的,卡住时人的判断力才是关键。
5.4 常见问题速查表
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| 改了无关文件 | 指令未限定范围 | 明确文件范围,用权限确认 |
| 代码风格不符 | 缺规范上下文 | 提供风格样本或规范文件 |
| 反复改同一处 | 未找到根因 | 人工介入,补充线索 |
| 测试被改宽松 | 为通过而作弊 | 指令中禁止改断言 |
| 理解错需求 | 上下文不足 | 补充业务规则说明 |
| 任务做一半停了 | 上下文超限 | 拆小任务,分步执行 |
| 引入不存在的 API | 模型幻觉 | 要求它查文档或跑验证 |
5.5 几个我踩过的坑
坑一:过度信任它的"自信"。Agent 说"已修复"不代表真修好了,一定要看它有没有跑验证。我吃过一次亏,它说改完了,我直接提交,结果 CI 挂了——它根本没跑测试。
坑二:让它处理它不熟的内部库。项目里如果有自研的框架或工具库,Agent 大概率没见过,会按通用套路瞎写。这种场景要么给它看源码,要么自己写。
坑三:忽略 token 成本。长任务、大仓库、反复迭代,token 消耗很快。养成习惯:任务开始前想清楚要给它什么,别让它自己漫无目的地搜。
坑四:在脏工作区上操作。前面说过,这是最不该犯的错。我现在用 Agent 前第一件事就是git status确认干净。
6. 影响范围:AI Coding 改变了什么
6.1 对个人开发者:效率杠杆而非替代
对个人来说,AI Coding Agent 最大的价值是把重复劳动压缩了。写样板代码、补测试、查 API 用法、做机械重构,这些事以前占掉大量时间,现在可以交给它。你省下来的时间可以花在真正需要思考的地方:架构设计、业务理解、疑难排查。
但要说它替代开发者,我不认同。它替代的是"敲键盘"这个动作,替代不了"判断该敲什么"。判断力、业务理解、系统设计能力,反而变得更值钱了,因为执行层面的门槛被拉低了。
6.2 对团队协作:规范变得更重要
团队里用 Agent,会放大"规范"的价值。因为 Agent 是按你给的上下文干活的,如果项目本身结构混乱、命名随意、没有文档,Agent 产出的东西也会跟着乱。反过来,一个规范清晰的项目,Agent 能快速融入,产出质量也高。
所以我的观察是:AI Coding 会倒逼团队把工程规范做扎实。这其实是好事。
6.3 对技能要求:从"会写"到"会描述和验收"
技能重心在转移。以前强调"手速快、记得住 API",现在更强调两件事:把需求描述清楚的能力,和判断产出对错的能力。前者是沟通,后者是基本功。基本功不扎实的人,用 Agent 反而更容易翻车,因为他看不出哪里错了。
6.4 边界在哪:它做不了什么
最后划一下边界,避免过度期待:
- 它不懂你的业务,业务规则得你喂。
- 它不承担后果,代码上线出问题,责任是你的。
- 它不擅长模糊需求,越模糊它越容易跑偏。
- 它可能产生幻觉,编造不存在的 API、配置、参数。
- 它没有长期记忆,跨会话的上下文需要你自己维护。
把这些边界记牢,你就能在它擅长的领域放心用它,在它不擅长的领域保持警惕。
我个人在实际操作中的体会是:把 AI Coding Agent 当成一个能力很强但需要带教的实习生,是最舒服的心态。别指望它一步到位,也别因为它犯错就否定它。你给它清晰的任务、足够的上下文、明确的验收标准,它回报你的效率提升是实打实的。反过来,你含糊其辞、放任自流,它也会用一堆似是而非的代码回敬你。这个工具的上限,很大程度上取决于用它的人。