软件描述
软件描述或需求工程是理解和定义系统需要提供哪些服务,以及找出开发和运行中受到哪些约束。需求工程是软件过程中一个特别关键的阶段,这个阶段的错误将不可避免地带来系统设计和实现阶段的后续问题。
需求工程过程有4个主要的阶段:
- 可行性研究:指明现有的软件、硬件技术能否实现用户对新系统的要求。从业务角度决定系统开发是否划算以及在预算范围内能否开发出来。可行性研究应该是相对来讲花钱少快速完成的。结果应该得出结论,该系统是否值得进行更细致的分析。
- 需求导出和分析:这是一个通过对现有系统分析、与潜在用户和购买者讨论、进行任分析等导出系统需求的过程。也可能需要开发一个或多个不同的系统模型和原型。这些都会助分析员了解所要描述的系统。
- 需求描述:就是把在分析活动中收集的信息以文档的形式确定下来。在这个文档中有类需求。用户需求是从客户和最终用户角度对系统需求的抽象描述;系统需求是对系统要提供的功能的详尽描述。
- 需求有效性验证:该活动检查需求的现实性、一致性和完备性。在这个过程中,肯定会发现需求文档中的错误,必须加以改正以解决问题。
软件设计和实现
软件开发的实现阶段是把系统描述转换成一个可运行的系统的过程。它总是包含设计和编程,但是,如果用增量式开发方法,可能还包含对软件描述的精炼过程。
软件设计是对实现软件的结构、系统的数据、系统组件间的接口以及所用的算法的描述。设计者不可能一次就能完成一个完整的设计,这是一个多次反复的过程。在设计过程中要不断添加设计要素和设计细节,并对先前的设计方案进行修正。
其中,设计活动中:
- 体系结构设计:识别系统总体结构、基本组件(有时候也叫子系统或模块)、它们之间的关系以及它们是怎样分布的。
- 接口设计:定义系统组件间的接口。接口的描述必须是无二义的。在有精确接口定义的前提下,组件不必知道其他组件的具体实现即可使用它们。一旦接口描述达成一致意见,组件就可以并行设计和开发了。
- 组件设计:针对每个系统组件设计它的运行方式。这可能是对预期功能的一个简单声明,留给程序员去做具体的设计。也可能是对复用组件或是某个细化的设计模型所做的一系列的变更。设计模型可用于自动生成一个实现。
- 数据库设计:设计系统数据结构,以及如何在数据库中表示这些数据结构。此处的工作又一次取决于是否复用现有数据库或创建一个新的数据库。
结构化方法是软件设计的一种方法,定义待开发的图形模型作为设计过程的一部分。这个方法可能也会定义适用于每一个模型开发的过程以及规则。结构化方法为系统产生标准化的文档,尤其是为缺乏经验的和非专业的开发者提供了一个开发框架。
软件有效性验证
软件有效性验证,通常也称为检验和有效性验证(V&V),是要看系统是否符合它的描述以及系统是否符合客户的预期。程序测试,即用模拟测试数据运行系统,是最基本的有效性验证技术。有效性验证技术也包括在从用户需求定义到程序开发的每个软件过程阶段进行检查过程(比如,查阅和复审)。由于测试的主导地位,绝大多数的有效性验证成本发生在系统完成过程中和完成之后。
测试过程中的阶段包括:
- 组件(或单元)测试:由开发系统的人员对组成系统的组件进行测试。每个组件都单独测试,而不受其他系统组件的影响。组件可能是简单的实体,如一个函数或对象类、或者是这些实体的–个相关集合。通常用自动化测试工具,如JUnit (Massol和Husted,2003),它能在新版本的组件创建的时候对其重新测试。
- 系统测试:集成组件形成完整的系统。这个过程主要是关注无法预测的组件间交互和组件界面问题所引发的错误。也关注系统是否满足了功能上和非功能上的需求,并测试系统的总体特性。对于大型系统来说,这可能是一个多阶段的过程,需要对组件所构成的子系统进行测试,然后测试由这些子系统所构成的最终系统。
- 接收测试:这是系统在接受并运行之前进行的最后阶段测试。这个阶段不再是用模拟数据来测试系统,而是用客户提供的真实数据测试系统。真实数据能以不同的方式测试系统,所以能暴露出系统需求定义中的错误和遗漏。接收测试还能发现系统需求中的类问题,即系统的设施不能满足用户的需要或者系统性能是无法接受的。
通常,组件开发和测试是交叉进行的。程序员自己构造用来测试的数据,在代码开发过程中增量地进行测试。这是一个经济的测试方法,程序设计者最了解组件,因此是产生测试数据的最佳人选。
软件进化
软件系统的柔性(灵活性)是在大型复杂系统中具有越来越多的软件的主要理由之一。一旦硬件生产的决定已经做出,再对硬件设计做出变更将是非常不经济的。然而,作为软件,变更可以发生在系统开发之中或之后的任何时间里。这些变更也可能非常昂贵,但对比系统硬件的变更仍然便宜得多。