构建一个软件系统最困难的部分就是精确地决定要构建什么。其他任何概念性的工作都不如确定详细的技术需求困难,需求包括与人、机器和其他软件系统的所有接口。如果做错了,没有任何其他工作的失误会这么削弱最终的系统,这么难纠正。
——Frederick Brooks
IEEE 1990对需求的定义:
(1)用户为了解决问题或达到某些目标所需要的条件或能力。
(2)系统或系统部件为了满足合同、标准、规范或其他正式文档所规定的要求而需要具备的条件或能力。
(3)对上述两种情况中的一个条件或一种能力的一种文档化表述。
需求分为功能需求和非功能需求两大类。功能需求包括业务需求、用户需求和系统需求三个层次。非功能需求包括性能需求、质量属性、对外接口和约束等。IEEE 1990对性能需求的定义:一个系统或者其组成部分在限定的约束下完成其指定功能的程度。系统完成工作的质量,即系统需要在一个“好的程度”上实现功能需求,如软件的灵活性、高效性、可靠性、可维护性、健壮性、可用性等。系统和环境中其他系统之间需要建立的接口,包括硬件接口、软件接口和数据库接口等。构建系统时需要遵循的约束,如硬件设施、行业规范和编程语言等,约束不受系统功能需求影响,却会给系统开发带来很多限制,会在总体程度上限制开发人员设计、开发、测试时的选择范围。
软件需求工程是一门分析并记录软件需求的学科,它把系统需求分解成一些主要的子系统和任务,把这些子系统或任务分配给软件,并通过一系列重复的分析、设计、比较研究、原型开发过程把这些系统需求转换为软件的需求描述和一些性能参数。
软件需求工程包括软件需求分析阶段以及在此之前做的有关系统的所有需求的工作。需求工程分为需求开发和需求管理两部分。需求开发细分为获取、分析、定义和验证;需求管理包括确定需求基线、需求跟踪和需求变更控制。需求开发确定需求项并分析各个需求项之间存在的关系,需求管理是对确定需求基线之后的需求项的管理。需求管理对需求开发结果进行管理,跟踪纳入需求基线的需求项的进展情况,预测和协调不可避免且实际存在的变更,组织需求变更和项目变更过程,确保项目需求的最终完成。
需求开发与需求管理是相辅相成的两类活动,它们共同构成完整的需求工程。图2-1为需求开发和需求管理流程图。
图2-1 需求开发与需求管理流程图
不管项目遵循什么软件生命周期,都需要完成这些需求活动。根据项目所选择的软件生命周期特点,在项目的不同阶段实施需求活动,只不过需求活动执行的深度或广度有所差异。
下面首先讨论软件需求工程的获取和分析阶段,这两个阶段位于软件需求工程的初始阶段,是关键且最需要沟通的环节。