前两天有位读者私信我,说看了一堆AI编程工具的安利文,结果代码还是得自己复制粘贴,问“到底有没有能真正上手干活的东西”。我的回答是:有,但你要先理解它的玩法。这里说的就是 Claude Code——一个跑在终端里的 AI 智能体。它能自己进目录、翻代码、改文件、跑命令,再根据报错重新调整方案,全程只需要你在旁边做“项目经理”,而不是“打字员”。这次我打算把自己在这套工具上踩出来的经验整理一遍,从装好第一行命令,到让它独立完成一个真实小项目,每一步怎么做、为什么这么做、什么叫真正的“高级用法”,都尽量写透。
1. Claude Code 到底是什么,能替我们做什么
1.1 从“对话式助手”到“能动手的智能体”
很多人对AI编程助手的印象还停留在网页对话框里:你提问,它给你一段代码,你复制、粘贴、保存、运行,报错了再回去复制。这种模式其实已经很高效,但本质上还是“人负责动手,AI负责动嘴”。Claude Code 改变的是这个分工,它不仅输出代码,还拥有操作本地环境的能力。
当你启动 Claude Code 后,它会以当前项目目录为工作区,实际读取文件内容、搜索关键词、执行 shell 命令、运行测试、查看报错日志,然后基于真实结果做下一步决策。比如你让它“把这个函数改成异步”,它不只是给出新代码,而是真的打开源文件、定位函数、修改内容、跑一遍关联测试,再告诉你结果。这个过程很像带一个动手能力不错的实习生:指令明确时,它可以独立完成完整任务链。
我自己的体会是,这个工具的核心不是“更聪明”,而是“更接近真实工作流”。因为它看到的不是你在网页里粘贴的片段,而是整个项目文件、目录结构、Git 状态、运行时报错。上下文一旦完整,AI 的判断质量会有质的提升。
1.2 哪些场景值得用,哪些人不适合
用了一段时间后,我总结了几个最能发挥它价值的场景:
- 重构老代码:几百行的入口脚本、混乱的参数解析、到处重复的逻辑,你只要描述清楚目标,它可以一步步拆解并完成修改。
- 补充测试用例:给定被测模块,约定测试框架和覆盖标准,它能生成结构完整的测试,并不断根据失败信息自我修正。
- 跨文件改动:涉及多个模块的接口调整,比如改函数签名、统一日志格式、迁移配置读取逻辑。
- 调试排错:把报错原样抛给它,它会顺着调用链分析问题,再动手修复。
- 生成提交信息与变更说明:改完全部文件后,让它基于
git diff写清楚“改了什么、为什么改”,比手写省力得多。
但我也要说句实话,它不适合完全不懂代码的人。Claude Code 再怎么强,基础判断力还是得在你这边。如果你连“这段代码改得对不对”“这个测试为什么失败”都把握不了,让它放手干活很容易生成一堆看起来没问题、实际经不起推敲的结果。最理想的使用者是那种“知道怎么做、但不想敲键盘”的开发者。
2. 环境准备:装好、登好、把权限握在自己手里
2.1 安装、授权与首次启动
Claude Code 的使用前提是完成安装和登录授权。官方推荐的安装方式是 npm 全局包,要求本机有较新的 Node.js 环境:
# 安装命令行工具 npm install -g @anthropic-ai/claude-code # 进入项目目录 cd my-project # 启动交互式会话 claude首次启动会引导你完成账号授权,本质是在本地生成一个令牌文件,之后在这个机器上启动就不需要重复登录了。注意这里有两个看似不起眼但很重要的点:
第一,授权选择“当前机器”即可,不要为了省事把令牌同步到公共服务器或者共享开发机,令牌等于账号的钥匙,泄露的后果比密码泄露还严重。第二,启动claude之前,先确认当前目录是正确的项目根目录。因为它会默认把当前目录当作工作区,你启动错了目录,它后面读文件、跑命令都会以错误项目为基础,越努力越跑偏。
我自己的做法是,在项目根目录新建一个专门进入 Claude Code 的终端窗口,保证工作区边界清晰。
2.2 高频启动参数与权限模式
Claude Code 的启动参数值得花几分钟看一眼,多数人只敲claude就完事,错过了不少控制能力。我把日常使用频率较高的几个参数整理在下面:
| 参数 | 作用 | 推荐场景 |
|---|---|---|
--continue | 恢复上一次任务会话 | 中断后继续干活 |
--model | 指定使用哪个模型版本 | 需要更高质量推理时 |
--output-format json | 以 JSON 格式输出结果 | 脚本化批量调用 |
--permission-mode | 设置权限模式 | 控制操作边界 |
--allowedTools | 精确放行某些工具 | 团队/自动化场景 |
--disallowedTools | 禁止某些工具 | 限制风险操作 |
权限模式是最值得重点理解的。默认情况下,Claude Code 执行命令、写文件时都会先征求你的确认,你按回车放行,或者按别的键拒绝。这种模式适合日常开发,你能全程掌控它做了什么。
还有一种跳过所有确认的模式,适合在完全可信的隔离环境(比如专门的容器、一次性沙箱)里做全自动任务。但我特别不推荐在自己日常开发的机器上开这个模式:一旦你的某条指令表达得不够严谨,它可能连续修改一堆不该碰的文件,等你发现时git diff已经很长了。
2.3 为什么“上下文”决定一切
聊 Claude Code 就绕不开上下文这个词。很多人用不好这类工具,不是 AI 能力不行,而是上下文管理出了问题。
模型对对话历史的记忆是有限度的,不可能把一个大项目所有文件全部塞进去。Claude Code 的做法是按照需要动态读取文件、记录你讨论过的路径和结论。项目小还好说,项目一大,前面聊过的一个关键约束,过了十几轮对话之后就可能被它“淡忘”。
理解这一点之后,你就会明白为什么要把重要规则“写进文件”,而不是只靠对话里的一句话。这也是后面要讲的 CLAUDE.md 的价值所在:与其反复提醒,不如让规则成为项目的一部分,让 AI 每次启动时都重新加载。
3. 高级配置:把你的规则写进项目里
3.1 CLAUDE.md:项目的长期记忆
CLAUDE.md 是 Claude Code 支持的项目级记忆文件,放在项目根目录后,每次会话启动时会被自动读取。你可以把它理解成“给 AI 的入职手册”,里面写的项目背景、技术栈、常用命令、代码约定,都会成为它后续工作的默认依据。
我见过不少人把这个文件当成摆设,或者只写两三行“这是某某项目”。其实它才是高级用法的分水岭。我截一个自己常用的骨架:
# 项目概览 这是一个基于 Python 3.11 的跨平台命令行工具,负责日志统计与报表生成。 # 常用命令 - 启动开发环境:uv run python main.py --dev - 运行测试:uv run pytest tests/ - 执行 lint:uv run ruff check . # 代码约定 - 所有日期字段统一使用 ISO-8601 字符串。 - 机器可读输出一律走 stdout 的 JSON,日志和错误走 stderr。 - 配置读取统一走 config.py 里的加载函数,禁止在业务代码里直接读环境变量。 # 禁忌事项 - 不要修改 data/ 目录下的原始数据文件。 - 不要向代码仓库提交 .env 文件。 - 此文件仅允许阅读与执行,不允许改动:deploy.sh写这个文件的重点不是“写得多”,而是“可执行”。每一条约定都应该是 AI 在编码时能直接判断对错的标准。比如“代码要优雅”这种话就没有可执行性,但“机器可读输出一律走 stdout 的 JSON”就是一条清晰约束,AI 写代码时可以直接对照。
除了项目根目录的 CLAUDE.md,用户主目录下也可以放一个~/.claude/CLAUDE.md,里面的内容会作用于所有项目。我会把个人偏好放那里,比如“默认使用单引号”“提交信息按 Conventional Commits 格式”,而把项目特有的信息放在项目内。这样在不同项目间切换时,规则既不会冲突,也不会丢失。
3.2 自定义斜杠命令:把重复劳动变成一条指令
如果你多次让 Claude Code 做同一类事情,比如“review 最近的改动”“生成变更说明”“补测试”,那就应该把这些任务固化成斜杠命令。
具体做法是在项目根目录的.claude/commands/目录下新建一个 Markdown 文件,文件名就是命令名。比如我经常用review命令,就在.claude/commands/review.md里写:
# 对最近的改动做一次代码评审。 请按以下步骤操作: 1. 使用 git diff 查看自上次提交以来的全部改动。 2. 检查是否有明显的错误、边界条件遗漏或安全风险。 3. 对每一处修改,用一句话说明“改了什么、为什么这样改”。 4. 发现问题时,直接提出修改建议,并在确认后再改动代码。 5. 最后输出一个简短结论:改动质量、需要人工复核的地方。之后在会话里输入/review,它就会自动按照这套流程执行。好处很明显:不用每次重复描述任务细节,团队协作时还能统一评审标准。类似地,你可以定义/test(补全测试)、/commit(生成提交信息)、/refactor(按模板重构)等命令,每个团队成员新加入时,只要看一遍.claude/commands/目录,就知道团队习惯怎么做任务。
3.3 用 MCP 给 AI 装上“新工具”
MCP(模型上下文协议)是另一个能明显提升效率的扩展机制。简单说,它允许 Claude Code 调用外部的工具服务,让它不仅能操作本地文件,还能跟外部系统交互。
举个实际例子:假设你的项目需要把生成的图片上传到某图片压缩服务,常规做法是你把命令复制粘贴给它,它执行完再读取结果。接入对应服务的 MCP server 后,它可以把它当作一个工具函数直接调用,流程更顺畅、反馈也更结构化学。
在项目根目录的.mcp.json里配置:
{ "mcpServers": { "image-service": { "command": "npx", "args": ["-y", "image-service-mcp"], "env": { "SERVICE_API_KEY": "your-key-placeholder" } } } }配置写好并重启会话后,Claude Code 就能感知到这个工具的存在。你可以直接说“把这张图压缩后上传,并返回访问地址”,它会在内部串联起调用链。
不过 MCP 也是一把双刃剑。第一,第三方 MCP server 质量参差不齐,有的安装后会让启动速度明显变慢,甚至报错。第二,安全风险更高——它意味着 AI 能操作的不仅是本地文件,还有外部系统。我个人的建议是:只接入自己审查过源码或来自可信维护者的 server,并且密钥别直接写进配置文件,优先用环境变量。
4. 实战拆解:让 Claude Code 完整接手一次重构
4.1 需求与场景设定
理论讲再多,不如走一遍完整流程。拿我之前处理过的一个模拟项目举例:某图像处理 Demo,一个命令行工具,入口脚本已经膨胀到几百行,参数解析逻辑散落在多个函数里,输出格式混乱——正常日志和机器可读结果混在同一个输出流,写脚本的人根本没办法稳定解析结果,而且整个项目没有任何自动化测试。
我的目标很明确:统一参数解析、把机器可读输出改成标准化 JSON、补一组基础测试,并且这个过程主要交给 Claude Code 完成,我只负责定方向、审关键节点。
4.2 第一阶段:盘点现状,输出改造计划
在这个阶段,我做的第一个操作不是让它改代码,而是让它先读代码。我给它的指令是:
先不要改任何代码。 把项目入口脚本和相关模块梳理一遍,告诉我: 1. 入口脚本里参数解析分布在哪些位置,分别用了什么方式。 2. 哪些输出是可以被脚本解析的,哪些是纯日志,它们目前是不是混在一起。 3. 按你的理解,给出一个重构计划,拆成几个可独立推进的阶段。 计划先存成 REFACTOR_PLAN.md,给我过目后我们再动手。Claude Code 会读取目录结构、打开入口脚本和相关模块,然后输出一份结构化的现状分析。这个过程比大部分人想象的要靠谱,因为它不是读文件本身,而是理解文件之间的关系。它甚至会在阅读后指出“某个函数的参数解析其实在 utils 里又实现了一遍,和入口脚本里的逻辑重复”。
这一步的意义在于,把拆解和规划的劳动从人身上匀给了 AI。拿到计划后,我不是直接说“就这么干”,而是先检查它的拆解思路是否符合我的预期。如果计划里缺了“输出兼容旧脚本”这个约束,我会直接补充进需求,再让它修改计划。人为把关的节点前移,后面执行阶段反而省心很多。
4.3 第二阶段:统一参数解析与输出格式
计划确认后,进入实际改造阶段。这一阶段我给的指令是:
按 REFACTOR_PLAN.md 的第二阶段执行: 把入口脚本里所有参数解析统一收敛到 argparse,删除重复实现; 引入统一的日志对象,所有机器可读结果统一打印到 stdout 的 JSON,日志和错误全部走 stderr。 每完成一个文件的修改,先贴出 diff 摘要,等我确认后再继续下一个文件。这里有一个关键技巧:把“改一步、确认一步”直接写进指令。Claude Code 在没人约束时容易连续改很多文件,一旦方向理解偏了,返工成本很高。让它每完成一个文件就停下来汇报,我只需要扫一眼 diff 摘要,就能在早期发现偏差。
它执行的时候会真的打开文件、删掉旧的参数处理函数、替换成argparse的写法,同时在输出层做 JSON 序列化。期间它还会自己跑一遍现有的命令行入口,观察输出格式是否符合预期。如果有不符合的地方,它会检查自己的改动,甚至回退重试。
这个阶段我最深的感触是:越复杂的重构,越需要把验收标准预先说清楚。所谓“统一输出格式”,如果我不说明“以 stdout 为界、JSON 为格式、错误走 stderr”,它能给你创造出一百种“统一”的方式。条件越具体,执行越可靠。
4.4 第三阶段:收尾检查、补测试、提交代码
重构进入尾声时,我让它做三件事:补测试、跑全量检查、生成提交信息。补测试的指令我要求它针对参数解析和输出格式两个模块各写一组 pytest 用例,覆盖正常路径、缺参路径、非法输入路径。
它生成的测试用例质量比我预期还高,不仅覆盖了边界情况,还利用了重构后参数解析集中带来的便利——比如直接调用解析函数,而不是每次都起一个子进程。这其实是 AI 理解了代码结构之后才能做出的选择。
全量检查阶段,它自己执行 pytest、lint 等命令,遇到失败会读取错误信息,再回到代码里修复。这个过程不是一次过的,中间出现过一次断言失败,原因是某个错误提示文案和测试期望不一致,它自己定位后修改了相关文案,测试恢复全绿。
最后我让它基于完整的改动生成提交信息:
基于 git diff 生成一条符合 Conventional Commits 规范的提交信息,要求包含改动范围、主要变更、以及可能影响的功能点。它输出的提交信息比我平时手写的要规范得多。我确认后直接提交,这个重构任务就闭环了。
5. 常见问题与踩坑实录
5.1 任务中断与上下文丢失
用 Claude Code 时最让人头疼的,不是它能力不够,而是长任务进行到一半,终端意外关闭,或者会话因为上下文过长而明显变笨。
先说中断。Claude Code 正常情况下支持恢复会话,关键是你要记得用--continue参数,而不是重新敲一遍任务描述。我一开始踩过坑:终端闪退后直接重启claude开始新会话,结果它完全忘了前面的改造计划和已经改过的文件,我不得不把需求重新描述一遍,浪费了不少时间。恢复会话后还要注意,它的记忆是“恢复执行”,不是“重新开始”,所以要检查一下它上次执行到哪里,再让它继续。
再说上下文过长。项目越大,对话轮次越多,模型越容易忽略早期信息。我的应对方法是:大任务拆成小阶段,每个阶段结束前让它把结果和后续计划写进一个文件。这样即使上下文被重置,新会话也能通过读取该文件快速找回状态。
5.2 “改错文件”与指令模糊
还有一次比较典型的翻车:我想让 Claude Code 优化某个模块的数据库连接逻辑,结果它不仅改了目标模块,顺手把另一个工具函数也重写了。原因是我的指令里包含了“顺便把相关依赖清理一下”这种模糊表述,它把“相关”理解得很宽。
从那以后我的指令风格就变了:涉及修改范围时,宁可多费几行字把边界讲清楚。比如“只允许修改src/parser.py和src/output.py两个文件,其它文件只能读、不能写”。如果担心遗漏,可以直接把它要动的文件先放进 CLAUDE.md 的禁忌或允许清单。
另外,每次大改之前,我都会先在一句话里要求它“先输出 diff 方案,不要直接落盘”。确认方案没毛病再让它动手,能避免绝大多数返工。
5.3 网络、认证与工具链问题
日常使用中还会遇到一些环境层面的怪问题。比如会话开始时报认证过期,需要重新登录;或者它执行某些命令时报command not found,原因是子进程继承的环境变量和当前终端不完全一致。
遇到认证过期,我的做法是先按提示重新走授权流程,再把令牌的存放位置检查一遍,确认没有因为环境变量覆盖导致读取异常。
command not found这类问题,通常出在它执行命令时用的 PATH 不完整。尤其是通过某些包管理器安装的工具,在非交互式 shell 里经常找不到。解决方案很简单:在 CLAUDE.md 里写明这些工具的完整路径,或者在启动 Claude Code 前先确认 PATH 环境变量已经被正确加载。
我把高频问题整理成一个速查表,方便随时翻:
| 现象 | 常见原因 | 我的处理方式 |
|---|---|---|
| 任务执行到一半中断 | 终端意外关闭、权限确认超时 | 使用--continue恢复,检查已执行状态 |
| 前面说过的约束它忘了 | 上下文过长、早期信息被覆盖 | 把规则写进 CLAUDE.md,阶段结果落盘 |
| 改动了不该碰的文件 | 权限模式太宽、指令边界模糊 | 收紧指令范围,要求先出 diff 方案 |
| 命令找不到 | PATH 不完整、子进程环境差异 | 写绝对路径,或启动前修正 PATH |
| 会话恢复后状态错乱 | 新旧上下文冲突 | 让它在继续前先读取阶段计划文件 |
| 认证失效 | 令牌过期、环境变量覆盖 | 重新授权,检查本地令牌配置 |
6. 安全与合规:用 AI 写代码的底线
6.1 敏感信息永远不要进对话
用 Claude Code 写代码,最大的诱惑是图省事,把密钥、令牌、内部服务地址直接贴进对话里,让它帮你联调。这个习惯一定要戒掉。
AI 编程工具的上下文处理机制意味着,你贴进去的所有内容都会成为上下文的一部分,存在被输出、被后续请求携带的风险。正确做法是:用环境变量管理密钥,让 Claude Code 读取配置、调用命令,但永远不把密钥明文展示在对话里。如果你在它的回复里看到疑似从环境变量里摸出来的敏感字符串,要立刻警惕,确认是不是某个配置文件的访问权限出了问题。
6.2 权限范围要收着点
前面提到过--dangerously-skip-permissions这类全自动模式,我再强调一次:不要在真实项目、尤其是多人协作仓库里开。
我见过有开发者图省事全程跳过确认,结果 AI 自动执行了git push --force,把一个分支的历史全改写了。这种事一旦发生,靠 AI 是救不回来的。日常开发就用默认权限模式,每条命令、每个文件改动都过一遍确认。虽然多花几秒钟,但换来的是对整个开发过程的掌控感。
6.3 第三方扩展要审查
MCP server 和自定义插件能极大扩展 Claude Code 的能力,同时也会引入新的攻击面。一个来历不明的 MCP server,理论上可以让你机器上的 AI 往任何外部地址请求数据,也能在本地执行任意命令。
我的原则是:只用开源的、有维护记录的、或者能看懂源码的 MCP server。接入前,我会先看它有哪些配置项、会请求哪些外部 API、依赖了哪些底层包。生产环境里能用官方能力解决的,就尽量不引入第三方扩展。
6.4 生成内容也要过一遍合规
Claude Code 的强项是生成代码和文档,但不是它生成的东西一定没问题。让它生成的脚本、文案、批量处理工具,发布前必须做一次人工审查。
近几年线上一堆乱象,什么爬虫脚本、钓鱼页面、垃圾点击工具,基本都是这种自动化能力被滥用搞出来的。我们在自己项目里用 AI,至少要守住基本的合规底线:不生成恶意代码、不做绕过鉴权的操作、不写欺骗性文案。这个意识不是空话,是给团队减少麻烦的必要步骤。
7. 一些个人体会
折腾了几个月,我对这套工具最大的感受是:它不会替代工程师的判断力,但能把工程师从“敲字”和“重复劳动”里解放出来。用它的正确姿势,不是把它当成一个全知全能的神,而是当成一个记性好、执行力强但缺少方向感的实习生。你交代清楚背景、验收标准、禁忌事项,然后小步放权,它就能帮你干很多原本需要一两个小时才能完成的活。
如果让我给刚上手的人一个建议,那就是从 CLAUDE.md 开始。花一晚上时间,把你所在项目的技术栈、命令、约定、雷区全部写进去。第二天你再用 Claude Code,会明显感觉到它的表现提升了不止一个档次。很多看似“AI 听不懂人话”的问题,本质上是规则没进上下文。
最后再分享一个小技巧:如果你不想让 Claude Code 反复改动某个关键文件,与其在对话里反复强调,不如直接在 CLAUDE.md 里写一句“此文件仅允许阅读,不允许修改”。文件规则比对话里的临时指令可靠得多,这才是长期使用下来最省心的方式。