Skip to main content
← All posts
作者:Sagasu

#001-为什么我们需要文档驱动开发?

为什么我们需要文档驱动开发?

—— 重新思考 AI 时代的开发范式

封面:卡皮巴拉的文档驱动之旅

系列导读:这是《用一份 .md,把想法变成产品》系列的第1篇。在这个系列中,我们不仅会讨论文档驱动开发的方法论,更会从零开始构建一个真实的博客系统。跟随卡皮巴拉的旅程,你将学会如何用文档驱动的方式,让 AI 成为你可靠的开发伙伴。


开篇:卡皮巴拉的困境

让我给你讲个故事。

有一只叫卡比的卡皮巴拉,它是一名开发者(是的,水豚也会写代码)。某天,它突然有了一个想法:"我要做一个个人博客,分享我在池塘边的技术思考!"

于是,卡比打开了最新的 AI 编程助手,兴奋地输入:

"给我生成一个个人博客!"

几秒钟后,AI 哗啦啦吐出了一大堆代码。卡比激动地复制粘贴,运行……然后,懵了。

代码能跑,但这不是它想要的博客。样式是 Bootstrap 4(它想要 Tailwind),数据库是 MySQL(它只想用 Markdown 文件),评论系统用的是 Disqus(它想要更轻量的方案)。更糟糕的是,代码结构非常混乱,想改却不知道从哪里下手。

这是 AI 时代开发的第一个困境:生成容易,但不一定是你想要的。

一、当前开发模式的困境:Vibe-coding 的三次失败

卡皮巴拉的三次尝试

让我们跟随卡比的三次尝试,看看传统的"边想边做"模式在 AI 时代遇到了什么问题。

第一次尝试:直接让 AI 生成

卡比的做法:

Prompt: "用 Next.js 做一个个人博客,要有文章列表、详情页、分类功能。"

结果:AI 生成了代码,但是……

  • 使用了 Pages Router(卡比想要 App Router)

  • 文章内容存在 Prisma + PostgreSQL(卡比只想用 Markdown 文件)

  • 样式用的是 CSS Modules(卡比更习惯 Tailwind CSS)

  • 包含了一大堆不需要的功能(RSS、Newsletter、暗黑模式……)

更要命的是,当卡比想要修改时,发现代码高度耦合,改一处牵扯一大片。最后只能推倒重来。

问题根源:AI 不知道你的真实意图,只能根据常见模式生成"看起来合理"的代码。

第二次尝试:详细描述需求

卡比吸取教训,这次写了一个超级详细的需求文档,足足 2000 字,涵盖了:

  • 技术栈(Next.js App Router + Tailwind CSS + TypeScript)

  • 数据存储(本地 Markdown 文件 + frontmatter)

  • 功能清单(文章列表、详情、分类、标签、搜索)

  • 性能要求(首屏加载 < 2s)

  • 设计风格(极简、优雅、响应式)

这次 AI 生成的代码质量好多了,技术栈对了,架构也基本符合预期。

但新问题出现了:

  1. 无法演化:当卡比想添加"作者系统"时,发现需要大改数据结构,牵一发动全身。

  2. 需求理解偏差:AI 对"极简"的理解和卡比不一样,生成的页面过于简陋。

  3. 缺乏上下文:后续迭代时,AI 记不住之前的决策,每次都要重新解释一遍架构。

问题根源:需求文档只是"一次性输入",没有形成可持续演化的知识体系。

第三次尝试:文档驱动开发

这次,卡比改变了策略。它没有急着让 AI 生成代码,而是先写了三份文档:

  1. intent.md:为什么要做这个博客?核心价值是什么?

  2. spec.md:博客需要哪些功能?用户如何使用?

  3. plan.md:用什么技术实现?架构如何设计?

有了这三份文档后,卡比再让 AI 生成代码。这次的体验完全不同:

  • ✅ 代码完全符合预期(因为 AI 有了清晰的参考)

  • ✅ 需要修改时,先更新文档,再生成代码(保持一致性)

  • ✅ 后续迭代时,AI 能理解历史决策(文档是记忆)

  • ✅ 新功能可以无缝融入(因为架构是可演化的)

这就是文档驱动开发的力量。

二、什么是文档驱动开发?

文档驱动 vs 边做边想

核心定义

文档驱动开发(Document-Driven Development)的核心理念是:

Documentation is the source of truth.

文档是产品的单一真实来源(Single Source of Truth),代码是文档的实现,而非反过来。

这听起来和传统的"先写文档再写代码"没什么区别?其实不然。关键在于三个不同:

1. Living Documents vs. Static Docs

传统文档(静态文档):

  • 写完就扔在一边,几乎不更新

  • 和代码脱节,没人相信文档

  • 文档是负担,是"必须完成的任务"

文档驱动中的文档(活文档):

  • 随着项目演化而持续更新

  • 文档和代码同步提交,始终一致

  • 文档是生产力工具,是"思考的外化"

一个真实的对比:

传统模式下,当你问:"这个功能为什么这么设计?",可能的回答是:"不知道,当时的人已经离职了,代码里也没注释。"

文档驱动模式下,答案在 intent.md 里写得清清楚楚:"因为我们的目标用户是技术博主,他们需要一个极简的写作环境,所以我们放弃了复杂的富文本编辑器,选择 Markdown。"

2. 迭代 + 规范 = 可控演化

文档驱动开发不是瀑布模型的复活,而是敏捷开发的增强版。

敏捷开发强调:

  • 快速迭代,小步快跑

  • 拥抱变化,响应需求

  • 工作软件优于详尽文档

文档驱动开发在此基础上补充:

  • 每次迭代前,先更新文档(明确意图)

  • 拥抱变化,但变化要有文档支持(可追溯)

  • 工作软件 + 清晰文档 = 可持续演化

公式:

敏捷开发 = 快速迭代 + 拥抱变化
文档驱动 = 敏捷开发 + 意图明确 + 可追溯演化

3. 从"记录"到"设计"

传统文档是记录:代码写完了,补一份文档交差。

文档驱动是设计:文档是思考的过程,写文档的过程就是设计的过程。

举个例子:

传统模式:

1. 写代码(边写边想,遇到问题现场决策)
2. 写完了,补一份 README
3. 过几个月,README 过时了,没人更新

文档驱动:

1. 写 intent.md(为什么做?核心价值?)
2. 写 spec.md(做什么?功能清单?)
3. 写 plan.md(怎么做?技术方案?)
4. 基于文档生成代码
5. 发现问题 → 回溯到对应文档 → 修正文档 → 重新生成代码

在这个过程中,文档不是负担,而是思考的脚手架。

三、AI 时代为什么需要文档驱动?

AI协作的正确方式

1. AI 擅长模式识别,不擅长心智解读

AI 本质上是一个超级模式匹配器。你给它一个 Prompt,它会在海量训练数据中寻找最匹配的模式,然后生成代码。

问题是:你脑子里的想法,AI 读不到。

当你说"我想要一个简洁的博客",AI 会生成一个它认为"简洁"的博客。但你的"简洁"可能是:

  • 没有侧边栏

  • 只有黑白两色

  • 只显示标题和日期,没有摘要

而 AI 的"简洁"可能是:

  • 有侧边栏,但只有三个按钮

  • 浅灰色背景 + 深灰色文字

  • 显示标题、日期、作者、标签、阅读时间

解决方案:把你的意图写成文档,AI 就能精确理解。

2. 规范是人机协作的通用语言

把 AI 想象成一个非常聪明但没有心智的"字面主义者"。你说什么,它就理解成什么。

传统协作(人和人):

  • 可以靠"默契"理解对方

  • 可以通过"追问"澄清需求

  • 可以从"语气"判断优先级

AI 协作(人和机器):

  • 没有默契,只有规则

  • 不会追问,只会按字面理解

  • 不懂语气,只看明确指令

文档就是这个"通用语言"。它把人类模糊的意图,转化为机器可理解的结构化信息。

3. 生成容易,演化难——演化才是核心竞争力

这是本系列的核心命题:

生成是廉价的,可控的演化才是稀缺的。

现在,让 AI 生成一个初版代码非常容易。但是:

  • 一个月后,你想加新功能,AI 还能保持架构一致吗?

  • 三个月后,你发现初期的技术选型有问题,能平滑迁移吗?

  • 半年后,新同事接手项目,能快速理解设计思路吗?

没有文档:每次迭代都像在沼泽里行走,不知道下一步会踩到什么。

有文档:每次迭代都有清晰的路径,知道从哪里来,要到哪里去。

真实案例:

卡比的博客经过 6 个月,从 v0.1 演化到 v1.0:

  • v0.1:静态 Landing Page

  • v0.2:添加 Markdown 文章渲染

  • v0.3:文章列表 + 分页

  • v0.4:分类和标签系统

  • v0.5:搜索功能

  • v0.8:多作者支持 + SEO 优化

  • v1.0:性能优化 + 国际化

每一次演化,卡比都是先更新文档,再让 AI 生成代码。

结果:v1.0 的代码库依然清晰、一致、易维护,就像是一次性设计出来的一样。这就是"可控演化"的力量。

四、文档驱动的三个适用场景

文档驱动开发不是万能的,但在以下三个场景特别有效:

1. 从零到一:新项目启动

典型场景:你有一个新点子,想快速验证可行性。

为什么适合文档驱动:

  • 早期方向不明确,容易走偏(文档帮你明确意图)

  • AI 生成代码速度快,但容易生成"看起来对实际不对"的代码(文档是质量保障)

  • 需要快速迭代,但不能失控(文档提供可追溯性)

卡比的博客就是这个场景:

  • 用一周时间写清楚三份文档

  • 然后用两周时间完成 v1.0

  • 整个过程完全可控,没有返工

2. 功能迭代:现有系统扩展

典型场景:产品已经运行一段时间,现在要加新功能。

为什么适合文档驱动:

  • 新功能容易破坏现有架构(文档作为参考,保持一致性)

  • 需求可能和老功能冲突(在文档层面就能发现问题)

  • 新人不熟悉历史决策(文档是知识库)

案例:

  • v0.4 添加"分类和标签"时,卡比先更新了 spec.md 和 plan.md

  • AI 基于文档生成的代码,完美融入了现有架构

  • 没有破坏性改动,没有技术债务

3. 遗留重构:技术债务清理

典型场景:老项目堆积了大量技术债,需要重构。

为什么适合文档驱动:

  • 老代码的设计意图已不可考(通过文档重建意图)

  • 重构容易破坏现有功能(文档作为功能清单)

  • 需要渐进式迁移(文档规划迁移路径)

注意:这个场景比较复杂,本系列不会深入展开。但核心思路是:先把现状文档化,再用文档指导重构。

五、项目启动:写下第一份 intent.md

写下第一份intent.md

理论讲完了,让我们动手实践。

在接下来的系列文章中,我们会从零开始构建一个真实的个人博客。第一步,就是写下这个项目的 intent.md(意图文档)。

什么是 intent.md?

intent.md** 是项目的"宪法"**,它回答三个核心问题:

  1. 为什么做?(Why)

  2. 为谁做?(Who)

  3. 成功是什么样?(Success Criteria)

注意:intent.md** 不回答"怎么做"**。它只关注意图,不关注实现。

博客项目的 intent.md

让我们看看卡比为这个博客项目写的 intent.md:

# 个人技术博客 - 项目意图文档

## 项目愿景

构建一个简洁、优雅、易于维护的个人技术博客,用于分享技术见解和方法论实践。

这不仅是一个博客,更是**文档驱动开发方法论的实践案例**。通过这个项目,展示如何用 .md 文件驱动整个产品从想法到交付的全过程。

## 目标用户

### 主要用户:我自己(内容创作者)
- 需要一个专注写作的环境,没有复杂的后台管理
- 希望文章内容完全由自己掌控(Markdown 文件存储)
- 需要快速发布(写完文章推送到 Git 就自动部署)

### 次要用户:技术社区读者(内容消费者)
- 希望快速找到感兴趣的文章(搜索、分类、标签)
- 期望良好的阅读体验(加载快、排版好、响应式)
- 可能想要评论和互动(但不是核心需求)

## 核心问题

### 为什么不用现成的博客平台?

- **Medium / 掘金 / CSDN**:平台规则可能变化,内容不完全属于自己
- **WordPress / Ghost**:功能太重,维护成本高
- **Hexo / Hugo**:静态生成器不错,但主题定制复杂

### 我真正需要什么?

1. **完全掌控**:内容、设计、技术栈都由我决定
2. **简单维护**:不想花时间折腾后台,专注写作
3. **可持续演化**:能根据需求逐步添加功能,不被架构限制
4. **方法论实践**:用这个项目证明文档驱动开发的有效性

## 成功标准

### 功能标准
- ✅ 能够快速添加新文章(从写作到发布 < 5分钟)
- ✅ 文章渲染美观(代码高亮、数学公式、图片优化)
- ✅ 搜索友好(SEO 优化、sitemap、结构化数据)
- ✅ 可扩展架构(未来可添加评论、多作者、国际化等)

### 性能标准
- ⚡ 首屏加载时间 < 2秒
- ⚡ Lighthouse 分数 > 90
- ⚡ 移动端体验优秀

### 代码标准
- 📝 代码总量 < 5000 行(保持简洁)
- 📝 测试覆盖率 > 80%
- 📝 所有功能都有完整文档支持

### 文档标准(这是关键!)
- 📄 每个版本都有对应的 intent.md、spec.md、plan.md
- 📄 文档和代码同步演化,始终保持一致
- 📄 任何人看文档就能理解设计决策

## 非目标

明确我们**不做什么**同样重要:

- ❌ 不做社交功能(关注、点赞、私信)
- ❌ 不做付费订阅(这不是商业博客)
- ❌ 不做复杂的后台管理(文件系统就是后台)
- ❌ 不追求功能全面(只做必需的)

## 时间线

- **Week 1-2**:v0.1 - v0.2(基础架构 + 文章渲染)
- **Week 3-4**:v0.3 - v0.4(列表、分类、标签)
- **Week 5-6**:v0.5 - v0.8(搜索、性能优化)
- **Week 7-8**:v1.0(完整交付 + 文档整理)

---

**最后更新**:2025-01-15
**文档版本**:v1.0
**负责人**:卡比(Capybara Dev)

这份文档的价值在哪里?

  1. 明确了方向:任何时候迷茫了,回来看这份文档,就知道该往哪走。

  2. 提供了判断标准:当有新需求时,对照"成功标准"和"非目标",就知道该做还是不做。

  3. 方便 AI 协作:把这份文档提供给 AI,它就能生成符合你意图的代码。

  4. 团队协作友好:如果未来有人加入,看这份文档就能理解项目的核心价值。

你可以立即行动

现在,轮到你了。

如果你也想做一个项目(不一定是博客),试着写下你的第一份 intent.md:

  1. 打开文本编辑器(VS Code、Obsidian、甚至记事本)

  2. 创建一个文件:docs/intent.md

  3. 回答三个问题:

    • 为什么做这个项目?

    • 为谁做?

    • 成功是什么样?

  4. 不用追求完美,先写个初稿(200-500字就够)

记住:文档驱动不是一次性写完,而是随着项目演化而持续更新。你今天写的 intent.md v1.0,可能在一个月后变成 v1.2,这完全正常。

结语:从明天开始

我们讨论了为什么需要文档驱动开发,看到了卡比从失败到成功的三次尝试,理解了文档驱动的核心理念,也写下了第一份 intent.md。

但这只是开始。

在下一篇文章中,我们将深入探讨文档驱动的三份核心文档:

  • intent.md:项目愿景(为什么做)

  • spec.md:功能规范(做什么)

  • plan.md:技术方案(怎么做)

并且,我们会真正动手,基于这三份文档,让 AI 帮我们生成博客的第一个版本:v0.1 - 一个精美的 Landing Page。


📌 核心要点

  • 🤖 AI 生成代码很容易,但生成"你想要的代码"很难 - 问题在于 AI 不理解你的真实意图

  • 📝 文档驱动 ≠ 传统文档 - 它是活的、可演化的、与代码同步的

  • 🔄 生成廉价,演化稀缺 - 可控的持续演化才是核心竞争力

  • 🎯 文档是思考的外化 - 写文档的过程就是设计的过程

  • ✍️ 从 intent.md 开始 - 明确"为什么做"比"怎么做"更重要

📖 下篇预告

第2篇:三份文档,构建你的产品蓝图

我们将详细讲解 intent.md、spec.md、plan.md 的设计哲学,并基于这三份文档,让 AI 帮我们实现博客 v0.1 - 一个优雅的 Landing Page。

你将学会:

  • 如何设计三层文档结构

  • 如何让 AI 精确理解你的意图

  • 如何生成第一个可运行的版本

🗺️ 系列导航

  1. 为什么我们需要文档驱动开发?(当前)

  2. 三份文档,构建你的产品蓝图 + 博客 v0.1

  3. 让 AI 成为你的文档执行者 + 博客 v0.2

  4. 从 v0.2 到 v0.4 的完整演化

  5. 文档的生命周期管理 + 博客 v0.5

  6. 规模化实践 + 博客 v0.8

  7. 反思与边界:什么时候该用,什么时候不该用

  8. 开始你的文档驱动之旅 + 博客 v1.0 完整交付


感谢阅读!如果这篇文章对你有帮助,欢迎分享给更多人。

下一篇文章,我们真正开始构建!🚀