“需求文档太重要了,不能交给不想写的人。” —— 但现实是,写需求文档的人往往就是不想写。
引言:一个尴尬的现实
在上一篇文章《你的 AI 编程真的提效了吗?》中,我们论证了一个核心观点:需求阶段的效率提升,对整体工程效率的影响最大。
根据 Boehm 曲线,需求阶段发现问题的修复成本是 1x,而发布后是 100-1000x。
但现实很尴尬:
- 产品经理说:“我写了需求文档,开发说看不懂”
- 开发说:“需求文档太简略,我只能猜”
- 测试说:“需求文档没有异常流程,我不知道怎么测”
- 运维说:“需求文档没有非功能需求,我不知道要多少资源”
需求文档很重要,但没人愿意好好写。
这篇文章,我们不谈"应该怎么写需求文档"(这种文章已经太多了),而是谈一个更实际的问题:
如果人不好好写需求文档,有没有什么办法来解决这个问题?
问题分析:为什么人不好好写?
在解决问题之前,先理解问题的根源。
1. 能力问题:不知道怎么写
- 没受过系统训练
- 不知道需求文档应该包含哪些内容
- 写出来的文档遗漏关键信息
2. 动力问题:觉得不值得
- 写文档很花时间
- 觉得"反正开会都说过了"
- 认为"代码才是真理,文档会过时"
3. 环境问题:没有正向激励
- 写得好的文档没人看
- 写得差的文档也没人管
- 文档和代码脱节,维护成本高
4. 流程问题:缺乏质量保障
- 没有文档质量检查
- 差文档也能进入开发阶段
- 问题在后期才暴露
核心洞察:与其指望人"变好",不如设计一个系统,让"不好好写"也能工作。
六层防护体系
我们提出六层防护体系,从易到难,层层递进:
┌─────────────────────────────────────────────────────┐
│ 需求文档质量保障体系 │
├─────────────────────────────────────────────────────┤
│ │
│ 第一层:降低门槛 —— 让人写得轻松 │
│ 第二层:多元来源 —— 不写也能有文档 │
│ 第三层:质量门禁 —— 不好就不能往下走 │
│ 第四层:主动追问 —— AI 倒逼人思考 │
│ 第五层:文档即代码 —— 文档和代码同步 │
│ 第六层:逆向工程 —— 从代码反推需求 │
│ │
└─────────────────────────────────────────────────────┘
第一层:降低门槛 —— 让人写得轻松
核心思路
人不想写详细文档,那就让人只写 rough notes,AI 扩展成完整文档。
具体做法
步骤 1:人写 rough notes
产品经理在 Notion/飞书写简短描述:
用户登录功能:
- 支持手机号和邮箱
- 要记住密码
- 错误多次要锁定
步骤 2:AI 扩展成完整文档
使用 Claude 或 Cursor,输入 rough notes,AI 自动扩展:
## 用户登录功能
### 功能描述
- 支持手机号 + 密码登录
- 支持邮箱 + 密码登录
- 支持"记住密码"功能(7 天免登录)
### 输入
| 字段 | 类型 | 必填 | 校验规则 |
|------|------|------|---------|
| 账号 | string | 是 | 手机号(11 位)或邮箱格式 |
| 密码 | string | 是 | 6-20 位,至少包含数字和字母 |
| 记住密码 | boolean | 否 | 默认 false |
### 输出
- **成功**:返回用户信息 + Token,跳转到首页
- **失败**:返回错误信息
- 账号不存在
- 密码错误
- 账号已锁定
### 异常流程
1. **账号锁定**:连续错误 5 次,锁定 30 分钟
2. **密码过期**:90 天未修改,强制修改密码
3. **账号异常**:检测到异常登录(异地/新设备),触发二次验证
### 非功能需求
- 响应时间 < 200ms(P95)
- 密码传输加密(HTTPS)
- 敏感信息脱敏(日志中不记录密码)
- 支持并发登录:同一账号最多 5 个设备同时在线
步骤 3:人 Review 和确认
- 产品经理检查 AI 生成的文档
- 修正不准确的地方
- 补充遗漏的信息
- 确认后发布
效果
- 人的工作量:从 30 分钟降到 5 分钟
- 文档质量:从"简略"变成"详细且规范"
- AI 完成了 80% 的工作
第二层:多元来源 —— 不写也能有文档
核心思路
人根本不写文档?那就从其他地方"挖"需求。
来源 1:会议录音
场景:产品评审会、需求讨论会
做法:
- 会议全程录音(飞书妙记 / 钉钉录音)
- AI 自动转写成文字
- AI 提取关键决策、功能点、责任人
- AI 生成需求文档初稿
示例:
会议录音(AI 转写):
"产品经理:我们这个登录功能,要支持手机号和邮箱两种方式。
开发:那记住密码要不要做?
产品:要做,7 天免登录吧。
测试:错误多次要不要锁定?
产品:要,连续错 5 次锁 30 分钟。"
AI 提取并生成需求文档:
- 支持手机号登录
- 支持邮箱登录
- 记住密码(7 天免登录)
- 连续错误 5 次锁定 30 分钟
来源 2:产品原型/Figma
场景:设计师已经画好了原型
做法:
- 上传 Figma 设计稿截图
- AI(Claude Vision / GPT-4V)识别界面元素
- AI 分析交互流程
- AI 生成功能描述
示例:
AI 分析 Figma 设计稿:
- 检测到:登录表单(账号输入框、密码输入框、记住密码复选框、登录按钮)
- 检测到:第三方登录图标(微信、Google)
- 推断:支持多种登录方式
- 生成需求文档...
来源 3:Issue/Jira 任务
场景:开发者在 Jira/GitHub Issue 里描述任务
做法:
- 开发者在 Issue 里写任务描述
- AI 从 Issue 提取需求
- 生成需求文档
- Issue 和需求文档双向同步
示例:
GitHub Issue:
"实现用户登录功能,支持手机号和邮箱,要记住密码。"
AI 生成需求文档:
(同上,自动扩展)
来源 4:现有代码/测试用例
场景:历史项目没有需求文档
做法:
- AI 分析现有代码的业务逻辑
- AI 分析测试用例的边界条件
- 逆向生成需求文档
示例:
# 从代码生成需求文档
cursor generate-requirement src/user/login.ts
# 从测试用例生成需求文档
cursor generate-requirement tests/user/login.test.ts
效果
- 不强制要求写需求文档
- 但要求有至少一种"原材料"(会议录音/原型/Issue)
- AI 从原材料生成文档
第三层:质量门禁 —— 不好就不能往下走
核心思路
文档质量差也能混过去?设置质量门禁,不达标就不能进入下一阶段。
质量检查项
AI 自动检查以下内容:
class RequirementQualityChecker:
def check(self, doc: RequirementDoc) -> QualityReport:
checks = [
# 完整性检查
("是否有功能描述", doc.has_function_description()),
("是否有输入输出定义", doc.has_input_output()),
("是否有异常流程", doc.has_error_handling()),
("是否有非功能需求", doc.has_non_functional_req()),
# 清晰性检查
("是否避免了模糊表述", not doc.has_vague_terms()),
# 模糊表述示例:"性能要好"、"用户体验要流畅"
("是否有可量化的指标", doc.has_quantifiable_metrics()),
# 量化指标示例:"响应时间 < 200ms"、"支持 1 万并发"
# 一致性检查
("是否与现有需求冲突", not doc.conflicts_with_existing()),
("是否与原型一致", doc.matches_prototype()),
# 可测试性检查
("是否有验收标准", doc.has_acceptance_criteria()),
("是否可转化为测试用例", doc.is_testable()),
]
return QualityReport(checks)
质量门禁示例
❌ 需求文档质量不达标(60/100)
未通过项:
- [ ] 缺少非功能需求(性能、安全、可用性)
- [ ] 存在模糊表述:"用户体验要好"
- [ ] 缺少可量化指标
- [ ] 缺少异常流程(账号锁定、密码过期)
建议:
1. 补充性能要求:"响应时间 < 200ms(P95)"
2. 明确"用户体验好"的定义:"登录成功率 > 99.9%"
3. 补充异常流程:账号锁定策略、密码过期策略
⚠️ 请修正后再提交技术方案。
流程集成
需求文档 → AI 质量检查 → 通过?
├─ 是 → 可创建技术方案任务
└─ 否 → 返回修改,无法进入下一阶段
效果
- 强制倒逼需求质量提升
- 问题在早期暴露,避免后期返工
第四层:主动追问 —— AI 倒逼人思考
核心思路
人不知道自己写得不好?AI 主动提问,倒逼人思考。
示例对话
AI:我看到你提交了"用户登录"功能的需求文档,但有几个问题想确认:
【安全性】
1. 登录失败时,是提示"用户名或密码错误"还是分别提示?
- 分别提示:用户体验好,但可能被用于枚举账号
- 统一提示:安全性高,但用户体验略差
→ 请选择:A. 分别提示 B. 统一提示 C. 自定义
【扩展性】
2. 是否需要支持第三方登录(微信/Google/Apple ID)?
- 如果未来要支持,现在就要预留接口
→ 请选择:A. 不需要 B. 需要(请列出平台)
【合规性】
3. 是否需要登录日志?保留多久?
- 某些行业要求保留 6 个月以上
→ 请输入:保留 ___ 个月
【性能】
4. 预计的并发登录量是多少?
- 影响技术方案(单机 vs 集群)
→ 请输入:峰值 ___ QPS
【安全策略】
5. 密码规则是什么?
- 复杂度要求(数字/字母/特殊字符)
- 最小/最大长度
→ 请描述:_____________________
请回答以上问题,或告诉我使用默认规则。
实现方式
方式 1:交互式对话
- 产品经理提交需求后,AI 在评论区提问
- 产品经理回答,AI 更新文档
- 反复几轮,直到需求完整
方式 2:表单式问卷
- AI 生成问卷,包含所有需要确认的点
- 产品经理填写问卷
- AI 根据答案更新需求文档
方式 3:模板填充
- AI 提供需求文档模板
- 标记必填项和可选项
- 产品经理填充模板,AI 检查完整性
效果
- 人不需要"知道怎么写",只需要"回答问题"
- AI 倒逼人思考遗漏的点
- 需求文档质量显著提升
第五层:文档即代码 —— 文档和代码同步
核心思路
文档和代码脱节?把文档和代码放一起,一起维护。
目录结构
project/
├── docs/
│ └── requirements/
│ ├── user-login.md # 需求文档
│ ├── user-register.md
│ └── .templates/
│ └── requirement-template.md # 需求文档模板
├── src/
│ └── user/
│ ├── login.ts # 代码
│ ├── login.test.ts # 测试
│ └── login.md # 代码文档(可选)
├── .ai/
│ └── checks/
│ ├── requirement-check.sh # 需求质量检查
│ └── sync-check.sh # 文档代码同步检查
└── .github/
└── workflows/
└── requirement-quality.yml # CI 检查
Git 工作流
规则 1:PR 必须包含需求文档
# .github/workflows/requirement-quality.yml
name: Requirement Quality Check
on:
pull_request:
paths:
- 'src/**'
jobs:
check:
runs-on: ubuntu-latest
steps:
- name: Check if requirement doc exists
run: |
# 检查是否有对应的需求文档
# 如果 src/user/login.ts 变更了,检查 docs/requirements/user-login.md 是否存在或更新
- name: Run AI quality check
run: |
# 运行 AI 质量检查
python .ai/checks/requirement_quality.py
规则 2:Code Review 同时 Review 文档
- PR 中包含代码变更和文档变更
- Reviewer 同时检查代码和文档
- 文档不通过,代码也不能合并
规则 3:文档有版本控制
- 需求文档的每一次变更都有 Git 记录
- 可以追溯:“这个需求是什么时候改的?为什么要改?”
- 可以 diff:对比新旧需求的变化
效果
- 文档和代码同步更新
- 避免文档过时
- 文档有版本控制,可追溯
第六层:逆向工程 —— 从代码反推需求
核心思路
历史项目没有需求文档?从现有系统反推。
反推来源
来源 1:代码
# 从代码生成需求文档
cursor generate-requirement src/user/login.ts
# 输出:
# - 功能:用户登录
# - 输入:账号(手机号/邮箱)、密码
# - 输出:Token、用户信息
# - 异常处理:账号锁定、密码过期
# - 安全措施:密码加密、登录日志
来源 2:测试用例
# 从测试用例生成需求文档
cursor generate-requirement tests/user/login.test.ts
# 输出:
# - 正常流程:手机号登录、邮箱登录
# - 异常流程:账号不存在、密码错误、账号锁定
# - 边界条件:密码长度、账号格式
来源 3:API 文档
# 从 OpenAPI/Swagger 生成需求文档
cursor generate-requirement api/user.yaml
# 输出:
# - 接口定义
# - 请求参数
# - 响应格式
# - 错误码
来源 4:数据库 Schema
# 从数据库 Schema 生成需求文档
cursor generate-requirement schema/user.sql
# 输出:
# - 数据模型
# - 字段含义
# - 约束条件
工作流程
1. AI 扫描代码仓库
↓
2. 识别功能模块(登录、注册、支付...)
↓
3. 分析每个模块的业务逻辑
↓
4. 生成需求文档初稿
↓
5. 人工 Review 和补充
↓
6. 存入 docs/requirements/
效果
- 历史项目也能补文档
- 文档和代码一致(从代码生成)
- 为后续维护提供基础
综合方案:多层防护
单独使用某一层,效果有限。综合使用多层防护,效果最佳。
推荐组合
【新项目】
第一层(降低门槛)+ 第三层(质量门禁)+ 第四层(主动追问)
→ 人写得轻松 + 质量有保障 + AI 帮你查漏补缺
【敏捷团队】
第二层(多元来源)+ 第三层(质量门禁)
→ 不写文档也能有文档 + 质量有保障
【大型项目】
第五层(文档即代码)+ 第三层(质量门禁)
→ 文档代码同步 + 质量有保障
【历史项目】
第六层(逆向工程)
→ 从代码反推需求,补齐文档
完整流程
┌──────────────┐
│ 原材料输入 │(rough notes / 会议录音 / 原型 / Issue)
└──────┬───────┘
↓
┌──────────────┐
│ AI 生成文档 │(第一层 + 第二层)
└──────┬───────┘
↓
┌──────────────┐
│ AI 主动追问 │(第四层)
└──────┬───────┘
↓
┌──────────────┐
│ 质量门禁检查 │(第三层)
└──────┬───────┘
↓
通过?
├─ 是 → 进入技术方案阶段
└─ 否 → 返回修改
(全程:文档和代码同步维护 - 第五层)
(历史项目:逆向工程补文档 - 第六层)
实施建议
Phase 1:试点(1-2 周)
目标:验证效果,建立信心
行动:
- 选择 1 个新项目或新功能
- 只实施第一层(降低门槛)+ 第四层(主动追问)
- 使用 Claude 或 Cursor 生成需求文档
- 收集反馈,优化流程
成功标准:
- 需求文档质量提升(从"简略"到"详细")
- 产品经理写文档时间减少 50% 以上
Phase 2:扩展(2-4 周)
目标:建立质量保障
行动:
- 实施第三层(质量门禁)
- 编写质量检查脚本
- 集成到 Git 工作流(PR 检查)
- 推广到更多项目
成功标准:
- 需求文档质量检查通过率 > 80%
- 技术方案返工率下降 30% 以上
Phase 3:完善(1-2 月)
目标:全面覆盖
行动:
- 实施第二层(多元来源):会议录音、原型分析
- 实施第五层(文档即代码):文档存入 Git
- 实施第六层(逆向工程):历史项目补文档
成功标准:
- 所有新功能都有需求文档
- 历史项目文档覆盖率 > 60%
Phase 4:优化(持续)
目标:持续改进
行动:
- 定期复盘(每 2 周)
- 分析需求质量问题
- 更新质量检查规则
- 分享最佳实践
预期效果
| 指标 | 当前 | 目标 | 提升 |
|---|---|---|---|
| 需求文档完整性 | 30-50% | 80-90% | +60% |
| 需求文档质量 | 简略/模糊 | 详细/可量化 | 质的飞跃 |
| 产品经理写文档时间 | 30-60 分钟/功能 | 5-10 分钟/功能 | -80% |
| 需求返工率 | 30-50% | 10-20% | -65% |
| 技术方案返工率 | 30-40% | 10-15% | -65% |
| 历史项目文档覆盖率 | 10-20% | 60-70% | +300% |
结语
需求文档质量差,不是一个"人的问题",而是一个"系统问题"。
与其指望人"变好",不如设计一个系统,让"不好好写"也能工作。
六层防护体系的核心思想是:
- 降低门槛:让 AI 帮人写,人只需要写 rough notes
- 多元来源:不写也能有文档,从其他地方"挖"需求
- 质量门禁:不好就不能往下走,强制倒逼质量提升
- 主动追问:AI 倒逼人思考,查漏补缺
- 文档即代码:文档和代码同步,避免脱节
- 逆向工程:从代码反推需求,历史项目也能补文档
需求文档写不好?没关系,让 AI 帮你兜底。
参考资料
- Boehm, B. W. (1981). Software Engineering Economics. Prentice-Hall.
- NASA. (2010). Error Cost Escalation Through the Project Life Cycle. https://ntrs.nasa.gov/api/citations/20100036670/
- 《你的 AI 编程真的提效了吗?》- 从工程全生命周期看 AI 提效
本文是"AI 全生命周期提效"系列的第二篇。上一篇讨论了为什么 AI 编程的提效有限,本文讨论如何在需求阶段实施 AI 提效。