第七章软件工程概述第一节软件工程的基本概念第二节软件工程开发模型第三节软件开发工程过程第一节软件工程的基本概念1、软件工程2、软件工程过程3、软件工程的生存周期1、软件工程软件工程这一概念,主要是针对20世纪60年代的“软件危机”而提出的,自这一概念提出以来,围绕软件项目,开展了有关开发模型、方法以及支持工作的研究。1.软件工程的定义软件工程是指导计算机软件开发和维护的一门工程科学。采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它,这就是软件工程。1、软件工程1、软件工程随着软件工程的发展过程,出现过对软件工程的各种各样的定义,其中的一些典型的定义有:1968年在第一届NATO会议上曾经给出了软件工程的一个早期定义:“软件工程就是为了经济地获得可靠的且能在实际机器上有效地运行的软件,而建立和使用完善的工程原理。”P.Wegner和B.Boehm认为:软件工程是科学知识在设计和构造计算机程序以及开发、运作和维护这些程序所要求的有关文档编制中的实际应用。1983年IEEE(国际电气与电子工程师协会)的软件工程术语汇编中,将软件工程定义为:对软件开发、运作、维护、退役的系统研究方法。1、软件工程1993年IEEE进一步给出了一个更全面更具体的定义:“软件工程是:①把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程,也就是把工程应用于软件;②研究①中提到的途径。”从以上对软件工程的不同定义中,我们可以看到对其内容的理解是逐步深入的。发展到今天,软件工程已是一门交叉性学科,它运用计算机科学、数学及管理科学等原理,借鉴传统工程的原则、方法来创建软件,从而达到提高质量、降低成本的目的。1、软件工程2.软件工程的基本原理1983年B.Weohm提出了软件工程的七条基本原理,他认为,这7条原理是确保软件产品质量和开发效率的最小集合。它们是相互独立、缺一不可的最小集合,同时,它们又是完备的。1、软件工程这七条原理是:①用分阶段的生命周期计划严格管理这一条是吸取前人的教训而提出来的。统计表明,50%以上的失败项目是由于计划不周而造成的。在软件开发与维护的漫长生命周期中,需要完成许多性质各异的工作。这条原理意味着,应该把软件生命周期分成若干阶段,并相应制定出切实可行的计划,然后严格按照计划对软件的开发和维护进行管理。在整个软件生命周期中应指定并严格执行六类计划,即项目概要计划、里程碑计划、项目控制计划、产品控制计划、验证计划和运行维护计划。1、软件工程②坚持进行阶段评审统计结果显示,大约63%的错误是在编码之前造成的,错误发现的越晚,改正它要付出的代价就越大。因此,软件的质量保证工作不能等到编码结束后再进行,应坚持进行严格的阶段评审,以便尽早发现错误。③实行严格的产品控制在软件开发过程中麻烦的事情之一就是改动需求,因为改变一项需求需要付出较高的代价。但是实践告诉我们:需求的改动往往是不可避免的。由于各种客观的需要,不能禁止用户提出改变需求的要求,而只能依靠科学的产品控制技术来适应这种要求。1、软件工程④采纳现代程序设计技术从提出软件工程的概念开始,人们主要的精力都用于研究各种新的程序设计技术。从20世纪60年代的结构化软件开发技术,以及随后发展的结构化分析和结构化设计技术,已成为大多数人认为的先进程序设计技术。再加上后来又提出的面向对象技术,从第一、第二代语言到第四代语言等等。总之采用先进的技术即可以提高软件开发的效率,又可以减少软件维护的成本。1、软件工程⑤结果应能清楚地审查软件产品不同于一般的物理产品,软件是一种看不见、摸不着的逻辑产品。软件开发小组的工作进展情况可见性差,难于评价和管理。为了更好地进行管理,应根据软件开发的总目标及完成期限,尽量明确地规定开发小组的责任和产品标准,从而使所得到的标准能清楚地审查。1、软件工程⑥开发小组的人员应少而精开发人员的素质和数量是影响软件质量和开发效率的重要因素,应该少而精。这一条基于两点原因:高素质开发人员的效率比低素质开发人员的效率要高几倍到几十倍;另一方面,开发工作中犯的错误也要少的多。当开发小组为N人时,可能的通讯信道为N(N-1)/2,可见随着人数N增大,通讯开销将急剧增大。1、软件工程⑦承认不断改进软件工程实践的必要性上述六条原理只是对现有经验的总结和归纳,并不能保证赶上技术不断前进发展的步伐。而根据第七条原理,不仅要积极采纳新的软件开发技术,还要注意不断总结经验,收集进度和消耗等数据,进行出错类型和问题报告统计。这些数据既可以用来评估软件技术的效果,也可以用来指明必须着重注意的问题和应该优先进行研究的工具和技术。1、软件工程3.软件工程的目标软件工程是一门工程性学科,目的是成功地建造一个大型软件系统。所谓成功,主要达到以下几个目标:付出较低的开发成本;达到要求的软件功能;取得较好的软件性能;开发的软件易于移植;需要较低的维护用费;能按时完成开发任务,及时交付使用;以及开发的软件可靠性高等等。4.软件工程的主要内容软件工程研究的主要内容是指软件开发技术和软件开发管理两个方面。在软件开发技术中,它主要研究软件开发方法、软件开发过程、软件开发工具和环境。在软件开发管理中,它主要研究软件管理学、软件经济学和软件心理学等。1、软件工程2、软件工程过程软件工程过程是开发或维护软件及其相关产品的一系列活动。软件工程过程规定了获取、供应、开发、操作和维护软件时,要实施的过程、活动和任务。其目的是为各种人员提供一个公共的框架,以便使用相同的语言进行交流。软件工程过程一般包括开发过程、管理过程、供应过程、获取过程、操作过程、维护过程和支持过程等七个方面。1.开发过程开发过程就是开发者和机构为了定义和开发软件或服务所需的活动。此过程包括需求、分析、设计、编码、集成、测试、软件安装和验收等活动。2、软件工程过程2.管理过程管理过程是指软件工程过程中各项管理的活动,包括项目开始和范围定义;项目管理计划;实施和控制,评审和评价;项目完成。3.供应过程供应过程是供应方按照合同向需求方提供合同中的系统、软件产品或服务所需的活动。4.获取过程根据需要,获取过程是需求方按合同要求获取一个系统、软件产品或服务的活动。2、软件工程过程5.操作过程操作过程是操作者和机构为了在规定的运行环境中为其用户运行一个计算机系统所需要的活动。6.维护过程维护过程是维护者和机构为了管理软件的修改,使它出于良好运行状态需要的活动。7.支持过程支持过程对项目的生存周期过程给予支持。它有助于项目的成功并能提高项目的质量。这个过程没有规定一个特定的生存周期模型或软件开发方法,各软件开发机构可为其开发项目选择一种生存周期模型,并将软件工程过程所含的过程、活动与任务映射到该模型中。2、软件工程过程软件工程过程是一个软件开发组织针对某一类软件产品为自己规定的工作步骤,它应当是科学的、合理的,否则必将影响到软件产品的质量。一个良好的软件工程过程应当具备如下特点:①易理解性;②可见性,是指每个过程活动都以得到明确的结果而告终,保证过程的进展对外可见;③可支持性,是指容易得到CASE工具的支持;④可接受性,是指比较容易被软件工程师接受和适用;⑤可靠性,是指不会出现过程错误,或者出现的过程错误能够在产品出错之前被发现;⑥健壮性,是指不受意外发生问题的干扰;⑦可维护性,是指过程可以根据开发组织需求的改变而改进;⑧高效率性,是指从给出软件规格说明开始,就能够较快地完成开发和改进。3、软件工程的生存周期如同任何事物一样,软件也有一个孕育、诞生、成长、成熟和衰老的生存过程,因此称其为软件工程的生存周期。软件工程的方法、工具和管理都是以软件工程的生存周期为基础的。软件工程的生存周期的基本思想是:任何一个软件都是从它的提出开始到最终被淘汰为止,有一个存在期。其主要包括以下六个过程:1.计划计划主要包括确定要开发软件系统的总目标,给出它的功能、性能、可靠性以及接口等方面的要求,这可由系统分析员通过对用户和使用部门负责人的访问和调查,讨论来完成;分析员和用户合作,研究完成该项软件任务的可行性,探究问题的可能方案,并对可利用的资源、成本、可取得的效益、开发的进度做出估计,制定出完成开发任务的实施计划,连同可行性研究报告,提交管理部门审查。3、软件工程的生存周期2.分析和定义分析和定义指待开发软件提出的需求进行分析并给出详细的定义。软件人员和用户共同讨论哪些需求是可以满足的,并对其加以确切地描述。然后编写软件需求说明书或系统功能说明书以及初步的系统用户手册,提交管理机构评审。3.软件设计软件设计的根本任务是将分析时期得出的逻辑模型设计成具体计算机软件方案。具体来说,主要包括设计软件的总体结构和设计软件具体模块的实现算法。软件设计结束之前,也要进行有关评审,评审通过后才能进入编程时期。软件设计时期也可以根据具体软件的规模、类型等决定是否细分成概要设计和详细设计两个阶段。3、软件工程的生存周期4.程序设计这个阶段主要是把每个模块的控制结构转换成计算机可接收的程序代码,即写成以某特定程序设计语言表示的“源程序清单”。当然,写出的程序应是结构好,清晰易读,并且与设计相一致。5.软件测试软件测试是保证软件质量的重要手段,其主要方式是在设计测试用例的基础上检验软件的各个组成部分。测试分为模块测试、组装测试和确认测试。模块测试是查找各模块在功能结构上存在的问题。组装测试是将各模块按一定顺序组装起来进行的测试,主要是查找各模块之间接口上存在的问题。确认测试是按软件需求说明书上的功能逐项进行的,发现不能满足用户需求的问题,决定开发的软件是否合格、能否交付用户使用等。3、软件工程的生存周期6.运行与维护已交付的软件投入正式使用,便进入运行阶段。这一阶段可能持续若干年甚至几十年。软件在运行中可能由于多方面的原因,需要对它进行修改。其原因可能有:运行中发现了软件中的错误需要修正;为了适应变化了的软件工作环境,需做适当变更;为了增强软件的功能需做变更等。第二节软件工程开发模型1、瀑布模型2、原型模型3、螺旋模型4、喷泉模型1、瀑布模型瀑布模型由W.Royce于1970年首先提出。根据软件工程生存周期各个阶段的任务,瀑布模型从可行性研究开始,逐步进行阶段性变换,直至通过确认测试并得到用户确认的软件产品为止。瀑布模型上一阶段的变换结果是下一阶段变换的输入,相邻两个阶段具有因果关系,紧密联系。一个阶段的失误将蔓延到以后的各个阶段。为了保障软件开发的正确性,每一阶段任务完成后,都必须对它的阶段性产品进行评审,确认之后再转入下一阶段的工作。评审过程发现错误和疏漏后,应该及时反馈到前面的有关阶段修正错误或弥补疏漏,然后再重复前面的工作,直至某一阶段通过评审后再进入下一阶段。瀑布模型如图所示。1、瀑布模型1、瀑布模型瀑布模型有许多优点,如可强迫开发人员采用规范的方法;严格规定了每个阶段必须提交的文档;要求每个阶段交出的所有产品都必须经过质量保证小组的仔细验证等。但瀑布模型也存在缺点,其主要表现在:①在软件开发的初始阶段指明软件系统的全部需求是困难的,有时甚至是不现实的。而瀑布模型在需求分析阶段要求客户和系统分析员必须做到这一点才能开展后续阶段的工作。②确定需求后,用户和软件项目负责人要等相当长的时间才能得到一份软件的最初版本。如果用户对这个软件提出比较大的修改意见,那么整个软件项目将会蒙受巨大的人力、财力和时间方面的损失。2、原型模型原型模型又称演化模型,主要是针对事先不能完整定义需求的软件项目开发而言的。许多软件开发项目由于人们对软件需求的认识模糊,很难一次开发成功,返工再开发难以避免。因此,人们对需开发的软件给出基本需求,作第一次试验开发,其目标仅在于探索可行性和弄清需求,取得有效的反馈信息,以支持软件的最终设计和实现。通常我们把第