第 12 期 | 理解"记忆断档":Vibe Coding 翻车实录分析

更新于 2026/4/5

🎯 学习目标

学完本期你将理解:

  1. 为什么越写越嗨的 Vibe Coding 最后经常导致项目崩盘
  2. Claude Code 上下文窗口的物理限制和记忆丢失机制
  3. 五种典型的翻车场景及对应的预防策略
  4. 如何在"爽感"和"工程纪律"之间找到平衡

📖 核心概念讲解

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 检查点 确保每次大改前有可回退的状态

📝 本期要点回顾

  1. Vibe Coding 爽但危险 — 不加约束必然翻车
  2. Claude 的上下文窗口有 物理上限,长对话必然遗忘
  3. 目标漂移过度修改 是两大最高频翻车原因
  4. /compact 定期压缩,用 CLAUDE.md 固化约束
  5. 每次大改前 git commit 是最简单有效的安全网

🔗 参考资料