1、软件工程方法与实践 (机械工业出版社),高等院校计算机课程案例教程系列,窦万峰 编著,主讲:曾婕 13767792699 ,上一章回顾,软件生命周期是什么?分为哪几个阶段 什么是CMM,分为几个级别 什么是敏捷过程?什么是XP?什么是结对编程?,进入本章学习,1.现代软件工程(国家示范性软件学院系列教材)张家浩/东南大学 机械工业出版社 2009.1 2.软件工程 理论与实践许家珆 曾翎 彭德中 编著 高等教育出版社 2004.7 3.软件工程-实践者的研究方法(美)Roger S. Pressman著 郑人杰等译 机械工业出版社 2008.6 4.Software Engineering,
2、6th EditionSommerville.I. (影印版) 机械工业出版社 2003.4,主要参考书:,总 目 录,第1章 软件工程学概述(2学时)第2章 软件过程(2学时)第3章 软件过程模型(4学时)第4章 案例研究(2学时)第5章 软件需求分析过程(4学时)第6章 结构化分析建模(4学时)第7章 面向对象分析(6学时)第8章 软件设计(4学时)第9章 结构化设计方法(4学时),总 目 录,第10章 面向对象设计(4学时)第11章 软件实现(2学时)第12章 软件测试(4学时)第13章 软件维护(2学时)第14章 软件项目管理(2学时)第15章 软件项目估算(1学时)第16章 软件项目
3、计划与管理(1学时),第3章 软件过程模型,3.1 瀑布模型 3.2 增量模型 3.3 螺旋模型 3.4 协同开发模型 3.5 面向对象模型 3.6 面向方面的软件开发 3.7 思考习题 3.8 习题,也称线性顺序模型。在20世纪80年代之前,瀑布模型一直是惟一被广泛采用的生命周期模型,现在它仍然是软件工程中应用得最广泛的过程模型,它提供了软件开发的基本框架。 其过程是从上一项活动接收该项活动的工作对象作为输入,利用这一输入实施该项活动应完成的内容,给出该项活动的工作成果,并作为输出传给下一项项。同时,评审该项活动的实施若确认,则继续下一项活动;否则,返回前面甚至更前面的活动。传统软件工程方法
4、学的软件过程,基本上可以用瀑布模型来描述。,3.1 瀑布模型,图3.1 传统的瀑布模型,瀑布模型将软件生命周期划分为软件计划、需求分析和定义、软件设计、软件实现、软件测试、软件运行和维护这6个阶段,规定了它们自上而下、相互衔接的固定次序,如同瀑布流水逐级下落而得名。,传统的瀑布模型有下述的几个特点: 阶段间具有顺序性和依赖性 顺序性是指:只有等前一阶段的工作完成以后,后一阶段的工作才能开始;前一阶段的输出文档,就是后一阶段的输入文档。 依赖性是指只有前一阶段有正确的输出时,后一阶段才可能有正确的结果。 2. 推迟实现的观点过早地考虑程序的实现,常常导致大量返工,有时甚至给开发人员带来灾难性的后
5、果。瀑布模型在编码以前安排了分析阶段和设计阶段,并且明确宣布,这两个阶段都只考虑目标系统的逻辑模型,不涉及软件的物理实现。把逻辑设计与物理设计清楚地划分开来,尽可能推迟程序的物理实现,这是瀑布型软件开发的一条重要的指导思想。 3. 质量保证的观点 为了保证质量,瀑布型软件开发在各个阶段坚持了两个重要的做法:(1)每一阶段都要完成规定的文档。没有完成文档,就认为没有完成该阶段的任务。(2)每一阶段都要对完成的文档进行复审,以便尽早发现问题,消除隐患。 4. 是一种线性模型 5. 强调文档的作用,瀑布模型所带来的问题: 、不适应需求经常发生变更的环境:在项目的开发过程中,变更可能会引起混乱。所以,
6、有人形象地把采用线性模型进行商业软件工程称之为“在沙滩上盖楼房”。 、瀑布模型也经常不能接受项目开始阶段自然存在的不确定性:在采用线性顺序模型的时候,用户只有到项目的开发晚期才能够得到程序的可运行版本。大的错误如果到这时才被发现,那么造成的后果往往是灾难性的。 、线性顺序模型每一步的工作都必须以前一阶段的输出为输入,这种特征会导致工作中发生“阻塞”状态。 因此,瀑布模型的成功在很大程度上是由于它基本上是一种文档驱动的模型。但是,“瀑布模型是由文档驱动的”这个事实也是它的一个主要缺点。,图3.2 实际的带“反馈环”的瀑布模型,特点:当在后一阶段发现前一阶段的错误时,需要沿着图中左侧的反馈线,返回
7、前一阶段,修正前一阶段的产品之后,再回来继续完成后面阶段的任务。,实线表示开发阶段 虚线表示维护阶段,图3.3 上下阶段间循环,图3.4 具有维护阶段循环的软件生存期的瀑布模型,问题背景:由于传统的瀑布模型本身存在的不足,在开发过程中不论怎样严格,终究难以接近理想目标,考虑能否将整个软件一部分一部分地开发? 解决方案:在需求难以完全明确的情况下,快速分析并构造一个小的原型系统,满足用户的某些要求后,使用户在使用过程中受其启发,逐步确定各种需求。即所谓的增量模型。 增量模型也称为渐增模型,使用增量模型开发软件时,把软件产品作为一系列的增量构件来设计、编码、集成和测试,融合了线性顺序模型的基本成分
8、(重复的应用这些成分)和原型模型的迭代特征。,3.2 增量模型,如下图所示。增量模型实际上是一个随着日程/时间的进展而交错的线性序列集合。每一个线性序列产生一个软件的可发布的“增量”,所有的增量都能够结合到原型模型中去。 每一个构件是由多种相互作用的模块所形成的提供特定功能的代码片段构成。 第一个增量构件往往实现软件的基本需求,提供最核心的功能。 第二个增量构件提供更完善的编辑和文档生成功能。 第三个增量构件实现拼写和语法检查功能。 。 能在较短时间内向用户提交可完成部分工作的产品,是增量模型的一个优点。,增量方式包括: 增量开发:以一定的时间间隔开发部分工作软件 增量提交:以一定的时间间隔增
9、量方式向用户提交工作软件及相应文档增量模型融合了线性顺序模型的基本成份和原型实现模型的迭代特征,故分为渐增模型和原型模型。 渐增模型是瀑布模型的变种,有两类渐增模型: 增量构造模型:在瀑布模型基础上,对一些阶段进行整体开发,对另一些阶段进行增量开发 演化提交模型:它在瀑布模型的基础上,所有阶段都进行增量开发,也就是说不仅是增量开发,也是增量提交。,增量模型逐步增加产品功能可以使用户有较充裕的时间学习和适应新产品,从而减少一个全新的软件可能给客户组织带来的冲击。但也存在以下缺陷:1.必须把软件的体系结构设计得便于按这种方式进行扩充,也就是说,软件体系结构必须是开放的。2.模型适应变更的灵活性优于
10、瀑布模型,但容易退化为边做边改模型,使软件过程的控制失去整体性。从长远观点看,具有开放结构的软件拥有真正的优势,这样的软件的可维护性明显好于封闭结构的软件。,增量构造模型:采用随时间的进展而交错的纯属序列,每一个线性序列产生软件的一个可发布的增量。,图3.5 增量构造模型1,增量模型融合了线性顺序模型的基本成份和原型实现模型的迭代特征。,特点:,第一个增量模型往往是核心部分的产品,它实现了软件的基本需求,但很多已经明晰或者尚不明晰的补充特性还没有发布。 核心产品交由用户使用或进行详细复审。使用或复审评估的结果是制定下一个增量开发计划,在前面增量的基础上开发后面的增量。 每个增量的开发可用瀑布或
11、快速原型模型。 和原型模型不一样的是,增量模型虽然也具有“迭代”特征,但是每一个增量都发布一个可操作的产品,不妨称之为“产品扩充迭代”。它的早期产品是最终产品的可拆卸版本,每一个版本都能够提供给用户实际使用。,图3.6 增量构造模型2,图3.7 风险更大的增量模型,所谓快速原型是快速建立起来的可以在计算机上运行的程序,它所能完成的功能往往是最终产品能完成的功能的一个子集。 快速原型模型的第一步是快速建立一个能反映用户主要需求的原型系统,让用户在计算机上试用它,通过实践来了解目标系统的概貌。从图3.8可以看出,快速原型模型是不带反馈环的,这正是这种过程模型的主要优点:软件产品的开发基本上是线性顺
12、序进行的。,快速原型模型,图3.8 快速原型模型,软件风险是任何软件开发项目中都普遍存在的实际问题,项目越大,软件越复杂,承担该项目所冒的风险也越大。软件风险在不同程度上损害软件开发过程和软件产品质量。在软件开发过程中必须及时识别和分析风险,并且采取适当措施以消除或减少风险的危害。对于大型软件,只开发一个原型往往达不到要求,故螺旋模型特别适合于大型复杂的系统。螺旋模型将瀑布模型和增量模型结合起来,并加入了风险分析(风险识别、风险分析、风险控制)。,3.3 螺旋模型,图3.9 完整的螺旋模型,每一个周期都包括需求定义、风险分析、工程实现和评审。,螺旋模型有许多优点:(1)有利于已有软件的重用,有
13、助于把软件质量作为软件开发的一个重要目标;(2)减少了过多测试或测试不足所带来的风险;(3)维护只是模型的另一个周期,在维护和开发之间并没有本质区别。螺旋模型主要适用于内部开发的大规模软件项目。如果进行风险分析的费用接近整个项目的经费预算,则风险分析是不可行的。螺旋模型的主要优势在于,它是风险驱动的,但是,这也可能是它的一个弱点。,协同开发模型(Collaborative Development Model, 简称CDM),有时也叫做协同工程,可以表示为一系列框架活动、软件工程动作和任务以及相应的状态。 在某一特定时间,建模活动可能处于任何一种状态。 协同开发模型定义了一系列事件,这些事件将触
14、发软件工程活动、动作或任务的状态转换。,3.4 协同开发模型,图3.10 协同开发模型,3.5 喷泉模型,该模型是由B.H.Sollers和J.M.Edwards于1990年提出的一种面向对象开发模型。又称快速应用开发模型(RAD,Rapid Application Development Model) 它克服了瀑布模型不支持软件重用和多项开发活动集成的局限性,喷泉模型使开发过程具有迭代性和无间隙性。,其特点如下: ()开发过程有分析、系统设计、软件设计和实现4个阶段。 ()各阶段相互重叠,反映了软件过程并行性的特点。 ()以分析为基础。 ( 4)反映了软件过程迭代性。 ()强调增量开发,整个
15、过程是一个迭代的逐步提炼的过程。,1、喷泉模型的优点 喷泉模型不像瀑布模型那样,需要分析活动结束后才开始设计活动,设计活动结束后才开始编码活动。该模型的各个阶段没有明显的界限,开发人员可以同步进行开发。其优点是可以提高软件项目开发效率,节省开发时间,适应于面向对象的软件开发过程。 2、喷泉模型的缺点 由于喷泉模型在各个开发阶段是重叠的,因此在开发过程中需要大量的开发人员,因此不利于项目的管理。此外这种模型要求严格管理文档,使得审核的难度加大,尤其是面对可能随时加入各种信息、需求与资料的情况。,3.6 智能模型(Intelligent Model),也称为基于知识的软件开发模型,是知识工程与软件
16、工程相结合的软件开发模型。,图1.20 智能模型,其主要特点是必须建立知识库,并将模型本身、软件工程知识、特定领域知识放入知识库。具体描述可以使用形式功能规约,也可以使用知识处理语言描述等。,构件组装模型的特征: 应用软件可用预先编好的、功能明确的产品部件定制而成, 并可用不同版本的部件实现应用的扩展和更新。 利用模块化方法,将复杂的难以维护的系统分解为互相独立、协同工作的部件,并努力使这些部件可反复重用。 突破时间、空间及不同硬件设备的限制,利用客户和软件之间统一的接口实现跨平台的互操作。,3.7 构件组装模型(组件集成模型),构件组装模型的优点: 构件组装模型导致了软件的复用,提高了软件开
17、发的效 率,面向对象技术是软件工程的构件组装模型的基础。 构件可由一方定义其规格说明,被另一方实现,然后供给 第三方使用。 构件组装模型允许多个项目同时开发,降低了费用,提高 了可维护性。 可实现分步提交软件产品。 构件组装模型的缺点: 可重用性和软件高效性不易协调。 缺乏通用的组装结构标准,而自定义的组装结构标准引入 较大的风险。 需要精干的有经验的分析和开发人员,一般的开发人员插 不上手。 客户的满意度低。,3.8 统一过程模型,统一过程(Unified Process,UP) 是风险驱动的、基于用例技术的、以架构为中心的、迭代和增量的、可配置的软件开发流程。统一过程是一个软件开发过程,是
18、一个通用的过程框架,可用于各类软件系统和应用领域,它重复一系列组成系统生命周期的循环。 每次循环包括四个阶段: 初始 细化 构造 移交每个阶段又进一步细分为多次迭代的过程,每次循环迭代会产生一个新的版本。,RUP的时间轴被分解为四个顺序的阶段,分别是: 初始阶段(Inception) 细化阶段(Elaboration) 构造阶段(Construction) 交付阶段(Transition) 每个阶段结束于一个主要的里程碑(Major Milestones) 每个阶段本质上是两个里程碑之间的时间跨度 在每个阶段的结尾执行一次评估以确定这个阶段的目标是否已经满足。如果评估结果令人满意的话,可以允许
19、项目进入下一个阶段。 RUP的阶段目标: 初始阶段的目标是为系统建立业务案例并确定项目的边界。 细化阶段的目标是分析问题领域,建立健全的体系结构基础,编制项目计划,淘汰项目中最高风险的元素。 构建阶段,所有剩余的构件和应用程序功能被开发并集成为产品,所有的功能被详细测试。 交付阶段的重点是确保软件对最终用户是可用的。,RUP的核心工作流: RUP中有6个核心过程工作流和3个核心支持工作流。尽管6个核心过程工作流可能使人想起传统瀑布模型中的几个阶段,但应注意迭代过程中的阶段是完全不同的,这些工作流在整个生命周期中一次又一次被访问。9个核心工作流在项目中轮流被使用,在每一次迭代中以不同的重点和强度
20、重复。,核心过程工作流: (1)业务建模工作流为组织开发一个构想,并基于这个构想在业务用例模型和业务对象模型中定义组织的过程,角色和责任。 (2)需求工作流的目标是描述系统应该做什么,并使开发人员和用户就这一描述达成共识。 (3)分析和设计工作流将需求转化成未来系统的设计,为系统开发一个健壮的结构并调整设计使其与实现环境相匹配,优化其性能。 (4)实现工作流的目的包括以层次化的子系统形式定义代码的组织结构;以组件的形式(源文件、二进制文件、可执行文件)实现类和对象;将开发出的组件作为单元进行测试以及集成由单个开发者(或小组)所产生的结果,使其成为可执行的系统。 (5)测试工作流要验证对象间的交
21、互作用,验证软件中所有组件的正确集成,检验所有的需求已被正确的实现,识别、提出缺陷并确认缺陷在软件部署之前被处理。 (6)部署工作流的目的是成功的生成版本并将软件分发给最终用户。,统一过程准则,迭代的开发软件:Rational Unified Process 支持专注于处理生命周期中每个阶段中最高风险的迭代开发方法,极大地减少了项目的风险性。 需求管理:RUP描述了如何提取、组织和文档化需要的功能和限制;跟踪和文档化折衷方案和决策; 捕获和进行商业需求交流。过程中用例和场景的使用被证明是捕获功能性需求的卓越方法,并确保由它们来驱动设计、实现和软件的测试,使最终系统更能满足最终用户的需要。它们给
22、开发和发布系统提供了连续的和可跟踪的线索。 基于构件的体系结构 可视化软件建模:工业级标准 UML是成功可视化软件建模的基础。 验证软件质量:质量评估被内建于过程、所有的活动,包括全体成员,使用客观的度量和标准,并且不是事后型的或单独小组进行的分离活动。 控制软件的变更:开发过程描述了如何控制、跟踪和监控修改以确保成功的迭代开发。,核心支持工作流: (1)配置和变更管理工作流描绘了如何在多个成员组成的项目中控制大量的产物,管理演化系统中的多个变体,跟踪软件创建过程中的版本。 (2)软件项目管理工作流平衡各种可能产生冲突的目标,管理风险,克服各种约束并成功交付使用户满意的产品。 (3)环境工作流
23、的目的是向软件开发组织提供软件开发环境,包括过程和工具。,RUP模型的优点:提高了团队生产力,在迭代的开发过程、需求管理、基于组件的体系结构、可视化软件建模、验证软件质量及控制软件变更等方面,针对所有关键的开发活动为每个开发成员提供了必要的准则、模板和工具指导,并确保全体成员共享相同的知识基础。它建立了简洁和清晰的过程结构,为开发过程提供较大的通用性。 RUP模型的缺点:RUP在理论上,是比较理想的,但在实际应用上,还需要更多的工具的支持和普及推广工作。,3.9 面向方面的软件开发,面向方面的软件开发(Aspect-Oriented Software Development,简称AOSP)是一
24、系列新兴技术,用以寻找软件系统中新的模块化特性。 强调独立描述关注点,软件关注点就是客户需要的属性或者技术兴趣点,它一般体现在整个架构设计中。 有些关注点涉及系统多个方面的功能、特性和信息,这些关注点通常称为横切关注点。,方面需求(Aspectual Requirement)定义了那些对整个软件体系结构产生影响的横切关注点: 对等关注点,这种关注点是相互独立的,没有任何一个对等关注点比另一个更重要。如 ATM的取款、转帐和存款等; 扩展(extension),是在基础组件(base)之上定义的组件,它用来表示附加的服务或功能。如在图书馆系统中,当还书时发现该书已经超期,那么系统就要计算罚金。计
25、算罚金功能就是还书的扩展。,对等关注点,对等关注点(分离限制),扩展,对等关注点(分离限制),问题: 缠绕(tangling),各个组件包含满足不同关注点的实现(也就是编码),如组件“房间”; 分散(Scattering),某个特定关注点的实现是分散在多个组件中,如“登记入住”。 分离扩展是一种使复杂问题易于理解的技术。,关注点分离技术,关注点分离技术(Concern Separation Technique)对关注点进行建模和结构化。 用例技术,关注点合成机制,关注点合成机制(Concern Composition Mechanism)将关注点合成 发生在编译时、编译后,甚至是运行时,扩展相
26、互分离,扩展相互分离 Jacobson早在1986发表的论文 “支持易于变化的实时系统的语言” 术语:表示原有程序、扩展基础的术语existion;表示添加到existion的新功能的术语extensions。,扩展,在编译或运行阶段,而非编码阶段,往existion中插入extensions(扩展) 原有系统的源代码甚至二进制代码都与任何扩展之间保持了清晰性和无关性 优点: 扩展更为简单 系统将更易于理解,序列变化器,项目 管理,咨询 顾问,系统分析,软件编码,软件测试,文档制作,客户服务,解决方案行销,教育培训,工程项目的组成,瀑布模型:最早期、最简单的时间分段 迭代模型:对瀑布模型的改进
27、,用在需求和设计阶段 喷泉模型:OO方法,OOA与OOD融合 增量模型:更深入迭代,是产品与项目阶段共存模式 螺旋模型:高风险防范模型、应用在产品研发 构件模型:新的开发模式,重点是架构和合适的组件 RUP模型:最接近现代软件工程思想,是课程的基础,软件工程的生存周期问题小结,3.10 思考题 1、简述增量模型和瀑布模型的本质区别。 答:瀑布模型属于整体开发模型,它规定在开始下一个阶段的工作之前,必须完成前一阶段的所有细节,而增量模型属于非整体开发模型,它推迟某些阶段或所有阶段中的细节,从而较早的产生工作软件。 2、软件开发中有哪几种过程模型?哪些适用于面向对象的软件开发? 软件开发中常见的软件过程模型有瀑布模型、增量模型、螺旋模型、协同开发模型、喷泉模型、统一软件过程等。 其中喷泉模型、统一软件过程适用于面向对象的软件开发。 3.11习题 习题1、2、4、7,