Vibe Coding 实战手册
date: 2020/01/09
author: zone
[!abstract] 核心理念
AI 编程的本质不是「让 AI 写代码」,而是「让 AI 理解你想要什么」。
你的需求描述能力,决定了 AI 的输出质量。
一、注意力机制与上下文工程
为什么要理解这个?
不理解 AI 的工作原理,你就永远在瞎试。
很多人用 AI 编程的体验是:有时候特别好用,有时候特别蠢。这是因为你不知道它的「注意力」是怎么分配的。
注意力机制的本质
大语言模型基于 Transformer 架构,核心是 注意力机制(Attention)。
模型在生成每个字的时候,会「看」之前所有的内容,但不是平均地看,而是有重点地看。
1 | 你给 AI 的输入(上下文): |
[!important] 关键点
上下文越长,每个部分能分到的「注意力」就越少。
这就是为什么:
- 对话太长,AI 会「忘记」前面说的
- 一次塞太多需求,AI 会漏掉一些
- 重要信息放在中间,容易被忽略
上下文腐烂(Context Rot)
Anthropic 的工程团队提出了 Context Rot(上下文腐烂) 概念:
[!quote]
随着上下文窗口中 token 数量增加,模型准确回忆信息的能力会下降。
这不是 bug,是架构的固有限制。n 个 token 会产生 n² 个注意力关系,上下文越长,关系越稀疏。
上下文工程策略
| 问题 | 策略 |
|---|---|
| 上下文太长 | 定期开新对话,保持上下文干净 |
| 重要信息被稀释 | 把关键信息放在开头或结尾 |
| AI「忘记」之前的约定 | 用 CLAUDE.md 固化重要规则 |
| 一次性需求太多 | 拆分成多个小任务 |
[!tip] 实战建议
把 AI 的上下文窗口想象成一个容量有限的工作台。东西太多就会乱,要定期清理。
二、提示词工程
提示词的本质
提示词不是「咒语」,是沟通协议。
你和 AI 之间的沟通,本质上和你跟一个新来的实习生沟通是一样的:
- 说清楚要做什么
- 说清楚怎么做
- 说清楚做成什么样
提示词的三层结构
1 | ┌─────────────────────────────────────────┐ |
[!tip] 提示
Claude code已经内置了一份系统提示词,所以当我们使用的时候只需要输入 第二层 + 第三层即可
CLAUDE.md:一劳永逸的提示词
Claude Code 有一个特殊文件叫 CLAUDE.md,启动时自动加载到上下文。
这相当于一次性把「角色设定」和「约束条件」固化下来,每次对话不用重复说。
[!example] CLAUDE.md 模板
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 # 项目:[项目名称]
## 技术栈
- 前端:React 18 + TypeScript + Tailwind CSS
- 后端:Node.js + Express + Prisma
- 数据库:PostgreSQL
## 代码规范
- 组件使用函数式写法,不用 class
- 异步操作用 async/await
- 错误处理用 try-catch,不要静默失败
- 变量命名:camelCase,组件命名:PascalCase
## 项目结构
- /src/components - 可复用组件
- /src/pages - 页面组件
- /src/hooks - 自定义 hooks
- /src/utils - 工具函数
- /src/api - API 调用
## 重要约定
- 所有 API 响应统一格式:{ success, data, error }
- 表单验证使用 zod
- 状态管理使用 zustand
- 不要安装新依赖,除非我明确要求
思考模式关键词
Claude Code 支持不同级别的思考深度,通过关键词触发:
| 关键词 | 思考深度 | 适用场景 | 建议使用频率 |
|---|---|---|---|
| (不加) | 快速响应 | 简单修改 | 20% |
think |
基础思考 | 常规功能 | 30% |
think hard |
深度思考 | 需要设计的功能 | 35% |
think harder |
更深思考 | 复杂逻辑 | 10% |
ultrathink |
最深思考 | 架构决策 | 5% |
[!tip] 经验之谈
宁可多花 30 秒让它想清楚,也不要花 30 分钟改它的烂代码。
三、无歧义需求描述
歧义是效率杀手
最常见的问题就是:需求描述有歧义。
你说「做个登录功能」,AI 可能给你:
- 只有用户名密码的简单登录
- 带手机验证码的登录
- 带第三方 OAuth 的登录
- 以上全部
然后你说「不对」,它改一版,还是不对,再改,还是不对……时间就这么浪费了。
SMART-C 框架
| 要素 | 含义 | 示例 |
|---|---|---|
| Specific | 具体 | 不说「登录」,说「邮箱+密码登录」 |
| Measurable | 可衡量 | 「密码至少8位,包含大小写和数字」 |
| Actionable | 可执行 | 「使用 bcrypt 加密,JWT 生成 token」 |
| Restricted | 有约束 | 「不要用第三方登录库」 |
| Testable | 可测试 | 「登录成功跳转 /dashboard,失败显示错误」 |
| Context | 有上下文 | 「参考现有的 /api/register 接口风格」 |
实战对比
[!failure] 差的描述
帮我做个用户管理功能
[!success] 好的描述
实现用户管理模块,包含以下功能:1. 用户列表页
- 表格展示:ID、用户名、邮箱、角色、创建时间、状态
- 支持分页,每页 20 条
- 支持按用户名、邮箱搜索
- 支持按角色、状态筛选
2. 用户详情/编辑
- 点击用户名进入详情页
- 可编辑:用户名、邮箱、角色、状态
- 不可编辑:ID、创建时间
- 保存后返回列表页
3. 技术要求
- 使用现有的 /api/users 接口
- 表格用 shadcn/ui 的 Table 组件
- 表单验证用 react-hook-form + zod
4. 参考
- 样式参考现有的 /admin/products 页面
- API 调用方式参考 src/api/products.ts
需求描述模板
1 | ## 功能:[功能名称] |
四、验证效果
核心理念
[!note] Vibe Coding 的核心
你不需要理解代码,你只需要验证结果。
验证流程
1 | AI 生成代码 |
快速验证清单
| 验证项 | 怎么验证 |
|---|---|
| 能编译 | pnpm build 不报错 |
| 能运行 | 页面能打开,不白屏 |
| 主流程通 | 核心功能点一遍 |
| 边界情况 | 空数据、错误输入、网络错误 |
| 响应式 | 手机尺寸看一眼 |
整个过程不超过 5 分钟。
让 AI 自己写测试
[!tip] 高效做法
让 AI 写完功能后,再让它写测试。
1
2
3
4
5
6 为刚才实现的用户登录功能编写单元测试,覆盖以下场景:
1. 正常登录成功
2. 密码错误
3. 用户不存在
4. 账户被锁定
5. 输入格式错误然后跑测试,测试不过就让它改。这比你手动点点点高效多了。
五、代码审查
要不要看代码?
原则:平时不看,关键时刻看。
| 场景 | 要不要看 |
|---|---|
| 普通 CRUD | 不看 |
| 核心业务逻辑 | 看关键部分 |
| 安全相关(认证、支付) | 仔细看 |
| 性能敏感 | 看并优化 |
| 上线前 | 让 AI 做一次全面审查 |
让 AI 审查代码
与其自己看,不如让 AI 审查:
1 | 审查 src/api/auth.ts 文件,检查以下方面: |
上线前安全审查
[!warning] 上线前必做
1
2
3
4
5
6
7
8 think hard 对整个项目做安全审查,重点检查:
1. 认证和授权逻辑
2. 敏感数据处理(密码、token)
3. API 接口安全
4. 前端 XSS 防护
5. 依赖包的已知漏洞
给我一份安全审查报告。
六、Bug 定位与修复
正确姿势
出 bug 了怎么办?不要自己去翻代码。
正确的做法是:把 bug 的所有信息喂给 AI,让它定位和修复。
Bug 报告模板
1 | ## Bug 描述 |
实战对比
[!failure] 差的 bug 报告
登录不好使了,帮我看看
[!success] 好的 bug 报告
Bug:登录时页面无响应复现步骤
- 打开 /login 页面
- 输入正确的邮箱和密码
- 点击登录按钮
期望行为
跳转到 /dashboard实际行为
按钮变成 loading 状态后一直转圈,没有跳转,也没有错误提示控制台错误
1
2 POST http://localhost:3000/api/auth/login 500
Uncaught (in promise) Error: Request failed with status 500网络请求
Response: {“error”: “Cannot read property ‘password’ of undefined”}
复杂 Bug 的渐进式调试
1 | 第一轮:让 AI 分析可能的原因 |
让 AI 解释代码
如果你实在需要理解某段代码:
1 | 解释 src/utils/auth.ts 中的 validateToken 函数: |
比自己读代码快 10 倍。
七、常用技巧
技巧一:分而治之
不要一次提一堆需求。
一次一个功能,做完一个再做下一个。原因前面讲过:上下文有限,塞太多会「注意力分散」。
推荐节奏:
- 一个功能 = 一轮对话
- 一轮对话 = 描述需求 → 生成 → 验证 → 微调
- 大功能完成后,开新对话
技巧二:先让 AI 读文件
开新对话时,先让 AI 建立上下文:
1 | 阅读以下文件,理解项目结构和现有代码风格: |
这样后续的代码生成会更符合项目风格。
技巧三:用「参考」来约束风格
1 | 实现一个 ProductCard 组件,参考现有的 UserCard 组件的风格和结构 |
比你描述半天「要怎么怎么样」有效得多。
技巧四:让 AI 先出方案
复杂功能不要直接让 AI 写代码,先让它出方案:
1 | think hard 关于如何实现订单系统,我需要: |
方案确认后再让它实现,避免返工。
技巧五:保存好用的提示词
建立一个提示词库:
1 | # 我的提示词库 |
好用的提示词是可以复用的。
八、高级技巧
Plan 模式
当你面对复杂任务时,可以让 AI 先制定计划:
1 | 我需要实现一个完整的电商后台系统,包括: |
AI 会给你一份详细的项目计划。然后你可以:
1 | 好的,按照这个计划,我们先做第一个任务:[任务名] |
这样大项目也能有条不紊地推进。
[!tip] 经验之谈
Claude code 使用 Shift+Tab 可切换模式 Edit \ Plan
多文件协同修改
当修改涉及多个文件时:
1 | 这个功能需要修改以下文件,请一起修改,确保一致性: |
让 AI 模拟用户测试
1 | 假设你是一个普通用户,测试刚才实现的注册流程: |
这能帮你发现很多边界情况。
渐进式重构
老代码需要重构时:
1 | 我需要重构 src/utils/helpers.ts,这个文件太大了(500行)。 |
上下文恢复
对话太长需要开新会话时,如何恢复上下文:
1 | 我们之前在做 [项目名] 的 [功能名]。 |
让 AI 写文档
项目完成后:
1 | 为这个项目生成以下文档: |
速查表
思考模式关键词
| 关键词 | 场景 |
|---|---|
think |
常规功能 |
think hard |
需要设计的功能 |
think harder |
复杂逻辑 |
ultrathink |
架构决策 |
CLAUDE.md 必备内容
1 | # 技术栈 |
[!tip] 经验之谈
如果是现存项目可使用 /init 生成
需求描述 SMART-C
- Specific - 具体
- Measurable - 可衡量
- Actionable - 可执行
- Restricted - 有约束
- Testable - 可测试
- Context - 有上下文
Bug 报告模板
1 | ## Bug 描述 |
FAQ
[!faq]- 中文好用吗?
非常好用,全程用中文没问题。
[!faq]- 团队怎么协作?
每个人独立使用,代码合并还是用 Git。可以共享 CLAUDE.md 保持风格统一。
[!faq]- 会取代程序员吗?
不会。但会用 AI 的程序员会取代不会用的。
[!faq]- 学习曲线陡吗?
不陡。会写需求文档,就会用 AI 编程。
[!quote] 结语
这是一个沟通能力比编码能力更重要的时代。