软件需求分析方法大体分为如下四类:结构化方法、面向对象方法、面向控制方法和面向数据方法。限于篇幅,将主要从结构化方法和面向对象方法以及RUP三个方面进行简要的探讨。 面向对象(Object Oriented, OO)的方法把分析建立在系统对象以及对象间交互的基础之上,使得我们能以3个最基本的方法框架——对象及其属性、分类结构和集合结构来定义和沟通需求。面向对象的问题分析模型从3个侧面进行描述,即对象模型(对象的静态结构)、动态模型(对象相互作用的顺序)和功能模型(数据变换及功能依存关系)。需求工程的抽象原则、层次原则和分割原则同样适用于面向对象方法,即对象抽象与功能抽象原则是一样的,也是从高级到低级、从逻辑到物理,逐级细分.每一级抽象都重复对象建模(对象识别)一动态建模(事件识别)一功能建模(操作识别)的过程,直到每一个对象实例在物理(程序编码)上全部实现为止。
面向对象需求分析(OORA)利用一些基本概念来建立相应模型,以表达目标系统的不同侧面。尽管不同的方法所采用的具体模型不尽相同,但都无外乎用如下五个基本模型来描述软件需求:
整体—部分模型:该模型描述对象(类)是如何由简单的对象(类)构成的。将一个复杂对象(类)描述成一个由交互作用的若干对象(类)构成的结构的能力是OO途径的突出优点。该模型亦称聚合模型。
分类模型:分类模型描述类之间的继承关系。与聚合关系不同,它说明的是一个类可以继承另一个或另一些类的成分,以实现类中成分的复用。
类—对象模型:分析过程必须描述属于每个类的对象所具有的行为,这种行为描述的详细程度可以根据具体情况而定。既可以只说明行为的输入、输出和功能,也可以采用比较形式的途径来精确地描述其输入、输出及其相应的类型甚至使用伪码或小说明的形式来详细刻画。
对象交互模型:一个面向对象的系统模型必须描述其中对象的交互方法。如前所述,对象交互是通过消息传递来实现的。事实人对象交互也可看作是对象行为之间的引用关系。因此,对象交互模型就要刻画对象之间的消息流。对应于不同的详细程度,有不同的消息流描述分析,分析人员应根据具体馆况而选择。一般地,一个详细的对象交互模型能够说明对象之间的消息及其流向,并且同时说明该消息将激活的对象及行为。一个不太详细的对象交互模型可以只说明对象之间有消息,并指明其流向即可。还有一种状况就是介于此两者之间。
状态模型:在状态模型中,把一个对象看作是一个有限状态机,由一个状态到另一状态的转变称作状态转换。状态模型将对象的行为描述成其不同状态之间的通路。它也可以刻画动态系统中对象的创建和废除,并称由对象的创建到对象的废除状态之间的退路为对象的生存期。
状态模型既可以用状态转换因的图形化手段,又可用决策表或称决策矩阵的形式来表。 RUP(Rational Unified Process)是Rational公司开发和维护的过程产品。RUP是工程化的软件开发过程,它提供了在开发机构中分派任务和责任的纪律化方法。RUP不仅仅是一个简单的过程,而是一个通用的过程框架,可用于各种不同类型的软件系统、各种不同的应用领域、各种不同类型的组织、各种不同的功能级别以及各种不同的项目规模。RUP的突出特点可以由以下三个关键词来体现——用例驱动、以构架为中心、迭代和增量的。这些是RUP所特有的,也是同等重要的。构架提供了一种结构来指导迭代过程中的工作,而用例则确定了目标井驱动每次迭代的工作。
进行需求分析的基础是要获得用户的需要,为了完成这一工作,必须建立业务模型,通过描述业务规则、业务逻辑,明确业务过程并对其进行规范、优化。对于一个系统,在建立业务模型时,应从3个方面来描述其特性:功能、行为、数据,对应于这些特性。 基于上述分析可知,结构化分析方法与面向对象分析方法的区别主要体现在两个方面:
* 将系统分解成于系统的方式不同。前者将系统描述成一组交互作用的处理,后者则描述成一组交互作用的对象。
* 子系统之间的交互关系的描述方式不一样。前者加工之间的交互是通过不太精确的数据流来表示的,而后者对象之间通过消息传递交互关系。
因此,面向对象软件需求分析的结果能更好地刻画现实世界,处理复杂问题,对象比过程更具有稳定性,便于维护与复用。
三种需求分析的方法:结构化分析方法、面向对象的分析方法、面向问题域的分析方法。
结构化的分析方法是传统的分析法,它的好处是在需求阶段可以不需要精确地定义系统,只需要根据业务框架确定系统的功能范围,以及每个功能的处理逻辑和业务规则,功能需求规格书等。因为不需要精确描述,因此描述系统的方式比较灵活多样,可以采用图表、示例图、文字等等方式来描述系统。在系统开发以前,一般还可以采用更为直观的原型系统方式和最终用户进行交流和确认,因此对业务需求的要求会低一些,业务需求阶段的周期相对容易控制;通过业务全景图,最终用户也能了解系统的功能;通过功能活动图和业务规则的描述,也可以相对精确地描述业务系统;因为没有严格的标记语言,可以采用适当的篇幅描述适当的系统。当然,这种方法的缺点也是明显的,分析人员和业务人员之间可能缺乏共同语言,机器不能识别业务需求书,在设计阶段还需要继续和用户确认一部分功能。
面向对象的分析方法的最大好处是在需求阶段,就能够非常精确地描述一个系统,采用程序语言的方式和最终用户交流(最终用户必须要熟悉这种语言),能够在项目一开始就发现很多问题,避免在开发的过程中出现需求的反复,而且在系统设计和开发阶段不需要最终用户参与。在实施上,一般可以采用场景、业务功能等方式来描述,比较适合于业务流程环节多的系统,或者软件产品的开发。但是,我们也要看到,在现实中,绝大多数的应用系统都很难在需求阶段就可以被精确地抽象化定义,所以这种方法的缺点和困难也是显而易见的:首先,用户要非常清楚地知道最终的业务系统应该是什么样,或者采用一种抽象的方式能够确定最终的应用系统;其次,因为最终用户不需要参与设计和开发阶段的工作,所以双方确定业务需求的过程也会比较长;同时,因为是精确描述,因此描述系统的语言是非常逻辑化的,一般通过某种方式可以使机器识别业务需求,采用这种方式写的业务需求是非常格式化的,一方面描述一个系统需要的信息非常多,可能使需求说明的篇幅非常长,不便于理解和阅读;另外由于通过抽象的方式来推演最终系统的运行方式,对业务人员的要求非常高。
软件工程中包含需求、设计、编码和测试四个阶段,其中需求工程是软件工程第一个也是很重要的一个阶段,需求分析是要决定“做什么,不做什么”。
在一个软件项目中,软件需求包括三个不同的层次-业务需求、用户需求和功能需求-也包括非功能需求:业务需说明了提供给客户和产品开发商的新系统的最初利益,反映了组织机构或客户对系统、产品高层次的目标要求。
软件开发,能否获得成功,最重要的是需求分析的工作。因此,软件需求分析能力和水平,对软件项目至关重要。
一般的分析方法和步骤如下:
⑴首先调查组织机构情况 包括了解该组织的部门组成情况,各部门的职能等,为分析信息流程作准备。
⑵然后调查各部门的业务活动情况 包括了解各个部门输入和使用什么数据,如何加工处理这些数据,输出什么信息,输出到什么部门,输出结果的格式是什么。
⑶协助用户明确对新系统的各种要求 包括信息要求、处理要求、完全性与完整性要求。
⑷确定新系统的边界 确定哪些功能由计算机完成或将来准备让计算机完成,哪些活动由人工完成。由计算机完成的功能就是新系统应该实现的功能。
常用的调查方法有:
⑴跟班作业 通过亲身参加业务工作来了解业务活动的情况。这种方法可以比较准确地理解用户的需求,但比较耗费时间。
⑵开调查会 通过与用户座谈来了解业务活动情况及用户需求。座谈时,参加者之间可以相互启发。
⑶请专人介绍。
⑷询问 对某些调查中的问题,可以找专人询问。
⑸设计调查表请用户填写 如果调查表设计得合理,这种方法是很有效,也很易于为用户接受的。
⑹查阅记录 即查阅与原系统有关的数据记录,包括原始单据、账簿、报表等。 通过调查了解了用户需求后,还需要进一步分析和表达用户的需求。分析和表达用户需求的方法主要包括自顶向下和自底向上两类方法。
一、过滤需求的方法做后端系统,要学会的第一个技能就是砍需求。
也就是过滤需求。这不是一个贬义词,反而是体现后端产品价值判断的基础。
过滤需求的方法,就是通过一定的手段判断需求是否是伪需求,应该被过滤掉。1. 用户场景模拟法后端产品的出发点就是帮助业务用户,因此在调研需求的时候要模拟业务的场景,分析业务用户提到的需求是否能解决他的问题。
如果不能帮助用户,那么这个需求就可能是伪需求。以下面的案例说明:背景:“货到付款”类型的订单会因为缺货而无法发出,如果超过一定的时间,客服就会跟顾客沟通,帮顾客取消订单。
需求:由于这种订单的数量还是蛮多的,逐个取消太费时间,因此业务用户要求在“缺货订单”列表页增加“批量取消订单”按钮。分析:调研到业务操作场景,是先找到该类缺货订单,然后和顾客沟通,顾客同意删除,才进行删除。
也就是逐个沟通确认,再逐个取消订单的,所以“批量取消订单”无法被有效使用。因此,该需求是个伪需求,应该被过滤掉。
2. 功能归属分析专门的系统做专职功能,有助于合理的产品体系建设。因此需求调研的时候,可以通过系统的定位,判断需求是否应该在该系统完成。
如果不属于该系统范畴,那么直接说服需求方更换方案。以下面的案例说明:背景:CRM系统(顾客关系管理系统)有一个顾客标签生成功能,就是根据顾客的消费行为数据,自动对应关联上标签,如优质顾客、高潜力顾客、欺诈顾客等。
需求:业务用户提出需求,除了做上述的基础标签之外,还要做出英语版本的标签(就是把标签文案翻译成英文),这样欧美员工可以在英语版本的系统下使用。分析:调研到翻译之后的标签不是在CRM系统使用的,而是给到SMS(客服系统)使用的。
所以应该由SMS根据CMS提供的基础标签数据,自己做二次的衍生。之所以这样,首先是为了避免未来更多语言版本的扩展需求或更多系统提出类似的需求;其次,CRM系统已经完成了“接力赛”的第一棒,创造了基础数据,那么其他系统要特殊化使用,完全可以自行进行特殊化处理,无需耦合回CRM系统。
结论:案例的需求本身是真需求,并且实现上也没难度,但是该功能的定位超出了本系统范畴,专门系统做专职功能,化衍生需求应该在下游执行。否则,耦合性过高只会增加系统的复杂程度,难以维护和扩展。
二、拆分和聚合的方法1. 拆分需求法业务用户提出一个需求,很可能只是短短的一段话。但是不要高兴太早,可能这一句话暗含了很多线索,因此要善于拆分:先找他要解决的核心问题,再围绕核心点,理清前、后、左、右、上、下的旁系需求点。
每个需求点再当做一个子需求进行调研,最后再聚合在一起。以下面的案例说明:背景:订单业务的类型很多,订单退货之后需要创建售后单据,但是因为数量大,所以花费很多人力,且手动创建有出错的风险。
需求:业务提出的需求是“增加退货订单自动创建售后单的功能”,这是个一句话需求。该一句话需求,其实包含了多种具体的订单类型和场景,那么我们就要拆分调研,拆分的维度比如:自营订单、第三方订单、货到付款订单、先款后货订单、部分退货订单、完全退货订单、服装事业部订单、电子事业部订单等,其中每一个维度就相当于一个小需求。
这里不一一展开。2. 聚合需求法拆分法是对单个需求分解成若干小需求进行调研,聚合法相反,是找到许多个相互关联的小需求的共性,然后统筹成一个大需求去完成。
例如:由于业务用户分散在不同的部门,各自为政,于是张三、李四可能都对一个业务流程有相同的需求,或者对同一个功能有相同的优化期望,结果俩人分别提了需求过来。那么产品经理就要找到二者背后的相关性和交叉区。
然后统筹规划,聚合在一起当作一个需求来调研,最终输出一个整体的需求调研结果。三、利用辅助功能调研需求调研产品现有功能,可以用来确认原有功能的逻辑,或者确定新需求方案是否可行。
比如业务用户需要更新一个功能,为了避免更新出错或遗漏,产品经理需要知道修改前和修改后是否会能正常运行。最基础的办法就是自己设计一个测试用例,记录操作方式、状态变化、数据流向等。
看看下面的例子:背景:从销售网站获取到OMS系统(订单管理系统)的订单信息中带着顾客的邮箱。顾客下完单,可能会在销售网站修改邮箱,而此时已经获取到OMS的历史订单中的邮箱是不变的。
需求:顾客若在销售网站修改邮箱,要求已获取到OMS的该顾客的订单中的邮箱也要同步修改。分析:需求是很明白的,也有它的意义,但有风险。
因为我们知道订单信息贯穿于整个订单流转过程中,牵扯到订单编辑、审核、取消、配货、发货等,而这些环节跳转的触发条件可能就是某个信息更新(这里面就可能包括有邮箱更新)。因此,更新邮箱是否会影响流程中的某些环节,一时间很难准确知道。
于是,我们可以采用预测试的方式,设计测试用例,在测试机运行一些订单,观察各个环节邮箱变更的影响,然后收集起来分析对策。测试法就像是探雷一样,主要用来解决未知风险点。
这个方式的重点是记录和分析操作前状态、操作位。
问卷调查法,是指设计方就用户需求中的一些个性化的、需要进一步明确的需求或问题,通过采用向用户问卷调查表的方式,达到彻底弄清项目需求的一种需求获取方法。
这种方法适合于设计方和建设方、使用方都清楚项目需求的情况。因为建设方和使用方都清楚项目的需求,需要双方进一步沟通的需求或问题就比较少,通过采用这种简单的问卷调查方法就能使问题得到较好的解决。
显然对于乐百氏集团这样规模庞大的公司,简单的问卷调查是不能够满足准确获得需求的需要的。会议讨论法,是指设计方和用户相关人员召开若干次需求讨论会议,达到彻底弄清项目需求的一种需求获取方法。
这种方法适合于设计方不清楚用户的详细业务需求,但使用方清楚项目需求的情况。因为使用方清楚项目的需求,他们能准确地表达出他们的需求,而设计方有专业的需求,而我们有专业的软件开发经验,经过回忆讨论交流之后,能够对用户的需求进行准确描述和把握。
这个方法对于准确的获得乐百氏公司的需求是一种不错的选择。在本案例中系统的设计人员也是这么做的,他们通过和乐百氏项目组经理的讨论,很快了解了乐百氏的运作过程的数据。
界面原型法,是指设计方根据自己所了解的用户需求,描画出应用系统的功能界面后与用户进行交流和沟通,通过“界面原型”这一载体,达到双方逐步明确项目需求的一种需求获取的方法。这种方法比较适合于设计方和用户都不是非常清楚项目需求、只是大概了解用户需求的情况。
因为设计方和用户方都不能非常准确的描述出客户的需求,因此此时就更需要借助于一定的“载体”来加快对需求的挖掘和双方对需求理解。
目前,软件需求的分析与设计方法较多,一些大同小异,而有的则基本思路相差很大。从开发过程及特点出发,软件开发一般采用软件生存周期的开发方法,有时采用开发原型以帮助了解用户需求。在软件分析与设计时,自上而下由全局出发全面规划分析,然后逐步设计实现。
从系统分析出发,可将需求分析方法大致分为功能分解方法、结构化分析方法、信息建模法和面向对象的分析方法。
(1)功能分解方法。
将新系统作为多功能模块的组合。各功能义可分解为若干子功能及接口,子功能再继续分解。便可得到系统的雏形,即功能分解——功能、子功能、功能接口。
(2)结构化分析方法。
结构化分析方法是一种从问题空间到某种表示的映射方法,是结构化方法中重要且被普遍接受的表示系统,由数据流图和数据词典构成并表示。此分析法又称为数据流法。其基本策略是跟踪数据流,即研究问题域中数据流动方式及在各个环节上所进行的处理,从而发现数据流和加工。结构化分析可定义为数据流、数据处理或加工、数据存储、端点、处理说明和数据字典。
(3)信息建模方法。
它从数据角度对现实世界建立模型。大型软件较复杂;很难直接对其分析和设计,常借助模型。模型是开发中常用工具,系统包括数据处理、事务管理和决策支持。实质上,也可看成由一系列有序模型构成,其有序模型通常为功能模型、信息模型、数据模型、控制模型和决策模型。有序是指这些模型是分别在系统的不同开发阶段及开发层次一同建立的。建立系统常用的基本工具是E—R图。经过改进后称为信息建模法,后来又发展为语义数据建模方法,并引入了许多面向对象的特点。
信息建模可定义为实体或对象、属性、关系、父类型/子类型和关联对象。此方法的核心概念是实体和关系,基本工具是E-R图,其基本要素由实体、属性和联系构成。该方法的基本策略是从现实中找出实体,然后再用属性进行描述。
(4)面向对象的分析方法。
面向对象的分析方法的关键是识别问题域内的对象,分析它们之间的关系,并建立三类模型,即对象模型、动态模型和功能模型。面向对象主要考虑类或对象、结构与连接、继承和封装、消息通信,只表示面向对象的分析中几项最重要特征。类的对象是对问题域中事物的完整映射,包括事物的数据特征(即属性)和行为特征(即服务)
1.概念 需求的定义包括从用户角度(系统的外部行为),以及从开发者角度(一些内部特性)来阐述需求. 关键的问题是一定要编写需求文档.我曾经目睹过一个项目中途更换了所有的开发者,客户被迫与新的需求分析者坐到一起.系统的分析人员说:"我们想与你谈谈你的需求."客户的第一反应便是:"我已经将我的要求都告诉你们前任了,现在我要的就是给我编一个系统". 百事通 而实际上,UGGs,需求并未编写成文档,因此新的分析人员不得不从头做起.所以如果只有一堆邮件、会谈记录或一些零碎的未整理的对话,你就确信你已明白用户的需求,那完全是自欺欺人. 需求的另外一种定义认为需求是"用户所需要的并能触发一个程序或系统开发工作的说明".有些需求分析专家拓展了这个概念:"从系统外部能发现系统所具有的满足于用户的特点、功能及属性等".这些定义强调的是产品是什么样的,而并非产品是怎样设计、构造的.而下面的定义则从用户需要进一步转移到了系统特性: 需求是指明必须实现什么的规格说明.它描述了系统的行为、特性或属性,是在开发过程中对系统的约束. 从上面这些不同形式的定义不难发现:并没有一个清晰、毫无二义性的"需求"术语存在,真正的"需求"实际上在人们的脑海中,这个人们主要是指客户,但一般情况下,用户并不能描述自己的需要,只就需要系统分析人员根据用户的自己语言的描述整理出相关的需要再进一步和客户核对.系统分析员和客户需要确保所有项目风险承担者在描述需求的那些名词的理解上务必达成共识. 任何文档形式的需求(例如如下将要描述的需求规格说明书)仅是一个模型,一种描述. 2.需求分析的任务 开发软件系统最为困难的部分就是准确说明开发什么.最为困难的概念性工作便是编写出详细技术需求,这包括所有面向用户、面向机器和其它软件系统的接口.同时这也是一旦做错,将最终会给系统带来极大损害的部分,并且以后再对它进行修改也极为困难. 目前,国内产品的庞杂,一家企业可能有几个系统并立运行,它们之间接口是系统开发人员最头痛的问题. 对于商业最终用户应用程序,企业信息系统和软件作为一个大系统的一部分的产品是显而易见的.但是对于我们开发人员来说,并没有编写出客户认可的需求文档,我们如何知道项目于何时结束?而如果我们不知道什么对客户来说是重要的,那我们又如何能使客户感到满意呢? 然而,即便并非出于商业目的的软件需求也是必须的.例如库、组件和工具这些供开发小组内部使用的软件.当然你可能偶尔勿需文档说明就能与其他人意见较为一致,但更常见的是出现重复返工这种不可避免的后果,而重新编制代码的代价远远超过重写一份需求文档的代价,这些血的教训正在国内的软件开发者身上发生. 近来,我遇到一个开发小组开发包括代码编辑器在内的一套内部使用的计算机辅助软件.不幸的是,当他们开发完这个工具后,发现这个工具不能打印出源代码文件,使用者当然希望有这个功能.结果这个小组只好手工抄写源代码文档以供代码检查.这说明那怕需求明确无误并构思准确,如果我们没有编写文档,软件达不到期望目标也只能是咎由自取了. 相反的情况,我曾见一个要集成到"错误跟踪系统"中的简单界面写了一页需求说明.而操作系统系统管理员在为处理脚本时发现简单的一张需求清单竟是如此有用.他们依据需求对系统进行测试时,此系统不仅非常清晰地实现了所有必需功能,而且未发现任何错误. 事实上,需求文档在开发过程中一直起指导作用. 3.需求分析过程 可把整个软件需求工程研究领域划分为需求开发和需求管理两部分更合适,如图4-1所示: 图4-1 需求工程域的层次分解示意图 需求开发可进一步分为:问题获取、分析、编写规格说明和验证四个阶段.这些子项包括软件类产品中需求收集、评价、编写文档等所有活动.需求开发活动包括以下几个方面: 确定产品所期望的用户类别. 获取每个用户类的需求. 了解实际用户任务和目标以及这些任务所支持的业务需求. 分析源于用户的信息以区别用户任务需求、功能需求、业务规则、质量属性、建议解决方法和附加信息. 将系统级的需求分为几个子系统,并将需求中的一部份分配给软件组件. 了解相关质量属性的重要性. 商讨实施优先级的划分. 将所收集的用户需求编写成文档和模型. 评审需求规格说明,确保对用户需求达到共同的理解与认识,并在整个开发小组接受说明之前将问题都弄清楚. 需求管理需要"建立并维护在软件工程中同客户达成的合同" .这种合同都包含在编写的需求文档与模型中.客户的接受仅是需求成功的一半,开发人员也必须能够接受他们,并真正把需求应用到产品中.通常的需求管理活动包括: 定义需求基线(迅速制定需求文档的主体). 评审提出的需求变更、评估每项变更的可能影响从而决定是否实施它. 以一种可控制的方式将需求变更融入到项目中. 使当前的项目计划与需求一致. 估计变更需求所产生影响并在此基础上协商新的承诺,这种承诺具体体现在项目解决方案上. 让每项需求都能与其对应的设计、源代码和测试用例联系起来以实现跟踪. 在整个项目过程中跟踪需求状态及其。
它首先用结构化分析(SA)对软件进行需求分析,然后用结构化设计(SD)方法进行总体设计,最后是结构化编程(SP)。它给出了两类典型的软件结构(变换型和事务型)使软件开发的成功率大大提高。
三种基本的结构形式就是顺序、选择和重复。三种数据结构可以进行组合,形成复杂的结构体系。这一方法从目标系统的输入、输出数据结构入手,导出程序框架结构,再补充其它细节,就可得到完整的程序结构图。这一方法对输入、输出数据结构明确的中小型系统特别有效,如商业应用中的文件表格处理。该方法也可与其它方法结合,用于模块的详细设计。
声明:本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
蜀ICP备2020033479号-4 Copyright © 2016 学习鸟. 页面生成时间:3.074秒