1第2章软件开发模型复习与训练主要内容传统生存期模型瀑布模型演化模型原型模型增量模型螺旋模型四代技术混合模型面向对象生存期模型统一软件开发过程基于软件构件的软件开发软件工程学科发展到今天,已经有了很多方法和规范,学之不尽。本章只在宏观上讨论了软件工程的一些思想,更具体的内容将在后面的章节论述。无论是什么好方法,贵在理解与灵活运用,而不可当成灵丹妙药,不会象“吃了脑黄金或脑白金,就能使一亿人先聪明起来”。主要知识点——软件工程的主要环节软件工程的主要环节包括人员管理、项目管理、需求分析、系统设计、程序设计、测试、维护等。如何用一定的流程将各个环节连接起来,并可用规范的方式操作全过程,好比工厂的生产线?需要对软件过程的建模,一种软件工程模型支持!——软件开发过程都要经过三个典型阶段定义(definition)阶段:开发人员要弄清软件做什么;分为三个基础步骤:系统分析、软件项目计划、需求分析开发(development)阶段:开发人员要确定软件怎么做;有三个步骤:软件设计、编码、测试维护(maintenance)阶段:对各种修改进行再定义和再开发;分为三种类型:改正、适应、完善——软件工程模式软件工程模式是对软件过程的建模,描述了软件开发全部过程、活动和任务的一种范式。软件工程模式又称为范型、范例、风范、模式(Pattern)或模型。根据软件项目的性质灵活选用开发模式。每个开发模式都有它的支持者和用户;每个开发模式都特别适合于某种类型的问题或子问题;每一个开发模式都用不同的方式考虑问题;每一个开发模式都使用不同的方法来分解问题;每一个开发模式都导致不同种类的块、过程、产生规则。——软件工程模型软件工程模型是对软件过程的建模,描述了软件开发全部过程、活动和任务的一种范式。软件工程模型能清晰、直观地表达软件开发全过程,明确规定要完成主要的活动与任务,用2来作为软件项目工作的基础。模型应该是稳定和普遍适用的。——概念相同、背景有别的名词有:软件工程模型,软件工程模式,软件工程范例,软件生存期模型、软件工程过程,软件过程。本质与目的:表征了软件开发活动的组织,给出了软件求解的计算逻辑。——瀑布模型(waterfallmodel)是软件生存期的的经典范例,给出了固定的顺序,将生存期活动从上一个阶段向下一个阶段逐级过渡,形如流水下泻,逐级下落,最终得到软件产品。适合需求容易析取、处理规范的大型项目开发。—瀑布模型的特点:是软件生存期的经典模型,阶段工作具有顺序性、依赖性,可提高大型软件开发的质量和效率;各阶段有明确的工作任务、成果文档与审查验证,有利于软件开发方法和工具的研究与使用;有利于大型软件开发过程中人员的分工、组织与管理;—瀑布模型的不足缺乏回馈的灵活性,需求分析要求特别高。下游阶段发现错误时,回馈修改不方便。事实上,很多软件开发的初始阶段指明软件系统的全部需求是困难的,有时甚至是不现实的;无法通过并发活动澄清本来不够确切的需求,容易掩饰早期错误。需求确定后,用户和软件项目负责人要等相当长的时间才能得到一份软件的最初版本。如果用户对这个软件提出比较大的修改意见,那么整个软件项目将会蒙受巨大的人力、财力、时间方面的损失。如何改善?瀑布模型为基础,较大限度的反馈迭代!这是演化模型、原型模型、螺旋模型、混合模型产生的思想。——演化模型(evolvementmodel)在项目开发的初始阶段,软件需求常常不够清晰,难于做到一次开发成功,出现返工再开发在所难免。做两次:第一次试验开发,探索可行性,目的是弄清软件需求;第二次则在此基础上获得较为满意的软件产品。——原型模型(prototypemodel)又名:雏形发展法,快速原型法。借助开发工具快速构造系统的简化原型版本,用于开发者与用户之间进行交流,得到用户反馈意见,获得用户的需求;再根据需求增加系统的功能,以支持系统的最终设计和实现。实际上,原型模型是获取需求的一种机制,适合需求难以获取的软件开发。特点:容易析取需求;阶段工作模糊;用户参与好。不足:阶段审查难;易管中窥豹;错误易放大。——增量模型(Incrementalmodel)软件被作为一系列的增量构件来设计、实现、集成和测试。每个构件由多个相互作用的模块构成,并且能够完成特定的功能。各个阶段并不交付可运行的完整产品,而是交付满足客户需求的可运行的一个子集产品。即:第一个增量往往是核心产品;每一个增量均发布一个可操作的子集产品;早期的增量是最终产品的“可拆卸”版本。例如,使用增量模型开发字处理软件,可以考虑:3第一个增量发布基本的文件管理、编辑、生成功能;第二个增量发布更完善的编辑和文档生成能力;第三个增量实现拼写和文法检查功能;第四个增量完成高级的页面布局功能。增量模型也存在以下缺陷:(1)由于各个构件是逐渐并入已有的软件体系结构中的,所以加入构件必须不破坏已构造好的系统部分,这需要软件具备开放式的体系结构。(2)增量模型的灵活性可以适应需求变化的能力大大优于瀑布模型和快速原型模型,但也容易退化为边做边改模型,从而是软件过程的控制失去整体性。——螺旋模型(spiralmodel)综合了生存期与原型模型的优点,增加了风险分析,弥补他们的不足。风险分析可对设计方案的风险进行识别,并设法消除风险。通常用来指导大型软件项目的开发。风险分析可对设计方案的风险进行分析、评价、识别并设法消除。通常用来指导大型软件项目的开发。螺旋模型沿着螺线旋转,在四个象限上分别表达四个方面的活动,即:制定计划──确定软件目标,选定实施方案,弄清项目开发的限制风险分析──分析所选方案,考虑如何识别和消除风险原型开发──实施软件开发用户平审──评价开发工作,提出修正建议螺旋模型特点:风险驱动的模型;可选方案和约束条件有助于软件重用;风险分析可控制软件质量。——四代技术(Fourth-GenerationTechniques,4GT)拥有一组工具。每个工具都能使开发人员在高层次上定义软件的某些特性,并把开发人员定义的这些软件自动地生成为源代码。这种方法需要四代语言(4GL)的支持。4GL不同于三代语言,其主要特征是用户界面极端友好,即使没有受过训练的非专业程序员,也能用它编写程序;它是一种声明式、交互式、非过程性编程语言。4GL还具有高效的程序代码、智能缺省假设、完备的数据库和应用程序生成器。目前市场上流行的4GL(如Foxpro等)都不同程度地具有上述特征。4GT目前主要限于事务信息系统的中、小型应用程序的开发。——混合模型(hybridmodel)组合多种模型,沿着最有效的路径推进,也称过程开发模型。特征:开发划分为分析、综合、运行、废弃等4阶段;各阶段之间的重叠,提供了有效途径的选择;可根据不同性质的需求,灵活采用相应的开发模型。混合采用多种模型,可以扬长避短。——面向对象生存期模型面向对象方法(OO):出发点和基本原则是尽量模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人认识和实践的习惯,使问题的描述空间与解法空间在结构上尽可能一致。特征:把对象作为融合了数据及其操作的软件构件;把所有对象都划分成包含了数据和服务的类;按照父类与子类的关系,把若干个相关类组成一个层次结构的系统;象彼此间仅能通过发送消息互相联系。在分析、设计、实现等阶段都对象模型,阶段工作能平滑过渡。4OOSE演化模型及其特点:OO设计是类设计、应用程序设计的两阶段过程。类设计建立公共与专用功能需要的类属层次结构;应用程序设计是利用已设计好的类属结构来构造的。设计和编码循环为快速更新代码生成提供了基础。迭代这是原型开发生存期的精髓,这种迭代过程有利于减少软件开发的风险。OOSE增量迭代模型(喷泉模型):类似于原型开发中的增量模型;不同的是下一个增量的分析阶段可以与当前增量的实现阶段重叠,这种迭代过程有利于减少软件开发的风险。喷泉模型特征:软件生存期的各个阶段可以相互重叠和多次重复,就像水喷上去又落下来,既可以落在下一层,也可以落在最底层。喷泉模型是典型的OOSE增量迭代模型,体现了OO软件开发的迭代性和无间隙性。为避免喷泉模型的开发过程过分无序,应该把一个线性过程作为总目标。——RUP统一的软件开发过程(RationalUnifiedProcess)UML是基于OO方法的可视化建模语言,不是统一建模过程;UML之后,RationalSoftware公司的Jacobson、Booch和Rumbaugh三人推出的业界第一的OOSE建模工具产品——RUP;UML、RUP组成了完整的OOSE的开发模式;支持软件生存期的循环迭代,每次循环在时间上经历四个阶段:初始、细化、构造和移交;分析与设计工作依靠三个关键思想:用例驱动;体系结构为中心;迭代增量开发。时间上经历的四个阶段:初始——确定生存期的目标:主要对提出的有关基本思想进行充分论证,考虑项目效益,确定项目规模。精化——确定生存期的框架:主要收集更为详细的需求,进行高层分解和设计,定义系统的体系结构框架,并为构造阶段制定计划。建造——可初步运行的能力:由多次迭代组成,每次迭代都包含软件生存期的所有活动。每次迭代都要增加一些新功能,解决一些新问题。每次所得产品都应满足项目需求的某一子集,或交用户,或内部交付。产品化——产品的移交或发布:除交付产品外,还有测试和用户培训。用例驱动(use-casedriver)是Jacobson在“OOSE”一书中首先提出的,有四个理由:能够提供一个系统的、直觉捕捉功能需求的平台;能够驱动整个开发过程;使用用例可以帮助完成迭代开发;在初始的迭代中,通过选择并实现基本的用例集合,便可以用一个稳定的体系结构来实现一个系统。体系结构为中心(architecture-centric)是在统一的软件开发过程的生存期中第一次提出来的,其目的:理解系统;组织开发;促进重用;发展系统。由此可见,结构的设计问题已远远超出了计算的算法和数据结构范围。迭代和增量(iterativeandincremental)开发最早是在原型和OO生存期模型中提出来的,主要目的是用于控制软件的开发,以降低风险。特征:为了早期致命的和重大的风险能得到控制;5为了得到一个健壮的体系结构,以指导软件开发;为了提供一个框架,能较好地控制不可避免的需求和其他修改;为了构造一个系统,多次增量接近,比一次完成所带来的各种开销要少,而且质量要高;为了提供一个开发过程,让技术人员更为有效;为了让开发人员能够获得早期学习的机会。——基于构件的软件开发(Component-BasedSoftwareDevelopment,CBD)是在软件重用和OO技术的基础上发展起来的。说到底,也是从硬件引入的。使用可重用的软件来构造基于硬件的软件系统。前述7种软件工程模式都是面向过程的。而CBD是第一个提出面向结构的。软件产业要发展,并形成规模经济,标准构件的生产和构件的重用是关键。有人估计,将来软件工程职业,5%为构件工程师,95%为组装工程师。关于构件:应用系统结构的构件:一般包含三类:通用基本构件;领域共性构件;应用专用构件。应用软件开发中的重复劳动:主要存在于前两类构件上,可以充分利用过去应用系统开发中积累的知识和经验,将开发的重点集中在应用专用构件的开发上。通过软件重用,不仅可以消除重复劳动,而且还可以避免重新开发可能引入的错误。关于软件重用:软件重用发展中的主要问题技术方面:重用构件如何确定、获取、存储、检索和组装等。非技术方面:怎样确定标准化、知识产权、机构组织、前期投入和管理等。实现软件重用需要解决的问题重用软件(构件)的开发。应用系统如何构造和组装。关于领域工程:上述CBD软件过程模型是Pressman给出的,它由领域工程模型和基于构件开发模型组成。领域工程创建应用模型,可以被从事基于构件开发的软件开发者选用。领域工程包含三个活动:分析,构造,传播。目的是确定、构造、分类和传播一组软件构件。它