浅谈软件需求分析
一、什么是需求分析?
通俗的讲,对用户的意图不断揭示和验叛的过程,要对经过系统可行性分析所确定的系统目标做更为详细的描述。
假如你是个建筑工程师,有个客户找你建一个鸡窝,这个时候要需要与客户沟通,来确定客户到底想要一个什么样子的鸡窝。我们应该注意三点:
1、准确的理解和描述客户需要的功能。
客户说,我的鸡窝要三层的,带电梯,饮水池,厕所,饮水池要自动判断水位供水,电梯要可以同时乘坐10只鸡….客户滔滔不绝的讲了一大堆,你也都非常忠实的按照自己的理解再一一的向客户描述一遍,以便于确认客户的需求是否正确。
2、帮助客户挖掘需求。
等客户把自己的需求说完了,你发现客户没有说鸡的卧室,于是,你向客户提议说:“你看,这鸡的卧室要什么样子的?”,客户连连的拍着脑门说,我差点给忘记了,鸡们啊喜欢晚上在一起聊天,所以呢,需要一个长而大的卧室,但一定要舒适。
3、分析客户需求的可行性。
客户临走时又说,最近啊,黄鼠狼很多,我这个鸡窝啊,一楼就不用盖了,直接盖二楼和三楼吧!以免晚上遭遇黄鼠狼的攻击。你这么一分析,客户这要求,按照目前的技术可没法建啊,于是,你向客户提议,一楼采用坚固架子来支撑二三楼的建筑。
二、需求分析困难在哪儿?
有几种原因使需求分析变得困难:
(1)客户说不清楚需求;
有些客户对需求只有朦胧的感觉,当然说不清楚具体的需求。
有些客户心里非常清楚想要什么,但却说不明白。
如果客户本身就懂软件开发,能把需求说得清清楚楚,这样的需求分析将会非常轻松、愉快。如果客户全不懂软件,但信任软件开发方,这事也好办。分析人员可以引导客户,先阐述常规的需求,再由客户否定不需要的,最终确定客户真正的需求。最怕的就是“不懂装懂”或者“半懂充内行”的客户,他们会提出不切实际的需求。
(2)需求自身经常变动;
尽可能地分析清楚哪些是稳定的需求,哪些是易变的需求。以便在进行系统设计时,将软件的核心建筑在稳定的需求上。
在合同中或需求书中一定要确定清楚“做什么”和“不做什么”。
(3)分析人员或客户理解有误。
需求分析人员不可能都是全才。客户表达的需求,不同的分析人员可能有不同的理解。如果理解错了,可能会导致开发浪费时间和精力。所以分析人员写好需求说明书后,最好要请客户方的验证。有条件的设计原型来论证需求。
三、需求分析的分类:
需求分析一般可分为功能需求、非功能需求和领域需求
1、功能需求
功能需求主要说明了系统实际应做到什么。这是用户最直观也是最主要的需求,如系统的输入输出、系统能完成的功能以及其它相关处理等;
2、非功能需求
非功能需求又称“约束”,它主要从各个角度对系统起约束和限制作用。如响应时间、存储效率、报表的规格和界面的样式等
3、领域需求
领域需求的来源不是用户,而是系统应用的领域,其主要反映了该领域的基本问题。
四、如何进行需求分析?
进行需求分析不象情人之间的浪漫做法——“让我摸摸你的头发,感觉它是什么颜色。”我们需要了解需求分析的渠道和过程。
需求分析的过程:
(1)可行性研究
它指明现有的软件、硬件技术能否实现用户对系统的要求,从业务角度来决定系统开发是否可行以及在预算范围内能否开发出来。可行性研究的结果是清楚的回答:该系统是否值得开发?
(2)需求导出和分析
这是一个通过对现有系统分析、与潜在客户讨论、进行任务分析等导出系统需求的过程,也可能需要开发一个或多个不同的系统原型,以帮助分析员了解所要描述的系统。
(3)需求描述
需求描述就是把在分析活动中收集的信息通过分析整理之后以文档的形式确定下来。该文档中有两类需求:用户需求是从客户和最终用户角度对系统需求的抽象描述;系统需求是对系统要提供的功能的详尽描述。
(4)需求有效性验证
主要是通过评审、验证等一系列活动来找出需求文档中的错漏并加以改正。
(5)需求管理
需求管理需求管理是一种系统化方法,可用于获取、组织和记录系统需求并使用户和开发方在系统变更需求上始终保持一致。
五、需求分析的方法
1、功能分析方法
功能分析法功能分解法以系统提供的功能为中心来组织系统。首先定义各种功能, 然后把功能分解为子功能, 同时定义功能之间的接口。数据结构是根据功能/子功能的需要设计的。 其基本策略是以分析员的经验为依据, 确定新系统所期望的处理步骤或子步骤, 然后, 将问题空间映射到功能和子功能上。
2、数据流方法
数据流法也叫结构化分析, 其基本策略是研究问题域中数据如何流动以及在各个环节上进行何种处理, 从而发现数据流和加工。 问题域被映射为由数据流、加工以及文件、端点等成份构成的数据流图(DFD) , 并用数据字典对数据流和加工进行详细说明。这种方法的关键是动态跟踪数据流动。
3、信息建模方法
信息建模法的核心概念是实体和关系, 主要工具是语义数据模型(实体关系图) , 其基本策略是找出现实世界的对象, 然后用属性来描述对象, 增添对象与对象之间的关系, 定义父类与子类, 用父类型/子类型提炼属性的共性, 用关联对象关系作细化的描述, 最后进行规范化处理。 其实质是将问题空间直接映射成模型中的对象。