7.需求文件

  需求研发的终成果是:客户和研发小组对将要研发的产品达成一致协议。协议综合了业务需求、用户需求和软件功能需求。像我们早先所看到的,项目视图和范围文件包含了业务需求,而使用实例文件则包含了用户需求。你必须编写从使用实例派生出的功能需求文件,还要编写产品的非功能需求文件,包括质量属性和外部接口需求。只有以结构化和可读性方式编写这些文件,并由项目的风险承担者评审通过后,各方面人员才能确信他们所赞同的需求是可靠的。

  你能使用以下三种方法编写软件需求规格说明:

  用好的结构化和自然语言编写文本型文件。

  建立图像化模型,这些模型能描绘转换过程、系统状态和他们之间的变化、数据关系、逻辑流或对象类和他们的关系。

  编写形式化规格说明,这能通过使用数学上精确的形式化逻辑语言来定义需求。

  由于形式化规格说明具有非常强的严密性和精确度,因此,所使用的形式化语言只有极少数软件研发人员才熟悉,更不用说客户了。虽然结构化的自然语言具有许多缺点,但在大多数软件工程中,他仍是编写需求文件现实的方法。包含了功能和非功能需求的基于文本的软件需求规格说明已为大多数项目所接受。图像化分析模型通过提供另一种需求视图,增强了软件需求规格说明。

  软件需求规格说明不仅是系统测试和用户文件的基础,也是所有子系列项目规划、设计和编码的基础。他应该尽可能完整地描述系统预期的外部行为和用户可视化行为。除了设计和实现上的限制,软件需求规格说明不应该包括设计、构造、测试或工程管理的细节。许多读者使用软件需求规格说明来达到不同的目的:

  客户和营销部门依赖他来了解他们所能提供的产品。

  项目经理根据包含在软件需求规格说明中描述的产品来制定规划并预测进度安排、工作量和资源。

  软件研发小组依赖他来理解他们将要研发的产品。

  测试小组使用软件需求规格说明中对产品行为的描述制定测试计划、测试用例和测试过程。

  软件维护和支持人员根据需求规格说明了解产品的某部分是做什么的。

  产品发布组在需求规格说明和用户界面设计的基础上编写客户文件,如用户手册和帮助屏幕等。

  培训人员根据需求规格说明和用户文件编写培训材料。

  软件需求规格说明作为产品需求的终成果必须具有综合性:必须包括所有的需求。研发者和客户不能作所有假设。如果所有所期望的功能或非功能需求未写入软件需求规格说明,那么他将不能作为协议的一部分并且不能在产品中出现。

  我见过有一个项目忽然接到测试人员发出的错误灾难的报告。结果是他们测试的是老版本的软件需求规格说明,而他们觉得错误的地方正是产品所独有的特性。他们的测试工作是徒劳的,因为他们一直在老版本的软件需求规格说明中寻找错误的系统行为。

  在编写软件需求规格说明,希望读者牢记以下的建议:

  对节、小节和单个需求的号码编排必须一致。

  在右边部分留下文本注释区。

  允许不加限制地使用空格。

  正确使用各种可视化强调标志(例如,黑体、下划线、斜体和其他不同字体)。

  创建目录表和索引表有助于读者寻找所需的信息。

  对所有图和表指定号码和标识号,并且可按号码进行查阅。

  使用字处理程式中交叉引用的功能来查阅文件中其他项或位置,而不是通过页码或节号。

  为了满足软件需求规格说明的可跟踪性和可修改性的质量标准,必须确定每个软件需求。这能使你在变更请求、修改历史记录、交叉引用或需求的可跟踪矩阵中查阅特定的需求。由于要达到这一目的,用单一的项目列表是不够的,因此,我将描述几个不同的需求标识方法,并阐明他们的好处和缺点。能选择适合你的方法。

  (1)序列号简单的方法是赋予每个需求一个的序列号,例如SRS-13。当一个新的需求加入到商业需求管理工具的数据库之后,这些管理工具会为其分配一个序列号(许多这样的工具也支持层次化编号)。序列号的前缀代表了需求类型,例如SRS代表“软件需求说明”。由于序列号不能重用,所以把需求从数据库中删除时,并不释放其所占据的序列号,而新的需求只能得到下一个可用的序列号。这种简单的编号方法并不能提供所有相关需求在逻辑上或层次上的差别,而且需求的标识不能提供所有有关每个需求内容的信息。

  (2)层次化编码这也许是常用的方法。如果功能需求出目前软件需求规格说明中第3.2部分,那么他们将具有诸如3.2.4.3这样的标识号。标识号中的数字越多则表示该需求越周详,属于较低层次上的需求。即使在一个中型的软件需求规格说明中,这些标识号也会扩展到许多位数字,并且这些标识也不提供所有有关每个需求目的的信息。如果你要插入一个新的需求,那么该需求所在部分其后所有需求的序号将要增加。删除或移去一个需求,那么该需求所在部分其后所有需求的序号将要减少。但其他地方的引用将混乱,对于这种简单的层次化编号的一种改进方法是对需求中主要的部分进行层次化编号,然后对于每个部分中的单一功能需求用一个简短文字代码加上一个序列号来识别。例如,软件需求规格说明可能包含“第3.2.5部分?编辑功能”,并将此部分编写成子模块文件,然后设置管理。