🌈个人主页:一条泥憨鱼(欢迎各位大佬莅临)

🎬精选专栏:数据结构与算法Java ,苍穹外卖日记AI与AgentJavaWeb

前言:

用了一段时间的Claude Code,同时总结了一下各领域大佬们的经验,容易踩的坑基本都在这篇文章里了。

先讲一件真事。有一次我让 Claude Code 帮我写一个用户登录模块,它写得很快,没什么问题。然后我说:把密码校验逻辑改成支持 bcrypt,它重写了整个 UserService,把我之前手动调的 JWT 过期时间也覆盖了。我当时没注意到,上线后所有用户两分钟后就被踢出登录。

我气的不是 Claude——是气我自己没先告诉它游戏规则

Claude Code 不是一个聊天框。它是一个 Agent——有记忆机制、有权限体系、有工具调用能力、能并行干活。你把它当聊天框用,它就给你聊天框的水平。你把它当 Agent 用,它能一个人干一个模块。

好了,进入正题。

我们先看一眼这 11 个概念怎么串在一起的:

   Claude Code Agent (主进程)
                     |
         ┌───────────┴───────────┐
    记忆 & 配置层          执行 & 控制层
  CLAUDE.md / 上下文      权限 / 计划模式
      检查点              钩子 / 斜杠命令
                     |
              能力扩展层
         MCP / 技能 / 插件 / 子代理

左边是让 Claude 知道该怎么做,右边是控制 Claude 怎么做,下面是让 Claude 能做更多事。记住这个三层结构,后面的概念就好理解了。


01. CLAUDE.md —— 你的项目说明书

每次启动 Claude Code,它第一件事就是读项目根目录下的 CLAUDE.md。你可以把它理解成新员工的入职手册——公司技术栈、代码规范、什么不能做,写清楚了,不用每次嘴对嘴交代。

这是来自一个项目的 CLAUDE.md:

# 项目信息
Spring Boot 3.x + MyBatis-Plus 的电商后台。

# 技术栈
- Java 17
- Maven 构建

# 代码规范
- Service 方法加 @Transactional
- Controller 层不写业务逻辑
- 统一返回 Result<T>
- 命名全部驼峰,禁止缩写(DTO/VO/PO 除外)

# 禁止事项
- 不要改 pom.xml 里已有的依赖版本
- 不要删除 TODO 注释
- 生成 SQL 不要用 SELECT *

有了这个,你不用每次都说我们用 Java 17,不要 SELECT *。Claude 自己知道。

一个容易被忽略的点:CLAUDE.md 的内容会占上下文窗口。写得太多太啰嗦,反而挤掉了真正有用的对话空间。我的经验是重点规则控制在 20 条以内,够用就行。


02. 权限 —— 管好 Claude 的手

Claude Code 是真的能读写你硬盘上的文件、执行 Shell 命令的。这是它强的地方,也是你需要小心的原因。

权限系统说白了就是一句话:告诉 Claude 哪些文件能碰,哪些绝对不能碰。

{
  "permissions": {
    "allow": ["src/**", "test/**", "docs/**"],
    "deny": [".env", ".env.production", "secrets/**", "*.pem"]
  },
  "requireConfirmation": ["git push", "rm -rf", "DROP TABLE"]
}

deny 的优先级高于 allow。所以你把 src/** 放进白名单,但把 .env 放进黑名单,Claude 永远碰不到你的密钥文件。

容易犯的错误:最初没把 *.pem 加黑名单,Claude 在做代码分析时把整个项目文件树输出了一遍,密钥文件名出现在日志里。不是什么大事故,但足够让我们把黑名单配置变成每个项目的第一个提交。


03. 计划模式 —— 先想清楚再动手

普通模式下,你一句话下去 Claude 就开始改代码。如果方向不对,等你发现的时候已经动了十几个文件。

计划模式就是:让 Claude 先把方案列出来,你确认了再执行。
- 在提示词里加一句:先出计划,不要改代码
- 用命令 /plan 帮我把 UserService 拆成读写分离的两个 Service

Claude 会输出类似这样的东西:
1. 分析现有 UserService 的接口定义
2. 创建 UserReadService(只读操作)
3. 创建 UserWriteService(写操作)
4. 更新所有调用方的引用
5. 运行单元测试验证

确认执行?

对于重构、跨模块改动、或者你不太确定要怎么实现的任务,5 分钟看计划比改崩了再回滚划算得多。但对于加一行日志这种小事就别开计划模式了——杀鸡用牛刀。


04. 检查点 —— AI 的「存档读档」

玩过 RPG 的都知道打 Boss 前先存档。检查点就是 Claude Code 的游戏存档。

# 手动存档
/checkpoint save "重构支付模块前的稳定版本"

# 查看存档列表
/checkpoint list

# 读档
/checkpoint restore "重构支付模块前的稳定版本"

底层就是 Git。Claude 帮你自动 git commit,改坏了就 git reset 回去。我对自己的要求是:只要改动超过 5 个文件,先打检查点。养成习惯就不容易翻车。

Claude 有时候也会自动打检查点——比如在执行高风险操作之前。但不要全指望自动的,重要的节点自己手动存一个。


05. 技能 —— 把重复操作封装成模板

我每周都要让 Claude 写 CRUD 接口。每次都得重复说:用 Result 返回格式、加参数校验、写好注释、Controller 路径用 RESTful 风格。说多了就很烦。

技能就是把这些重复指令打包成一个文件,以后一个命令就能调用。

# skills/crud-generator.md

## 输入参数
3. 生成 Service 接口 + ServiceImpl
4. 生成 Controller(Result<T> 返回)
5. 生成单元测试

## 规范约束
- 主键 @TableId(type = IdType.ASSIGN_ID)
- 软删除字段 is_deleted
- 时间字段 LocalDateTime
- Controller 路径 RESTful

/skill crud-generator entity=Product fields=name,price,stock,categoryId

一套代码直接生成,格式统一,团队成员之间也能共用。说到底是 DRY 原则——连跟 AI 的对话都别重复。


06. 钩子 —— 关键时机自动触发

   

"post-edit": [
      {
        "name": "auto-format",
        "command": "mvn spotless:apply",
        "when": "*.java files changed"
      },
      {
        "name": "run-tests",
        "command": "mvn test -q",
        "on-failure": "notify-claude"
      }
    ],
    "post-task": [
      {
        "name": "send-summary",
        "command": "node scripts/notify-feishu.js"
      }
    ]
  }
}

钩子最让我兴奋的用法是:Claude 写代码 → 自动跑测试 → 测试红了自己修 → 再跑 → 直到全绿。一个完全自动的 TDD 循环。不过前提是你的测试覆盖得够好,不然 Claude 修的可能是错的。

实用一点的场景:每次 Claude 完成任务后自动发一条飞书/钉钉通知。你不需要盯着屏幕,干完活自然收到消息。


07. MCP —— AI 工具调用的 USB 接口

MCP(Model Context Protocol)是 Anthropic 定义的一套标准协议。理解它的价值很简单:以前每个 AI 工具的接入方式都不一样,MCP 出来之后,工具实现一次,所有支持 MCP 的模型都能用。

MCP 之于 AI 工具调用,就像 HTTP 之于互联网通信。

举个最小实现:

@RestController
@RequestMapping("/mcp")
public class UserMcpServer {
    @Autowired
    private UserMapper userMapper;

    @GetMapping("/tools")
    public List<McpTool> listTools() {
    }

    @PostMapping("/call")
    public McpResult callTool(@RequestBody McpCallRequest req) {
        if ("get_user_count".equals(req.getTool())) {
            long count = userMapper.selectCount(null);
            return McpResult.success("当前用户总数:" + count);
        }
        return McpResult.error("未知工具");
    }
}

有了 MCP,Claude 不只是生成代码的工具。它能查你的数据库、调内部 API、读 Confluence 文档、操作 Jira。MCP Server 怎么写、怎么部署,值得另开一篇文章来讲。


08. 插件 —— 现成的能力包


code-executor   让 Claude 运行代码看结果
file-reader     读 PDF、Word、Excel
browser-control 操作浏览器(点击、填表、截图)
git-manager     自动 commit、push、创建 PR

实际项目里两个一起用:私有业务数据走 MCP,通用能力走插件。不冲突。


09. 上下文 —— Claude 的白板,用完就擦

上下文窗口是 Claude 每次能记住的内容上限。把它想象成一块固定大小的白板——对话记录、代码文件、CLAUDE.md 都写在上面。写满了,最早的内容就被擦掉。

这就是为什么聊久了 Claude 突然忘了你一开始说的规范——你的 CLAUDE.md 被挤出去了。

几个好用的办法:
- 关键规则写进 CLAUDE.md,每次自动加载,不占对话空间
- 大任务拆成小任务,每个任务开新对话。别把所有东西堆在一个窗口里
- /compact 压缩历史,保留结论,清掉细节
- 喂代码只喂相关的那几十行,别把整个项目倒进去


10. 斜杠命令 —— 常用操作的快捷键

以 / 开头的快捷指令,跟 VS Code 的命令面板一个思路:

/plan          先出方案不动代码
/compact       压缩对话,释放上下文
/clear         清空对话,重来
/checkpoint    存档 / 读档 / 列表
/read          读取文件到上下文
/diff          查看当前改动

你可以自定义斜杠命令,放在 .claude/commands/ 目录下。团队常用的操作封装成命令,/gen-api、/review 直接调用。


11. 子代理 —— AI 多线程

子代理是 Claude Code 区别于普通 AI 助手最核心的能力:主 Claude 可以并行派出多个子实例,各自执行子任务,最后汇总结果。

说个实际场景。让 Claude 做一次全项目代码审查,检查安全漏洞、性能瓶颈和代码规范:

主 Claude(项目经理)
    ├── 子代理 A:扫 SQL 注入 / XSS / 权限绕过
    ├── 子代理 B:找慢查询 / N+1 / 内存泄漏
    └── 子代理 C:检查命名 / 注释 / 代码结构
三个子代理并行跑,各自返回报告,主 Claude 汇总。

跟多线程的思路一样,但有本质区别:多线程共享内存,存在竞态;子代理每个实例有独立上下文,天然隔离。代价是子代理之间沟通成本高,而且每个子代理都烧 Token。

适合复杂的一次性大任务。简单任务别滥用——为了格式化一个文件开三个子代理,属于浪费。


常见问题

AI Agent 和普通 AI 聊天有什么区别?

普通聊天是一问一答,你没有问它不会动。Agent 是给你一个目标,它自己想办法完成——会制定计划、调用工具、处理异常。核心区别在于 Agent 有工具调用、循环执行和自主决策的能力

MCP 和 Function Calling 有什么区别?

Function Calling 是厂商私有的,OpenAI 一套格式、Anthropic 另一套。MCP 是开放标准,工具实现一次,支持 MCP 的模型都能调用。跟 HTTP 一样,标准的意义在于通用。

上下文满了会怎样?

最早的对话被截断,Claude 开始失忆——输出质量下降,或者违反你之前定的规则。解法就几个:/compact 压缩、CLAUDE.md 存关键规则、大任务拆分、或者用 RAG 把文档放向量库里按需检索。
思路一样:并行、分解、汇总。区别在于多线程共享内存有竞态,子代理独立上下文天然隔离。子代理的调度由 AI 自己决定,多线程的调度是人写的代码。


建议的学习顺序:

CLAUDE.md → 权限 → 斜杠命令 → 计划模式 → 检查点 → 钩子 → MCP → 子代理。

不用一口气全学完。先用好前三层(CLAUDE.md + 权限 + 斜杠命令),你的效率就已经比 90% 的用户高了。后面的一步一步来,用到的时候再深挖。

现在,把 CLAUDE.md 写到你的项目根目录里去。不用很复杂,先写 10 条,够用了。

更多推荐