软件工程概述
软件工程是指应用计算机科学、数学及管理科学等原理,以工程化的原则和方法来解决软件问题的工程,其目的是提高软件生产率、提高软件质量、降低软件成本。
软件工程涉及软件开发、维护、管理等多方面的原理、方法、工具与环境。
软件工程基本原理
美国著名的软件工程专家 B.W.Boehm 于 1983 年提出了软件工程的 7 条基本原理,他认为这 7 条原理是确保软件产品质量和开发效率的原理的最小集合。
用分阶段的生命周期计划严格管理
在软件开发与维护的漫长生命周期中,需要完成许多各种各样的工作。这条基本原理意味着应该把软件生命周期划分成若干个阶段,并相应地制订出切实可行的计划,然后严格按照计划对软件的开发与维护工作进行管理。
Boehm 认为,在软件的整个生存周期中应该制定并严格执行六类计划:项目概要计划、里程碑计划、项目控制计划、产品控制计划、验证计划和运行维护计划。
坚持进行阶段评审
根据 Boehm 等人的统计,设计错误占软件错误的 63%,编码错误仅占 37%,而且错误发现与改正得越晚,所需付出的代价越高。因此,在每个阶段都应进行严格的评审,以便尽早发现在软件开发过程中所犯的错误。
实现严格的产品控制
在软件开发过程中不应随意改变需求,因为改变一项需求需要付出较高的代价。但是,在软件开发过程中改变需求又是难免的,由于外部环境的变化,相应地改变用户需求是一种客观需要。
在改变需求时,为了保持软件各个配置成分的一致性,必须实行严格的产品控制,其中主要是实行基准配置管理。基准配置又称为基线配置,它是经过阶段评审后的软件配置成分 (各个阶段产生的文档或程序代码)。基准配置管理也称为变动控制,一切有关修改软件的建议,特别是涉及基准配置的修改建议,都必须按照严格的规程进行评审,在获得批准以后才能实施修改。
采用现代程序设计技术
从 20 世纪 60 年代和 70 年代的结构化软件开发技术到面向对象技术,从第一代、第二代语言到第四代语言,人们已经充分认识到:方法大于力气。采用先进的技术既可以提高软件开发的效率,又可以降低软件维护的成本。
结果应能清楚地审查
软件是一种看不见、摸不着的逻辑产品。软件开发小组的工作进展情况可见性差,难以评价和管理。为了更好地进行管理,应根据软件开发的总目标及完成期限尽量明确地规定开发小组的责任和产品标准,从而使所得到的结果能够清楚地审查。
开发小组的人员应少而精
开发人员的素质和数量是影响软件质量和开发效率的重要因素,应该少而精。这一条基于两点原因:高素质开发人员的效率比低素质开发人员的效率要高几倍到几十倍,开发工作中犯的错误也要少得多;当开发小组为 N 人时,可能的通信信道为 N(N-1)/2。可见,随着人数 N 的增大,通信开销将急剧增大。
承认不断改进软件工程实践的必要性
遵循上述 6 条基本原理,就能够按照当代软件工程基本原理实现软件的工程化生产。但是它们只是对现有经验的总结和归纳,并不能保证软件开发与维护的过程能赶上时代前进的步伐,能跟上技术的不断进步。因此,Boehm 提出应把 “承认不断改进软件工程实践的必要性” 作为软件工程的第 7 条原理。
根据这条原理,不仅要积极采纳新的软件开发技术,还要注意不断总结经验,收集进度和消耗等数据,进行出错类型和问题报告统计。这些数据既可以用来评估新的软件技术的效果,也可以用来指明必须着重注意的问题和应该优先进行研究的工具和技术。
软件生存周期
与其他事物一样,一个软件产品或软件系统也要经历孕育、诞生、成长、成熟、衰亡的许多阶段,一般称为软件生存周期。
把整个软件生存周期划分为若干阶段,使得每个阶段有明确的任务,使规模大、结构复杂和管理复杂的软件的开发变得容易控制和管理。通常,软件生存周期包括可行性分析与项目开发计划、需求分析、设计 (概要设计和详细设计)、编码、测试、维护等活动,可以将这些活动以适当的方式分配到不同的阶段去完成。
可行性分析与项目开发计划
这个阶段主要确定软件的开发目标及其可行性。必须要回答的问题是:
- 要解决的问题是什么?
- 该问题有可行的解决办法吗?
- 若有解决的办法,则需要多少费用?
- 需要多少资源?
- 需要多少时间?
要回答这些问题,就要进行问题定义、可行性分析,制订项目开发计划。
该阶段的参加人员有用户、项目负责人和系统分析师。
该阶段产生的主要文档有可行性分析报告和项目开发计划。
需求分析
需求分析阶段的任务不是具体地解决问题,而是准确地确定软件系统必须做什么,确定软件系统的功能、性能、数据和界面等要求,从而确定系统的逻辑模型。
该阶段的参加人员有用户、项目负责人和系统分析师。
该阶段产生的主要文档有软件需求说明书。
概要设计
在概要设计阶段,开发人员要把确定的各项功能需求转换成需要的体系结构。在该体系结构中,每个成分都是意义明确的模块,即每个模块都和某些功能需求相对应,因此,概要设计就是设计软件的结构,明确软件由哪些模块组成,这些模块的层次结构是怎样的,这些模块的调用关系是怎样的,每个模块的功能是什么。同时,还要设计该项目的应用系统的总体数据结构和数据库结构,即应用系统要存储什么数据,这些数据是什么样的结构,它们之间有什么关系。
该阶段的参加人员有系统分析师和软件设计师。
该阶段产生的主要文档有概要设计说明书。
详细设计
详细设计阶段的主要任务是对每个模块完成的功能进行具体描述,要把功能描述转变为精确的、结构化的过程描述。即该模块的控制结构是怎样的,先做什么,后做什么,有什么样的条件判定,有些什么重复处理等,并用相应的表示工具把这些控制结构表示出来。
该阶段的参加人员有软件设计师和程序员。
该阶段产生的主要文档有详细设计文档。
编码
编码阶段就是把每个模块的控制结构转换成计算机可接受的程序代码,即写成某种特定程序设计语言表示的源程序清单。
该阶段的参加人员有程序员。
测试
测试是保证软件质量的重要手段,其主要方式是在设计测试用例的基础上检查软件的各个组成部分。
该阶段的参加人员通常是另一部门 (或单位) 的软件设计师或系统分析师。
该阶段产生的主要文档有软件测试计划、测试用例和软件测试报告。
维护
软件维护是软件生存周期中时间最长的阶段。已交付的软件投入正式使用后,便进入软件维护阶段。在软件运行过程中可能由于各方面的原因需要对它进行修改,其原因可能是运行中发现了软件隐含的错误而需要修改;也可能是为了适应变化了的软件工作环境而需要做适当变更;也可能是因为用户业务发生变化而需要扩充和增强软件的功能;还可能是为将来的软件维护活动做预先准备等。