软件工程
一.软件工程概述
1.背景
软件工程诞生于60年代末期,它作为一个新兴的工程学科,主要研究软件生产的客观规律性,建立与系统化软件生产有关的概念、原则、方法、技术和工具,指导和支持软件系统的生产活动,以期达到降低软件生产成本 、改进软件产品质量、提高软件生产率水平的目标。软件工程学从硬件工程和其他人类工程中吸收了许多成功的经验,明确提出了软件生命周期的模型,发展了许多软件开发与维护阶段适用的技术和方法,并应用于软件工程实践,取得良好的效果。
2.软件危机
软件工程的兴起是为了解决软件危机的出现,软件危机是指落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象。
危机实例:美国银行信托软件系统开发案——美国银行1982年进入信托商业领域,并规划发展信托软件系统。项目原订预算2千万美元,开发时程9个月,预计于1984年12月31日以前完成,后来至1987年3月都未能完成该系统,期间已投入6千万美元。美国银行最终因为此系统不稳定而不得不放弃,并将340亿美元的信托账户转移出去,并失去了6亿美元的信托生意商机
解决途径: 在软件开发过程中人们开始研制和使用软件工具,用以辅助进行软件项目管理与技术生产,人们还将软件生命周期各阶段使用的软件工具有机地集合成为一个整体,形成能够连续支持软件开发与维护全过程的集成化软件支援环境,以期从管理和技术两方面解决软件危机问题。在软件工程理论的指导下,发达国家已经建立起较为完备的软件工业化生产体系,形成了强大的软件生产能力。 软件标准化与可重用性得到了工业界的高度重视,在避免重用劳动,缓解软件危机方面起到了重要作用。
3.三要素
方法:方法是完成软件开发的各项任务的技术方法,为软件开发提供“如何做”的技术。
工具:工具为运用方法而提供的自动的或半自动的软件工程的支撑环境。
过程:过程是为了获得高质量的软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤,如何将软件工程方法与软件工具相结合,合理、及时地进行软件开发。
4.基本原理
(1)、用分阶段的生命周期计划严格管理;
(2)、坚持进行阶段评审;
(3)、实行严格的产品控制;
(4)、采用现代程序设计技术;
(5)、结果应能清楚的审查;
(6)、开发小组的人员应该少而精;
(7)、承认不断改进软件工程实践的必要性;
5. 软件生命周期
定义:软件的生命周期是指软件的产生直到报废或停止使用的生命周期。
具体分为以下阶段:
一、问题定义:要求系统分析员与用户进行交流,弄清“用户需要计算机解决什么问题”然后提出关于“系统目标与范围的说明”,提交用户审查和确认。
二、可行性研究:一方面在于把待开发的系统的目标以明确的语言描述出来,另一方面从经济、技术、法律等多方面进行可行性分析。
三、需求分析:弄清用户对软件系统的全部需求,编写需求规格说明书和初步的用户手册,提交评审。
四、开发阶段:开发阶段由四个阶段组成:
1、概要设计:
2、详细设计:
3、编码和单元测试:根据选定的程序设计语言完成源程序的编码。
4、综合测试:
五、软件维护:通过各种必要的维护活动使系统持久地满足用户需要。
包括四个方面:
1、改正性维护:在软件交付使用后,由于开发测试时的不彻底、不完全、必然会有一 部分隐藏的错误被带到运行阶段,这些隐藏的错误在某些特定的使用环境下就会暴露。
2、适应性维护:是为适应环境的变化而修改软件的活动。
3、完善性维护:是根据用户在使用过程中提出的一些建设性意见而进行的维护活动。
4、预防性维护:是为了进一步改善软件系统的可维护性和可靠性,并为以后的改进奠 定基础。
6.模型分类
瀑布模型(Waterfall Model)
定义:也称为传统模型,是一种非常经典的模型,也是理想化的软件开发模式。
生命周期:
制定计划—需求分析—软件设计—程序编程—软件测试—运行维护
特点:
自上而下,相互衔接的固定次序:阶段间具有顺序性和依赖性,前一阶段结束后才能开始后一阶段的工作,前一阶段的输出是后一阶段的输入;推迟实现观点,尽可能推迟程序的物理实现;强调质量保证观点,每个阶段必须完成规定的文档,每个阶段结束前完成文档以便及早改正错误。
优点:
(1)原理简单,容易掌握。严格按照线性方式进行
(2)强调文档的作用,各阶段间都有验证和确认环节,以便进行质量管理。
(3)主要用于支持结构化方法
缺点:
(1)缺乏灵活性,不能适应用户的需求变化。
(2)缺乏演化性,返回上一级的开发需要付出十分高昂的代价,过于理想化。
(3)是线性的软件开发模型,回溯性差。
使用场合:
(1)适合于软件需求比较明确或很少变化,且开发人员可以一次性获取到全部需求的场合
(2)适合开发技术比较成熟,工程管理比较严格的场合
(3)一般用于低风险的项目,适合开发人员具有丰富的经验。
快速原型模型
定义:又称原型模式,快速原型是快速建立起来的可以在计算上运行的程序,是软件的一个早期可运行的版本,它的功能是最终产品的子集。用途主要是获取用户的真正的需求。
优点:
(1)增强了开发者于用户间的交流,有助于满足用户的真实需求。
(2)用户可及早得到有用的产品,可及早发现问题,随时纠正错误,
(3)减小技术、应用风险,可降低开发费用,缩短开发时间
缺点:
(1)缺乏丰富而强有力的软件工具和开发环境
(2)对设计人员及开发环境要求较高
(3)难于做到彻底测试,更新文档较为困难
适用场合:
(1)预先不能确切定义需求的软件系统,或需求多变的系统
(2)开发人员对设计方案没信心或对将要采用的技术手段不熟悉或把握性不大
(3)原型模型可作为单独的过程模型使用,也常被作为一种方法或实现技术应用于其他的过程模型中。
增量模型
渐增模型也叫增量模型,其实质上是分段的线性模型,是一种非整体开发模型,渐增模型把软件产品作为一系列增量构件来设计、编码、集成和测试,在项目开发过程中以一系列的增量方式来逐步开发系统。
优点:
(1)可分批次提交软件产品,方便用户及时了解软件开发进展情况,及早发现问题。
(2)以组件为单位进行开发,降低了软件开发的风险。
(3)开发顺序灵活,优先级最高的服务首先交付。
缺点:
(1)由于对整个软件系统的需求没有一个完整的定义,会给总体设计带来麻烦。
(2)在把每个新的增量构件集成到现有软件结构中时,必须不破坏原来已开发出的产品。
(3)软件的体系结构必须是开放的,即向产品中加入新构件的过程必须简单、方便。每次增量开发的产品都应当是可测试的,可扩充的。
适用场合:
(1)软件产品可以分批次地进行交互
(2)待开发的软件系统能够被模块化
(3)软件开发人员对应用领域不熟悉、难以一次性地进行软件开发时。
(4)项目管理人员把握全局的水平较高时
(5)对软件需求把握不准确、设计方案有一定风险的项目
螺旋模型
螺旋模型是在结合瀑布模型与快速原型模型基础上演变而成的 ,并且加入了风险分析。其基本思想是,使用原型及其它方法来尽量降低风险。在螺旋模型中,将软件过程表示为一个螺旋线,在螺旋线上的每一个循环表示过程的一个阶段。
整个过程的实现按以下四个步骤完成:
(1)指定计划
(2)风险分析
(3)工程实施
(4)客户评估
适用场合:
(1)适用于面向规格说明、面向过程和面向对象的软件开发方法。
(2)也适用于几种开发方法的组合和产生的组合模型。
缺点:
(1)要求开发人员必须具有丰富的风险评估经验和专门知识。
喷泉模型
喷泉一词体现了迭代和无间隙特性,迭代是指开发软件系统时,某些部分经常要重复多次,相关功能在每次迭代中随之加入演进的系统。
特点:
(1)各阶段相互重叠,反映了软件过程的并行性
(2)以分析为基础,资源消耗呈塔形,在分析阶段消耗的资源最多。
(3)反映了软件过程迭代的自然特性,从高层返回低层无资源消耗
(4)强调增量开发,依据分析一点、设计一点为原则,不要求一个阶段完成,整个过程是一个迭代的逐步提炼过程。