“需求文档太重要了,不能交给不想写的人。” —— 但现实是,写需求文档的人往往就是不想写。


引言:一个尴尬的现实

在上一篇文章《你的 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. **账号异常**:检测到异常登录(异地/新设备),触发二次验证

### 非功能需求
- 响应时间 < 200msP95
- 密码传输加密HTTPS
- 敏感信息脱敏日志中不记录密码
- 支持并发登录同一账号最多 5 个设备同时在线

步骤 3:人 Review 和确认

  • 产品经理检查 AI 生成的文档
  • 修正不准确的地方
  • 补充遗漏的信息
  • 确认后发布

效果

  • 人的工作量:从 30 分钟降到 5 分钟
  • 文档质量:从"简略"变成"详细且规范"
  • AI 完成了 80% 的工作

第二层:多元来源 —— 不写也能有文档

核心思路

人根本不写文档?那就从其他地方"挖"需求。

来源 1:会议录音

场景:产品评审会、需求讨论会

做法

  1. 会议全程录音(飞书妙记 / 钉钉录音)
  2. AI 自动转写成文字
  3. AI 提取关键决策、功能点、责任人
  4. AI 生成需求文档初稿

示例

会议录音(AI 转写):
"产品经理:我们这个登录功能,要支持手机号和邮箱两种方式。
开发:那记住密码要不要做?
产品:要做,7 天免登录吧。
测试:错误多次要不要锁定?
产品:要,连续错 5 次锁 30 分钟。"

AI 提取并生成需求文档:
- 支持手机号登录
- 支持邮箱登录
- 记住密码(7 天免登录)
- 连续错误 5 次锁定 30 分钟

来源 2:产品原型/Figma

场景:设计师已经画好了原型

做法

  1. 上传 Figma 设计稿截图
  2. AI(Claude Vision / GPT-4V)识别界面元素
  3. AI 分析交互流程
  4. AI 生成功能描述

示例

AI 分析 Figma 设计稿:
- 检测到:登录表单(账号输入框、密码输入框、记住密码复选框、登录按钮)
- 检测到:第三方登录图标(微信、Google)
- 推断:支持多种登录方式
- 生成需求文档...

来源 3:Issue/Jira 任务

场景:开发者在 Jira/GitHub Issue 里描述任务

做法

  1. 开发者在 Issue 里写任务描述
  2. AI 从 Issue 提取需求
  3. 生成需求文档
  4. Issue 和需求文档双向同步

示例

GitHub Issue:
"实现用户登录功能,支持手机号和邮箱,要记住密码。"

AI 生成需求文档:
(同上,自动扩展)

来源 4:现有代码/测试用例

场景:历史项目没有需求文档

做法

  1. AI 分析现有代码的业务逻辑
  2. AI 分析测试用例的边界条件
  3. 逆向生成需求文档

示例

# 从代码生成需求文档
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%

结语

需求文档质量差,不是一个"人的问题",而是一个"系统问题"。

与其指望人"变好",不如设计一个系统,让"不好好写"也能工作。

六层防护体系的核心思想是:

  1. 降低门槛:让 AI 帮人写,人只需要写 rough notes
  2. 多元来源:不写也能有文档,从其他地方"挖"需求
  3. 质量门禁:不好就不能往下走,强制倒逼质量提升
  4. 主动追问:AI 倒逼人思考,查漏补缺
  5. 文档即代码:文档和代码同步,避免脱节
  6. 逆向工程:从代码反推需求,历史项目也能补文档

需求文档写不好?没关系,让 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 提效。