软件工程学教程第二版《软件工程》课程说明•实际上课时间:去除长假1周,共12周,第13周复习/考试•教学要求及考试范围覆盖《软件工程学教程》全书各章•教材中的“习题”按教师要求完成并计入本课程的“平时成绩”•本课程上机实验的主要内容是–以指定或自选开发项目为基础–依据国家标准的有关规定–编制软件生存周期各阶段的软件文档–主要文档作为期中考核内容–初步了解SybasePowerDesigner和MicrosoftProject•期末进行闭卷考试《软件工程》教材与教参•教材–《软件工程学教程》(第二版),周苏等编著,科学出版社,2004•教学参考书–《软件工程》[美],黄柏素等译,机械工业出版社,1999–GB/T8566-2001《信息技术软件生存周期过程》–GB/T8567-1988《计算机软件产品开发文件编制指南》•周课时:5课时/周*12第1章传统软件工程概述•计算机系统的发展•软件、软件生存周期和软件生存周期过程•软件生存周期模型•软件工程定义第1章传统软件工程概述•进入60年代,人们开始逐渐认识到了确实存在着“软件危机”这样一个事实。例如:–软件生产不能满足日益增长的需要–软件开发成本和开发进度估计往往不准确–软件开发人员和用户之间信息交流不充分,用户对完成的软件满意度很低–软件价格昂贵,软件成本在整个计算机系统中所占的比例急剧上升,软件已成为许多计算机系统中花钱最多的项目–软件质量难以保证–软件可维护性差,程序中的错误很难改正,适应性或完善性维护都极其困难第1章传统软件工程概述•导致危机问题的一个重要原因,是由于软件研制和维护本身是工程性的任务,但软件人员采取的方式却未能工程化•为克服软件危机,人们开始考虑采用工程化方法和工程途径来研制和维护软件第1章传统软件工程概述•60年代末至70年代初开始,逐渐发展起一组总称为“软件工程”的技术–这些技术把软件作为一个工程产品来处理:它需要计划、分析、设计、实现、测试以及维护–软件工程学主要研究软件结构、软件设计方法论、软件工具、软件工程标准和规范,以及与软件工程有关的理论等–软件产业的逐步建立,也带动了软件工程这门学科的发展。同时,软件生产的系列化、产品化、工程化和标准化形成了软件产业的标志1.1计算机系统的发展•软件工程和硬件工程都可以看成是一门更广义的学科——计算机系统工程的一部分–用于计算机硬件的工程技术是由电子设计技术发展起来的,已经达到了比较成熟的水平,可靠性已是一种可以期待的现实而不再是一种愿望–但是,软件已经取代硬件成为系统中设计起来最困难、最不容易成功(按时完成和不超过预计的成本),而且是最不易管理的部分–另一方面,随着以计算机为基础的系统在数量、复杂程度和应用范围上的不断增长,对软件的需求却仍然有增无减1.1.1计算机系统及其软件的发展•软件发展的历史与计算机系统发展紧密相关–计算机系统发展的初期(50~60年代),程序设计时期–计算机系统发展的第二个时期(从60年代中期到70年代中期),程序系统时期–计算机系统发展的第三个时期从70年代初期开始,软件工程时期–如今,计算机系统的发展正在向第四个时期过渡,即从技术性应用向消费性市场过渡1.1.2计算机系统工程•计算机系统工程的主要内容是对系统所要求的功能加以揭示、分析,并把它们分配给系统的各个部分•在大多数新系统创建时,对系统所要求的功能往往只有模糊的概念。系统分析和系统定义的目的在于揭示摆在面前的项目的范围–要对需要进行处理的信息、所要求的功能、所期望的性能以及设计的约束和检验的标准等进行系统、详细的分析–范围确定之后,系统工程师必须考虑多种能潜在地满足项目范围的、可供选择的配置。在综合考虑了各项因素之后,选择其中的一种配置,并将系统的功能分配给系统的各个部分系统分析和定义概念综合考虑软件硬件硬件工程软件工程图1-1计算机系统工程1.2软件和软件生存周期•《中国大百科全书》给软件下的定义是:软件是计算机系统中的程序和有关文件•也就是说,“软件”不仅仅是指程序,在软件研制过程中按一定规格产生的各种文件也是软件不可缺少的组成部分1.2软件和软件生存周期•一个计算机软件,从出现一个构思之日起,经过开发成功投入使用,在使用中不断增补修订,直到最后决定停止使用,并被另一项软件代替之时止,被认为是该软件的一个生存周期(或称生命周期、生存期,lifecycle)•一个软件产品的生存周期可以划分成若干个互相区别而又有联系的阶段,每个阶段中的工作均以上一阶段工作的结果为依据,并为下一阶段的工作提供了前提•经验表明,失误造成的差错越是发生在生存周期的前期,在系统交付使用时造成的影响和损失就越大,要纠正它所花费的代价也越高。因而在前一阶段工作没有做好之前,决不要草率地进入下一阶段1.2软件和软件生存周期•国家标准GB/T8566-2001《信息技术软件生存周期过程》将软件生存周期划分为以下8个阶段–可行性研究与计划–需求分析–概要设计–详细设计–实现(包括单元测试)–组装测试(即集成测试)–确认测试–使用和维护1.2软件和软件生存周期•GB/T8567-88《计算机软件产品开发文件编制指南》建议在软件的开发过程中编制下述14种文件–可行性研究报告–项目开发计划–软件需求说明书–数据要求说明书–概要设计说明书–详细设计说明书–数据库设计说明书用户手册操作手册模块开发卷宗测试计划测试分析报告开发进度月报项目开发总结报告可行性研究与计划需求分析设计实现测试使用和维护维护阶段开发阶段计划阶段图1-2软件生存周期的瀑布模型开发33%维护67%图1-3软件生存周期工作量分配图1-4开发期工作量分配分析20%设计15%编码20%单元测试25%组装测试20%1.3软件生存周期模型•在软件工程中,重要的概念是软件生存周期模型(又称软件开发模型)以及软件生存周期过程•软件生存周期模型可以定义为:是软件开发全部过程、活动和任务的结构框架•软件生存周期模型能清晰、直观地表达软件开发全过程,明确规定了开发工作各阶段所要完成的主要活动和任务,以作为软件项目开发工作的基础•对于不同的软件系统,可以采用不同的开发方法、使用不同的程序设计语言以及各种不同技能的人员参与工作、运用不同的管理方法和手段等,以及允许采用不同的软件工具和不同的软件工程环境•软件生存周期模型是稳定有效和普遍适用的1.3软件生存周期模型•软件生存周期过程可分为–基本生存周期过程•获取过程、供应过程、开发过程、运作过程和维护过程等–支持生存周期过程–组织生存周期过程•软件生存周期模型仅对软件的开发、运作、维护过程有意义,在ISO12207和ISO9000-3中都提到软件生存周期模型,它包括:瀑布模型、渐增模型、演化模型、螺旋模型、喷泉模型和智能模型等1.3.1瀑布模型•瀑布模型是1970年W.Royce提出的最早的软件开发模型•软件维护构成了生存周期的循环表示•如果把软件维护看作是软件的二次开发,便有了软件生存周期的b形表示•在评价瀑布模型时,应考虑以下的相关风险–需求未被充分理解–系统太大而一次不能做完所有的事–事先打算采用的技术迅速发生变化–需求迅速发生变化–有限的资源–无法利用某一中间产品需求分析测试计划运行评价设计编码图1-5软件生存周期循环图1-6具有维护循环的软件生存周期测试运行计划编码设计编码设计需求分析计划需求分析评价软件开发维护循环1.3.2渐增模型•是指从一组给定的需求开始,通过构造一系列可执行的中间版本来实施开发活动–第一个中间版本纳入一部分需求,下一个中间版本纳入更多的需求,依此类推,直到系统完成–每个中间版本都要执行必要的过程、活动和任务,如:需求分析和体系结构设计需要执行一次,而详细设计、编码和测试、软件组装和验收测试在每个中间版本构造过程中都执行•在评价该模型时,需要考虑的风险因素是–需求未被很好地理解–突然提出一些功能–事先打算采用的技术迅速发生变化–需求迅速发生变化–长时期内仅有有限的资源保证(工作人员/资金)图1-7渐增模型示意R:需求C/T:编码/测试D:设计I/AS:安装和验收支持DC/TI/AS中间版本nDC/TI/AS中间版本1中间版本2DC/TI/ASR可能的信息流1.3.3演化模型•主要针对事先不能完整定义需求的软件项目开发–对需要开发的软件给出基本需求,作第一次试验开发,其目标仅在于探索可行性和弄清需求,取得有效的反馈信息,以支持软件的最终设计和实现–通常把第一次试验性开发出来的软件称为原型。这种开发模型可以减少由于需求不明给开发工作带来的风险–与渐增模型的区别是:演化模型承认需求不能被完全了解,且不能在初始时就确定。在该模型中,需求一部分被预先定义,然后在每个相继的中间版本中逐步完善–对所有的中间版本,开发过程中的活动和任务通常接同一顺序被重复使用。维护过程和运作过程可以与开发过程平行地使用。获取过程、供应过程、支持过程和组织过程通常与开发过程平行地使用图1-8演化模型示意RnDC/TI/AS工作版本nDC/TI/AS工作版本2R2DC/TI/AS工作版本1R1信息流(细化)R:需求C/T:编码/测试D:设计I/AS:安装和验收支持1.3.4螺旋模型•该模型是B.Boehm于1988年提出的,它将瀑布模型与演化模型相结合,并增加了两者所忽略的风险分析•该模型通常用来指导大型软件项目的开发。•它将开发划分为制订计划、风险分析、实施开发和客户评估四类活动。沿着螺旋线每转一圈,表示开发出一个更完善的新的软件版本•如果开发风险过大,开发机构和客户无法接受,项目有可能就此终止;多数情况下,会沿着螺旋线继续下去,自内向外逐步延伸,最终得到满意的软件产品•沿着螺旋线旋转,在笛卡儿坐标的四个象限上分别表达了四类活动–制定计划、风险分析、实施开发、客户评估图1-9螺旋模型原型1原型2原型3可运行原型详细设计编码实现单元测试集成与测试验收测试需求确认软件需求软件产品设计需求计划设计确认与验证生存期计划开发计划集成与测试风险分析风险分析风险分析累计成本提交线评审制定计划决定目标方案与限制风险分析评价方案、识别风险、消除风险客户评估实施开发开发、验证下一产品1.3.5喷泉模型•是由B.H.So11ers和J.M.Edwards于1990年提出的一种开发模型,主要用于采用面向对象技术的软件开发项目•“喷泉”一词本身就体现了迭代和无间隙的特性–软件的某个部分常常被重复工作多次,相关对象在每次迭代中随之加入渐进的软件成分–无间隙是指在各项活动之间无明显边界,如分析和设计活动之间没有明显的界限。由于对象概念的引入,表达分析、设计、实现等活动只用对象类和关系,从而可以较为容易地实现活动的选代和无间隙,使其开发自然地包括复用图1-10喷泉模型演化分析设计实现确认维护1.3.6智能模型•也称为基于知识的软件开发模型,它是知识工程与软件工程在开发模型上结合的产物•它的维护不在程序一级上进行,把问题的复杂性大为降低,从而可以把精力更加集中于具体描述的表达上,即维护在功能规约一级进行•具体描述可以使用形式功能规约,也可以使用知识处理语言描述等等,因而必须将规则和推理机制应用到开发模型中,所以必须建立知识库,将模型本身、软件工程知识和特定领域的知识分别存入知识库,由此构成某一领域的软件开发系统获取需求需求分析具体描述优化程序验证维护调整知识库/专家系统图1-11智能模型1.4软件工程定义•定义一:科学知识在设计和构造计算机程序,以及开发、运作和维护这些程序所要求的有关文档编制中的实际应用•定义二:为了经济地获得软件,这个软件是可靠的并且能在实在的计算机上工作,所需要的健全的工程原理(方法)的确立和使用•定义三:1983年IEEE(国际电气与电子工程师协会)的《软件工程术语汇编》中,将软件工程定义为:对软件开发、运作、维护、退役的系统研究方法•定义四:1990年新版的IEEE《软件工程术语汇编》又将定义更改为:对软件开发、运作、维护的系统化的、有纪律的、可定量的方法之应用,即是对软件的工程化应用1.4软件工程定义•软件工程已经是一门交叉性学科,它是解决软件问