需求一直是软件工程中较为模糊的词汇之一,不同背景的人会有不同的看法,因此需求是需求工程中一个非常难以准确定义的解释的概念。需求源于问题,要准确理解需求,就必须明确它和问题之间的关系。问题中的差距要么是某些事件、事物的状态不理想,要么是某些事情的发生过程不理想。要解决问题,就需要改变这些事件、事物的状态,或者改变其状态变化的演进顺序,使其达到期望的状态和理想的演进顺序。
人们开发软件系统的目的就是希望用它作为解决方案来解决问题,使得现实改善到期望的状况。解决问题、改善现实、满足用户期望的条件与能力就是需求。
其中的问题域是需求的背景,要理解需求就必须先理解问题域,问题域的背景信息又被称为问题域特性。与需求相区别的是,问题域是自制的,它有自己的运行规律,而且这些规律不会因解系统的引入而改变。问题域特性是既定现实,可以改善但不能忽视,更不能违背的。
解系统并不是问题域的一部分,解系统与问题域之间存在可以互相影响的接口,以实现交互活动,虽然需求工程师通常是技术人员,来自于解系统领域,但是他们也必须懂得如何站在用户的立场,与用户进行基于问题域的交流。解系统的核心是软件解决方案和解决方案在通用计算机上的实现。解决方案描述的是软件系统与问题域交互的过程,侧重于软件系统中与外界交互的部分,实现部分则主要是软件内部的组成元素、结构关系、物理实现等软件系统的构造要素。所以解决方案被称为软件系统的需求规格说明。然而在设计解决方案是要防止解系统的引入在问题域中引发未预见的连锁反应,这种反应可能会使解决方案无法达到与其目的,甚至造成不良的负面效应。
问题域和解系统能够形成互动的基础是解系统部分模拟了问题域,这种模拟性称为共享现象。模拟并操纵共享现象是软件系统满足需求的最直接的方法,但有些情况下软件系统也会使用间接的方法解决问题。
解系统解决问题的方法是改变共享知识,影响问题域的运行,进而满足用户的需求。所以需求规格说明主要包括两部分:对共享现象的描述和对系统对共享现象所施加的操作的描述。这也是软件系统中最为核心的两个部分:数据和功能。