需求工程是软件工程中最复杂的过程之一,其复杂性来自于客观和主观两个方面。从客观意义上说,需求工程面对的问题几乎是没有范围的。由于应用领域的广泛性,它的实施无疑与各个应用行业的特征密切相关。其客观上的难度还体现在非功能性需求及其与功能性需求的错综复杂的联系上,当前对非功能性需求分析建模技术的缺乏大大增加了需求工程的复杂性。从主观意义上说,需求工程需要方方面面人员的参与,各方面人员有不同的着眼点和不同的知识背景,沟通上的困难给需求工程的实施增加了人为的难度。
最初,需求工程仅仅是软件工程的一个组成部分,是软件生命周期的第一个阶段。虽然大家也都知道需求工程对软件整个生命周期的重要性,但对它的研究远远没有对软件工程的其他部分的研究那么深入。
在传统软件工程生命周期中,涉及需求的阶段称作需求分析。一般来说,需求分析的作用是:
系统工程师说明软件的功能和性能,指明软件和其他系统成分的接口,并定义软件必须满足的约束;
软件工程师求精软件的配置,建立数据模型、功能模型和行为模型;
为软件设计者提供可用于转换为数据设计、体系结构设计、界面设计和过程设计的模型;
提供开发人员和客户需求规格说明,用于作为评估软件质量的依据。
但从当前的研究现状来看,需求工程的内容远不止这些。需求工程是系统工程和软件工程的一个交叉分支,涉及到软件系统的目标、软件系统提供的服务、软件系统的约束和软件系统运行的环境。它还涉及这些因素和系统的精确规格说明以及系统进化之间的关系。它也提供现实需要和软件能力之间的桥梁。
需求工程的基本活动包括:抽取需求;模拟和分析需求;传递需求;认可需求;进化需求。
每个活动都有它基本的动机、任务和结果,也有各自的困难所在。
首先,开始一个项目是因为要对现行系统进行改造。要改造一个系统是因为现行系统存在需要解决的问题。如:现行系统与当前情况不符合、出现新的商机或者可能节省时间、资金和资源等,这就是抽取需求的动机。在这个阶段,需求工程师的任务是认识问题之所在,获取足够多的知识,最后成为问题领域的专家。需求工程师常采用W6H方法去认识问题领域,即6个以W打头的问题,一个以H打头的问题,如表1所示。
需求抽取是非常困难的,其主要原因有:
缺乏领域知识,应用领域的问题常常是模糊的、不精确的;
存在默认的知识,即难以描述的日常知识;
存在多个知识源,而且多知识源之间可能有冲突;
面对的客户可能有偏见,如不能提供你需要了解什么或不想告知你需要了解的事情。
需求抽取的方法一般有问卷法、面谈法、数据采集法、用况法、情景实例法以及基于目标的方法等,还有知识工程方法,如:场记分析法、卡片分类法、分类表格技术和基于模型的知识获取等。
需求工程的第二个阶段是模拟和分析需求,目前有许多工作都以此为目标进行。需求分析和模拟的出发点在于:
指导抽取;
帮助需求工程师了解进展;
帮助发现问题;
帮助检查对问题的理解。
需求分析和模拟又包含三个层次的工作。首先是需求建模。需求模型的表现形式有自然语言、半形式化和形式化表示等三种。自然语言形式具有表达能力强的特点,但它不利于捕获模型的语义,一般只用于需求抽取或标记模型。半形式化表示可以捕获结构和一定的语义,也可以实施一定的推理和一致性检查。形式化表示具有精确的语义和推理能力,但要构造一个完整的形式化模型,需要较长时间和对问题领域的深层次理解。对需求概念模型的要求包括:
实现的独立性:不模拟数据的表示和内部组织等;
足够抽象:只抽取关于问题的本质方面;
足够形式化:语法无二义性,并具有丰富的语义;
可构造性:简单的模型块,能应付不同复杂程度和规模的描述;
利于分析:能支持二义性、不完整性和不一致性分析;
可追踪性:支持横向交叉索引并能与设计或实现等建立关联;
可执行性:可以动态模拟,利于与现实相比较;
最小性:没有冗余的概念。
需求模拟技术又分为企业模拟、功能需求模拟和非功能需求模拟等。
企业模拟是一种软系统方法,涉及整个组织,从各个不同的视点分析问题,包括目标、组织结构、活动、过程等。有的企业模拟还建立可执行的领域模型。采用企业模拟方法产生的不仅仅是规格说明,还可以得到许多关于企业运作的状况分析。目前代表性的工作包括:信息模拟、组织模拟和目标模拟等。
功能需求模拟从不同视点为模拟软件提供服务,包括结构视点和行为视点等,主要方法有:结构化分析、面向对象分析和形式化方法。结构化分析是一种面向数据的方法,以数据流为中心。其核心概念包括:进程、数据流、数据存储、外部实体、数据组和数据元素。有代表性的模拟工具有:数据流图、数据字典、原始进程规格说明。面向对象分析以对象及其服务作为建模标准,比较自然,对象也具有相对的稳定性。主要模拟的元素有:对象、类、属性、关系、方法、消息传递、Use Cases等。其主要原理包括分类继承层次、信息隐藏、汇集关系等。形式化方法从广义上说,是应用离散数学的手段来设计、模拟和分析,得到像数学公式那样精确的表示。从狭义上说,就是使用一种形式语言进行语言公式的形式推理,用于检查语法的良构性并证明某些属性。形式化方法一般用于一致性检查、类型检查、有效性验证、行为预测以及设计求精验证。引入形式化机制的目的是:
减少二义性,提高精确性;为验证打下基础;允许对需求进行推理;允许执行需求。
但是人们常常不用形式化手段,因为:
形式化涉及太多细节,分析的级别较低;形式化的核心问题是一致性和完整性,而不是获取需求;没有合适的工具;要求更多的代价。传递需求的主要任务是书写软件需求规格说明,其目的是:
传达对需求的理解;作为软件开发项目的一份契约;作为评价后续工作的基线;作为控制需求进化的基线。
对需求规格说明感兴趣的群体包括:用户、客户;系统分析员、需求分析员;软件开发者、程序员;测试员;项目管理者。
认可需求就是让上述人员对需求规格说明达成一致,其主要任务是冲突求解,包括定义冲突和冲突求解两方面。常用的冲突求解方法有:协商、竞争、仲裁、强制、教育等,其中有些只能用人的因素去控制。
进化需求的必要性是明显的,因为客户的需要总是不断增长的,但是一般的软件开发又总是落后于客户需求的增长,如何管理需求的进化就成为软件进化的首要问题。对传统的变化管理过程来说,其基本成分包括软件配置、软件基线和变化审查小组。当前的发展是软件家族法,即产品线方法。多视点方法也是管理需求变化的一种新方法,它可以用于管理不一致性并进行关于变化的推理。