软件工程课程设计精.ppt
软件工程课程设计第1页,本讲稿共14页软件工程 软件工程软件工程软件工程软件工程是一门研究用工程化方法构建和维护有效的、实用的和高质是一门研究用工程化方法构建和维护有效的、实用的和高质量的量的软件软件的学科。的学科。它涉及到它涉及到程序设计语言程序设计语言程序设计语言程序设计语言、数据库数据库、软件开发工具软件开发工具、系统平台系统平台、标、标准、准、设计模式设计模式设计模式设计模式等方面。等方面。软件应用于多个方面。典型的软件比如有软件应用于多个方面。典型的软件比如有电子邮件电子邮件、嵌入式系统嵌入式系统、人人人人机界面机界面机界面机界面、办公包办公包办公包办公包、操作系统操作系统、编译器编译器编译器编译器、数据库数据库、游戏游戏等。同时,等。同时,各个行业几乎都有计算机软件的应用,比如各个行业几乎都有计算机软件的应用,比如工业工业工业工业、农业农业、银行银行银行银行、航空航空、政府政府部门等。而这些应用促进了经济和社会的发展,提高部门等。而这些应用促进了经济和社会的发展,提高人们的工作效率,同时提升了生活质量。人们的工作效率,同时提升了生活质量。软件工程师软件工程师是对应用软件创造软件的人们的统称,软件工程师按照是对应用软件创造软件的人们的统称,软件工程师按照所处的领域不同可以分为所处的领域不同可以分为系统分析员系统分析员、软件设计师软件设计师、系统架构师系统架构师系统架构师系统架构师、程序员程序员、测试员测试员测试员测试员等等。人们也常常用程序员来泛指各种软件工程师。等等。人们也常常用程序员来泛指各种软件工程师。2022/12/52第2页,本讲稿共14页软件工程的由来 鉴于软件开发时所遭遇困境,鉴于软件开发时所遭遇困境,北大西洋公约组织北大西洋公约组织北大西洋公约组织北大西洋公约组织(NATONATO)在)在19681968年年举办了首次软件工程学术会议,并于会中提出举办了首次软件工程学术会议,并于会中提出“软件工程软件工程”来界定软来界定软件开发所需相关知识,并建议件开发所需相关知识,并建议“软件开发应该是类似工程的活动软件开发应该是类似工程的活动”。软件工程自软件工程自19681968年正式提出至今,这段时间累积了大量的年正式提出至今,这段时间累积了大量的研究研究成成果,广泛地进行大量的技术实践,借由果,广泛地进行大量的技术实践,借由学术界学术界学术界学术界和产业界的共同努和产业界的共同努力,软件工程正逐渐发展成为一门专业力,软件工程正逐渐发展成为一门专业学科学科学科学科。2022/12/53第3页,本讲稿共14页软件工程的定义 创立与使用健全的工程原则,以便经济地获得可靠且高效率的软件。创立与使用健全的工程原则,以便经济地获得可靠且高效率的软件。应用系统化,遵从原则,可被计量的方法来发展、操作及维护软件;也就是把工程应用应用系统化,遵从原则,可被计量的方法来发展、操作及维护软件;也就是把工程应用到软件上。到软件上。与开发、管理及更新软件产品有关的理论、方法及工具。与开发、管理及更新软件产品有关的理论、方法及工具。一种知识或学科(一种知识或学科(disciplinediscipline),目标是生产品质良好、准时交货、符合预算,),目标是生产品质良好、准时交货、符合预算,并满足用户所需的软件。并满足用户所需的软件。实际应用科学知识在设计、建构电脑程序,与相伴而来所产生的文件,以及后实际应用科学知识在设计、建构电脑程序,与相伴而来所产生的文件,以及后续的操作和维护上。续的操作和维护上。使用与系统化生产和维护软件产品有关之技术与管理的知识,使软件开发与修改可在有使用与系统化生产和维护软件产品有关之技术与管理的知识,使软件开发与修改可在有限的时间与费用下进行。限的时间与费用下进行。建造由工程师团队所开发之大型软件系统有关的知识学科。建造由工程师团队所开发之大型软件系统有关的知识学科。对软件分析、设计、实施及维护的一种系统化方法。对软件分析、设计、实施及维护的一种系统化方法。系统化地应用工具和技术于开发以计算机为主的应用。系统化地应用工具和技术于开发以计算机为主的应用。2022/12/54第4页,本讲稿共14页软件工程的内核知识(SWEBOK)ACMACM 与与 IEEE Computer Society IEEE Computer Society 联合修定的联合修定的 SWEBOKSWEBOK(Software Engineering Body Software Engineering Body of Knowledgeof Knowledge)提到,软件工程领域中的内核知识包括:)提到,软件工程领域中的内核知识包括:软件需求(软件需求(Software requirementsSoftware requirements)软件设计(软件设计(Software designSoftware design)软件建构(软件建构(Software constructionSoftware construction)软件测试软件测试软件测试软件测试(Software testSoftware test)软件维护与更新(软件维护与更新(Software maintenanceSoftware maintenance)软件构型管理(软件构型管理(Software Configuration Management,SCMSoftware Configuration Management,SCM)软件工程管理(软件工程管理(Software Engineering ManagementSoftware Engineering Management)软件开发过程(软件开发过程(Software Development ProcessSoftware Development Process)软件工程工具与方法(软件工程工具与方法(Computer-Aided Software Engineering,CASEComputer-Aided Software Engineering,CASE)软件品质(软件品质(Software QualitySoftware Quality)2022/12/55第5页,本讲稿共14页软件工程与计算机科学 软件的开发到底是一门软件的开发到底是一门科学科学还是一门还是一门工程工程,这是一个被争论了很久的,这是一个被争论了很久的问题。实际上,软件开发兼有两者的特点。但是这并不意味着它们可以问题。实际上,软件开发兼有两者的特点。但是这并不意味着它们可以被互相混淆。很多人认为软件工程基于被互相混淆。很多人认为软件工程基于计算机科学计算机科学和和信息科学信息科学信息科学信息科学就如传就如传统意义上的工程学之于统意义上的工程学之于物理物理和和化学化学一样。在美国,大约一样。在美国,大约40%40%的的软件工软件工程师程师具有计算机科学的学位。在世界其他地方,这个比例也差不具有计算机科学的学位。在世界其他地方,这个比例也差不多。他们并不一定会每天使用计算机科学方面的知识,但是他们多。他们并不一定会每天使用计算机科学方面的知识,但是他们每天都会使用软件工程方面的知识。每天都会使用软件工程方面的知识。2022/12/56第6页,本讲稿共14页软件工程与计算机科学的差别软件工程与计算机科学的差别11软件工程软件工程计算机科学计算机科学目标在时间、资源、人员这3个主要限制条件下构建满足用户需求的软件系统。探索正确的计算和建模方法,从而改进计算方法本身。产品软件(比如办公包和编译器)。算法(比如希尔排序法)和抽象的问题(比如哲学家进餐问题)。进度与时间表软件项目都有特定的进度与时间表研究项目一般不具有设置的进度与时间表关注点软件工程关注如何为用户实现价值。软件理论关注的是软件本身运行的原理,比如时间复杂度,空间复杂度,和算法的正确性。变化程度随着技术和用户需求的不断变化,软件开发人员必须时刻调整自己的开发以适应当前的需求。同时软件工程本身也处于不断的发展中。对于某一种特定问题的正确解决方法将永远不会改变。需要的其他知识相关领域的知识。数学。著名的探索者和教育家Barry Boehm,David Parnas,and Frederick P.Brooks。Edsger Dijkstra,高德纳,Robert Tarjan,Peter Slater,艾伦图灵,姚期智。著名的实践者John Backus,Dan Bricklin,蒂姆伯纳斯-李,林纳斯托瓦兹,理查德马修斯托曼。无。2022/12/57第7页,本讲稿共14页软件工程与计算机程序设计 软件工程存在于各种应用中,存在于软件开发的各个方面。而软件工程存在于各种应用中,存在于软件开发的各个方面。而程序设计程序设计通常包含了程序设计和编码的反复迭代的过程,它是软件开通常包含了程序设计和编码的反复迭代的过程,它是软件开发的一个阶段。发的一个阶段。软件工程力图对软件项目的各个方面作出指导,从软件的可行性分析软件工程力图对软件项目的各个方面作出指导,从软件的可行性分析直到软件完成以后的维护工作。软件工程认为软件开发与各种市场活直到软件完成以后的维护工作。软件工程认为软件开发与各种市场活动密切相关。比如软件的动密切相关。比如软件的销售销售,用户,用户培训培训,与之相关的软件和硬件,与之相关的软件和硬件安装等。软件工程的方法学认为一个独立的安装等。软件工程的方法学认为一个独立的程序员程序员不应当脱离团队不应当脱离团队而进行开发,同时程序的编写不能够脱离软件的需求,设计,而进行开发,同时程序的编写不能够脱离软件的需求,设计,以及以及客户客户的利益。的利益。软件工程的发展是计算机程序设计工业化的体现。软件工程的发展是计算机程序设计工业化的体现。2022/12/58第8页,本讲稿共14页软件危机 软件工程的兴起要根源于软件工程的兴起要根源于2020世纪世纪6060,7070和和8080年代的年代的软件危机软件危机。在那个时代,。在那个时代,很多的很多的软件软件最后都得到了一个悲惨的结局。很多的最后都得到了一个悲惨的结局。很多的软件软件项目开发时间项目开发时间大大超出了规划的时间表。一些项目导致了财产的流失,甚至某些软件导致大大超出了规划的时间表。一些项目导致了财产的流失,甚至某些软件导致了人员伤亡。同时软件开发人员也发现软件开发的难度越来越大。了人员伤亡。同时软件开发人员也发现软件开发的难度越来越大。OS 360OS 360操作系统被认为是一个典型的案例。到现在为止,它仍然被操作系统被认为是一个典型的案例。到现在为止,它仍然被使用在使用在IBMIBM360360系列主机中。这个经历了数十年,极度复杂的软件项系列主机中。这个经历了数十年,极度复杂的软件项目甚至产生了一套不包括在原始设计方案之中的工作系统。目甚至产生了一套不包括在原始设计方案之中的工作系统。OS OS 360360是第一个超大型的软件项目,它使用了是第一个超大型的软件项目,它使用了10001000人左右的程序员。人左右的程序员。Fred Fred BrooksBrooks在随后他的大作在随后他的大作人月神话人月神话(The Mythical Man-MonthThe Mythical Man-Month)中曾经承认,在他管理这个项目的时候,他犯了一个价值数百万中曾经承认,在他管理这个项目的时候,他犯了一个价值数百万美元的错误。美元的错误。财产的损失:软件的错误可能导致巨大的财产损失。财产的损失:软件的错误可能导致巨大的财产损失。欧洲欧洲阿里亚娜火阿里亚娜火箭箭的爆炸就是一个最为惨痛的教训。的爆炸就是一个最为惨痛的教训。2022/12/59第9页,本讲稿共14页方法学 软件工程的方法有很多方面的意义。包括项目管理,分析,设计,程软件工程的方法有很多方面的意义。包括项目管理,分析,设计,程序的编写,测试和质量控制。序的编写,测试和质量控制。软件设计软件设计方法可以区别为方法可以区别为重量级的方法重量级的方法重量级的方法重量级的方法和和轻量级的方法轻量级的方法轻量级的方法轻量级的方法。重量级。重量级的方法中产生大量的正式的方法中产生大量的正式文档文档。著名的重量级开发方法包括著名的重量级开发方法包括ISO 9000ISO 9000,CMMCMM,和,和统一软件开发过统一软件开发过程程(RUPRUP)。)。轻量级的开发过程没有对大量正式文档的要求。著名的轻量轻量级的开发过程没有对大量正式文档的要求。著名的轻量级开发方法包括级开发方法包括极限编程极限编程(XPXP)和)和敏捷过程敏捷过程(Agile ProcessesAgile Processes)。)。2022/12/510第10页,本讲稿共14页 根据根据新方法学新方法学这篇文章的说法,这篇文章的说法,重量级方法重量级方法重量级方法重量级方法呈现的是一种呈现的是一种“防御型防御型”的姿态。在应用的姿态。在应用“重量级方法重量级方法”的软件组织中,由于软件项目经理不的软件组织中,由于软件项目经理不参与或者很少参与程序设计,无法从细节上把握项目进度,因而会对项参与或者很少参与程序设计,无法从细节上把握项目进度,因而会对项目产生目产生“恐惧感恐惧感”,不得不要求程序员不断撰写很多,不得不要求程序员不断撰写很多“软件开发文档软件开发文档”。而而轻量级方法轻量级方法轻量级方法轻量级方法则呈现则呈现“进攻型进攻型”的姿态,这一点从的姿态,这一点从XPXP方法特别强调的方法特别强调的四个准则四个准则“沟通、简单、反馈和勇气沟通、简单、反馈和勇气”上有所体现。目前有一些人上有所体现。目前有一些人认为,认为,“重量级方法重量级方法”适合于大型的软件团队(数十人以上)使用,适合于大型的软件团队(数十人以上)使用,而而“轻量级方法轻量级方法”适合小型的软件团队(几人、十几人)使用。当然,适合小型的软件团队(几人、十几人)使用。当然,关于关于重量级方法重量级方法重量级方法重量级方法和和轻量级方法轻量级方法轻量级方法轻量级方法的优劣存在很多争论,而各种方法也的优劣存在很多争论,而各种方法也在不断进化中。在不断进化中。一些方法论者认为人们在开发中应当严格遵循并且实施这些方法。但是一些方法论者认为人们在开发中应当严格遵循并且实施这些方法。但是一些人并不具有实施这些方法的条件。实际上,采用何种方法开发软件一些人并不具有实施这些方法的条件。实际上,采用何种方法开发软件取决于很多因素,同时受到环境的制约。取决于很多因素,同时受到环境的制约。2022/12/511第11页,本讲稿共14页软件开发过程 软件开发过程是随着开发技术的演化而随之改进的。从早期的瀑软件开发过程是随着开发技术的演化而随之改进的。从早期的瀑布式布式(Waterfall)(Waterfall)的开发模型到后来出现的螺旋式的迭代的开发模型到后来出现的螺旋式的迭代(Spiral)(Spiral)开发,以致最近开始兴起的敏捷开发方法开发,以致最近开始兴起的敏捷开发方法(Agile)(Agile),他们展示出了在不同的时代软件产业对于开发过程的不同的他们展示出了在不同的时代软件产业对于开发过程的不同的认识,以及对于不同类型项目的理解方法。认识,以及对于不同类型项目的理解方法。注意区分软件开发过程和软件过程改进之间的重要区别。诸注意区分软件开发过程和软件过程改进之间的重要区别。诸如像如像ISO 15504,ISO 9000,CMM,CMMIISO 15504,ISO 9000,CMM,CMMI这样的名词阐述的是这样的名词阐述的是一些软件过程改进框架,他们提供了一系列的标准和策略来指一些软件过程改进框架,他们提供了一系列的标准和策略来指导软件组织如何提升软件开发过程的质量、软件组织的能力,导软件组织如何提升软件开发过程的质量、软件组织的能力,而不是给出具体的开发过程的定义。而不是给出具体的开发过程的定义。2022/12/512第12页,本讲稿共14页软件工程的发展方向 “敏捷开发敏捷开发敏捷开发敏捷开发”(Agile DevelopmentAgile Development)被认为是软件工程的一个)被认为是软件工程的一个重要的发展。它强调软件开发应当是能够对未来可能出现的重要的发展。它强调软件开发应当是能够对未来可能出现的变化和不确定性作出全面反应的。变化和不确定性作出全面反应的。敏捷开发被认为是一种敏捷开发被认为是一种“轻量级轻量级轻量级轻量级”的方法。在轻量级方法中最的方法。在轻量级方法中最负盛名的应该是负盛名的应该是“极限编程极限编程极限编程极限编程”(Extreme ProgrammingExtreme Programming,简称为,简称为XPXP)。而与轻量级方法相对应的是)。而与轻量级方法相对应的是“重量级方法重量级方法重量级方法重量级方法”的存在。重量的存在。重量级方法强调以开发过程为中心,而不是以人为中心。重量级方级方法强调以开发过程为中心,而不是以人为中心。重量级方法的例子比如法的例子比如CMM/PSP/TSPCMM/PSP/TSP。面向方面的程序设计面向方面的程序设计面向方面的程序设计面向方面的程序设计(Aspect Oriented ProgrammingAspect Oriented Programming,简称,简称AOPAOP)被认为是近年来软件工程的另外一个重要发展。这里的)被认为是近年来软件工程的另外一个重要发展。这里的方面方面方面方面指的是完成一个功能的对象和函数的集合。在这一方面相关的内指的是完成一个功能的对象和函数的集合。在这一方面相关的内容有容有泛型编程泛型编程(Generic ProgrammingGeneric Programming)和)和模板模板。2022/12/513第13页,本讲稿共14页参考 1.1.1.1.F.L.Bauer,NATO Software Engineering Conference,1968.F.L.Bauer,NATO Software Engineering Conference,1968.2.2.2.2.IEEEIEEE标准电脑字典,标准电脑字典,610.12610.12,1990 1990 3.3.3.3.I.Sommerville,Software Engineering,7th ed.:Addison-Wesley Longman I.Sommerville,Software Engineering,7th ed.:Addison-Wesley Longman Publishing Co.,Inc.Boston,MA,USA,2004.Publishing Co.,Inc.Boston,MA,USA,2004.4.4.4.4.S.R.Schach,Software Engineering:Asken Associates Pacific Palisades,CA,S.R.Schach,Software Engineering:Asken Associates Pacific Palisades,CA,USA,1990.USA,1990.5.5.5.5.B.W.Boehm,Software Engineering Economics:Prentice Hall PTR Upper Saddle River,NJ,B.W.Boehm,Software Engineering Economics:Prentice Hall PTR Upper Saddle River,NJ,USA,1981.USA,1981.6.6.6.6.R.Fairley,Software Engineering Concepts:McGraw-Hill,Inc.New York,NY,R.Fairley,Software Engineering Concepts:McGraw-Hill,Inc.New York,NY,USA,1985.USA,1985.7.7.7.7.C.Ghezzi,M.Jazayeri,and D.Mandrioli,Fundamentals of Software Engineering,2nd ed.:C.Ghezzi,M.Jazayeri,and D.Mandrioli,Fundamentals of Software Engineering,2nd ed.:Prentice Hall,2002.Prentice Hall,2002.8.8.8.8.The Free On-Line Dictionary of Computing,The Free On-Line Dictionary of Computing,http:/foldoc.org/http:/foldoc.org/9.9.9.9.S.A.Conger,The New Software Engineering:Course Technology Press United S.A.Conger,The New Software Engineering:Course Technology Press United States,1993.States,1993.10.10.10.10.http:/puter.org/portal/web/swebokhttp:/puter.org/portal/web/swebok 11.11.11.11.P.McBreen,Software Craftmanship:The New Imperative:Addsion-Wesley Professional,P.McBreen,Software Craftmanship:The New Imperative:Addsion-Wesley Professional,2001.2001.12.12.12.12.11 2022/12/514第14页,本讲稿共14页