1.3 软件工程基础

1.3.1 软件工程基本概念

1.软件的定义、特点与分类

(1)软件的定义

计算机软件是包括程序、数据及相关文档的完整集合。其中,程序是软件开发人员根据用户需求开发的、用程序设计语言描述的、适合计算机执行的指令(语句)序列;数据是使程序能正常操纵信息的数据结构;文档是与程序开发、维护和使用有关的图文资料。

国标中对计算机软件的定义为:与计算机系统的操作有关的计算机程序、规程、规则,以及可能有的文件、文档及数据。

(2)软件的特点

①软件是一种逻辑实体,而不是物理实体,具有抽象性。

②软件的生产与硬件不同,它没有明显的制作过程。一旦研制开发成功,可以大量复制同一内容的副本。

③软件在运行、使用期间不存在磨损、老化问题。软件虽然在生存周期后期不会因为磨损而老化,但为了适应硬件、环境以及需求的变化要进行修改,而这些修改又会不可避免地引入错误,导致软件失效率升高,从而使得软件退化。

④软件的开发、运行对计算机系统具有依赖性,受计算机系统的限制,这导致了软件移植的问题。

⑤软件复杂性高,成本昂贵。软件是人类有史以来生产的复杂度最高的工业产品。软件涉及人类社会的各行各业、方方面面,软件开发常常涉及其他领域的专门知识。软件开发需要投入大量、高强度的脑力劳动,成本高,风险大。

⑥软件开发涉及诸多的社会因素。许多软件的开发和运行涉及软件用户的机构设置,体制问题以及管理方式等,甚至涉及人们的观念和心理,软件知识产权及法律等问题。

(3)软件的分类

软件按功能可以分为应用软件、系统软件、支撑软件(或工具软件)。应用软件是为解决特定领域的应用而开发的软件,如文字处理软件Word、电子表格软件Excel等。系统软件是计算机管理自身资源,提高计算机使用效率并为计算机用户提供各种服务的软件,如操作系统、程序设计语言处理系统、数据库管理系统等。支撑软件是介于系统软件和应用软件之间,协助用户开发软件的工具性软件,包括帮助程序人员开发和维护应用软件的工具软件,如需求分析工具软件、设计工具软件、编码工具软件、测试工具软件、维护工具软件等。

2.软件危机与软件工程

(1)软件危机的概念

所谓软件危机是泛指在计算机软件的开发和维护过程中所遇到的一系列严重问题。实际上,几乎所有的软件都不同程度地存在这些问题。

软件危机主要表现在以下几个方面:

①软件需求的增长得不到满足。用户对系统不满意的情况经常发生。

②软件开发成本和进度无法控制。开发成本超出预算,开发周期大大超过规定日期的情况经常发生。

③软件质量难以保证。

④软件不可维护或维护程度非常低。

⑤软件的成本不断提高。

⑥软件开发生产率的提高赶不上硬件的发展和应用需求的增长。

总之,可以将软件危机归结为成本、质量、生产率等问题。

(2)软件工程的定义

国标中指出,软件工程是应用于计算机软件的定义、开发和维护的一整套方法、工具、文档、实践标准和工序。

1993年,IEEE给出了一个更加综合的定义:“将系统化的、规范的、可度量的方法应用于软件的开发、运行和维护的过程,即将工程化应用于软件中。”

(3)软件工程的三要素

软件工程包括三个要素:方法、工具和过程。方法是完成软件工程项目的技术手段;工具是支持软件的开发、管理、文档生成;过程是支持软件开发的各个环节的控制、管理。

软件工程的核心思想是把软件产品看作一个工程产品来处理。把需求计划、可行性研究、工程审核、质量监督等工程化的概念引入到软件生产当中,以期达到工程项目的三个基本要素:进度、经费和质量的目标。同时,软件工程也注重研究不同于其他工业产品生产的一些独特特性,并针对软件的特点提出了许多有别于一般工业工程技术的一些技术方法。

3.软件工程过程

软件工程过程是把输入转化为输出的一组彼此相关的资源和活动。

软件工程过程通常包含四种基本活动:

①P(Plan)——软件规格说明,规定软件的功能及其运行时的限制。

②D(Do)——软件开发,产生满足规格说明的软件。

③C(Check)——软件确认,确认软件能够满足客户提出的要求。

④A(Action)——软件演进,为满足客户的变更要求,软件必须在使用的过程中演进。

事实上,软件工程过程是一个软件开发机构针对某类软件产品为自己规定的工作步骤,它应当是科学的、合理的,否则必将影响软件产品的质量。

通常把用户的要求转变成软件产品的过程称为软件开发过程。此过程包括对用户的要求进行分析,解释成软件需求,把需求变换成设计,把设计用代码来实现并进行代码测试,有些软件还需要进行代码安装和交付运行。

软件工程过程是将软件工程的方法和工具综合起来,以达到合理、及时地进行计算机软件开发的目的。

4.软件生命周期

将软件产品从提出、实现、使用维护到停止使用退役的过程称为软件生命周期。也就是说,软件产品从考虑其概念开始,到该软件产品不能使用为止的整个时期都属于软件生命周期。一般包括可行性研究与需求分析、设计、实现、测试、交付使用以及维护等活动。

软件生命周期分为软件定义、软件开发及软件运行维护三个阶段。

软件生命周期的主要活动阶段是:

①可行性研究与计划制订。确定待开发软件系统的开发目标和总的要求,给出它的功能、性能、可靠性以及接口等方面的可能方案,制订完成开发任务的实施计划。

②需求分析。对待开发软件提出的需求进行分析并给出详细定义,编写软件规格说明书及初步的用户手册,提交评审。

③软件设计。系统设计人员和程序设计人员应该在反复理解软件需求的基础上,给出软件的结构、模块的划分、功能的分配以及处理流程。在系统比较复杂的情况下,设计阶段可分解成概要设计阶段和详细设计阶段。编写概要设计说明书、详细设计说明书和测试计划初稿,提交评审。

④软件实现。把软件设计转换成计算机可以接受的程序代码。即完成源程序的编码,编写用户手册、操作手册等面向用户的文档,编写单元测试计划。

⑤软件测试。在设计测试用例的基础上,检验软件的各个组成部分,编写测试分析报告。

⑥运行和维护。将已交付的软件投入运行,并在运行使用中不断地维护,根据新提出的需求进行必要而且可能的扩充和删改。

5.软件工程的目标与原则

(1)软件工程的目标

软件工程的目标是,在给定成本、进度的前提下,开发出具有有效性、可靠性、可理解性、可维护性、可重用性、可适应性、可移植性、可追踪性和可互操作性且满足用户需求的产品。

软件工程需要达到的基本目标应是:付出较低的开发成本;达到要求的软件功能;取得较好的软件性能;开发的软件易于移植;需要较低的维护费用;能按时完成开发,及时交付使用。

软件工程的理论和技术性研究的内容主要包括:软件开发技术和软件工程管理。

①软件开发技术:包括软件开发方法学、开发过程、开发工具和软件工程环境,其主体内容是软件开发方法学。

②软件工程管理:包括软件管理学、软件工程经济学、软件心理学等内容。

(2)软件工程的原则

为了达到软件工程目标,在软件开发过程中,必须遵循软件工程的基本原则,这些原则适用于所有的软件项目。这些基本原则包括抽象、信息隐蔽、模块化、局部化、确定性、一致性、完备性和可验证性。