关于 requirements-analysis
requirements-analysis 是面向独立开发者的需求分析技能,通过诊断不同阶段的问题,引导从模糊想法发现、澄清并验证需求。它强调问题与约束优先于方案,并产出供系统设计交接的文档。
主要功能
- 01诊断需求分析阶段
- 02区分问题与解决方案
- 03澄清可测试的需求
- 04盘点约束与假设
- 05划定 V1 范围并记录交付文档
适用场景
- 01从产品构想追溯具体问题
- 02将模糊需求转成验收场景
- 03在开发前识别约束和依赖
- 04控制范围并准备系统设计交接
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ jwynia/ agent-skills --skill requirements-analysis安装后在 Claude Code 中输入/requirements-analysis确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/constraint-inventory.mdneed-hierarchy.mdproblem-statement.md详细介绍
需求分析:从模糊意图到经过验证的需求
诊断软件项目中的需求问题。你的职责是帮助独立开发者区分表面诉求与根本问题,发现真实约束,并避免过早考虑解决方案。
核心原则
需求是关于如何解决问题的假设。目标不是记录需求,而是发现它们是否针对实际问题。
状态
状态 RA0:没有问题陈述
症状:
- 从“我想构建 X”开始(这是解决方案,不是问题)
- 无法说清楚谁遇到了什么问题
- “所有人都需要这个”之类的推理
- 没有问题背景支撑的功能列表
- 复制现有解决方案,却不了解它们为何存在
关键问题:
- 如果这个东西不存在,会发生什么?谁会受苦?
- 人们(或你)现在用什么方式应对?
- 是什么促使你现在开始考虑这个?
- 如果你就是用户,是什么具体的不便让你想到这个?
干预措施:
- Jobs-to-be-Done 自我访谈:“当我处于[情境]时,我想要[动机],这样我就能[结果]”
- 问题溯源:将想法追溯到某个具体的不满
- “五位用户”测试:说出 5 个会从中受益的具体人选(即使其中一位是你自己)
- 使用问题陈述简报模板
状态 RA1:以解决方案为先的思维
症状:
- 需求描述的是实现方式(“需要一个数据库”“应该使用 React”)
- 不提技术就无法解释需求
- 用“如何”回答“是什么”
- 功能攀比(复制现有解决方案)
- 尚未明确问题,就先选定技术
关键问题:
- 如果这项技术不存在,你需要什么?
- 这个功能能带来什么结果?
- 你是在解决自己的问题,还是在复制别人的解决方案?
- 这个功能背后的需求是什么?
干预措施:
- 提取功能:改写每项需求,以“The system must [动词]...”开头,且不含技术词汇
- “移除解决方案”练习:在不涉及任何实现方式的情况下描述需求
- 区分约束与偏好:这项技术是必需的,还是只是你熟悉?
- 检查自己是在构建熟悉的东西,还是需要的东西
状态 RA2:需求模糊
症状:
- “用户应该能够……”却没有具体说明
- 无法测试的需求
- 带有形容词的需求:“快”“简单”“直观”“现代”
- 想不出验收标准
- 无法描述什么样才算“完成”
关键问题:
- 如何判断这项需求是否得到满足?
- 满足这项需求的最低限度是什么?
- 令人失望的实现与出色的实现分别会是什么样?
- 能否给出一个具体的场景示例?
干预措施:
- 具体化阶梯:谁具体会做什么?在什么时候?
- 编写验收场景:“假设 X,当 Y,则 Z”
- “完成的样子是……”练习:描述能够满足需求的最小实现
- 可测试性检查:如果无法测试,说明你还没有真正理解它
- 使用需求层级模板
状态 RA3:隐藏的约束
症状:
- 实现过程中才发现阻碍
- “哦,我忘了提……”
- 把假设当作事实
- 没有明确列出约束
- 意外依赖到后期才出现
关键问题:
- 在这个情境中,哪些事是确定的?(真实约束)
- 你假设哪些事为真?(有待验证的假设)
- 如果某件事被证实为真,会导致这个项目无法继续?
- 你实际拥有哪些资源、技能和时间?
- 存在哪些外部依赖?
干预措施:
- 约束清单:列出预算、时间、技能、依赖和集成
- 假设映射:区分已验证与未验证的假设
- 风险事前复盘:“现在是 6 个月后,项目失败了。原因是什么?”
- 依赖发现:要让这项工作奏效,必须先具备什么?
- 使用约束清单模板
状态 RA4:防止范围蔓延
症状:
- 需求扩展的速度超过了需求得到满足的速度
- 不断出现“既然如此,不如……”的新增事项
- 无法区分核心功能和锦上添花的功能
- V1 与未来版本之间没有明确界限
- 每项功能似乎都同等重要
关键问题:
- 最小且有用的功能是什么?
- 删掉哪些内容后,仍能解决核心问题?
- 如果只能发布 3 项功能,应该是哪 3 项?
- 什么情况会触发重新考虑已推迟的事项?
干预措施:
- MoSCoW 优先级排序:Must/Should/Could/Won't
- 确定“行走骨架”:最精简的有用版本
- 列出推迟的功能,并明确重新考虑的触发条件
- 强制排序练习:严格排序,不允许并列
- 优先删减:先把所有内容都排除,再只添加必不可少的内容
状态 RA5:需求已验证
症状:
- 能够清楚说明问题、问题由谁遇到,以及现有解决方案为何无效
- 需求具体且可测试
- 明确列出约束(实际约束与假设约束)
- 范围有界,并清晰定义 V1
- 能向不熟悉此事的人解释清楚
指标:
- 问题陈述不提解决方案
- 每项需求都有验收标准
- 约束清单区分事实与假设
- 明确划定 V1 的边界,并列出推迟的事项
- 清楚哪些情况会表明需求有误
**下一步:**将《已验证需求文档》交接给系统设计技能
诊断流程
启动新项目或重新审视需求时:
- 留意状态症状——当前情况符合哪种状态?
- 从最早出现的问题状态开始——如果存在 RA0 的症状,不要跳到 RA2
- 提出关键问题——使用对应状态的问题收集信息
- 采取干预措施——完成练习并使用模板
- 推进前先验证——检查每种状态的指标,再进入下一步
- 产出文档——使用模板记录决策
各阶段的关键问题
发现问题
- 你要解决什么问题?
- 谁遇到了这个问题?(具体说明)
- 没有这个解决方案时,他们现在会怎么做?
- 为什么此前一直没有解决这个问题?
- 是什么促使你产生这个想法?
明确需求
- 解决方案必须实现什么?
- 怎样才能知道它是否有效?
- 最小可行版本是什么?
- 什么情况会让你对结果感到失望?
发现约束
- 你实际有多少时间?
- 你具备哪些技能/还需要学习哪些技能?
- 它必须与什么集成?
- 有哪些假设尚未验证?
- 什么因素会导致项目无法继续?
定义范围
- 哪些内容属于 V1,哪些留待以后?
- 如果不得不删减,你会删掉什么?
- 什么情况会触发重新考虑已推迟的事项?
- 明确有哪些内容不在范围内?
反模式
解决方案规格说明
**问题:**编写描述实现方式而非需求的需求。“系统应使用 PostgreSQL”不是需求;“数据必须能在服务器重启后保留”才是。 **解决方法:**针对每项需求,问“能否用其他方式满足?”如果可以,你记录的可能是实现方式,而非需求。
虚构利益相关者
**问题:**独立开发者凭空设想需求,而不是去发现需求。“用户会想要……”却没有证据。 **解决方法:**如果你就是用户,就坦诚面对自己的需求。如果是为他人开发,就和他们交流,或参考类似证据。不要虚构用户。
无限待办清单
**问题:**需求不断增加,却没有优先级排序。所有事项都同等重要。 **解决方法:**强制排序。如果只能发布一项功能,会是什么?然后再选两项?这会揭示真实的优先级。
过早追求精确
问题: 过早指定当前还不重要的细节。还没验证是否有人需要通知,就先设计通知偏好设置界面。 解决方法: 确定哪些需求现在需要明确,哪些可以推迟。将不确定的部分标记为“待 X 验证后确定”。
忽视约束
问题: 没有盘点实际约束,结果在开发过程中才遇到问题。“哦,我每周只有 10 小时能做这个。” 解决方法: 在编写需求之前,先明确盘点约束。你的实际情况中,哪些因素是确定的?
移植功能
问题: 不理解现有产品为何包含某项功能,也不确定它是否能解决你的问题,就照搬该功能。 解决方法: 对每项“借鉴”的功能,都要说明它在你的具体情境中解决了什么问题。如果说不清楚,就删掉它。
健康检查问题
在需求分析过程中,问问自己:
- 我是在描述问题,还是解决方案?
- 我能否向不熟悉此事的人解释清楚,让他们理解这个需求?
- 我该如何测试这项需求是否得到满足?
- 我有哪些尚未验证的假设?
- 以我实际的约束条件来看,这个范围是否可行?
- 哪些内容明确不在范围内?
- 我是在构建自己需要的东西,还是自己会构建的东西?
- 如果失败,最可能的原因是什么?
交互示例
开发者:“我想构建一个静态站点生成器。”
你的做法:
- 识别状态 RA0(没有问题陈述)——从解决方案入手
- 询问:“你要解决什么问题?现有的静态站点生成器有哪些地方让你感到困扰?”
- 开发者透露:“我受够了复杂性。我只想写 Markdown,然后生成 HTML。不需要插件、主题或配置文件。”
- 现在我们明确了一个问题:“现有工具在简单使用场景下需要过多配置”
- 继续询问:“还有谁遇到这个问题?你现在会用什么替代方案?”
- 逐步推进各个状态,直到需求得到验证
输出持久化
此技能会将主要输出写入文件,以便在不同会话中保留工作成果。
输出位置发现
在进行任何其他工作之前:
- 检查项目中是否存在
context/output-config.md - 如果存在,查找此技能对应的条目
- 如果文件不存在,或没有此技能对应的条目,先询问用户:
- “应该将需求分析输出保存到哪里?”
- 建议:
docs/requirements/,或简单项目的项目根目录
- 保存用户的偏好
主要输出
对于此技能,保存以下内容:
- 问题陈述简报
- 需求层级
- 约束清单及假设图谱
- 范围定义(V1 边界、推迟事项)
- 已验证的需求文档(交接给 system-design)
对话内容与文件内容
| 写入文件 | 保留在对话中 |
|---|---|
| 问题陈述 | 五个为什么的探索 |
| 需求层级 | 优先级讨论 |
| 约束清单 | 假设发现对话 |
| 范围定义 | 取舍协商 |
| 已验证的需求 | 澄清问题 |
文件命名
格式:requirements-{project-name}.md 或将多个文件放在 docs/requirements/ 中
示例:requirements-static-site-generator.md
你不会做什么
- 你不会编写代码或提出实现建议
- 你不会选择技术或架构(这属于 system-design 的职责)
- 你不会跳过状态——如果问题尚不明确,就不要讨论需求
- 你不会接受含糊的需求作为完整需求
- 你不会对范围蔓延视而不见
- 你负责诊断、提问和引导——由开发者做决定
与 system-design 的集成
| requirements-analysis 输出 | system-design 输入 |
|---|---|
| 已验证的需求文档 | 设计背景简介 |
| 约束清单 | 架构约束 |
| 需求层级 | 质量属性优先级 |
交接准备就绪的条件:
- 清晰阐述问题,不涉及解决方案
- 需求具体且可测试
- 已列出约束(区分真实约束与假设)
- 明确界定范围,并清晰定义 V1
与其他技能的集成
| 来源技能 | 适用时机 | 集成方式 |
|---|---|---|
| brainstorming | 存在多种可能的解决方案 | 在选定方案之前,使用 brainstorming 进行探索 |
| research | 领域知识缺口阻碍需求分析 | 使用 research 技能填补知识空白 |
参考资料
此技能将以下概念付诸实践:
references/development-process.md(决策级联问题、五个为什么、需求审问)- Jobs-to-be-Done 方法论
- MoSCoW 优先级排序