接手一个维护了两年的老项目时,我对“AI 编码助手”这回事已经有点麻木了。聊天窗口里它能写出漂亮的函数,能解释晦涩的逻辑,可一旦我说“帮我把这个导出功能加上”,它就变成了一台只会输出零散代码片段、却从不关心项目里其他文件的打字机。直到我把工作场景从聊天窗口搬进终端,换成 Claude Code 之后,我的第一反应不是“它真聪明”,而是“它终于愿意待在我的项目里了”。
这个区别才是理解 Claude Code 的正确入口。它不是又一个更聪明的问答机器人,而是一种长在项目目录里的编码代理。它能读文件、写文件、执行命令、根据报错继续修改,然后再跑一遍测试,直到把任务真正做完整。换句话说,它的价值不是“给你一段代码”,而是“替你走完一遍编码工作流”。但它的坑也恰恰在这里:一旦把工作流交给它,你就要面对上下文管理、文件改动范围、批量任务稳定性、回退策略这些以前不用操心的问题。这篇文章想聊的,就是我从“能跑通”到“能放心用”之间趟出来的那套方法。
1. 先搞清楚:Claude Code 不是另一个聊天窗口
1.1 从提问到派活:Claude Code 的实际使用形态
如果你以前用的是网页版 AI 对话,你的基本操作路径是:把相关代码复制进去,让它分析,把输出复制回来。这中间有一个隐藏的成本——你替 AI 完成了大部分“进入项目”的工作。你需要知道哪些文件相关,需要截取哪些片段,需要把报错信息整理成一段能看懂的话。这套流程偶尔用一次没问题,但每天重复十几次,人的精力就变成了 AI 的输入管道。
Claude Code 改变了这个分工。它运行在项目所在的终端里,天然拥有当前目录及其子目录的访问权限。你不需要复制粘贴代码,只要告诉它“去查看 src/services/order.js 和 src/utils/excel.js,看看导出功能应该加在哪里”,它真的会自己去读文件、理解调用链,然后给出改动方案,甚至直接动手改。
这里要区分一下“聊天模型”和“代理工具”的本质差异。聊天模型的交互单位是回合:你说一句,它回一句。代理工具的交互单位是任务:你提一个目标,它自己规划路径、读取资源、执行动作、观察结果、调整方案,直到任务完成或碰到无法处理的情况。Claude Code 属于后者,至少在设计思路上是。
所以第一个要转变的认知是:你不是在“问它问题”,而是在“给它派活”。派活意味着你要交代目标、边界、质量要求和验收方式,而不是提供一个代码片段然后干等答案。
1.2 为什么终端里的代理比聊天窗口更接近真实工作流
真实编码工作流是什么样的?不是一次对话,而是循环:读代码、理解需求、写改动、跑测试、看报错、修问题、再跑测试。网页聊天窗口天然不支持这个循环,因为你必须人为地把每一次迭代的输出搬运到下一个输入里。
Claude Code 把这个循环接到了终端里。它可以直接运行测试命令,看到失败信息后定位到具体文件,修改之后再次运行,把已经变绿的结果作为完成信号。这个能力看起来是“跑个命令而已”,但它代表了一种更本质的变化:AI 从建议者变成了执行者。
当然,执行者不代表每一步都正确。我在使用中见过很多次它“自信地修改了 A 文件,却忘了 B 文件里还有一个引用”。这也是为什么需要后文的上下文管理、快照和审查机制。但我们得先承认,Claude Code 真正解决的是“反复切换上下文”的痛苦。你可能没意识到,以前每次项目间切换、每次把代码上下文重新塞给 AI,实际上都在消耗你的注意力。终端代理把这一层封装掉了,它替你保管着项目上下文,你只需要下达指令和检查结果。
一个核心判断:Claude Code 改变的不是“写代码的速度”,而是“你和 AI 协作时的职责划分”。你从内容搬运工退回成项目负责人,AI 从回答工具升级成项目执行者。这个转变值得适应,但也要付出新的管理成本。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 决定成败的是上下文,不是提示词技巧
很多第一次用 Claude Code 的人,会把它当成一个普通的命令行工具,丢一句“帮我写一个用户登录功能”进去。结果它确实写了,但写出来的东西和项目现有代码风格完全不一致,不按项目里已有的工具函数,不遵守现有的目录结构,甚至直接建议你引入一个项目里根本没用的依赖。
问题不在模型能力,而在上下文缺失。模型不理解你的项目背景,当然只能基于“一般情况”来写代码。所以 Claude Code 使用技巧里,最重要的一条不是怎么写提示词,而是怎么给它灌输项目背景。
2.1 CLAUDE.md:把项目背景写进 AI 的操作系统
Claude Code 支持在项目根目录或指定位置放置一个 CLAUDE.md 文件,它会在每次会话开始时自动读取,相当于给模型一个关于项目的“常驻记忆”。这个文件不是可选的装饰,它是你是否能稳定获得高质量输出的分水岭。
我在实际项目中总结了一份最低可用模板,大致包含四块内容:
markdown复制# 项目概览
这个项目是一个基于 Vue 3 + TypeScript 的运营后台系统,
核心业务是权限管理和数据报表导出。
# 代码风格
- 组件文件用组合式 API 和 `<script setup>` 写法
- 所有接口调用统一走 `src/api/request.ts` 里的 request 封装
- 工具函数放在 `src/utils`,命名用驼峰
- 样式优先使用项目已有的 design token,不直接写死颜色值
# 关键目录
- `src/api`:接口定义
- `src/views`:页面组件
- `src/store`:状态管理(Pinia)
- `src/utils`:工具函数
# 常用命令
- `npm run dev`:启动开发环境
- `npm run build`:构建
- `npm run test:unit`:运行单元测试
为什么要写这些?因为它能让模型在生成代码时自动对齐项目惯例。比如它知道接口要统一走 request 封装,就不会随手写一个 fetch;它知道样式要用 design token,就不会给元素硬编码一个 #336699。这些东西如果每次靠提示词说,根本说不完,而且会在长对话里逐渐被遗忘。
写 CLAUDE.md 的方式也有讲究。不要把它当成“项目使用说明书”来写,而要当成“给新入职同事的第一天培训材料”:先讲业务背景,再讲技术约束,最后讲最容易出错的地方。我一般会在项目进入稳定期之后写第一版,之后每次遇到 AI 反复犯同一个错,就往里面补一条规则。这样文件会越来越好用。
2.2 上下文预算与文件范围:不是喂得越多越好
CLAUDE.md 解决了“背景缺失”的问题,但它也带来一个新的诱惑:把什么都塞进去。我在一个项目里见过有人把完整的数据库表结构、几百行 API 文档、五六个 README 加起来的内容全部写进 CLAUDE.md,结果模型每次启动都在读一篇长文,真正有用的规则反而被淹没了。
Claude Code 和所有大模型工具一样,存在上下文窗口限制。虽然这个工具本身有一些自动压缩或“总结”机制,但你仍然要遵循一个原则:让核心上下文保持精简,让模型在需要时再去读具体文件。
我通常这样组织:
- CLAUDE.md 只写高频且稳定的信息:项目定位、代码风格、关键路径、常用命令、常见禁忌。
- 低频但重要的背景(比如复杂业务规则、详细设计文档)单独放到
docs目录,并按需在任务中指定读取。 - 一次性信息(比如本次要改的文件清单、特定的报错内容)直接放在对话指令里。
这样做的原因很简单:模型不需要每次都知道所有细节,它只需要知道“该去哪找细节”。如果任务到了某个分支需要更深入的信息,你再明确让它读某个文档,比让它一开始就记住全部内容更可靠。
另外,Claude Code 在读取文件时会有“用了多少上下文”的概念。你可以在对话中让它只查看必要的文件,或者用正则忽略不重要的目录,比如 node_modules、dist、锁文件。不是所有文件都对生成有正向帮助,喂进去一堆无关代码,反而会稀释模型对关键信息的注意力。
3. 从跑通到可控:如何让 Claude Code 按你的节奏工作
把 Claude Code 接入日常工作流之后,大多数人会经历三个阶段。第一阶段是兴奋期,什么任务都想丢给它;第二阶段是清醒期,发现它偶尔会乱改文件、跑飞逻辑、在没必要的地方自作聪明;第三阶段才是成熟期,你开始给它设定边界和节奏。这里我想重点说第二阶段到第三阶段之间的技巧。
3.1 先跑通单点任务:验证输入、输出和日志
我见过最危险的做法是:首次使用一个任务模板,就直接拿它跑几十个文件。单次跑通和稳定批量之间,隔着一整条工程化距离。
正确的起点是一个最小可验证任务。比如你想让 Claude Code 批量给一组接口文件添加日志,先不要一口气给全量文件,而是先挑一个接口文件,让它按你的要求完成修改,然后检查三件事:
- 输入是否被正确理解:它是否只改了该改的地方,没有顺手“优化”其他逻辑?
- 输出是否符合约定:日志格式、级别、字段是否和项目里已有的日志风格一致?
- 日志验证是否闭环:它有没有真的运行相关命令或至少执行语法检查,而不是停留在“我改完了”的自我声明?
如果你在第一跑就发现它改了额外的东西,那就要通过 CLAUDE.md 或任务指令收紧约束。比如你可以在指令里明确写:“只修改指定文件中的函数体,不修改其他函数,不改变任何导入语句。”如果项目里已有 eslint 和 prettier,让它在完成后运行一次检查。
单点验证还有一个好处:你可以以这次成功会话为模板,沉淀出标准任务指令。以后做同一类任务时复制指令,替换文件列表,效率会高很多。
3.2 用快照和回退兜底,再谈批量处理
Claude Code 支持在关键时刻创建会话快照(checkpoint),也支持在 Git 基础上进行回退。无论工具本身提供什么机制,你都要把自己的项目置于某种可回退的状态。
我的习惯是:在让 Claude Code 执行任何批量化改动之前,先确保当前修改已提交,或至少创建一个快照。因为代理是一次运行多步操作的,一个问题可能在第 10 步才暴露,但修改已经散落在多个文件里。如果没有回退点,你就得靠记忆手动恢复,那比不用 AI 还要累。
批量处理还有一个原则:分批比全量更可靠。假如你有 100 个文件需要添加统一的异常捕获,我建议按目录或业务模块分批,每批 10 到 20 个文件,批间让 AI 检查一次结果,或者你自己快速扫一遍 diff。批量任务最容易出的问题不是“它不懂怎么改”,而是“它在第 3 批开始之后忘记了你第 1 批的约定”。分批加上人工抽查,可以及时发现问题,避免一路错到底。
经验提醒:凡是涉及批量写文件的场景,先确认能回退,再确认分批阈值,最后才把任务交给它。顺序不要反过来。
3.3 审查与边界:让 AI 只碰该碰的文件
Claude Code 在默认情况下可能会读取目录里它认为相关的文件,这是优点也是风险。有时候你以为它只会改 A 文件,结果它顺手改了 B 文件来“配合”你的需求。如果 B 文件是另一个模块正在使用的,这就埋下了回归隐患。
所以我通常会在任务指令里明确文件边界,并对结果做一次 diff 审查。比如:
bash复制claude "修改 src/utils/date.ts 中的 formatDate 函数,支持传入 'YYYY-MM-DD' 格式。不要改动其他函数,不要新增依赖。"
然后在确认时,不只看最终输出,还要看这次会话到底改了哪些文件。大部分多少有点经验的人都会把这个动作固化下来:跑完任务之后 git diff --stat,列出改动文件清单,凡是清单里出现预期之外的文件,都要停下来问一句“为什么改它”。
这不是不信任工具,而是所有自动化工具都需要的治理机制。你在使用编译器的时候也不会盲信没有告警的构建,同样,使用代理式 AI 时,要对文件改动这件事保持一定程度的审查习惯。
4. 进阶组合:把规则、角色和检查固化下来
当你能稳定地让 Claude Code 完成单点和批量任务之后,就可以进入进阶阶段:把经常要交代的东西变成项目配置和自动化钩子,减少重复沟通成本。
4.1 用 Hooks 把检查变成自动化动作
Claude Code 提供 hooks 机制,可以在特定事件发生时自动执行脚本。最常见的用法是:在 AI 修改文件之后、或在任务执行的关键节点,自动跑格式化、lint 或测试。
我自己在一个团队项目里配置过一个简单的 hook:每次 Claude Code 完成修改后,自动运行 prettier 和 eslint,如果有错误就直接反馈给当前会话,让模型自己去修。这相当于给 AI 的每个动作配了一个“质检员”,大幅减少那种“格式很乱还要人工再跑一遍”的情况。
hook 的配置通常是放在配置目录里的,形式类似:
json复制{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "npx prettier --check {file_path}"
}
]
}
]
}
}
这里的思路比具体配置更重要:你要在“AI 改变代码”和“你检查代码”之间加一层自动校验,让质量标准不用每次都靠提示词来强调。这个机制的价值会随着使用频率上升而越来越大,因为它是作用于流程本身,而不是作用于某一次对话。
注意:hook 里的命令会根据触发事件频繁执行,所以要保证命令本身足够轻量,不要在这里跑完整测试套件或耗时构建。慢的 hook 会拖垮整个交互节奏,反倒让人不想再用。
4.2 用 Sub-agents 把任务拆给专业角色
在复杂项目里,同一个 AI 上下文如果既要处理前端样式、又要处理后端接口、还要兼顾数据库迁移,很容易顾此失彼。Claude Code 支持 sub-agents 机制,你可以为特定任务定义独立角色和独立指令,然后让主会话把任务分配给这些角色。
比如你可以定义“前端组件专家” agent,它只关注组件拆分、props/emits 设计、样式规范,不关心后端逻辑;再定义一个“代码评审员” agent,它专门做 diff 审查,检查可能引入的 bug、类型错误和风格问题。每个 agent 相当于一个“聚焦的上下文”,可以在处理专业任务时减少无关信息干扰。
Sub-agent 本质上是给任务加了一个“专业视角”。它比较适合项目复杂度已经超过单一上下文承载能力的场景。如果你的项目很小,任务也很简单,直接用主会话就够了,过多角色划分反而会增加调度成本。
4.3 三层用法:从对话层到规则层到自动化层
把前面的内容串起来,可以沉淀成一个可复用的框架。我在不同项目里用的都是同一套结构,只是具体内容不同:
| 层级 | 承载方式 | 解决什么问题 | 典型动作 |
|---|---|---|---|
| 对话层 | 每次任务指令 | 临时、一次性信息传递 | 指定文件、说明本次需求、验收标准 |
| 规则层 | CLAUDE.md、sub-agents | 稳定、重复的项目约定 | 代码风格、目录结构、权限边界、专业角色 |
| 自动化层 | hooks、脚本、命令封装 | 把检查和质量流程固化 | 自动 lint、格式化、快速测试、批量任务分解 |
这套“三层用法”可以作为你使用任何编码代理工具时的通用模板。先用对话层把当天任务说清楚,再用规则层保证模型自动遵守项目约定,最后用自动化层守住质量底线。三层各管各的事,问题就不会全部挤在对话指令里。
这个框架也解释了为什么很多人用了一段时间 Claude Code 之后,反馈“越来越顺手”:不是模型变聪明了,而是你逐渐把原来必须在对话里反复交代的东西,移到了更稳定的规则层和自动化层里。
5. 排查链路与适用边界:哪里值得信,哪里必须自己盯
任何工具都有失灵的时候,Claude Code 也不例外。遇到问题不能慌,更不能马上重开会话。按顺序排查,大部分问题都能定位到具体环节。
5.1 按现象分层排查:输入、权限、依赖、参数、边界
我习惯把 Claude Code 的问题分成五层,从外到内逐层排查:
- 看现象:是报错、卡住、不改、改错、还是结果不稳定?现象不同,排查方向完全不同。比如“卡住”大概率是任务范围过大或等待外部命令,而“改错”更可能是上下文理解偏差。
- 看输入:指令里有没有给够文件路径、业务背景、输出要求?如果让它改一个函数,但你只描述了目标,没告诉它这个函数被哪些地方调用,那它很可能改出局部正确、全局有问题的代码。
- 看权限与文件范围:它是否被允许读取关键文件?是否因为某个目录被 ignore,导致它看不到必要的上下文?有没有因为权限问题,它根本改不了目标文件?这类问题往往表现为“它表现得像没看见某个文件”。
- 看依赖与运行环境:它运行命令时,当前项目的依赖是否安装完整?Node 版本、包管理器是否和项目原来的一致?如果 AI 跑测试命令失败,不一定是它的逻辑错误,也可能是环境本身有问题。
- 看工具边界:Claude Code 某些版本或某些模型可能不支持复杂多仓库改动,或者上下文窗口已经接近上限,导致它开始丢失早期约定。这时候再优秀的提示词也没用,需要压缩上下文、拆分任务,或手动补充关键信息。
这套排查顺序的核心逻辑是:先确定是哪一层坏了,再决定修哪一层。很多人一遇到 AI 给出错误结果,马上怪“它太笨”,但问题常常出在输入不完整、环境不一致或任务范围过大。
5.2 适合用 Claude Code 的和不适合的
用了一段时间,我对它的适用边界越来越清晰。它非常适合以下几类工作:
- 熟悉代码库的短期任务:比如改一个函数、加一个参数、修复一个明确的 bug,这些任务范围可控,背景容易补全。
- 重复度高的批量修改:比如统一日志格式、批量增加类型注解、给一组函数补异常捕获,这类任务规则明确,适合自动执行。
- 快速生成初版代码:根据需求写出一个模块的初始结构,之后人工调整,能省很多起手时间。
- 代码阅读与解释:让它梳理调用链、解释一个复杂逻辑是怎么跑通的,相当于一个随叫随到的新同事。
而它目前并不适合的场景也很明确:
- 完全陌生的老项目且没有文档:如果连你自己都不清楚业务规则和模块依赖,AI 大概率会在错误的前提下做局部优化,结果看起来合理,实际上跑不通。
- 高安全、高合规要求的改动:支付、权限、敏感数据等场景,AI 修改后必须有人工深度 review,甚至应该只让它生成代码片段,不直接写文件。
- 需要全局架构判断的重构:它很难真的理解“这个模块将来要拆成三个服务”,所以对于跨模块的大重构,它只能辅助局部细节,不能承担总设计。
- 无人值守的长期任务:虽然新一代 agent 能力在提升,但真正跑十几个小时的任务,中间任何一步都可能在错误的假设上继续走下去。目前更稳妥的方式仍然是分批执行、人工检查。
这些边界不是固定不变的,但随着项目复杂度、任务类型、个人使用经验的差异,它会一直变化。保持“可以用,但要有管理”的心态,比追求“全信”或“全不信”都要实际。
往回看,Claude Code 带给我的最大改变,不是省了多少打字时间,而是重新划分了我自己与工具之间的职责。我不再是那个替 AI 搬运上下文的人,而是变成给任务划定范围、制定规则、检查结果的人。这个变化在刚开始时有点不舒服,因为你必须学会“把话说清楚”,必须接受“不检查就等于授权它乱来”。但一旦你建立了自己的项目上下文文件、任务模板和检查流程,这种协作方式就会越来越顺手。
如果你也准备把它引入日常工作,我的建议是:第一步不是研究各种花哨提示词,而是先写一版最精简的 CLAUDE.md,把你项目里那些“不用说也该知道”的规则记录下来。然后再找一个小任务跑通,检查 diff,看它是否真的理解了你的项目。等你确认它不会在项目里乱跑之后,再一步步放开任务范围。这个过程没有捷径,但它值得走一遍。
