软件工程清华大学出版社张海藩主编主讲:赵春霞电话:13937182207Email:springshiner@163.com课程性质:考试课学时:共72学时实验18学时,分组进行课程成绩构成:形成性成绩:40%(考勤:10分;实验项目:20分;实验报告:10分)终结性考核:60%建议参考书目1.(美)ShariLawrencePfleeger.SofewareEngineeringTheoryandPractice(SecondEdition).吴丹,史争印,唐忆译.北京:清华大学出版社,2003,82.(英)IanSommerville.SofewareEngineering(6thEdition).程成等译.北京:机械工业出版社,2003,13.郑人杰等.实用软件工程(第二版).北京:清华大学出版社,1997,44.周之英.现代软件工程.北京:科学出版社,19995.《敏捷开发方法—原则、模式与实践》RobertC.Martin著清华大学出版社6.《人月神话》弗雷德里克·布鲁克斯著清华大学出版社学习《软件工程》对我有什么用?长远看:……近期:帮助你完成毕业设计及毕业论文的撰写。思考:假如你的毕业设计是关于一个软件的设计与开发,拿到这个题目之后,你打算怎么开展工作?到底什么是软件工程?第1章软件工程学概述1.1软件危机1.2软件工程1.3软件生命周期1.4软件过程1.5问题定义1.1软件危机软件发展的历程:60年代中期以前:通用硬件相当普遍,软件却是为某个具体的应用而编写的。采用“个体生产方式”60年代中到70年代中:软件作坊。随着软件规模的扩大,个体生产已经不能够满足软件生产的需要,一个软件需要由几个人协同完成,采用“生产作坊方式”,随着软件需求量、规模及复杂度的增大,生产作坊的方式已经不能够适应软件生产的需要,出现所谓“软件危机”。软件工程时代:为了克服软件危机,适应软件发展的需要,而采用“工程化的生产”方式。将工程学的某些原理和方法应用在软件的设计和开发中来,最终出现软件工程。软件危机的最突出的爆发:60年代美国IBM公司开发IBM360机的操作系统,化了5000人年的工作量,完成时间一再推迟,结果却不理想。项目负责人Brook后来对整个过程反思,总结经验和教训,写成了《人月神话》,被称为程序员的“圣经”。1968年北大西洋公约组织的计算机科学家在联邦德国召开国际会议,讨论软件危机问题,在这次会议上正式提出并使用了“软件工程”一词,软件工程学由此开始研究。软件危机:计算机软件的开发和维护过程中所遇到的一系列严重问题。(正常、不正常运行软件都具有这种问题)1.1.1软件危机的介绍1)对软件开发成本和进度的估计常常很不准确:实际成本比估计成本高出几倍甚至十几倍,实际进度比预期进度拖延几个月甚至几年的现象并不罕见。2)用户对完成的软件系统不满意的现象经常发生:软件开发人员与用户的信息交流不充分。3)软件产品的质量往往靠不住:软件质量保证技术的不完善和未全面推广。软件危机的典型表现:4)软件常常是不可维护的:很多程序中的错误都非常难以改正。“可重用的软件”的目标很难实现。5)软件通常没有适当的文档资料:缺乏必要的文档资料或者文档资料不合格,必然给软件开发和维护带来许多严重的困难和问题。6)软件成本在计算机系统总成本中所占的比例逐年上升;7)软件开发生产率提高的速度,远远跟不上计算机应用迅速普及深入的发展趋势:软件产品“供不应求”。1.1.2产生软件危机的原因1)软件本身特点造成;2)软件开发与维护的方法不正确。主要表现:(a)忽视软件需求分析;(b)开发过程没有统一、规范的方法论的指导,文档资料不齐全,认为软件开发就是写程序并使之运行;(c)轻视软件维护。在软件开发的不同阶段进行修改需要付出的代价很不相同:高中低早期中期后期软件开发时期代价引入同一修改的代价随时间变化的趋势关于软件开发,常见的一些观点,我们看看是否正确:“有一个对目标的概括描述就足以着手编写程序了,许多细节可以在以后再补充。”“所谓软件开发就是编写程序并设法使它运行。”“用户对软件的要求不断变化,然而软件是柔软而灵活的,可以轻易地改动。”“软件投入生产性运行以后需要的维护工作并不多,而且维护是一种很容易做的简单工作。”软件维护的费用占软件总费用的55%-70%不完善的系统定义往往是导致软件项目失败的主要原因。只有质量差的软件产品才需要维护。在软件开发的过程中,若能推迟暴露其中的错误,则为修复和改正错误所花费的代价就会降低。只要我们写出了程序并使其正常运行,我们的工作就结束了。我们拥有一套讲述如何开发软件的书籍,书中充满了标准与示例,可以帮助我们解决软件开发中遇到的任何问题。在项目计划发生延迟的情况下,增加更多的程序员一定会加快进度。文档是软件产品的一部分,没有文档的软件就不称其为软件。一个成功的项目唯一提交的就是运行程序。1)正确认识软件的概念。2)充分认识到软件开发不是某种个体劳动的神秘技巧,而应该是一种组织良好、管理严密、各类人员协同配合共同完成的工程项目。3)充分吸取和借鉴人类长期以来从事各种工程项目所积累的行之有效的原理、概念、技术和方法,特别要吸取几十年来人类从事计算机软硬件研究和开发的经验教训。4)推广使用在实践中总结出来的开发软件的成功技术和方法,并研究探索更有效的技术和方法;5)开发和使用更好的软件工具;6)良好的组织管理措施。1.1.3解决软件危机的途径软件是计算机系统中与硬件相互依存的另一部分,它是包括程序,数据及其相关文档的完整集合。程序是按事先设计的功能和性能要求执行的指令序列。数据是使程序能正常操纵信息的数据结构。文档是与程序开发,维护和使用有关的图文材料。软件=程序+数据+文档什么是软件?开发软件不等于编写程序!!!总之,为了消除软件危机,既要有技术措施(方法和工具),又要有必要的组织管理措施。软件工程正是从管理和技术两方面研究如何更好地开发和维护计算机软件的一门新兴学科。1.2软件工程1.2.1软件工程的介绍1968年NATO(北大西洋公约组织)会议:软件工程就是为了经济地获得可靠的且能在实际机器上有效地运行的软件,而建立和使用完善的工程原理。1993年IEEE(美国电气和电子工程师协会):软件工程是(1)把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程;(2)研究(1)中提到的途径。1.软件工程关注于大型程序的构造;2.软件工程的中心课题是控制复杂性;3.软件经常变化;4.开发软件的效率非常重要;5.和谐地合作是软件开发的关键;6.软件必须有效地支持它的用户;7.在软件工程领域中是由具有一种文化背景的人替具有另一种文化背景的人创造产品。软件工程的本质特性:软件工程的定义概括地说,软件工程是指导计算机软件开发与维护的工程学科。它采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明是正确的管理技术和目前能够得到的最有效的技术与方法结合起来,以经济地开发出高质量的软件并有效地维护它,这就是软件工程。目标:软件工程研究的目标是“以较少的投资获取较高质量的软件”。(1)付出较低的开发成本(2)实现要求的软件功能(3)取得较好的软件性能(4)开发的软件易于维护(5)需要的维护费用较低(6)能按时完成开发工作,及时交付使用1.2.2软件工程的基本原理1.用分阶段的生命周期计划严格管理把软件生命周期划分成若干个阶段,并相应地制定出切实可行的计划,然后严格地按照计划对软件的开发与维护工作进行管理。2.坚持进行阶段评审软件的质量保证工作不能等到编码阶段结束之后再进行。原因:第一,大部分错误是在编码之前造成的,例如,根据Boehm等人的统计,设计错误占软件错误的63%,而编码错误仅占37%;第二,错误发现与改正得越晚,改正错误所需付出的代价也越高。3.实行严格的产品控制基线配置管理(变动控制)4.采用现代程序设计技术结构化分析(SA)技术、结构化设计(SD)技术、结构化程序设计(SP)技术,面向对象分析和设计技术。实践表明,采用先进的技术不仅可以提高软件开发和维护的效率,而且可以提高软件产品的质量。5.结果应该能够清楚地审查依据开发项目的总目标和完成期限,规定开发小组的责任、产品标准及完成日期,使结果能够清楚地审查。6.开发小组的人员应该少而精素质高的人员的开发效率比素质低的人员的开发效率可能高几倍至几十倍,而且素质高的人员所开发的软件中的错误明显少于素质低的人员所开发的软件中的错误。随着开发小组人员数目的增加,为了交流信息、讨论问题而造成的通信开销也急剧增加。当开发小组人数为N时,可能的通信路径有N(N-1)/2条。7.承认不断改进软件工程实践的必要性软件工程随着技术的进步而不断的发展。1.2.3软件工程方法学软件工程包括技术和管理两方面的内容,是技术与管理紧密结合形成的工程学科。管理是通过计划、组织和控制等一系列活动,合理配置和使用资源,以达到既定目标的过程。通常把在软件生命周期全过程中使用的一整套技术方法的集合称为方法学(Methodology),也称为范型(Paradigm)。软件工程方法学的3要素:方法、工具和过程。方法是完成软件开发的各项任务的技术方法,回答“怎样做”的问题;工具是为运用方法而提供的自动或半自动的软件工程支撑环境;过程是为了获得高质量的软件所需完成的一系列任务的框架,它规定了完成各项任务的工作步骤。1、传统方法学(生命周期方法学或结构化范型)——强调自顶向下采用结构化技术来完成软件;划分为若干个阶段,然后顺序地完成每个阶段的任务;每个阶段的任务相对独立,而且比较简单,降低了整个软件开发工程的困难程度;前一个阶段是后一个阶段的前提和基础,而后一阶段提出的解法更具体,细节更多;每个阶段结束前必须从技术和管理两方面对这个阶段的开发成果进行严格的检查,通过之后这个阶段才算结束;保证质量,提高可维护性;当软件规模庞大,或者的需求模糊或随时间而变化时,传统方法学往往不成功;维护起来仍然很困难。2、面向对象方法学——强调主动地多次反复迭代面向对象方法:把数据和行为看成同等重要,它是一种以数据为主线,把数据和对数据的操作紧密地结合起来的方法。面向对象方法学4个要点:对象(object):融合了数据及在数据上的操作行为。类(class):类是对具有相同数据和相同操作的一组相似对象的定义。继承:按照父类与子类的关系,把若干个相关类组成一个层次结构的系统。消息:对象彼此间仅能通过发送消息互相联系。面向对象方法学的优点:面向对象方法学的尽量模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程。面向对象方法学开发软件的过程,是一个主动地多次反复迭代的演化过程,保证了在各项开发活动之间的平滑过渡。促进了软件重用。最终的软件产品由许多较小的、基本上独立的对象组成,每个对象相当于一个微型程序,而且大多数对象都与现实世界中的实体相对应,降低了复杂性,提高了可理解性,简化了开发和维护工作。软件发展趋势:以面向对象技术为手段,以可重用软件构件化和体系架构为基础,以工业化生产方式和管理支撑体系为核心的软件新变革。1.3软件生命周期软件生命周期:指软件从提出到最终被淘汰的存在期。三个时期八个阶段:软件生命周期由软件定义、软件开发和运行维护(也称为软件维护)三个时期组成,每个时期又进一步划分成若干个阶段。三个时期:八个阶段:软件生命周期软件定义软件开发软件维护问题定义可行性研究需求分析概要设计详细设计编码和单元测试综合测试运行维护系统设计系统实现1.问题定义(系统定义)任务:问题是什么通过对客户的访问调查,系统分析员扼要地写出关于问题性质、工程目标和工程规模的书面报告。经过讨论和必要的修改之后这份报告应该得到客户的确认。结果:关于系统规模和目标的报告书2.可行性研究任务:有可行的解吗系统分析员需要进行一次大大压缩和简化了的系