#001-文档驱动项目-为什么老项目需要文档驱动?
——当遗留代码遇上文档驱动开发

这篇文章的由来
之前我写了《用一份 .md,把想法变成产品》系列,讲的是怎么从 0 到 1 用文档驱动开发。文章发出后,收到很多反馈。其中最多的问题是:"这套方法挺好,但我们是老项目,代码都写了好几年了,还能用吗?"
有人更直接:**"新项目谁不会写文档?关键是屎山代码怎么办?"**这个问题很现实。大部分团队面对的不是"如何从零开始",而是"如何在已有的烂摊子上改进"。所以,这个系列就是来回答这个问题的。
一、遗留代码为什么这么难?

让我们先诚实地面对一个问题:为什么遗留代码这么难搞?
老项目更难,但更普遍
坦白说,老项目引入文档驱动比新项目难 10 倍。为什么?
**新项目是一张白纸:**你可以按理想状态设计,文档和代码同步推进。
**老项目是历史包袱:**代码已经写了,很多设计决策的人已经离职,文档要从头补。更难的是:没人知道该从哪里开始。
但老项目也有优势:**痛点更明显。**新人看不懂代码?知识流失严重?改个需求提心吊胆?这些痛点会成为推动力。
**新项目是一张白纸:**你可以按理想状态设计,文档和代码同步推进。
**老项目是历史包袱:**代码已经写了,很多设计决策的人已经离职,文档要从头补。更难的是:没人知道该从哪里开始。
但老项目也有优势:**痛点更明显。**新人看不懂代码?知识流失严重?改个需求提心吊胆?这些痛点会成为推动力。
所以,这个系列不讲理想状态,讲的是:如何在现实约束下,渐进式地引入文档驱动。
二、两种思路,两种结局

面对同一个老项目,不同的处理思路会带来完全不同的结果。让我们看两个真实的案例。
周五下午 5 点的噩梦
周五下午 5 点,你正准备关电脑下班。
产品经理突然出现在你工位旁:"这个支付功能能不能支持花呗分期?客户要得急,下周要上线。"
你心里一紧。
打开 IDE,找到 PaymentService.java,2000 行代码扑面而来。翻到支付核心逻辑,发现分散在 8 个文件里。上次改这块代码的同事 3 个月前离职了,留下的注释只有寥寥几行。
Git 历史显示,这个文件被 15 个人修改过,每次都是"临时补丁"。
你不知道:
-
为什么这里要用这个状态?
-
这个重试逻辑是处理什么场景的?
-
改了这里会不会影响其他支付方式?
这就是老项目的现状。
你可能会说:"这不就是技术债务吗?重构不就完了?"
但问题是:有多少项目有机会推倒重来?
大部分时候,我们只能在这堆"屎山"上继续搭积木。
不只是技术债务,是知识流失
老项目的问题,本质上不是代码写得烂,而是知识流失了。
什么知识?
1. 设计决策的知识
-
为什么选择这个方案而不是那个?
-
当初权衡了什么?
-
有哪些坑不能踩?
2. 业务规则的知识
-
这个特殊逻辑是处理什么场景的?
-
为什么这里要这样判断?
-
哪些是历史遗留,哪些是必须保留?
3. 隐藏依赖的知识
-
改了这里,哪些地方会受影响?
-
哪些是硬性约束,哪些可以调整?
-
有没有埋着的定时炸弹?
这些知识原本在老员工的脑子里。
但人会离职,记忆会衰退。
3 个月后,连写代码的人自己都忘了当初为什么这样写。
老项目的三大困境
困境一:知识孤岛效应
场景再现:
团队里有个"大神",负责支付模块 3 年了。
每次出问题,大家都找他。每次改需求,只有他敢动代码。
他成了团队的"单点故障"。
某天他离职了。
团队傻眼了:支付模块成了黑箱,没人敢动。新来的同事花了 3 周时间,才勉强理解核心流程。
有个数据很残酷:资深开发离职后,相关模块的维护效率会下降 60%。
这不是个例。
我见过一个团队,核心的异常重试逻辑只有一位离职员工完全理解。结果一次故障排查耗时 8 小时,因为没人知道重试次数为什么是 3 次,不是 2 次也不是 5 次。
答案最终在 Git 历史的某个 commit message 里找到:"限制为 3 次是因为更多次会占用过多线程资源"。
但这个知识,没有在任何文档里。
困境二:隐性复杂度累积
表面上看,支付流程很简单:
创建订单 → 调用支付 → 处理回调 → 更新状态 → 完成
但实际运行时,状态转换是这样的:
CREATED → PAYING → PAID → SUCCESS
但其实还有隐藏的路径:
PAYING → TIMEOUT → RETRYING → PAYING (最多 3 次)
PAID → REFUNDING → REFUND_FAILED → PAID (需要人工处理)
SUCCESS → CANCELLED (特殊情况下可以取消已完成的支付)
更要命的是,有些状态转换是隐式的:
// 你在代码里看到的
if (payment.getStatus() == PAID) {
payment.setStatus(SUCCESS);
}
// 但在另一个文件的定时任务里
@Scheduled(cron = "0 */10 * * * ?")
public void reconcilePayments() {
// 每 10 分钟检查一次
// 如果支付超过 24 小时还是 PAID 状态,自动改为 CANCELLED
}
你改代码时,根本想不到有个定时任务在后台默默地改状态。
这就是隐性复杂度。
它不写在文档里,不体现在架构图里,只藏在代码的各个角落。
**真实成本:**一次"简单的"状态添加,引发了 3 个 bug,花了 2 周时间修复。
为什么?因为没人知道完整的状态转换路径。
困境三:团队越大,越慢
这听起来很反直觉:人多了,不应该更快吗?
但现实是:从 3 人团队扩展到 8 人,支付模块的需求交付周期从 1 周延长到 3 周。
为什么?
因为沟通成本超过了并行开发的收益。
3 个人的团队,大家对代码都很熟,改起来很快。
8 个人的团队,每次改动都要:
-
找到熟悉这块的人问清楚
-
评审时要多人对齐理解
-
测试时要考虑更多的交叉影响
结果就是:人多了,反而慢了。
根本原因:缺乏共同的知识基础。
每次都要重新对齐理解,每次都要从头解释一遍。
三、文档驱动的价值:从阅读理解到对话协作

现在让我们深入理解,为什么文档驱动能解决遗留代码的问题。
文档驱动能解决什么?不能解决什么?
说到这里,你可能会想:"那写文档不就行了?"
但并不是所有项目都适合文档驱动。
我得先给你泼盆冷水。
✅ 适合文档驱动的场景
1. 核心业务逻辑需要多人维护
如果一个模块只有你自己在维护,且不打算换人,那文档的价值有限。
但如果:
-
有新人要加入
-
需要跨团队协作
-
核心成员可能离职
那文档就是必需品。
2. 团队有人员流动
如果团队稳定,成员 3 年不变,靠口口相传也能维持。
但现实是:人员流动是常态。
平均来说,一个工程师在一家公司待 2-3 年。你的团队也不例外。
3. 需求变更频繁但模式相似
支付模块就是典型:
-
新增支付方式(支付宝、微信、花呗...)
-
调整支付流程(加验证、改状态)
-
处理新的异常场景
如果每次都从头梳理,太浪费时间。
有文档,新需求来了,对照着改就行。
4. 有明确的业务规则和状态机
像支付、订单、工单这种,业务规则很明确,用文档描述很清晰。
但如果是算法类、探索性的项目,文档的价值就打折扣了。
5. 团队愿意投入时间建立长期能力
这一条最重要。
如果团队连看文档的时间都没有,写了也白写。
如果管理层只看短期收益,不愿意投入,那趁早别开始。
❌ 不适合的场景
1. 一次性项目或短期项目(< 3 个月)
投入产出比不划算。
写文档的时间,可能比项目本身还长。
2. 团队规模很小(1-2 人)且稳定
面对面沟通更高效。
文档反而成了负担。
3. 业务逻辑极其简单
纯 CRUD 的管理后台,代码本身就是最好的文档。
4. 代码即将重写
如果已经决定推倒重来,别在旧系统上浪费时间了。
先重写,再为新系统写文档。
5. 团队文化强烈抵制文档
如果团队里全是"代码就是文档"的信仰者,且无法改变,那就别强推了。
等待合适的时机,或者接受现状。
6. 管理层不支持持续投入
文档需要长期维护。
如果管理层只给你 3 个月时间"见效果",那注定失败。
真实收益:不是万能药
文档驱动不是银弹,但在合适的场景下,收益是实实在在的。
短期收益(1-3 个月)
别指望立竿见影,但会有一些早期信号:
新人 onboarding 时间减少 50%
-
从 2 周缩短到 1 周
-
新人反馈:"有文档看懂多了"
-
但前提是文档质量过关
Code Review 效率提升 30%
-
有文档作为讨论基础
-
减少"这里为什么这样写"的反复解释
-
但需要团队养成参考文档的习惯
需求澄清时间减少 40%
-
文档作为沟通起点
-
减少重复的需求对齐
-
但需要文档及时更新
但是:
-
需要额外投入 20-30% 的时间编写文档
-
前期效率可能暂时下降 10-20%
-
团队需要适应新的工作方式
中期收益(3-6 个月)
如果坚持下来,会看到更明显的改善:
需求开发周期缩短 20-30%
-
设计阶段就能发现问题
-
减少返工和 bug
-
团队协作更顺畅
Bug 率下降 25%
-
早期发现设计问题
-
避免隐藏的状态转换 bug
-
测试覆盖更全面
技术方案评审时间减少 50%
-
基于文档讨论,更高效
-
减少"我以为你以为"的误解
但是:
-
文档维护成本趋于稳定(每周 2-4 小时)
-
部分成员可能仍有抵触
-
需要持续推动和优化
长期收益(6-12 个月)
真正的价值在长期:
知识沉淀效应
-
团队整体能力提升
-
不再依赖个别"大神"
-
新人能更快独立工作
维护成本持续下降
-
改代码前先看文档
-
减少"摸黑改代码"的风险
-
问题排查更快
支持更复杂的需求变更
-
对系统理解更深
-
敢于做大的重构
-
技术债务可控
形成团队文化
-
新成员自然遵循
-
文档成为工作方式的一部分
-
影响其他团队
真实成本:没人告诉你的那些
网上的文章都在说文档的好处,但很少有人诚实地谈成本。
我来说说。
初期成本(前 3 个月)
时间投入:每周 8-12 小时(团队总计)
这不是一个小数字。
对于一个 5 人团队,相当于 15-25% 的工作时间。
具体花在哪里?
-
编写初始文档:20-40 小时
-
团队培训和对齐:8-16 小时
-
建立流程和模板:8-16 小时
学习成本:每人 4-8 小时
-
学习文档工具和方法
-
适应新的工作流程
-
需要 2-4 周才能自然
机会成本:可能延缓 1-2 个需求交付
这是最容易被忽视的。
前期团队要分心搞文档,开发速度会下降 10-20%。
如果正赶上紧急需求,可能得延期。
持续成本(3 个月后)
维护成本:每周 2-4 小时
-
文档更新:1-2 小时
-
Code Review 中检查文档:1 小时
-
定期回顾和改进:1 小时(每月)
隐性成本:
-
需要有人推动和维护(通常是 Tech Lead)
-
可能引发团队文化冲突
-
文档质量参差不齐需要持续改进
心理成本
这个最难量化,但很真实。
推动者的压力:
-
要说服团队
-
要应对抵触情绪
-
要向管理层证明价值
-
看不到立即效果时的焦虑
团队成员的适应压力:
-
改变习惯的不适
-
"又要写文档"的抵触
-
担心被批评文档写得不好
总成本估算
对于一个 10 人团队,第一年的总成本:
直接成本:
-
100-150 小时/人/年 = 1000-1500 小时
-
按平均时薪 200 元算:20-30 万元
工具成本:
-
文档工具(Wiki、Confluence 等):5-10 万元/年
-
自动化工具(Swagger、Screw 等):开源免费或少量成本
机会成本:
- 延缓 1-2 个需求:难以精确估算,但也是实实在在的成本
总计:约 20-30 万元的时间成本 + 工具成本
收益何时能覆盖成本?
乐观估计:6-9 个月
-
团队配合好
-
文档质量高
-
业务相对稳定
现实估计:12-18 个月
-
有些波折和调整
-
需要持续优化
-
逐步看到复利效应
如果 18 个月后仍未见明显收益,应考虑调整策略或停止。
这不是失败,只是这个方法可能不适合你的团队。
失败案例:为什么很多团队放弃了?
说了这么多好处,我得诚实地告诉你:很多团队尝试文档驱动,最后都放弃了。
为什么?
案例一:文档变成形式主义
背景:
某团队决定推行文档驱动,强制要求所有代码提交都要更新文档。
听起来很严格,很好。
问题:
文档模板过于复杂,填写一份需要 30 分钟。
大家开始应付:
-
复制粘贴之前的文档
-
随便写几句应付检查
-
没有人认真看文档
6 个月后,文档和代码严重脱节。
大家宁愿读代码,也不看文档。
教训:
过度的流程会扼杀主动性。
文档应该是帮助理解的工具,不是完成任务的负担。
正确做法:
从最小可行文档(MVD)开始:
-
只记录核心决策和关键流程
-
模板要简单,填写时间 < 10 分钟
-
不追求 100% 覆盖,聚焦高价值内容
案例二:AI 生成的文档无人维护
背景:
某团队用 AI 工具快速生成了 100 篇文档。
看起来效率很高。
问题:
AI 生成的文档过于泛化:
-
缺乏项目特定的业务上下文
-
设计决策和"为什么"都是编的
-
开发人员不信任这些内容
更糟糕的是,没有人有 ownership。
文档很快过时,但没人愿意维护。
教训:
AI 是工具不是银弹。
人的 ownership 和理解才是关键。
正确做法:
AI 辅助生成初稿,人工精炼和维护核心部分:
-
AI 生成框架和结构
-
人工补充业务规则和设计决策
-
明确每份文档的 Owner
-
定期 Review 和更新
案例三:文档成为新的技术债务
背景:
某团队建立了详尽的文档体系,覆盖了所有模块。
看起来很完美。
问题:
文档量太大(200+ 页):
-
无人完整阅读
-
文档之间有冲突和重复
-
维护成本超过收益
3 年后,60% 的文档已经过时。
团队决定"推倒重来",但没有人愿意去清理。
文档变成了新的技术债务。
教训:
文档也需要"重构",要敢于删除过时内容。
不是越多越好,而是越精准越好。
正确做法:
遵循"最少文档原则":
-
只记录真正需要的内容
-
定期清理过时文档(每季度一次)
-
文档要有生命周期管理
-
敢于删除低价值内容
自我评估:你的项目适合文档驱动吗?
说了这么多,关键问题来了:你的项目适合吗?
别急着开始,先做个评估。
评估检查表
项目特征评估:
-
项目已运行 > 6 个月,且预期继续运行 > 12 个月
-
代码库规模 > 10,000 行或核心模块 > 3,000 行
-
团队规模 ≥ 3 人,或有人员流动计划
-
有明确的业务逻辑,不只是 CRUD
-
需求变更频率 ≥ 每月 1 次
团队准备度评估:
-
Tech Lead 愿意投入时间推动
-
至少 1-2 名核心成员支持
-
管理层认可长期投入价值
-
团队成员有基本的文档编写能力
-
没有强烈的抵触情绪
资源可行性评估:
-
可以分配 20-30% 的时间用于文档建设(前 3 个月)
-
允许前期效率暂时下降 10-20%
-
有持续改进的耐心(至少 6 个月)
-
可以接受失败和调整
评分标准
12-16 项:非常适合,现在就可以开始
你的项目和团队条件都很好。
但仍要保持理性,做好长期准备。
8-11 项:适合,但需要先解决部分阻碍因素
找出那些未勾选的项,先想办法改善。
比如:
-
管理层不支持 → 先做小范围试点,用数据说话
-
团队有抵触 → 先找支持的人,展示成功案例
4-7 项:不太适合,建议先从小范围试点
不要全面推广。
选一个小模块试试水,看看效果如何。
如果 3 个月后效果不好,及时停止。
0-3 项:不适合,应该寻找其他改进方案
诚实地说,你的项目可能不需要文档驱动。
或者说,现在不是合适的时机。
可以考虑其他方案:
-
加强代码注释
-
定期技术分享
-
Pair Programming
-
等待更好的时机
成本收益计算器
别只看概念,算算实际的投入产出。
投入估算(前 6 个月):
初期投入(前 3 个月):
- 核心文档编写:40 小时 × 时薪 200 元 = 8,000 元
- 团队培训:16 小时 × 5 人 × 200 元 = 16,000 元
- 流程建立:16 小时 × 200 元 = 3,200 元
- 机会成本(延迟需求):1 个需求 × 20,000 元 = 20,000 元
持续投入(3-6 个月):
- 文档维护:2 小时/周 × 12 周 × 200 元 = 4,800 元
- Review 和改进:1 小时/周 × 12 周 × 200 元 = 2,400 元
总投入:54,400 元
收益估算(6 个月后):
效率提升:
- 新人 onboarding 节省:1 周 × 1 人 × 8,000 元 = 8,000 元
- 需求开发加速:20% × 5 个需求 × 20,000 元 = 20,000 元
- Bug 减少:25% × 历史 bug 成本 10,000 元 = 2,500 元
风险降低:
- 避免知识丢失损失:预估 20,000 元
- 减少沟通成本:30% × 会议时间 × 5,000 元 = 1,500 元
总收益:52,000 元
ROI = (总收益 - 总投入) / 总投入 = -4.4%
第一个 6 个月,ROI 是负的。
这很正常。
但如果坚持到 12 个月,收益会持续累积,ROI 会变正。
如果 ROI > 0.5(6 个月内回本),则强烈建议引入。
我们的案例:支付模块的选择
说了这么多理论,我们来看个实际案例。
项目背景
一个运行 3 年的电商平台:
-
支付模块代码约 15,000 行
-
支持 3 种支付方式
-
经历过 5 次大的需求变更
-
有过 2 次严重的生产事故
当前痛点
代码层面:
-
核心支付流程分散在 8 个文件中
-
状态流转逻辑混乱
-
测试覆盖率不足 40%
团队层面:
-
只有 2 个人敢改支付代码
-
新人需要 2-3 周才能理解
-
每次改动都需要资深工程师 review
业务层面:
-
新增支付方式需要 2-3 周
-
支付异常排查平均耗时 2 小时
评估结果
用刚才的检查表评估:
项目特征:✅✅✅✅✅(5/5)
-
运行 3 年,预期继续运行
-
代码规模 15,000 行
-
团队 5 人
-
业务逻辑明确
-
需求变更频繁
团队准备:✅✅✅⚠️✅(4/5)
-
Tech Lead 支持
-
2 名核心成员认可
-
管理层希望 3 个月见效(有点急)
-
团队有文档能力
-
没有强烈抵触
资源可行:✅⚠️✅✅(3/4)
-
可以分配 20% 时间
-
前期效率下降可接受
-
有 6 个月耐心
-
但管理层希望快速见效
总分:12/14 项
决策
适合引入,但采用渐进式方案
不是全面铺开,而是:
-
只聚焦核心支付流程(约 3,000 行代码)
-
建立最小可行文档(MVD)
-
设置明确的里程碑和退出条件
-
每月评审一次,效果不佳可以调整或终止
风险预案
如果 3 个月内新人 onboarding 时间没有缩短:
-
评估文档质量是否有问题
-
调整文档结构和内容
-
必要时更换试点模块
如果团队抵触情绪增加:
-
暂停并重新评估
-
听取团队反馈
-
调整推进策略
如果管理层失去耐心:
-
准备应急的成果展示
-
用数据说话(即使改进很小)
-
强调长期价值
目标设定
短期目标(3 个月):
-
新人理解时间从 2 周缩短到 5 天
-
完成核心流程文档
中期目标(6 个月):
-
文档覆盖 80% 核心场景
-
新增支付方式时间缩短到 1 周
长期目标(12 个月):
-
建立文档驱动的维护机制
-
测试覆盖率提升到 70%
下一步:如何开始?
如果你的评估结果是"适合",那接下来怎么办?
第一步:建立共识(1-2 周)
别一个人闷头干。
和团队沟通:
-
分享本文的评估结果
-
讨论并明确目标和期望
-
确定投入的时间和资源
-
设定可衡量的成功标准
关键问题:
-
我们为什么要做这个?
-
期望达到什么效果?
-
需要投入多少时间?
-
如果效果不好,什么时候停止?
第二步:选择试点范围(1 周)
不要贪多。
选择一个代表性的模块:
-
选择标准(参考前面的"支付模块案例")
-
定义清晰的边界
-
评估初期投入
-
准备失败的 Plan B
第三步:建立初始文档(2-4 周)
核心原则:最小可行文档(MVD)
不追求完美,先完成 80% 的核心内容:
-
使用 AI 辅助生成框架(第二篇详述)
-
人工精炼和补充关键信息
-
团队 Review 和对齐理解
-
记录过程中的问题和决策
别陷入细节。
第一版文档的目标是:让新人能在 5 天内理解核心流程。
而不是:记录所有代码细节。
第四步:建立维护机制(持续)
文档不是一次性的,需要持续维护:
-
将文档纳入 Code Review 流程
-
定期回顾和更新(每月一次)
-
收集反馈并改进
-
调整激励机制,让文档成为文化
第五步:定期评估(每月一次)
不要盲目坚持。
每个月问自己:
-
文档是否被实际使用?
-
新人 onboarding 是否有改善?
-
团队反馈如何?
-
投入产出比是否合理?
如果 3 个月后效果不明显,及时调整或暂停。
最后的话
文档驱动不是银弹,不是所有项目都适合。
但如果你的项目:
-
代码复杂,难以维护
-
团队有人员流动
-
知识容易流失
那文档驱动可能是性价比最高的改进方案。
关键是:
-
理性评估,不盲目跟风
-
从小范围开始,渐进式推进
-
设定现实的目标和期望
-
持续评估,允许失败
记住:
写文档的目的不是为了写文档,而是为了让知识不再流失,让团队协作更高效,让新人能更快成长。
如果文档做不到这些,那就没必要做。
下一篇预告:
《第二篇:让 AI 帮你理解遗留代码》
我们会详细讲解:
-
如何用 AI 快速生成文档框架
-
AI 的能力边界和局限性
-
人工验证和精炼的关键技巧
-
完整的工作流和工具选择
但记住:**AI 是辅助,不是替代。**人的理解和判断才是核心。