软件工程计算机与信息科学学院黄敏hmin@swu.edu.cn软件工程是以工程化的思想和方法来指导计算机软件开发与维护整个过程的一门学科,既有很强的理论性,又有鲜明的实践性。本课程通过介绍软件工程学产生的历史背景以及它的基本原理、概念、技术和方法,使学生掌握软件项目开发和维护的一般过程,掌握软件开发的传统方法和最新方法,能用软件工程的方法参与软件项目的分析、设计、实现和维护,为更深入地学习和今后从事软件工程的实践打下良好的基础。第1章软件工程学概述第2章可行性研究第3章需求分析第4章形式化说明技术第5章总体设计第6章详细设计第7章实现第8章维护第9章面向对象方法学引论第10章面向对象分析第11章面向对象设计第12章面向对象实现第13章软件项目管理教学内容1.1软件与软件危机1.2软件工程1.3软件生命周期1.4软件过程第1章软件工程学概述教学目标•一般了解:•软件开发技术的发展历史及其特点;•什么是软件危机?•软件危机产生的原因?•解决软件危机的办法;•软件的特点、传统的生命周期模型。•基本掌握:•对软件工程的基本原理和方法有概括性的认识。•重点掌握:•软件工程的概念和基本原理;•生命周期方法学的内容;•生命周期方法学各阶段的划分和基本任务。1.软件的定义2.软件工程的发展3.软件危机的介绍4.产生软件危机的原因5.消除软件危机的途径1.1软件与软件危机1.软件的定义软件是计算机系统中与硬件相互依存的另一部分,它是包括程序、数据及其相关文档组成的完整集合。可以写作为:软件=程序+数据+文档。程序:程序是按事先设计好的功能和性能要求执行的指令序列。数据:数据是使程序能适当地处理信息的数据结构。文档:文档是与程序运行和维护有关的图文资料(面向开发者的文档和面向用户的文档)。第一阶段:个体化生产20世纪60年代中期以前第二阶段:作坊式生产20世纪60年代中期到70年代中期第三阶段:产业化生产20世纪70年代中期至今2.从软件到软件工程第一阶段:个体化生产20世纪60年代中期以前,当时的软件没有系统化的开发方法,所谓的软件开发就是根据应用的需要写出能够运行的程序,软件的开发者、使用者、维护者大多为同一个人或一组人,软件开发处于个体化生产状态。第二阶段:作坊式生产20世纪60年代中期到70年代中期,产品软件萌生,软件开发进入作坊式生产阶段,软件数量膨胀。但是,“软件作坊”基本上仍然沿用早期形成的个体化软件开发方法,这使得软件在开发和维护过程中遇到了一系列严重问题,软件危机由此产生。1968年北大西洋公约组织的计算机科学家在联邦德国召开会议,讨论“软件危机”问题,正式提出“软件工程”这一术语,从而使软件的开发和维护进入了一个新的历史阶段。第三阶段:产业化生产20世纪70年代中期以后,软件开发进入产业化生产阶段,出现了众多大型的软件公司,在工程化的思想和方法指导下进行软件的开发和维护,软件的数量和质量都有很大提高。软件工程的发展•第一代软件工程•生产作坊式•第二代软件工程•20世纪80年代中期,Smalltalk等面向对象程序设计语言推出•20世纪90年代起,研究重点从程序设计语言逐渐转移到面向对象的分析和设计,演化为一种完整的软件开发方法和系统的技术体系(对象工程)•第三代软件工程•软件工程管理难度增大,形成新的认识:对软件过程的控制非常重要(软件过程工程)•第四代软件工程•构件工程1.1.3软件危机的介绍•IBM公司在1963年至1966年开发的IBM360机的操作系统。•这一项目花了5000人一年的工作量,最多时有1000人投入开发工作,写出了近100万行源代码。据统计,这个操作系统每次发型的新版本都是从前一版本中找出1000个程序错误而修正的结果。•这个项目的负责人F.P.Brooks事后总结了他在组织开发过程中的沉痛教训时说:“……正像一只逃亡的野兽落到泥沼中做垂死的挣扎,越是挣扎,陷得越深。最后无法逃脱灭顶的灾难。……程序设计工作正像这样一个泥潭,……一批批程序员被迫在泥沼中拼命挣扎,……谁也没有料到问题竟会陷入这样的困境……”•IBM360操作系统的历史教训成为软件开发项目的典型事例为人们所记取。而Brooks随后也写出了软件工程领域的经典著作《人月神话》,至今畅销不衰。某公园有一游船码头,负责人希望开发一游船管理系统要求如下:当游客租船时,管理员输入S表示租船周期开始;当游客还船时,管理员输入E表示租船周期结束。一天结束时,要求系统打印出租船次数和平均租船时间。Algorithm:Number=Total_time=0;GetMessage;While(!End_of_stream){if(Code==S){Number++;Total_time=Start_time;}elseTotal_time+=End_time;GetMessage;}PrintNumber;If(Number)PrintTotal_time/Number;新要求:输出一天中的最长租用时间。新要求:将报告分上午和下午输出。新要求:当通信线路出问题时,能从计算中删除一切不完整的租船信息。Myth:Oncewewritetheprogramandgetittowork,ourjobisdone.Reality:Someoneoncesaidthat“thesooneryoubegin‘writingcode’,thelongerit’lltakeyoutogetdone.”Industrydataindicatethatbetween60and80percentofalleffortexpendedonaprogramwillbeexpendedafteritisdeliveredtothecustomerforthefirsttime.•直到今天,我们仍然需要回答这样几个问题:Whydoesittakessolongtogetsoftwarefinished?Whyaredevelopmentcostssohigh?Whycan’twefindalltheerrorsbeforewegivethesoftwaretocustomers?Whydowecontinuetohavedifficultyinmeasuringprogressassoftwareisbeingdeveloped?1.1.3软件危机的介绍软件危机是指在计算机软件的开发和维护过程中遇到的一系列严重问题。概括地说,软件危机包含两方面问题:如何开发软件,以满足对软件日益增长的需求;如何维护数量不断膨胀的已有软件。软件危机主要有以下一些典型表现:对软件开发成本和进度的估计常常很不准确。用户对“已完成的”软件系统不满意的现象经常发生。软件产品的质量往往靠不住。软件常常是不可维护的。软件通常没有适当的文档资料。软件成本在计算机系统总成本中所占的比例逐年上升。软件开发生产率提高的速度远远跟不上计算机应用迅速普及深入的趋势。原因一:软件本身的特点软件是逻辑产品;软件规模庞大;1.1.4产生软件危机的原因InfantmortalityWearoutFailurecurveforhardwareidealizedcurvechangeactualcurveFailurerateTime1.1.4产生软件危机的原因•原因二:软件专业人员本身的素质所决定的:软件专业人员对软件开发和维护存在糊涂的观念,在实践过程中采用了错误的方法和技术•忽视用户需求分析或分析不足;•对软件生存周期这一过程认识不明确;•对完整的软件配置认识不准确;•忽略了软件维护的重要性;对计算机软件应当有一个正确的认识;应当有组织、有计划、通过严格的管理手段进行软件的开发;及时总结软件开发的成功技术和方法并加以推广;开发和使用更好的软件工具;总之,为了解决软件危机,既要有技术措施,又要有必要的组织管理措施。软件工程正是从管理和技术两方面研究如何更好的开发和维护计算机软件的学科。1.1.5消除软件危机的途径1.2软件工程1.2.1软件工程的介绍1.2.2软件工程的基本原理1.2.3软件工程方法学软件工程是研究软件生产的一门学科。它采用工程的概念、原理、技术和方法来开发和维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以达到经济地开发出高质量的软件并有效的维护它的目的。1968年,北大西洋公约组织在原西德召开计算机科学会议,由FritzBauer首次提出了“软件工程”的概念:“软件工程是为了经济地获得能够在实际机器上有效运行的可靠软件而建立和使用的一系列完善的工程化原则。”《IEEE软件工程标准术语》对软件工程给出的定义是:开发、运行和维护软件以及使之退役的系统方法。1.2.1软件工程的介绍软件工程具有下述本质特性:软件工程关注于大型程序的构造软件工程的中心课题是控制复杂性软件经常变化开发软件的效率非常重要和谐的合作是开发软件的关键软件必须有效的支持它的用户在软件工程领域中是由具有一种文化背景的人替具有另一种文化背景的人创造产品1.2.1软件工程的介绍著名的软件工程专家B.W.Boehm于1983年综合了软件工程专家学者们的意见并总结了开发软件的经验,提出了软件工程的7条基本原理。这7条原理被认为是确保软件产品质量和开发效率的原理的最小集合,又是相互独立、缺一不可、相当完备的最小集合。1.用分阶段的生命周期计划严格管理2.坚持进行阶段评审3.实行严格的产品控制4.采用现代程序设计技术5.结果应能清楚地审查6.开发小组的人员应该少而精7.承认不断改进软件工程实践的必要性1.2.2软件工程的基本原理1.用分阶段的生命周期计划严格管理这条基本原理是应该把软件生存周期划分成若干个阶段,并相应地制定出切实可行的计划,然后严格按照计划对软件开发与维护工作进行管理。应该制定的计划有项目概要计划、里程碑计划、项目控制计划、产品控制计划、验证计划和运行维护计划等。各级管理人员都必须严格按照计划对软件开发和维护工作进行管理。据统计,不成功的软件项目中,有一半左右是由于计划不周造成的。2.坚持进行阶段评审据统计,在软件生存周期各阶段中,编码阶段之前的错误约占63%,而编码错误仅占37%。另外,错误发现并改正得越晚,所花费的代价越高。坚持在每个阶段结束前进行严格的评审,就可以尽早发现错误,从而可以最小的代价改正错误。因此,这是一条必须坚持的重要原理。3.实行严格的产品控制决不能随意改变需求,只能依靠科学的产品控制技术来顺应用户提出的改变需求的要求。为了保持软件各个配置成分的一致性,必须实行严格的产品控制。其中主要是实行基准配置管理(又称为变动控制),即凡是修改软件的建议,尤其是涉及基本配置的修改建议,都必须按规程进行严格的评审,评审通过后才能实施。这里的“基准配置”是指经过阶段评审后的软件配置成分,即各阶段产生的文档或程序代码等。4.采用现代程序设计技术实践表明,采用先进的程序设计技术既可以提高软件开发与维护的效率,又可以提高软件的质量。多年来,人们一直致力于研究新的“程序设计技术”。比如,20世纪60年代末提出的结构程序设计技术;后来又发展出各种结构分析(SA)和结构设计(SD)技术;之后又出现了面向对象分析(OOA)和面向对象设计(OOD)技术等等。5.结果应该能清楚地审查软件产品是一种看不见、摸不着的逻辑产品。因此,软件开发小组的工作进展情况可见性差,难于评价和管理。为了更好地进行评价与管理,应根据软件开发的总目标和完成期限,尽量明确地规定软件开发小组的责任和产品标准,从而使所得到的结果能清楚地审查。6.开发小组的人员应该少而精软件开发小组人员素质和数量是影响软件质量和开发效率的重要因素。实践表明,素质高的人员与素质低的人员相比,开发效率可能高几倍至几十倍、而且所开发的软件中的错误也要少得多。另外,开发小组的人数不宜过多,因为随着人数的增加,人员之间交流情况、讨论问题的通信开销将急剧增加,这不但不能提高生产率,反而由于误解等原因