第 12 期 | 理解"记忆断档":Vibe Coding 翻车实录分析
🎯 学习目标
学完本期你将理解:
- 为什么越写越嗨的 Vibe Coding 最后经常导致项目崩盘
- Claude Code 上下文窗口的物理限制和记忆丢失机制
- 五种典型的翻车场景及对应的预防策略
- 如何在"爽感"和"工程纪律"之间找到平衡
📖 核心概念讲解
12.1 什么是 Vibe Coding?
Vibe Coding 定义(by Andrej Karpathy):
"你完全放弃自己理解代码的企图,
完全交给 LLM,拥抱指数级的加速感,
看到什么不对就说'修一下',
然后疯狂迭代直到...
'它好了' 或者 '它彻底崩了'。"
核心特征:
✅ 极致的速度感
✅ 低门槛(不需要深入理解代码)
❌ 零可预测性
❌ 无法回退到已知正确状态
12.2 为什么 Claude 会"忘记"?
上下文窗口 (Context Window) 的本质:
╭──────────────── 200K Token 窗口 ──────────────────╮
│ │
│ [系统提示词] [CLAUDE.md] [你的对话历史] │
│ │
│ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■□□□□□□□□□□ │
│ └─── 已占用 ~75% ───┘ └── 剩余空间 ──┘ │
│ │
│ 当窗口填满时: │
│ → 最早的对话内容被截断 (Truncation) │
│ → Claude 忘记你在第 1 轮做了什么 │
│ → 它可能重新发明已经写过的函数 │
│ → 或者覆盖之前刻意设计的逻辑 │
│ │
╰────────────────────────────────────────────────────╯
12.3 五种典型翻车场景
场景 1: 目标漂移 (Goal Drift) ━━━━━━━━━━━━━━━━━━━
第 1 轮: "做一个 Todo App"
第 5 轮: "加个用户系统"
第 10 轮: "集成支付功能"
第 15 轮: Claude 觉得自己在做电商平台
❌ 结果: 代码库成了没人能理解的缝合怪
场景 2: 过度修改 (Over-editing) ━━━━━━━━━━━━━━━━━
你: "这个按钮样式不对"
Claude: 重写了整个组件树
❌ 结果: 修了按钮,破了导航
场景 3: 循环试错 (Retry Loop) ━━━━━━━━━━━━━━━━━━━
"测试没过" → 改一下 → "还是没过" → 改回去
→ 再改 → 破了更多东西 → "全部重写吧!"
❌ 结果: 消耗大量 Token,原地打转
场景 4: 幽灵依赖 (Phantom Dependencies) ━━━━━━━━━
Claude 在第 3 轮创建了 utils/helper.ts
在第 20 轮,它忘了这个文件存在
重新创建了一个功能完全一样的 utils/tools.ts
❌ 结果: 代码库出现重复模块
场景 5: 信心膨胀 (Confidence Inflation) ━━━━━━━━━
Claude: "我已经修复了所有问题 ✅"
实际上: 它只修了自己还记得的那部分
❌ 结果: 隐藏 Bug 在生产环境爆发
💻 模拟 Claude TUI 交互
场景:翻车实况 — 目标漂移
╭─ 第 1 轮(一切正常)─────────────────────────────╮
│ │
│ > 帮我创建一个 Markdown 编辑器 │
│ │
│ Claude: 好的!我来创建一个基于 React 的 │
│ Markdown 编辑器,使用 CodeMirror... │
│ ✅ 创建了 5 个文件,一切正常 │
│ │
╰────────────────────────────────────────────────────╯
╭─ 第 8 轮(开始偏离)─────────────────────────────╮
│ │
│ > 加个实时协同编辑功能 │
│ │
│ Claude: 我来集成 Y.js 进行 CRDT 同步... │
│ ⚠️ 修改了 12 个文件 │
│ ⚠️ 引入了 WebSocket Server │
│ ⚠️ 架构复杂度跳了两级 │
│ │
╰────────────────────────────────────────────────────╯
╭─ 第 15 轮(彻底失控)────────────────────────────╮
│ │
│ > 编辑器白屏了,修一下 │
│ │
│ Claude: 🔍 让我看看... │
│ (此时 Claude 已经忘了第 1-5 轮的原始架构) │
│ (它重写了 App.tsx,覆盖了 CodeMirror 配置) │
│ │
│ Claude: ✅ 应该修好了! │
│ │
│ 实际结果: 编辑器能显示了,但协同功能全废了 │
│ │
│ 💀 项目进入"修一个破两个"的死亡螺旋 │
│ │
╰────────────────────────────────────────────────────╯
正确做法:用工程纪律防止翻车
╭─ 防翻车清单 ────────────────────────────────────╮
│ │
│ ✅ 1. 每 5 轮对话执行 /compact │
│ 压缩上下文,保留关键决策 │
│ │
│ ✅ 2. CLAUDE.md 记录架构不变量 │
│ "编辑器核心基于 CodeMirror 6, │
│ 不要替换为其他库" │
│ │
│ ✅ 3. 每次大改前 git commit │
│ "在添加协同编辑前先提交当前稳定版本" │
│ │
│ ✅ 4. 限制单次 Prompt 的改动范围 │
│ "只修改 src/editor/ 下的文件, │
│ 不要碰 src/server/" │
│ │
│ ✅ 5. 使用 task_plan.md 追踪进度 │
│ 让 Claude 知道"我们在做什么, │
│ 已经做完了什么" │
│ │
╰────────────────────────────────────────────────────╯
💻 代码演示:防翻车实战工具
# ✅ 定期压缩上下文(最重要的防翻车手段)
# 在对话中输入:
> /compact
# ✅ 设置上下文使用量监控
# 在 CLAUDE.md 中加入:
cat >> CLAUDE.md << 'EOF'
## 工程约束
- 每次修改不超过 3 个文件
- 修改前先 git commit 当前状态
- 修改后立即运行 npm test
- 如果测试失败超过 3 次,停下来报告问题
EOF
# ✅ 进入新功能前检查点
claude "在开始新功能之前:
1. git status 确认当前工作区干净
2. 列出当前项目的核心文件结构
3. 然后再开始 [新功能描述]"
# ✅ 使用 Plan Mode 先预览改动
# 在终端中按 Shift+Tab 切换到 Plan Mode
# Claude 会描述它打算做什么,但不会实际执行
🔧 涉及的 Tools / Commands
| 工具/命令 | 防翻车用途 | 说明 |
|---|---|---|
/compact |
压缩上下文 | 防止 Token 溢出导致记忆丢失 |
/clear |
清空对话 | 从完全干净的状态重新开始 |
Shift+Tab |
切换模式 | Plan Mode 下预览改动再执行 |
CLAUDE.md |
持久记忆 | 记录项目核心约束和架构决策 |
git commit |
检查点 | 确保每次大改前有可回退的状态 |
📝 本期要点回顾
- Vibe Coding 爽但危险 — 不加约束必然翻车
- Claude 的上下文窗口有 物理上限,长对话必然遗忘
- 目标漂移 和 过度修改 是两大最高频翻车原因
- 用
/compact定期压缩,用CLAUDE.md固化约束 - 每次大改前 git commit 是最简单有效的安全网