1、1 1第2章 软 件 过 程第2章 软 件 过 程2.1 软件过程概述2.2 软件过程模型2.3 Rational统一过程2.4 敏捷开发过程2.5 面向方面的软件开发本章小结习题2 2第2章 软 件 过 程2.1 软件过程概述软件过程具有以下一些特征:(1)过程描述了所有的主要活动。(2)过程在一定限制下使用资源、产生中间和最终的产品。(3)过程由以某种方式连接的子过程构成,活动以一定的顺序组织。(4)每个过程活动都有入口和出口准则以便确立活动的开始和结束。(5)每个过程都有达到活动目标的相关指导原则。3 3第2章 软 件 过 程软件过程可概括为三类:基本过程类、支持过程类和组织过程类。基本
2、过程类包括需求获取和定义过程、设计过程、实现过程、验证过程和维护过程;支持过程类包括文档过程、配置管理过程、质量保证过程、联合评审过程、审计过程等;组织过程类包括基础设施过程、改进过程以及培训过程。4 4第2章 软 件 过 程2.2 软件过程模型软件开发过程也被称作为软件生命周期,因为它描述了一个软件产品从建立概念到实现、交付、使用、维护的过程。软件过程模型是对软件开发过程的抽象描述。模型一般来说是对实际过程的简化,过程模型通常包括软件活动、软件产品和人员的角色等。尽管从不同的角度可以构造很多不同的软件过程模型,但一般来说,有一些通用的软件开发模式和模型。5 5第2章 软 件 过 程2.2.1
3、 瀑布模型瀑布模型是被广泛认可的第一个软件工程模型。在模型中,过程的主要活动按需求分析和定义、系统和软件设计、编码和单元测试、集成和系统测试、运行和维护几个阶段顺序展开,瀑布模型的这几个活动阶段与软件生存期相吻合,模型示意如图2.1所示。6 6第2章 软 件 过 程图2.1 瀑布模型7 7第2章 软 件 过 程1需求分析和定义需求分析和定义阶段着重回答“软件要解决什么问题?”。这个阶段,通过咨询用户和与用户商讨准确地分析和定义系统的功能、限制和目标,分析和定义的结果被详细地用需求规格说明来描述。需求分析和定义是软件过程的早期阶段活动,若需求定义不准确将会造成所交付的软件存在严重的问题,并会为软
4、件的修改付出很大的代价。8 8第2章 软 件 过 程2系统和软件设计设计阶段需要回答“系统应该如何实现?”这个问题,因此设计阶段主要是要根据需求划分系统的组件,包括建立系统总体结构(又称为概要设计或初步设计)和确立构成系统的组件的细节(又称详细设计)。9 9第2章 软 件 过 程3编码和单元测试编码和单元测试阶段又称为实现阶段。实现阶段通过采用适合的程序设计语言,编码完成软件的设计,形成系统的程序集合。单元模块的测试通常在本阶段内完成。4集成和系统测试这个阶段对已通过单元测试的程序单元进行集成和测试,以保证整个系统可以满足用户的需求。在测试完成后系统可以被交付给用户。1010第2章 软 件 过
5、 程5运行和维护软件交付后并不意味着开发机构完成了所有的开发任务,一般来说,运行和维护是软件生存期中最长的一个阶段。软件的本质特性决定了软件交付后不可避免地会遭遇变更,维护涉及对未被发现的错误的纠正和对用户提出的新需求的完善。1111第2章 软 件 过 程2.2.2 演化式开发模型很多时候,软件开发的初期并不能准确、全面地发掘出软件的需求,软件的开发只能从并非准确的需求描述开始。演化式开发的主要思想是:首先经过概要的分析构建一个初始的系统(原型),将原型提交给用户评价,根据反馈信息改进系统形成新的原型(中间系统),重复这个过程直至系统可以满足用户的需要而产生最终可交付的系统。图2.2为演化式开
6、发模型。1212第2章 软 件 过 程图2.2 演化式开发模型1313第2章 软 件 过 程演化式开发过程中包含着并行的、循环的需求分析、开发和验证等活动。一般来说有两种类型的演化式开发过程,即探索式开发和抛弃式开发。探索式开发:通过与用户一起工作,探索需求逐步开发直至交付一个最终的系统。通常开发从理解系统的部分需求开始,通过加入用户提出的新的需求不断改进系统。抛弃式开发:主要目标是帮助更好地理解用户的需求和进行准确的需求定义。一旦系统真正的需求被确立,原型即被抛弃。通常适用于需求难以导出的项目。1414第2章 软 件 过 程2.2.3 形式化变换模型某些安全性、可靠性要求很高的软件系统,可以
7、采用形式转化模型来开发。在形式化变换模型中,开发过程实际上是一个数学变换过程,系统的需求定义是一个用数学语言描述的形式化定义,传统的设计、实现和单元测试过程被形式化变换过程所取代,软件的开发过程是通过一系列的数学变换将形式化的需求定义转换成可执行程序的过程。图2.3和图2.4反映了该过程。变换过程的每一步都会将形式化模型转换成更详细、更具体的数学表达直到转换成等价的程序。1515第2章 软 件 过 程图2.3 形式化开发过程1616第2章 软 件 过 程图2.4 形式化变换过程1717第2章 软 件 过 程2.2.4 面向复用的开发面向复用的开发模型如图2.5所示。开发人员在确定需求的基础上,
8、寻找可以符合要求的已有组件,这些组件可以是可购买到的通用组件,也可以是自身机构已开发成功的组件。之后应对获得的组件信息进行分析,在此基础上适当修改需求以适应组件,然后根据设计和选用的体系结构框架及选择的组件进行系统集成和测试。面向复用的开发模式区别于其他开发过程的主要地方是组件分析、需求调整、面向复用的设计以及开发和集成活动。1818第2章 软 件 过 程图2.5 面向复用的开发模式1919第2章 软 件 过 程(1)组件分析:根据需求定义寻找合适的组件。在很多情况下,不一定存在和所期望的功能十分一致的组件,更多情况下找到的组件仅能提供单一或部分所需要的功能。(2)需求调整:这个阶段根据搜索到
9、的组件信息对需求进行进一步的分析,调整部分需求以利于采用合适的组件开发。(3)面向复用的设计:这个阶段的主要任务是根据可复用的组件设计系统的结构或复用已有的系统框架,同时对于没有有效组件可利用的软件部分要进行设计。(4)开发和集成:集成组件、开发无法复用的软件部分。2020第2章 软 件 过 程2.2.5 增量开发瀑布模型由于需求的改变会造成系统的修改代价较大,演化式开发会带来系统结构上的缺陷和程序维护上的困难,增量开发则可以平衡这两种开发模式带来的问题。增量开发模式由Mills提出,其主要内容是将系统的需求定义、设计和实现分解成若干增量,依次开发和交付,以减少开发过程中的返工,也可以让用户体
10、验先期交付的系统,然后提出更准确、详细的需求。图2.6为增量开发模型。2121第2章 软 件 过 程图2.6 增量开发模型2222第2章 软 件 过 程增量开发的优势在于:系统较早交付的增量通常能满足一些关键的需求,因此客户不必等到整个系统交付就可以使用系统中较早交付的部分。同时增量开发模式需求的定义可以分阶段展开,客户从早期交付的增量部分体验系统有助于后期增量需求的获取,因此,增量模型可以灵活地适应需求的变化,从而降低整个工程的开发风险。2323第2章 软 件 过 程增量开发模式也存在缺陷,有些情况下将系统功能映射成适当大小的增量并不是很容易的,增量需求的逐步定义也让找出所有增量公共部分的需
11、求有些困难,增量模型灵活适应需求变化的特性也会容易退化成边做边改的模式,从而使软件过程容易失去控制。Beck1999年提出的极限编程是增量式开发的一种变化形式。2424第2章 软 件 过 程2.2.6 螺旋模型螺旋模型是由Barry Boehm在1988年正式提出的,它将瀑布模型和快速原型模型结合起来,其过程活动不是按顺序进行而是以螺旋式展开,强调了其他模型所忽视的风险分析,特别适合于大型复杂的系统。螺旋模型如图2.7所示。2525第2章 软 件 过 程图2.7 螺旋模型2626第2章 软 件 过 程螺旋开发模式将软件过程分成若干个循环阶段,每个循环分成四个部分活动:(1)目标确立:确立本阶段
12、的目标、可选方案和约束条件。(2)风险分析:分析工程风险,开展降低风险的活动。(3)开发验证:设计、编码和验证系统。(4)评审和规划:对项目进行评审,决策是否要开展下一个循环周期。2727第2章 软 件 过 程使用螺旋模型有一定的局限性:(1)螺旋模型强调风险分析,但要求许多客户接受和相信这种分析,并做出相关反应是不容易的,毕竟影响软件的因素复杂。另外风险分析需要一定的代价,如果软件预算不充裕,风险分析较难实行。因此,这种模型往往适用于内部的大规模软件开发。(2)如果执行风险分析大大影响项目的利润,那么进行风险分析毫无意义,因此,螺旋模型只适合于大规模软件项目。(3)软件开发人员应具备发现潜在
13、风险的能力,可以较准确地分析风险,否则将会带来更大的风险。2828第2章 软 件 过 程2.3 Rational统一过程Rational统一过程RUP(Rational Unified Process)是基于UML的一种现代软件开发过程模型。这是一种混合过程模型,融合了一些通用过程元素。Rational统一过程强调开发和维护模型,采用UML作为系统模型的描述语言,UML的使用使其具有丰富的语义表达。Rational统一过程经过了许多年的成熟期并反映了许多人和公司的集体经验。图2.8是其发展历程示意图。2929第2章 软 件 过 程图2.8 Rational统一过程示意图3030第2章 软 件
14、过 程Rational统一过程中的软件生命周期在时间上被分解为四个连续的阶段,分别是:初始阶段(Inception)、细化阶段(Elaboration)、构造阶段(Construction)和交付阶段(Transition),如图2.9所示。横轴代表了制定开发过程的时间,体现了过程的动态结构,纵轴表现了过程的静态结构。每个阶段结束于一个主要的里程碑(Major Milestone),每个阶段本质上是两个里程碑之间的时间跨度。在每个阶段的结尾执行一次评估以确定这个阶段的目标是否已经满足。如果评估结果令人满意的话,可以允许项目进入下一个阶段。3131第2章 软 件 过 程图2.9 Rational
15、统一过程模型3232第2章 软 件 过 程2.4 敏捷开发过程敏捷开发是由业界专家针对企业现状提出的,让软件开发团队具有快速工作、响应变化能力的价值观和原则。这些专家认为:“个体和交互”胜过“过程和工具”。“可以工作的软件”胜过“面面俱到的文档”。“客户合作”胜过“合同谈判”。“响应变化”胜过“遵循计划”。3333第2章 软 件 过 程敏捷开发包括一系列的方法,主流的有如下七种:(1)XP(极限编程)的思想源自Kent Beck和Ward Cunningham在软件项目中的合作经历。(2)SCRUM是一种迭代的增量化过程,用于产品开发或工作管理。(3)Crystal Methods(水晶方法系
16、列)由Alistair Cockburn在20世纪90年代末提出。(4)FDD(Feature-Driven Development,特性驱动开发)由Peter Coad、Jeff de Luca、Eric Lefebvre共同开发,是一套针对中小型软件开发项目的开发模式。3434第2章 软 件 过 程(5)ASD(Adaptive Software Development,自适应软件开发)由Jim Highsmith在1999年正式提出。(6)DSDM(动态系统开发方法)是众多敏捷开发方法中的一种,倡导以业务为核心,快速而有效地进行系统开发。(7)轻量型RUP其实是个过程的框架,它可以包容许
17、多不同类型的过程,主张以敏捷型方式来使用RUP。3535第2章 软 件 过 程敏捷开发的模型,如图2.10所示。图中的两个圆圈表示不同的视角上的敏捷实践,包括开发者视角和项目管理者的视角,下面从内向外依次介绍。3636第2章 软 件 过 程图2.10 敏捷开发过程模型3737第2章 软 件 过 程(1)测试驱动开发(Test-Driven Development)是敏捷开发的最重要的部分。(2)持续集成(Continuous Integration)。(3)配对编程(Pair-Programming)。(4)站立会议(Stand Up)。(5)小版本发布(Frequent Releases)。
18、(6)文档最小化(Minimal Documentation)。3838第2章 软 件 过 程(7)聚焦协作(Collaborative Focus)表现为代码共享,在敏捷开发中,代码是归团队所有而不是归某些人,每个人都有权利获得系统任何一部分的代码,然后修改它。(8)现场客户(Customer Engagement)。(9)自动测试(Automated Testing)。(10)可调整计划(Adaptive Planning)。3939第2章 软 件 过 程2.5 面向方面的软件开发横切关注点(Crosscutting Concern):理解横切关注点的一个好途径是用例子来说明。图2.11是
19、一个简单的图形编辑器(Figure Editor)的Aspect和类模块的示意。4040第2章 软 件 过 程图2.11 图形编辑器中的方面横切关注点4141第2章 软 件 过 程图中每个方法必须实现这个横切关注点。如果只使用面向对象的设计方法,所实现的横切关注点就会分散在系统各处,如图2.11所示。AOP的主要思想是将这些横切关注点抽象为方面Aspect,在一个方面模块中实现显示更新,在系统的其他地方无须考虑任何实现,仅在系统编译或运行时,由编织器Weaver将方面Aspect“织入”代码中,如图2.12所示。4242第2章 软 件 过 程图2.12 AOP实现4343第2章 软 件 过 程
20、本 章 小 结软件开发需要有效地过程活动,不同的软件过程以不同的方式组织软件活动。软件过程的抽象可以用过程模型来表达,典型的软件过程模型包括瀑布模型、演化式开发、形式化变换、面向复用的开发、增量开发和螺旋模型等。Rational统一过程、敏捷开发模式和面向方面的开发则是在软件开发过程中融入了新的元素,如迭代、持续地集成、面向方面的编程等。不同的过程可以产生相同的软件产品,但对一个应用问题我们应该选择更适合的软件过程。4444第2章 软 件 过 程习 题1请简要说明软件过程的概念和基本元素。2对于下列每一个过程模型,分别列举一个可以适用的具体软件项目,并说明在开发中如何应用该模型。(1)瀑布模型
21、;(2)快速原型模型;(3)增量模型;(4)形式化变换模型。4545第2章 软 件 过 程3在螺旋模型中、风险分析的作用是什么?4为运行系统测试和记录结果设计一个过程模型。5请举例说明不同的过程模型组合使用的情况。6请用自己的语言描述何为“面向方面的软件开发”。7敏捷开发过程与瀑布模型相比,其主要的优越性是什么?8解释说明为什么使用演化式开发方法开发的程序可能难以维护?4646第2章 软 件 过 程9为以下各系统提出合适的软件过程模型,并基于系统所属类型给出你的理由:(1)飞机自动飞行控制系统;(2)长生命周期的金融业务系统;(3)对校园已存在的各分系统集成的综合MIS系统;(4)一个位于公交站台的交互式公交车查询系统。