软件工程概述.docx
《软件工程概述.docx》由会员分享,可在线阅读,更多相关《软件工程概述.docx(26页珍藏版)》请在冰豆网上搜索。
软件工程概述
第一章软件工程概述
1.1软件工程的产生和发展
软件工程是在克服60年代末所出现的“软件危机”的过程中逐渐形成与发展的。
自1968
年在北大西洋公约组织(NATO)举行软件可靠性的学术会议上正式提出“软件工程
(SoftwareEngineering)”的概念以来,在不到40年的时间里,软件工程在理论和实践两方面都取得了长足的进步。
软件工程是一门指导计算机软件系统开发和维护的工程学科,是一门新兴的边缘学科,它涉及到计算机科学、工程科学、管理科学、数学等多学科,软件工程的研究范围广,不仅包括软件系统的开发方法和技术、管理技术,还包括软件工具、环境及软件开发的规范。
软件是信息化的核心,国民经济、国防建设、社会发展及人民生活都离不开软件。
软件产业关系到国家经济发展和文化安全,体现了国家综合实力,是决定21世纪国际竞争地位的战略性产业。
因此大力推广应用软件工程的开发技术及管理技术,提高软件工程的应用水平,对促进我国软件产业与国际接轨,推动软件产业的迅速发展起着十分重要的关键作用。
1.1.1软件工程的发展过程
软件工程的产生和发展是与软件的发展过程紧密相关的。
自从第一台电子计算机诞生以来,就开始了软件的生产,“软件工程”提出至今,它的发展已经历了四个重要阶段:
1.第一代软件工程(60年代末到70年代)
60年代末,软件生产主要采用“生产作坊方式”。
随着软件需求量、规模及复杂度的迅速增大,生产作坊的方式已不能够适应软件生产的需要,出现了所谓“软件危机”,即软件生产效率低,大量质量低劣的软件涌入市场或在开发过程中夭折。
由于“软件危机”的不断扩大,对软件生产已经产生了严重危害。
为了克服“软件危机”(Softwarecrisis),在著名的NATO(北大西洋公约组织)软件可靠性会议上第一次提出“软件工程”的名词,将软件开发纳入了工程化的轨道,基本形成了软件工程的概念、框架、技术和方法。
这阶段又称为传统的软件工程。
2.第二代软件工程(80年代中到90年代)
80年代中开始,以Smalltalk为代表的面向对象的程序设计语言相继推出,面向对象的方法与技术得到发展,从90年代起,研究的重点从程序设计语言逐渐转移到面向对象的分析与设计,演化为一种完整的软件开发方法和系统的技术体系。
90年代以来,出现了许多面向对象的开发方法的流派,面向对象的方法逐渐成为软件开发的主流。
所以这一阶段又成为称为对象工程。
3.第三代软件工程
随着规模的不断增大,开发人员也随之增多,开发时间相应持续增长,加之软件是知识密集型的逻辑思维产品,这些都增加了软件工程管理的难度。
人们在软件开发的实践过程中认识到:
提高软件生产率,保证软件质量的关键是对“软件过程”的控制和管理,提出对软件项目管理的计划、组织、成本估算、质量保证、软件配置管理等技术与策略,逐步形成了软件过程工程。
4.构件工程90起年代,基于构件(Component)的开发方法取得重要进展,软件系统的开发可通过使用现存的可复用构件组装完成,而无需从头开始构造,以此达到提高效率和质量,降低成本的目的。
称为构件工程。
1.1.2软件危机
1、软件危机的产生
“软件危机”(Softwarecrisis)的出现是由于软件的规模越来越大,复杂度不断增加,而软件需求量也不断增大,“生产作坊式”的软件开发模式及技术已不能满足软件发展的需要。
软件开发过程是一种高密集度的脑力劳动,对开发人员的需要投入大量的人力、物力和财力,由于软件开发的模式及技术不能适应软件发展的需要,致使大量质量低劣的软件产品涌向市场,有的甚至在开发过程中就夭折了。
国外在开发一些大型软件系统时,遇到了许多困难,有的系统最终彻底失败了;有的系统则比原计划推迟了好多年,而且费用大大超过了预算;有的系统不能符合用户当初的期望;有的系统则无法进行修改维护。
例如:
IBM公司的OS/360,共约100万条指令,花费了5000个人年;经费达数亿美元,而结果却令人沮丧,错误多达2000个以上,系统根本无法正常运行。
OS/360系统的负责人
Brooks这样描述开发过程的困难和混乱:
“像巨兽在泥潭中作垂死挣扎,挣扎得越猛,泥浆就沾得越多,最后没有一个野兽能够逃脱淹没在泥潭中的命运。
”
1962年6月,美国飞往金星的第一个空间探测器(水手Ⅰ号),因其飞舱中计算机导航程序的一条语句出错,致使空间探测器偏离航线无法取得成功。
还有,可以称为上世纪世界上最精心设计,并花费了巨额投资的美国阿波罗登月飞行计划的软件,也仍然没有避免出错,例如阿波罗8号由于太空飞船的一个计算机软件错误,造成存储器的一部分信息丢失;阿波罗14号在飞行的10天中,出现了18个软件错误。
2、软件危机的表现
20世纪60年代末期所发生的软件危机,反映在软件可靠性没有保障、软件维护工作量大、费用不断上升、进度无法预测、成本增长无法控制、程序人员无限度地增加等各个方面,以致形成人们难以控制软件开发的局面。
软件危机”主要表现在两个方面:
(1)软件产品质量低劣,甚至在开发过程中就夭折。
(2)软件生产率低,不能满足需要。
1.1.3软件工程的定义
究竟什么是“软件工程”?
自从1968年提出软件工程这个术语,对于软件工程就有了各种各样的定义,但是它们的基本思想都是强调在软件开发过程中应用工程化原则的重要性。
例如,
Boehm曾经为软件工程下了以下定义:
“运用现代科学技术知识时间并构造计算机程序及为开发、运行和维护这些程序所必需的相关文件资料。
”。
1983年,IEEE(国际电气与电子工程师协会)所下的定义是:
软件工程是开发、运行、维护和修复软件的系统方法。
1990年,IEEE又将定义更改为:
对软件开发、运作、维护的系统化的、有规范的、可定量的方法之应用,即是对软件的工程化应用。
软件工程有方法、工具和过程三个要素。
软件工程方法就是研究软件开发“如何作”的技术;软件工具是研究支撑软件开发方法的工具、软件工具的集成环境—计算机辅助软件工程CASE;软件工程过程则是指将软件工程方法与软件工具相结合实现合理、及时的进行软件开发的目的。
1.1.4软件工程研究的内容
软件工程是一门指导软件开发的工程学科,是以计算机理论及其他相关学科的理论为指导,采用工程化的概念、原理、技术和方法进行软件的开发和维护,把经实践证明的科学的管理措施与最先进的技术方法结合起来,以较少的代价获得高质量的软件。
1、软件工程研究的内容
软件工程是一门新兴的边缘学科,涉及的学科多,研究的范围广。
归结起来软件工程研究的主要内容有以下4个方面:
方法与技术、工具及环境、管理技术、标准与规范。
软件开发方法,主要讨论软件开发的各种方法及其工作模型,包括了多方面的任务,如软件系统需求分析、总体设计、以及如何构建良好的软件结构,数据结构及算法设计等,同时讨论具体实现的技术,软件工具为软件工程方法提供了支持,研究计算机辅助软件工程CASE,建立软件工程环境。
软件工程管理,是指对软件工程全过程的控制和管理,包括计划安排、成本估算、项目管理、软件质量管理。
软件工程标准化与规范化,使得各项工作有章可循,以保证软件生产率和软件质量的提高。
软件工程标准可分为个层次:
国际标准、行业标准、企业规范和项目规范。
必须要强调的是,随着人们对软件系统研究的逐渐深入,软件工程所研究的内容也不是一成不变的。
2、软件工程的目标
软件工程研究的目标是“以较少的投资获取高质量的软件”。
即软件的开发要在保证质量和效率的同时,尽量缩短开发期,降低软件成本。
软件过程所实现的多目标中,有的是互补的,例如缩短开发期,显然可降低成本,维护是需要代价的,易于维护就可降低总成本。
高性能与高可靠性是互补的。
而有的目标则是互斥的,例如:
要获得高的可靠性,通
常要采取一些冗余的措施,往往成本会增加。
为了实现软件工程的多目标,要对软件的的各项质量指标进行综合考虑,以实现软件开发的“多!
快!
好!
省!
”的总目标。
互斥
互补
图1.1软件工程的目标
3、软件工程的基本原则
过去,软件工程的基本原则是抽象、模块化、清晰的结构、精确的设计规格说明。
但今天的认识已经发生了很大的变化。
现已提出的软件工程四条基本原则是:
第一,必须认识软件需求的变动性,便采取适当措施来保证结果产品能忠实地满足用户要求。
在软件设计中,通常要考虑模块化、抽象与信息隐蔽、局部化、一致性等原则。
第二,稳妥的设计方法大大地方便软件开发,以达到软件工程的目标。
软件工具与环
境对软件设计的支持来说,颇为重要。
第三,软件工程项目的质量与经济开销直接取决于对它所提供的支撑的质量与效用。
第四,有效的软件工程只有在对软件过程进行有效管理的情况下才能实现。
近年来,印度的软件产业迅速发展,其成功的经验是,严格按照国际规范进行科学管理。
在本教材中,虽然主要讨论软件开发技术,只在第十章讨论软件管理技术,但软件管理仍然是软件开发成功的关键,因此,将介绍当前质量管理的国际规范CMM(软件成熟度的度量)。
1.2软件与软件生存期
“软件工程”是在软件生产中采用工程化的方法,采用一系列科学的、现代化的方法技术来开发软件。
这种工程化的思想贯穿到软件开发和维护的全过程。
为了进一步学习有关软件工程的方法、技术,先介绍软件、软件生存期及软件工程过程,这几个重要的概念。
1.2.1软件的概念和特点
1.软件(Software)
“软件就是程序,开发软件就是编写程序”是一个错误观念。
这种错误观点的长期存在,影响了软件工程的正常发展。
事实上,正如Boehm指出的:
软件是程序以及开发、使用和维护程序所需的所有文档。
它是由应用程序,系统程序,面向用户的文档及面向开发者的文档四部分构成。
即:
软件=程序+文档,
2.软件的特点
(1)软件是一种逻辑实体,不是具体的物理实体。
(2)软件产品的生产主要是研制。
(3)软件具有“复杂性”,其开发和运行常受到计算机系统的限制。
(4)软件成本昂贵,其开发方式目前尚未完全摆脱手工生产方式。
(5)软件不存在磨损和老化问题,但存在退化问题。
失效率
图1.1硬件失效率曲线
失效率
时间
实际曲线
理想曲线
图1.2软件失效率曲线
图1.1给出了硬件的失效率曲线,它是一个U型曲线(即浴盆曲线),说明硬件随着使用时间的增加失效率急剧上升。
图1.2所描述的软件失效率曲线,它没有U型曲线的右半翼表明软件随着使用时间的增加失效率降低,因为软件不存在磨损和老化问题,然而存在退化问题。
3、软件的分类
(1)按照软件功能划分
∙系统软件—如操作系统、设备驱动程序等。
∙支撑软件(实用软件)—协助用户开发的工具软件,如编辑程序、程序库、图形软件包等。
∙应用软件—如工程与科学计算软件、CAD/CAM软件、CAI软件、信息管理系统等。
(2)按照软件规模划分
如表1-1所示,按照软件的不同大小(源代码行)、参加人数、研制时间分为微型、小型、中型、大型、甚大型和极大型。
需要说明的是:
随着软件产品规模的不断增大,类别的指标也会变化。
(3)按照软件工作方式划分
实时处理软件、交互式软件、批处理软件
(4)按照软件服务对象的范围划分
∙项目软件—由客户委托开发的软件。
∙产品软件—由软件开发机构开发,提供给市场的。
此外,还可以按照软件使用的频度及按照软件失效的影响进行划分。
表1-1软件规模分类
类别
参加人数
研制期限
产品规模(源代码行)
微型
1
1—4周
0.5K
小型
1
1—6月
1K—2K
中型
2—5
1—2年
5K—50K
大型
5—20
2—3年
5K—500K
甚大型
100—1000
4—5年
1M
极大型
2000—5000
5—10年
1M—10M
1.2.2软件工程过程
软件工程过程(Softwareengineeringprocess)是指在软件工具的支持下,所进行的一系列软件工程活动。
通常包括以下四类基本过程:
1.软件规格说明:
规定软件的功能及其运行环境。
2.软件开发:
产生满足规格说明的软件。
3.软件确认:
确认软件能够完成客户提出的要求。
4.软件演进:
为满足客户的变更要求,软件必须在使用的过程中演进。
软件工程过程具有可理解性、可见性(过程的进展和结果可见)、可靠性、可支持性(易于使用CASE工具支持)、可维护性、可接受性(为软件工程师接受)、开发效率和健壮性
(抵御外部意外错误的能力)等特性。
1.2.3软件Th存期
软件生命周期(SDLD)是指一个从用户需求开始,经过开发、交付使用,在使用中不断地增补修订,直至软件报废的全过程,亦称软件生存期(lifecycle)。
GB8567中规定,软件生命周期分为7个阶段:
1.可行性研究和项目开发计划
可行性研究和项目开发计划阶段必须要回答的问题是“要解决的问题是什么”。
2、需求分析
需求分析阶段的任务不是具体地解决问题,而是准确地确定“软件系统必须做什么”,确定软件系统必须具备哪些功能。
3.概要设计
概要设计就是设计软件的结构,该结构由哪些模块组成,这些模块的层次结构是怎样地,这些模块的调用关系是怎样地,每个模块的功能是什么。
同时还要设计该项目的应用系统的总体数据结构和数据库结构,即应用系统要存储什么数据,这些数据是什么样的结
构,它们之间有什么关系等。
4.详细设计
详细设计阶段就是为每个模块完成的功能进行具体描述,要把功能描述变为精确的、结构化的过程描述。
5.编码
编码阶段就是把每个模块的控制结构转换成计算机可接受的程序代码,即写成以某特定程序设计语言表示的“源程序清单”。
6.测试
测试是保证软件质量的重要手段,其主要方式是在设计测试用例的基础上检验软件的各个组成部分。
测试分为模块测试、组装测试、确认测试。
7.维护
软件维护是软件生存期中时间最长的阶段。
已交付的软件投入正式使用后,便进入软件维护阶段,它可以持续几年甚至几十年。
在大部分文献中将生存周期划分为5个阶段,即要求定义、设计、编码、测试及维护。
其中要求定义阶段包括可行性研究和项目开发计划、需求分析,设计阶段包括概要设计和详细设计。
为了描述软件生存期的活动,提出了多种生存期模型。
例如:
瀑布模型、循环模型、演化模型、螺旋模型等。
1.3软件生存期模型
软件生存期模型是描述软件开发过程中各种活动如何执行的模型。
它确立了软件开发和演绎中各阶段的次序限制以及各阶段活动的准则,确立开发过程所遵守的规定和限制,便于各种活动的协调以及各种人员的有效通信,有利于活动重用和活动管理。
目前有若干软件生存期模型,如瀑布模型、增量模型、螺旋模型、喷泉模型、变换模型和基于知识的模型等。
1.3.1瀑布模型
瀑布模型如图1.3所示,这是1970年W.Royce提出的最早出现的软件开发模型。
瀑布模型是将软件开发活动中的各项活动规定为依线性顺序联接的若干阶段工作,形如瀑布流水,最终得到软件系统或软件产品。
换句话说,它将软件开发过程划分成若干个互相区别而又彼此联系的阶段,每个阶段中的工作都以上一个阶段工作的结果为依据,同时作为下一个阶段的工作基础。
该模型说明整个软件开发过程是按图中的各个阶段进行的,每个阶段的任务完成之后,产生相应的文档。
它是以文档作为驱动、适合于需求很明确的软件项目开发的模型。
瀑布模型得到了广泛的应用,它在消除非结构化软件、降低软件的复杂性、促进软件开发工程化方面起了很大的作用。
但在大量的仍然机软件开发实践中也逐渐暴露出它的缺
点。
由于瀑布模型是一种理想的线性开发模式,缺乏灵活性,也无法解决软件需求不准确或者不明确的问题。
这些缺点对软件开发带来了严重影响,由于需求不明确,会导致开发的软件不符合用户的需求而夭折。
目标与范围说明书
需求说明书
设计文档
程序
测试报告
维护报告
1.3.2循环模型
图1.3瀑布模型
瀑布模型的缺陷在于将充满回溯、相互重叠的软件开发过程硬性地割裂为几个阶段,随着开发的软件规模越来越大,造成的危害更加严重,循环模型是为了描述软件开发过程中可能的回溯,对瀑布模型进行了改进,开发各阶段可能循环重复。
图1.4描述了循环模型。
1.3.3增量模型
增量模型是一种非整体开发的模型。
根据增量的方式和形式的不同,分为基于瀑布模型的渐增模型和基于原型的快速原型模型。
图1.4循环模型
最终系统
系统不完全
图1.5增量模型
该模型具有较大的灵活性,适合于软件需求不明确、设计方案有一定风险的软件项目。
增量模型和瀑布模型之间的本质区别是:
瀑布模型属于整体开发模型,它规定在开始下一个阶段的工作之前,必须完成前一阶段的所有细节。
而增量模型属于非整体开发模型,它推迟某些阶段或所有阶段中的细节,从而较早地产生工作软件。
1.3.4螺旋模型
对于大型软件,只开发一个原型往往达不到要求。
螺旋模型将瀑布模型和增量模型结合起来,并加入了风险分析。
它是由TRW公司的B.Boehm于1988年提出的。
该模型将开发划分为制定计划、风险分析、实施工程和客户评估四类活动。
沿着螺旋线每转一圈,表示开发出一个更完善的新的软件版本。
如果开发风险过大,开发机构和客户无法接受,项目有可能就此终止;多数情况下,会沿着螺旋线继续下去,自内向外逐步延伸,最终得到满意的软件产品。
制定计划
决定目标、方案和限制
费用累加
风险分析
风险分析
评价方案、识别风险、消除风险
风险分析
风险分析
风险
评审分析原型1原型2原型3
可操作原型
提交部分
需求计划生存期计划
模拟,模型,基准点
操作概念
软件
开发计划
需求软件产
需求品设计
验证
详细设计编码
客户评估
计划下阶段工作
集成和测试计划
设计确认与验证
确认
运行测试
模块测试
组装
测试
实施工程
开发验证下一级产品
图1.6螺旋模型
螺旋模型将开发过程分为几个螺旋周期,每个螺旋周期可分为4个工作步骤:
第一,制定计划:
确定目标、方案和限制条件;
第二,风险分析:
评估方案、标识风险和解决风险;第三,实施工程:
开发确认产品;
第四,客户评估:
计划下一周期工作。
1.3.5喷泉模型
该模型是由B.H.Sollers和J.M.Edwards于1990年提出的一种新的开发模型。
主要用于采用对象技术的软件开发项目。
它克服了瀑布模型不支持软件重用和多项开发活动集成的局限性。
喷泉模型使开发过程具有迭代性和无间隙
性。
软件的某个部分常常被重复工作多次,相关对象在每次迭代中随之加入渐进的软件成分,即为迭代的特性;而分析和设计活动等各项活动之间没有明显的边界,即为无间隙的特性。
喷泉模型是以面向对象的软件开发方法为基础,以用户需求作为喷泉模型的源泉。
从右边喷泉模型的图中可以看出其特点如下:
(1)喷泉模型规定软件开发过程有4个阶段,
即分析、系统设计、软件设计和实现。
(2)喷泉模型的各阶段相互重叠,它反映了软件过程并行性的特点。
图1.7喷泉模型
(3)喷泉模型以分析为基础,资源消耗成塔型,在分析阶段消耗的资源最多。
(4)喷泉模型反映了软件过程迭代性的自然特性,从高层返回低层无资源消耗。
(5)喷泉模型强调增量开发,它依据分析一点,设计一点的原则,并不要求一个阶段的彻底完成,整个过程是一个迭代的逐步提炼的过程。
(6)喷泉模型是对象驱动的过程,对象是所有活动作用的实体,也是项目管理的基本内容。
(7)喷泉模型在实现时,由于活动不同,可分为系统实现和对象实现,这既反映了全系统的开发过程,也反映了对象族的开发和重用过程。
1.3.6智能模型
智能模型也成为基于知识的软件开发模型,是知识工程与软件工程在开发模型上结合的产物,是以瀑布模型与专家系统的综合应用为基础。
该模型通过应用系统的知识和规则帮助设计者认识一个特定的软件的需求和设计,这些专家系统已成为开发过程的伙伴,并指导开发过程。
从智能模型的图示中可以很清楚的看到,智能模型与其它模型不同,它的维护并不在程序一级上进行,这样把问题的复杂性大大地降低了。
该模型的优点主要有:
(1)通过领域的专家系统,可是需求说明更完整、准确和无二义性。
(2)通过软件工程的专家系统,提供一个设计库支持,在开发过程中成为设计者的助手。
(3)通过软件工程知识和特定应用领域的知识和规则的应用来提供开发的帮助。
但是,建立适合与软件设计的专家系统和一个既适合软件工程又适合应用领域的知识
库都是非常困难的。
目前,在软件开发中正应用AI技术,在CASE工具系统中使用专家系
统,用专家系统来实现测试自动化,在软件开发的局部阶段有所发展。
图1.8智能模型
1.4软件开发方法
为了克服软件危机,从60年代末开始,一直在进行软件开发方法的研究与实践,并取得了一系列研究成果,对软件产业的发展起着不可估量的作用。
软件工程的内容包括技术和管理两方面,两方面又紧密结合。
通常把在软件生命期中所使用的一整套技术的集合称为方法学(methodology)或范型(paradigm)。
软件开发方法是一种使用早已定义好的技术集及符号表示习惯来组织软件生产过程的方法,其方法一般表述成一系列的步骤,每一步骤都与相应的技术和符号相关。
其目标是要在规定的投资和时间内,开发出符合用户的需求,高质量的软件,为此需要有成功的开发方法。
软件工程方法学包括三要素:
方法、工具和过程。
方法:
完成软件开发各项任务的技术方法;
工具:
为方法的运用提供自动或者半自动的支撑环境;过程:
为开发高质量软件所规定的各项任务的工作步骤。
软件开发方法可分为两大类:
面向过程的开发方法和面向对象的开发方法。
本节将对结构化开发方法、原型化开发方法和面向对象的开发方法进行介绍。
1。
传统的软件工程方法
也称为面向过程的软件开发方法,这类开发方法都典型地包含了分析、设计、实现、确认(测试)、演化(维护)等活动。
典型的传统软件开发方法有:
Jackson方法、结构化开发方法、原型化方法、HIPO法、IDEF法等。
2.面向对象的开发方法
是以对象作为基本的元素构建新系统的方法,从90年代开始面向对象的开发方法逐渐成为软件开发方法的主流。
具有代表性的有:
Coda方法,Booch方法和OMT方法以及
UML统一建模语言。
1.4.1结构化开发方法
结构化开发方法(StructuredDevelopingMethod)是一种面向数据流的开发方法,它的基本原则是功能的分解与抽象。
结构化方法提出了一组提高软件结构合理性的准则,如分解和抽象、模块的独立性、信息隐蔽等。
它是现有的软件开发方法中最成熟,应用最广泛的方法,该方法的主要特点是快速,自然和方便。
结构化方法总的指导思想自顶向下、逐步求精。
1、结构化开发方法的组成
结构化方法由三部分构成,按照推出的先后次序有:
70年代初推出的结构化程序设计方法SP法(StructuredProgram);
70年代中推出的结构化设计方法SD法(StructuredDesig