为什么你的 Claude Code 越用越蠢?—— 6 条实战经验总结

0 阅读4分钟

一、Claude Code(下文简称CC)原理

主要涉及到CC的基本原理以及运作方式,详见:code.claude.com/docs/zh-CN/…

二、Claude Code扩展功能

介绍了我们经常听到的Skills、MCP、Hooks等基本概念以及使用方式,详见:code.claude.com/docs/zh-CN/…

三、Claude Code使用经验总结

1、注意claude code上下文窗口

​ CC 有一个上下文窗口(约 200K,如下图所示),就像一块白板,每条消息、命令输出、文件读取都会写入这块白板。白板快满时,CC 的性能就会显著下降,需要注意的是性能衰减是从 20-40% 使用率的时候就开始了,这也就是为什么对于复杂任务或者对话轮次比较长时,CC 效果比较差了。

graph LR
    A[0%] -->|性能正常| B[20-40%]
    B -->|开始衰减| C[50%]
    C -->|显著下降| D[70%]
    D -->|性能极差| E[100%]

    style A fill:#90EE90
    style B fill:#FFD700
    style C fill:#FFA500
    style D fill:#FF6347
    style E fill:#FF0000,color:#fff

image.png 解决方案:

(1)使用clear命令定期清理一些不相关的历史

(2)使用子代理,因为子代理拥有独立上下文

(3)复杂任务拆解成多个小任务去执行

(4)避免导入或者粘贴不必要的大文件

2、善于使用多会话(即多个session)

​ 例如在开发过程中,我们可以开多个窗口,一个窗口用于设计方案,一个窗口用于代码开发,一个窗口用于代码检视。因为在单个窗口干一件事情,就会导致该窗口的 CC 没法发现自身的问题,而多个窗口不共享上下文的情况下,能起到纠错或者监督的作用。

graph LR
    A[Session 1<br/>设计方案<br/>独立上下文 A] -->|设计文档| B[Session 2<br/>代码开发<br/>独立上下文 B]
    B -->|代码| C[Session 3<br/>代码检视<br/>独立上下文 C]
    C -->|问题反馈| B

    style A fill:#E3F2FD
    style B fill:#E8F5E9
    style C fill:#FFF3E0

3、合理使用CLAUDE.md

​ 关于什么是 CLAUDE.md 的介绍,参考"二、Claude Code扩展功能"章节,至于如何合理使用,从开发的角度来说,我们可以把必要流程或动作添加到 CLAUDE.md 中,同时避免添加某些固定场景才需要用到的东西,这样可以避免使用 CC 过程中引入过长的上下文而导致性能下降

​ 举个例子:在需求开发时,我会将静态代码校验放到 CLAUDE.md 中,这些属于所有代码开发的必要流程,不管是从代码健壮性还是后期维护角度,这样会使得写出来的代码比较干净。然后像性能校验这类,可以放到 Skills 中去,因为只有某些特定的需求才需要考虑性能。

CLAUDE.md(每次启动加载)Skills(按需手动调用)
静态代码校验性能校验
代码规范要求某些场景功能校验
通用开发流程特定框架/工具链
特点:全局生效,内容过多会影响性能特点:按需调用,不占用默认上下文

4、选择做信息的提供者而不是发号施令者

​ 一般涉及到大型需求(项目)开发时,并不是所有人对整个需求流程以及细节都很清楚,往往是各自负责各自的一亩三分地,而对其他模块以及端到端的流程并不是很熟悉。尽管 CC 可以辅助完成需求,但是这里有个关键点:要如何告诉 CC 去完成?一般情况下大家会直接告诉 CC 要实现 xxx,然后将自己了解的局部信息作为实现细节告知 CC,这时候 CC 实现出来的代码可能会有很多问题,相当于在这个需求背景下,你把 CC 拉低到跟你一样的认知水平上而没法发挥出模型本身的能力。

​ 这时候可以换种方式,直接将结果告诉 CC,然后让它反问你如果要实现这个需求,需要你给它提供哪些信息,这时候它往往会提出一些你的信息盲点。这时候我们再去收集这些信息,在收集的过程中也能加深自己对业务本身的了解,从而高质量地落地这个需求。

graph TB
    subgraph bad[发号施令 - 效果差]
        U1[用户] -->|局部信息| CC1[CC]
        CC1 --> R1[输出质量差]
    end

    subgraph good[信息提供 - 效果好]
        U2[用户] -->|告诉目标| CC2[CC]
        CC2 -.->|反问| U2
        U2 ==>|完整信息| CC2
        CC2 --> R2[高质量输出]
    end

    style bad fill:#FFEBEE
    style good fill:#E8F5E9

5、善于使用命令

​ 个人来看,但凡在开发过程中,使用次数超过三次以上的相同提示词,都应该用命令来表述,例如"执行环境变量,然后执行 build.sh 编译源码"。例如下面是我编码时常用的命令:

/compile  # 编译
/run-ut   # ut

6、不要给 CC 纠错

​ 当然这里有个前提,在非 Plan Mode 下不要给 CC 纠错,否则你就会收到"您说的对",然后 CC 疯狂降智,给你输出一堆屎山代码。一般情况下,针对简单需求,如果 CC 错了,直接把避免再次出错的提示词加到原始提示词后面重新来过,如此反复即可。针对复杂需求,你可以使用 Plan Mode,这里你可以跟 CC 极限拉扯,最终敲定一份终极 plan,让其一次性完成,同时需要考虑 context 是否足够,如果不够,拆解需求,分步完成。

graph TB
    subgraph simple[简单需求 - 非 Plan Mode]
        S1[提出需求] --> S2[CC 执行]
        S2 --> S3{出错了?}
        S3 -->|否| S4[完成]
        S3 -->|是| S5[加上避免出错的提示词]
        S5 --> S2
    end

    subgraph complex[复杂需求 - Plan Mode]
        C1[进入 Plan Mode] --> C2[提出需求]
        C2 --> C3[讨论方案]
        C3 --> C4[方案敲定]
        C4 --> C5{context 足够?}
        C5 -->|是| C6[一次性完成]
        C5 -->|否| C7[拆解分步完成]
    end

    style simple fill:#E3F2FD
    style complex fill:#FFF3E0