第1章软件工程的基本原理目的要求:认识《软件工程》这门课的内容和教学安排,了解计算机系统的发展历程,软件危机产生的原因及消除途径;掌握软件工程的概念、基本原理。了解软件过程的概念,掌握瀑布模型以及软件生命周期方法学的阶段划分,了解快速原型模型、增量模型、螺旋模型、喷泉模型的基本思想。教学目的、要求,重点、难点教学重点:讲述软件危机产生的原因;软件工程的概念;软件过程的概念,瀑布模型以及软件生命周期方法学的阶段划分;教学难点:螺旋模型、喷泉模型的基本思想;讲授内容:计算机系统发展历程;软件危机;软件工程。软件过程的概念,瀑布模型以及软件生命周期方法学的阶段划分快速原型模型、增量模型、螺旋模型、喷泉模型。计算机系统应用的日益普及和深化。硬件和软件的迅速发展。在计算机系统发展的早期时代所形成的一些错误概念和做法,已经严重地阻碍了计算机软件的开发,为更有效地开发和维护软件,软件工作者在20世纪60年代后期开始认真研究消除软件危机的方法,从而形成了计算机科学技术领域中的一们新兴学科:计算机软件工程学。计算机系统已经经历了4个不同的发展阶段,计算机软件也经历了4个阶段。60年代中期以前:为具体应用专门编写,认为无需预先计划,规模较小,编写者和使用者是同一人,无系统化方法,无管理,人们头脑中的一个隐含过程,除程序清单无文档资料。60年代中期到70年代中期:第二代,多道程序、多用户系统的引入,数据库系统的出现,重要特征:软件作坊,广泛使用产品软件,但仍使用个体化软件开发方法。程序运行时发现的错误必须设法改正,用户有了新的需求时必须相应的修改程序,硬件或操作系统更新时通常需要修改程序以适应新的环境。第一节软件概述一、软件的发展与特点1968年北大西洋公约组织的计算机科学家在联邦德国召开国际会议,讨论软件危机问题,正式提出“软件工程”。从20世纪70年代中期开始的10年:分布式系统,局域网、广域网、宽带数字通信等对软件开发者提出了更高的要求,主要特点:出现了微处理器,及智能产品(个人计算机)。计算机系统发展的第四代:以硬件和软件的综合效果为主,复杂的操作系统控制的强大的桌面机及局域网、广域网,与先进的应用软件相配合,已经成为当前的主流。计算机软件发展的三个阶段及其特点特点,阶段程序设计程序系统软件工程软件所指程序程序及说明书程序、文档、数据主要程序设计语言汇编及机器语言高级语言软件语言*软件工作范围程序编写设计和测试整个软件生命周期需求者程序设计者少数用户市场用户开发软件的组织个人开发小组开发小组及大中型开发机构软件规模小型中、小型大、中、小型特点,阶段程序设计程序系统软件工程决定质量的因素个人技术小组技术水平技术与管理水平开发技术和手段子程序、程序库结构化程序设计数据库,开发工具,集成开发环境,工程化开发方法,标准和规范,网络及分布式开发,OO技术,CASE维护责任者程序设计者开发小组专职维护人员硬件的特征高价、存储量小、可靠性差降价,速度、容量、可靠性明显提高向超高速,大容量,网络化,微型化方向发展软件的特征完全不受重视软件的技术发展不能满足需求开发技术有进步,但尚未完全摆脱软件危机指在计算机软件开发和维护的过程中所遇到的一系列严重问题。概括的说:如何开发软件,怎样满足对软件的日益增长的需求;如何维护数量不断膨胀的已有软件。具体的说:主要有以下一些表现:1、对软件开发成本和进度的估计常常很不准确;2、用户对已完成的软件系统不满意的现象经常发生;3、软件产品的质量经常靠不住;4、软件常常是不可维护的;5、软件通常没有适当文档资料;6、软件成本在计算机系统总成本中中所占的比例逐年上升;7、软件开发的生产率提高的速度,既跟不上硬件发展的速度,也远远跟不上计算机应用普及深入的趋势。二、软件危机IBM公司的OS/360,共约100万条指令,花费了5000个人年;经费达数亿美圆,而结果却令人沮丧,错误多达2000个以上,系统根本无法正常运行。OS/360系统的负责人Brooks这样描述开发过程的困难和混乱:“…像巨兽在泥潭中作垂死挣扎,挣扎得越猛,泥浆就沾得越多,最后没有一个野兽能够逃脱淹没在泥潭中的命运。…”1963年美国飞往火星的火箭爆炸,造成1000万美元的损失。原因是FORTRAN程序:DO5I=1,3误写为:DO5I=1.31967年苏联“联盟一号”载人宇宙飞船在返航时,由于软件忽略一个小数点,在进入大气层时因打不开降落伞而烧毁。在软件开发和维护的过程中存在这么多严重问题,一方面与软件本身的特点有关,另一方面也和软件开发与维护的方法不正确有关。1、软件不同于硬件:它是计算机系统中的逻辑部件,在写出程序代码并在计算机上运行之前,软件开发过程的进展情况较难衡量,软件开发的质量也较难评价,因此管理和控制软件开发过程相当困难。2、软件在运行过程中不会因使用时间过长而被用坏,如果运行中发现错误,很可能是遇到了一个在开发时期引入杂在测试阶段没能检测出来的故障,因此软件维护通常意味着改正或修改原来的设计。产生软件危机的原因3、软件不同于一般程序:规模庞大,必须有严格而科学的管理。4、软件专业人员对软件开发和维护有不少的糊涂观念,在实践过程中或多或少地采用了错误的方法和技术,忽视软件需求分析的重要性,认为开发软件就是写程序并使之运行,轻视软件维护,这可能是软件危机的主要原因。硬件/软件产品失效率曲线磨合调整磨损用坏时间失效率修改点实际曲线时间失效率理想曲线软件产品硬件产品52002020001000需求分析结构设计详细设计编码集成测试系统测试现场改正一个问题的估算费用/美元改正一个问题的估算工作量/人日0.050.52.5改正一个问题需付出的代价代价早期中期晚期时间高中低变更代价随时间变化的趋势一个软件从定义、开发、使用、维护,直到最终被废弃,要经历一个漫长的时期,这就如同一个人要经过胎儿、儿童、青年、中年、老年,直到最终死亡的漫长时期一样,通常把软件经历的这个漫长时期称为生存周期。在软件开发的不同阶段进行修改需要付出的代价很不相同:软件工程学的一个重要目标就是提高软件的可维护性,减少软件维护的代价。生存周期:1、软件开发应该是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目。2、必须充分吸收和借鉴人类长期以来从事各种工程项目所积累的行之有效的原理、概念、技术和方法,特别是要吸取几十年来从事计算机硬件研究和开发的经验教训。3、应该推广使用在实践中总结出来的开发软件的成功的技术和方法。4、应该开发和使用更好的软件工具。总之,为了解决软件危机,既要有技术措施(方法和工具),又要有必要的组织管理措施。软件工程.正是从管理和技术两方面研究如何更好的开发和维护计算机软件的一门新兴学科.解决软件危机的途径软件工程是指导计算机软件开发和维护的工程学科.采用工程的概念、原理、技术和方法来开发和维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它,这就是软件工程.1983年IEEE给软件工程的定义:“软件工程是开发、运行、维护和修复软件的系统方法。”强调“系统方法”不是“个人技巧”。Fairly认为:“软件工程学是为了在成本限额以内按时完成开发和修复软件产品所需要的系统生产和维护技术及管理学科”。强调“成本限额以内”及“技术和管理两个方面”。第二节软件工程一、软件工程与方法学FritzBauer认为:“软件工程是为了经济地获得可靠的且能在实际机器上有效地运行的软件,而建立和使用的完善的工程化原则”。强调“经济地开发出高质量的软件,应建立和使用的完善的工程化原则”。1993年IEEE进一步给出了一个更全面的定义:软件工程是:(1)把系统化的、规范的、可度量的途径应用于软件开发、运行和维护的过程,也就是把工程化应用于软件中;(2)研究(1)中提到的途径。1、用分阶段的生命周期计划严格管理2、坚持进行阶段评审3、实行严格的产品控制4、采用现代程序设计技术5、结果应能清楚的审查6、开发小组的人员应该少而精7、承认不断改进软件工程实践的必要性二、软件工程的基本原理三、软件工程的内容软件开发技术软件开发方法学瀑布模型的生命周期方法、动态需求的快速原型、面向对象的方法;软件工具用来开发软件的软件。软件工程环境支持软件开发的环境、工具及其关系;软件工程管理质量管理人力管理、进度安排、质量保证、资源管理软件工程经济学以经济的观点研究开发过程中的经济效益:成本估算、效益分析。软件工程包含:技术和管理。是技术和管理的紧密结合。通过计划、组织和控制等一系列活动,合理地配置和使用各种资源,以达到既定目标的过程。软件工程方法学包括三个要素:方法:完成软件开发的各项任务的技术方法;回答“如何做”的问题。工具:为方法的应用提供或半自动的软件支撑环境;过程:为了获得高质量的软件所需要完成的一系列任务的框架、规定了完成各项任务的工作步骤。四、软件工程方法学划分软件生存周期阶段的基本原则:使各阶段的任务彼此间尽可能相对独立,同一阶段各项任务的性质尽可能相同,从而降低每个阶段任务的复杂程度,简化不同阶段之间的联系,有利于软件开发工程的组织管理.面向对象方法的四个要点:对象;类;父类(基类)和子类(派生类);消息。面向对象方法学的出发点和基本原则,是尽可能模拟人类习惯的思维方式,使开发软件的方法和过程尽可能接近人类认识世界解决问题的方法和过程,从而使描述问题的问题空间与实现解法的解空间在结构上尽可能一致。传统方法学(生命周期方法学)或(结构化范型):采用结构化技术(结构化分析、结构化设计、结构程序设计和结构化测试)。第三节软件工程过程软件工程过程是为了获得高质量的软件所需要完成的一系列任务的框架,包括软件工程活动和软件管理活动。这些活动的执行可以是有序的、循环的、嵌套的,也可以有条件引发的。在完成开发任务时必须进行一些活动,并使用适当的资源(人员、时间、计算机硬件、软件工具等),在过程结束时将把输入(软件需求)转化为输出(软件产品)。ISO9000把过程定义为:“把输入转化为输出的一组彼此相关的资源和活动”。过程定义了运用方法的顺序、应交付的文档资料、为保证软件质量和协调变化所需要采取的管理措施以及标志软件开发各个阶段任务完成的里程碑。软件工程过程包括:开发过程、运作过程、维护过程、管理过程、支持过程、获取过程、供应过程、剪裁过程等在美国SEI(软件工程研究所,设在美国卡耐基-梅农大学,是致力于软件过程改进的权威机构)提出的“能力成熟度模型”(CMM,CapabilityMaturityModule)中,设定了52个目标,18个关键活动域和316个关键活动,能够用来评价软件开发组织的过程能力。工作任务里程碑、交付物软件质量保证点任务集合框架活动公共过程框架保护性辅助活动软件工程过程通过定义适合于所有软件项目的框架活动而建立。每个集合由软件工程工作任务、软件项目里程碑、软件工作产品和交付物以及质量保证点组成。独立于任何一个框架从宏观上来看,所有的软件开发过程都可以看成一个循环解决问题的过程。包括4个不同的阶段:状态描述,问题定义,技术开发和方案综述。问题循环解决的各个阶段状态描述问题定义技术开发方案综述状态描述问题定义技术开发方案综述状态描述问题定义技术开发方案综述状态描述问题定义技术开发方案综述问题循环解决阶段中的阶段状态描述软件生存周期划分为四个时期:软件分析时期、设计时期、编码与测试时期、运行与维护时期。每个时期又划分为若干个阶段。1、软件的分析时期任务:确定软件开发工程必须完成的总目标;可行性;采用的策略;必要的功能;所需的资源和成本;工程进度;分为三个阶段:问题定义、可行性研究、需求分析;2、软件设计时期的任务:具体设计和实现在前一时期定义的软件。分为2个阶段:总体设计;详细设计;3、编码和测试时期;编码和单元测试、综合测试;4、软件维护时期的任务:使软件持久地满足用户的需要。有四个方面的维护活动:改正性、完善性、适应性、预防性;第四节软件生存周期阶段关键问题结束标准问题定义问题是什么关于规模和目标的报告书可行