软件工程导论SoftwareEngineering程金控制科学与工程学院cse_chengj@ujn.edu.cn2020/2/3前言•参考教材:1.张海藩.软件工程导论(第5版).清华大学出版社.20082.计算机软件工程规范国家标准汇编(2003)3.史济民.软件工程原理.方法与应用.北京-高等教育出版社,1990.5•主要参考资料–《软件工程导论》教学大纲–《软件工程导论》授课计划前言•《软件工程导论》课程的性质、任务和特点–本课程是计算机科学类专业的一门必修课程,它是一门新兴的研究软件开发与维护的普通原理和技术的工程学科。–本课程的主要任务是:1.研究软件工程学产生的背景、基本原理和实际软件开发技术。2.学习软件生命周期的划分,掌握各个阶段的任务过程、方法、管理技术和使用专业工具对整个软件工程进行科学规划。3.培养高层次软件开发设计人员。4.培养软件项目管理人员。前言-课程的主要内容第1章软件工程学概述第2章可行性研究第3章需求分析第4章形式化说明技术第5章总体设计第6章详细设计第7章实现第8章维护第9章面向对象方法学引论第10章面向对象分析第11章面向对象设计第12章面向对象实现第13章软件项目管理前言-注意事项一.准备作业本,要求按时、独立完成课堂布置作业,不得抄袭。二.将不定期进行考勤,有事务必请假,出示按规定办理的请假条。三.课程涉及C和C++语言编程,请提前预习相关知识。四.本课程最终成绩由平时成绩(含考勤、作业和课堂表现,30%)、期末考试(70%)。五.我的联系方式地点:cse_chengj@ujn.edu.cn第一教学楼(信息楼)1006第1章软件工程学概述1.1软件危机1.2软件工程1.3软件生命周期1.4软件过程1.1软件危机•什么是软件:软件(software)是计算机系统中与硬件(hardware)相互依存的另一部分,它包括程序(program)、相关数据(data)及其说明文档(document)。–程序是按照事先设计的功能和性能要求执行的指令序列;–数据是是程序能正常操纵信息的数据结构;–文档是与程序开发维护和使用有关的各种图文资料。1.1软件危机•软件的发展:–早期时代(20世纪60年代中期以前),软件却是为每个具体应用而专门编写的。这时的软件通常是规模较小的程序,编写者和使用者往往是同一个(或同一组)人。这种个体化的软件环境,使得软件设计通常是在人们头脑中进行的一个隐含的过程,除了程序清单之外,没有其他文档资料保存下来。–从20世纪60年代中期到70年代中期是计算机系统发展的第二代时期-“软件作坊”,专职应别人的需求写软件。“软件作坊”基本上仍然沿用早期形成的个体化软件开发方法。IntroductiontoSoftwareHistory•FirsttherewasAdaLovelace,writingarudimentaryprogram(1843)fortheAnalyticalMachine,designedbyCharlesBabbagein1827,butthemachinenevercameintooperation.•ThentherewasGeorgeBoole(1815-1864),aBritishmathematician,whoprovedtherelationbetweenmathematicsandlogicwithhisalgebraoflogic(BOOLEANalgebraorbinarylogic)in1847•JohnVonNeumannworkingattheInstituteforAdvancedStudydevelopedin1945twoimportantconceptsthatdirectlyaffectedthepathofcomputerprogramminglanguages:–Thefirstconceptbecameknownasshared-programtechnique–Thesecondconceptwasalsoextremelyimportanttothedevelopmentofprogramminglanguages.VonNeumanncalleditconditionalcontroltransfer•IttookClaudeShannon(1916-2001)whowroteathesis(AMathematicalTheoryofCommunicationintheBellSystemTechnicalJournal-1948)onhowbinarylogiccouldbeusedincomputingtocompletethesoftwareconceptofmoderncomputing.•In1949,afewyearsafterVonNeumann'swork,thelanguageShortCodeappeared.Itwasthefirstcomputerlanguageforelectronicdevicesanditrequiredtheprogrammertochangeitsstatementsinto0'sand1'sbyhand.Still,itwasthefirststeptowardsthecomplexlanguagesoftoday.•In1951,GraceHopperwrotethefirstcompiler,A-0.Acompilerisaprogramthatturnsthelanguage'sstatementsinto0'sand1'sforthecomputertounderstand.Thisleadtofasterprogramming,astheprogrammernolongerhadtodotheworkbyhand.•In1957,thefirstofthemajorlanguagesappearedintheformofFORTRAN.ItsnamestandsforFORmulaTRANslatingsystem.ThelanguagewasdesignedatIBMforscientificcomputing.•Businesscomputingstartedtotakeoffin1959,andbecauseofthis,COBOLwasdeveloped.•In1958,JohnMcCarthyofMITcreatedtheLIStProcessing(orLISP)language.ItwasdesignedforArtificialIntelligence(AI)research.Becauseitwasdesignedforsuchahighlyspecializedfield,itssyntaxhasrarelybeenseenbeforeorsince.•TheAlgollanguagewascreatedbyacommitteeforscientificusein1958.It'smajorcontributionisbeingtherootofthetreethathasledtosuchlanguagesasPascal,C,C++,andJava.1.1软件危机•软件危机的出现:随着计算机应用的日益普及,软件数量急剧膨胀:–在程序运行时发现的错误必须设法改正;–用户有了新的需求时必须相应地修改程序;–硬件或操作系统更新时,通常需要修改程序以适应新的环境。•软件危机的案例:–IBM公司于1963年~1966年开发的IBM360系列机的操作系统。–1963年,美国用于控制火星探测器的计算机软件中的一个,号被误写为・,而使飞往火星的探测器发生爆炸,造成高达数亿美元的损失.–WINDOWSXP操作系统的漏洞。–银行的金融管理软件系统。1.1软件危机•什么是软件危机:软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。这些问题绝不仅仅是不能正常运行的软件才具有的,实际上,几乎所有软件都不同程度地存在这些问题。•软件危机包含下述两方面的问题:–如何开发软件,以满足对软件日益增长的需求;–如何维护数量不断膨胀的已有软件。1.1软件危机•软件危机的主要典型表现:(1)对软件开发成本和进度的估计常常很不准确。1995年美国公司取消了810亿美元的软件项目,在完成前就因成本等问题而取消的占其中的31%;53%的软件项目进度拖延,超过预定工期50%以上;只有9%的大型软件项目能够及时交付且费用不超支。(2)用户对“已完成的”软件系统不满意的现象经常发生。软件开发人员常常在对用户要求只有模糊的了解,甚至对所要解决的问题还没有确切认识的情况下,就匆忙着手编写程序。软件开发人员和用户之间的信息交流往往很不充分,“闭门造车”必然导致最终的产品不符合用户的实际需要。1.1软件危机•软件危机的主要典型表现(3)软件产品的质量往往靠不住。软件可靠性和质量保证的确切的定量概念刚刚出现不久,软件质量保证技术(审查、复审和测试)还没有坚持不懈地应用到软件开发的全过程中,这些都导致软件产品发生质量问题。(4)软件常常是不可维护的。很多程序中的错误是非常难改正的,实际上不可能使这些程序适应新的硬件环境,也不能根据用户的需要在原有程序中增加一些新的功能。“可重用的软件”还是一个没有完全做到的、正在努力追求的目标。1.1软件危机•软件危机的主要典型表现(5)软件通常没有适当的文档资料。这些文档资料应该是在软件开发过程中产生出来的,而且应该是“最新式的”(即和程序代码完全一致的)。软件开发组织的管理人员可以使用这些文档资料作为“里程碑”,来管理和评价软件开发工程的进展状况;软件开发人员可以利用它们在软件开发过程中准确地交流信息;对于软件维护人员而言,这些文档资料更是必不可少的。缺乏必要的文档资料或者文档资料不合格,必然给软件开发和维护带来许多严重的困难和问题。1.1软件危机•软件危机的主要典型表现:(6)软件成本在计算机系统总成本中所占比例逐年上升。软件开发需要大量人力,软件成本随着通货膨胀以及软件规模和数量的不断扩大而持续上升。美国在1985年软件成本大约已占计算机系统总成本的90%。(7)软件开发生产率提高的速度,远远跟不上计算机应用迅速普及深入的趋势。软件的开发至今尚未完全摆脱手工作坊式的开发方式,生产效率低。软件产品“供不应求”的现象使人类不能充分利用现代计算机硬件提供的巨大潜力。1.1软件危机•产生软件危机的原因-与软件本身的特点有关:–软件缺乏“可见性”,在写出程序代码并在计算机上试运行之前,软件开发过程的进展情况较难衡量,软件的质量也较难评价,因此,管理和控制软件开发过程相当困难。–软件维护通常意味着改正或修改原来的设计,这就在客观上使得软件较难维护。统计数据表明,实际上用于软件维护的费用占软件总费用的55%-70%。1.1软件危机•产生软件危机的原因-与软件本身的特点有关:–软件的显著特点是规模庞大,而且程序复杂性将随着程序规模的增加而呈指数上升。–为了在预定时间内开发出规模庞大的软件,必须由许多人分工合作,然而,如何保证每个人完成的工作合在一起确实能构成一个高质量的大型软件系统,更是一个极端复杂困难的问题,不仅涉及许多技术问题,诸如分析方法、设计方法、形式说明方法、版本控制等,更重要的是必须有严格而科学的管理。1.1软件危机•产生软件危机的原因-另一方面也和软件开发与维护的方法不正确有关:–错误的认识和作法主要表现为忽视软件需求分析的重要性,认为软件开发就是写程序并设法使之运行,轻视软件维护等。•事实上,对用户要求没有完整准确的认识就匆忙着手编写程序是许多软件开发工程失败的主要原因之一。•软件开发最初的工作应是问题定义。作好软件定义时期的工作,是降低软件成本,提高软件质量的关键。1.1软件危机•产生软件危机的原因-另一方面也和软件开发与维护的方法不正确有关:–在软件开发的不同阶段进行修改需要付出的代价是很不相同的,在早期引入变动