构建之法学习(第八章 需求分析)
第八章 需求分析
一、软件需求分析步骤
1. 获取和引导需求,即需求捕捉
找到软件的利益相关者,了解和挖掘他们对软件的需求,引导他们表达出对软件的需求。利益相关者即最终用户、客户、市场分析师、监管机构和软件工程师。
2. 分析和定义需求
对从各个方面获取的需求进行规整,定义需求的内涵,从各个角度将需求量化(需求实现的最后期限,实现需求大致所需的时间和资源成本,各个不同需求的优先级,需求带来的收益,等等)。
3. 验证需求
软件团队要跟利益相关者沟通,通过分析报告、技术原型、用户调查或演示等形式向他们验证软件团队对于这些需求的认知。
4. 在软件产品的生命周期中管理需求
在软件的生命周期中,需求在发生变化,技术在发展,团队成员的能力也在提高。这些都要求我们不断对需求进行重新审核并做出相应的调整。
二、软件需求的划分
1. 对产品功能性的需求
要求产品必须实现某些功能。例如,学校的选课软件只允许有学生身份的用户浏览并选择课程,同时要求学生选择某一门课时必须要满足“先修课”的要求,等等
2. 对产品开发过程的需求
要求软件的开发流程必须满足某些约束条件,例如,开发过程必须产生某种类型的文档,必须在某个时间点达到某个状态,必须对源代码施以某种约束(安全性核查、代码版权核查、代码规范和支持文档的核查)
3. 非功能性需求
这也叫“服务质量需求”。例如,股票交易系统必须在一定时间内返回用户查询结果(它对时间的要求要比“科技文献检索”网站要高),火车票购票系统、大学选课软件必须能支持一定数量的用户同时访问,等等
4. 综合需求
有些需求并不是单单一个软件模块就能满足,例如,“购物网站必须在24小时内把货物发送到用户手中”,这个需求牵涉到软件系统、货物派送系统、送货部门、监控系统等不同部门的功能和执行能力。软件团队和客户代表要在需求阶段把这些问题定义清楚。
三、获取用户需求——用户调查
1. 焦点小组
找到一群目标用户的代表,加上项目的利益相关者来讨论用户想要什么,用户对软件的评价等等。
2. 深入面谈
通过详细的面谈,广泛而深入地了解用户的背景、心理、需求等。这通常是一对一的采访。这种方法费时费力,效果往往取决于主持面谈的团队成员的能力。
3. 卡片分类
收集反馈时利用“卡片分类”的办法,把各种需求做成便于规整的小卡片(也可以写在小贴纸上),反复进行 讨论-->明晰定义-->归类-->排序 的活动。
4. 用户调查问卷
指向用户提供事先规定好的问题,让用户回答。
5.用户日志研究
要求用户记录自己日常工作或生活中与所用软件相关的行为,供软件团队分析。
6.人类学调查
和目标用户“同吃同住同劳动”。
7.眼动跟踪研究
8.快速原型调研
用户参与式设计,拿一些纸张模型,让用户去使用,得到反馈。
9.A/B测试
决定试验哪两种不同的UI,以及衡量标准、数据收集流程、试验运行时间、人数
在技术上实现A/B测试(通常在5%—10%的用户上运行试验)
收集数据,分析数据,形成结论。
四、竞争性需求分析的框架
N(Need,需求):
充分了解用户的痛苦,他们对已有软件、服务不满意的地方。
A(Approach,做法):
在技术、商业模式等方面拥有独特的招数。
B(Benefit,好处):
在独特的做法下,考虑这个产品/服务会给客户/用户带来什么好处。
C(Competitors,竞争):
分析清楚敌我的优势和劣势,满足用户需求。
D(Delivery,推广):
想办法把创新的产品交到用户手中。
五、功能分析的四象限方法
维持——以最低成本维持此功能
抵消——快速地达到“足够好”,“和竞争对手差不多”
优化——花大力气做到并保持行业最好
差异化——产生同类产品比不了的功能或优势
不做——砍掉一个功能,不一定要做所以的功能
六、计划和估计
软件项目计划的一个重要环节就是估计项目各类工作(特别是各种功能)所需的时间。
*目标:表明一个希望达到的状态。
*估计:以当前了解的情况和掌握的资源,要花费多少人力物力时间才能实现某事。
*决心:保证在某个时间之前完成预先规定的功能和质量。
整个软件项目的时间估计:
1.自底向上。团队成员各自估计底层模块和单个功能(及单元测试)所需的时间,再加上集成及基本测试的时间,就是大概的开发时间。
2.回溯。团队从整个项目最终交付之日往回倒推
项目的复杂程度的决定因素:
1. 需求的复杂程度:程序员是第几次实现类似的需求?
2. 技术的复杂程度:程序员是第几次用这个技术实现?