需求工程无疑是当前软件工程中的关键问题,从美国于1995年开始的一项调查结果足以看出这一点。在这项调查中,他们对范围内的8000个软件项目进行跟踪调查,结果表明,有1/3的项目没能完成,而在完成的2/3的项目中,又有1/2的项目没有成功实施。他们仔细分析失败的原因后发现,与需求过程相关的原因占了45%,而其中缺乏终用户的参与以及不完整的需求又是两大首要原因,各占13%和12%。

  需求工程又是软件工程中复杂的过程之一,其复杂性来自于客观和主观两个方面。从客观意义上说,需求工程面对的问题几乎是没有范围的。由于应用领域的广泛性,它的实施无疑与各个应用行业的特征密切相关。其客观上的难度还体现在非功能性需求及其与功能性需求的错综复杂的联系上,当前对非功能性需求分析建模技术的缺乏大大增加了需求工程的复杂性。从主观意义上说,需求工程需要方方面面人员的参与(如领域专家、领域用户、系统投资人、系统分析员、需求分析员等等),各方面人员有不同的着眼点和不同的知识背景,沟通上的困难给需求工程的实施增加了人为的难度。

  初,需求工程仅仅是软件工程的一个组成部分,是软件生命周期的第一个阶段。虽然大家也都知道需求工程对软件整个生命周期的重要性,但对它的研究远远没有对软件工程的其他部分的研究那么深入。

  在传统软件工程生命周期中,涉及需求的阶段称作需求分析。一般来说,需求分析的作用是:

  ● 系统工程师说明软件的功能和性能,指明软件和其他系统成分的接口,并定义软件必须满足的约束;

  ● 软件工程师求精软件的配置,建立数据模型、功能模型和行为模型;

  ● 为软件设计者提供可用于转换为数据设计、体系结构设计、界面设计和过程设计的模型;

  ● 提供开发人员和客户需求规格说明,用于作为评估软件质量的依据。

  但从当前的研究现状来看,需求工程的内容远不止这些。需求工程是系统工程和软件工程的一个交叉分支,涉及到软件系统的目标、软件系统提供的服务、软件系统的约束和软件系统运行的环境。它还涉及这些因素和系统的精确规格说明以及系统进化之间的关系。它也提供现实需要和软件能力之间的桥梁。

  需求工程的基本活动包括:

  ● 抽取需求;

  ● 模拟和分析需求;

  ● 传递需求;

  ● 认可需求;

  ● 进化需求。

  每个活动都有它基本的动机、任务和结果,也有各自的困难所在。

  首先,开始一个项目是因为要对现行系统进行改造。要改造一个系统是因为现行系统存在需要解决的问题。如:现行系统与当前情况不符合、出现新的商机或者可能节省时间、资金和资源等,这是抽取需求的动机。在这个阶段,需求工程师的任务是认识问题之所在,获取足够多的知识,后成为问题领域的专家。需求工程师常采用W6H方法去认识问题领域,即6个以W打头的问题,一个以H打头的问题,如表1所示。

  需求抽取是非常困难的,其主要原因有:

  ● 缺乏领域知识,应用领域的问题常常是模糊的、不精确的;

  ● 存在默认的知识,即难以描述的日常知识(常识问题);

  ● 存在多个知识源,而且多知识源之间可能有冲突;

  ● 面对的客户可能有偏见,如不能提供你需要了解什么或不想告知你需要了解的事情。

  需求抽取的方法一般有问卷法、面谈法、数据采集法、用况法、情景实例法以及基于目标的方法等,还有知识工程方法,如:场记分析法、卡片分类法、分类表格技术和基于模型的知识获取等。

  需求工程的第二个阶段是模拟和分析需求,目前有许多工作都以此为目标进行。需求分析和模拟的出发点在于:

  ● 指导抽取;

  ● 帮助需求工程师了解进展;

  ● 帮助发现问题;

  ● 帮助检查对问题的理解。