第1章需求工程
1.1引言
随着软件应用领域的不断扩展和深入,软件需求的获取、分析和管理逐渐成为软件开发过程中非常重要,但同时又相对困难的活动。早在20世纪70年代中期,研究者就已经发现对软件需求的获取和描述很难达到必要的完整性、一致性和无二义性,而这些需求中存在的缺陷往往会对最终软件产品的质量造成决定性的影响。在20世纪90年代进行的若干项调查研究中,研究者发现,软件需求问题的困难性并没有因为软件开发技术和方法的发展而逐渐减弱,反而呈现出不断增长的趋势,并在实际软件开发活动中展现出巨大的负面影响。一项涉及350家美国软件公司和8000多个软件项目的调研发现,软件需求的缺陷导致近1/6的软件项目彻底失败,近1/4的软件项目开发成本和周期远远超出预算。在欧洲,一项涉及17个欧盟国家和3800多个软件开发组织的调研也揭示了同样的现象: 软件开发中一半以上的问题都与软件需求缺陷有着密切的关系。
从软件开发的成本来看,需求中的缺陷传播到软件开发后期导致的修正成本将远远大于在需求分析阶段的早期修正成本。在一项针对GTE,TRW,IBM和HP等公司若干独立软件项目开发成本的分析中,研究者发现了近似相同的需求缺陷修正成本规律: 以需求缺陷在需求分析阶段被发现后导致的修复成本为基准,在设计阶段被发现后导致的修复成本将增长2~~5倍,在编码阶段的修复成本将进一步增长10~~20倍,在软件维护阶段的修复成本则急速增长至100~~200倍。Snyder和Shumate进行的一项统计调查则发现,虽然74%左右的需求缺陷能够在需求获取和分析阶段通过客户交流、复查和协商等方式被发现,但仍然有4%和7%的需求缺陷分别被传播至软件的高层设计和详细设计阶段,而4%的需求缺陷甚至直到软件的维护阶段才会被发现。
因此,如何以一种系统化的方式在软件的整个生命周期中对需求进行有效的管理就成为软件开发过程中的一个重要问题。这也是导致需求工程概念产生的直接原因。
1.2基础知识
1.2.1需求的定义
在一般意义上,需求体现了为解决现实世界中的某个问题而必须具有的性质。特别的,软件需求指代了为解决特定的问题,软件必须表现出的性质。软件所能解决的问题具有广泛的多样性,例如: 通过软件实现对某些人工活动的自动化、通过软件支持特定组织的业务流程、通过软件控制硬件设备等问题。由于软件所能解决问题的复杂性,软件的需求也体现出很强的复杂性。通常,软件的需求是由特定组织内具有不同职能和角色的一组人群各自需求的一种复杂组合,或者是运行环境中的各种因素的一种复杂组合。
软件需求必须具备的一个基本性质是可验证性(verifiability)。对于特定的软件需求,对其进行验证通常具有一定的困难性或者需要付出较高的代价。例如,对于特定软件系统吞吐量需求的验证可能会需要首先开发出相应的仿真软件。因此,软件需求人员和软件质量保证人员必须确保每个软件需求都可以在当前项目的资源消耗限制内得到验证。
为了实现特定的目的,可以对需求关联特定的属性。例如,为了实现对资源的有效利用或者实现对项目进度的有效监控,可以对每个需求赋予不同的优先级别以便于对需求进行必要的取舍或者决定实现需求的前后顺序。通常需要对每个需求赋予全局唯一的标识符,以便于在特定的软件开发活动中对其进行引用。
展开