1、第2章 软件过程及其模型,2 . 1 软件过程概述,2 . 2 软件生命周期,2 . 3 敏捷软件过程,2 . 4 软件工程实践,2 . 5 软件过程模型,2 . 6 能力成熟度模型,2.1 软件过程概述,什么是软件过程? 与软件生产(开发)相关的活动。 规定科学、有效的软件过程可以提高软件生产效率和软件质量。,2.1 软件过程概述,2.1.1 软件过程框架 包含两个方面的内容: 一是组织及管理框架,包括实现软件过程改进活动时所涉及的角色与职责; 项目经理、系统分析员、程序员、测试员、文档管理员 二是技术及工具框架,包括实现过程活动自动化,以及为实现不同角色和职责提供支持时所需的设备与工具。
2、软件、硬件、开发模式、 框架是一个十分重要的概念,通常其中的角色既可以为过程活动的执行提供帮助与指导,还可以为过程活动的实施与监控提供工具与渠道。,2.1.2 软件过程模型,软件过程是整个软件生命周期中一系列有序的软件生产活动的流程。为了能高效地开发一个高质量的软件产品,通常把软件生命周期中各项开发活动的流程用一个合理的框架开发模型规范描述。这就是软件过程模型,或者称为“软件生命周期模型”。 软件过程模型从一个特定的角度表现一个过程,一般使用直观的图形标识软件开发的过程。主要根据软件的类型和规模,特别是软件的开发方法及开发环境等多种因素确立过程模型。 典型代表:瀑布模型、螺旋模型、面向对象模型
3、等。,2.2 软件生命周期,软件生命周期可划分为定义、开发和运行3个大的阶段,进一步可细分为6个阶段,每个阶段有明确的任务,使规模大、结构复杂且管理复杂的软件开发变得容易控制和管理。 (1)问题的定义及规划:在该阶段软件开发人员与客户进行需求交流,确定软件的开发目标及其可行性。 (2)需求分析:在确定软件开发可行的情况下,对软件需要实现的各个功能进行详细分析。 (3)软件设计:该阶段主要根据需求分析的结果,对整个软件系统进行设计,如系统框架设计,以及数据库设计等。 (4)程序编码:该阶段是将软件设计的结果转换成计算机可运行的程序代码。 (5)软件测试:在软件设计完成后要经过严密的测试,以便发现
4、软件在整个设计过程中存在的问题并加以纠正。 (6)软件维护:这是软件生命周期中持续时间最长的阶段。,2.3 敏捷软件过程,敏捷方法说明开发项目是一个学习的体验。没有谁能在完全理解所有需求之后才开始项目,即使是顾客也一样。 2.3.1 敏捷软件过程 敏捷方法的两大特征: 对“适应性”的强调和对“人”的关注。,2.3 敏捷软件过程,2.3.1 敏捷软件过程 敏捷开发提出了以下12条原则。 (1)开发人员最优先要做的是通过尽早且持续地交付有价值的软件从而使客户满意。 (2)即使到了开发的后期,也欢迎改变需求,敏捷过程利用变化为客户创造竞争优势。 (3)经常性地交付可以工作的软件,交付的间隔可以从几个
5、星期到几个月,交付的时间间隔越短越好。 (4)在整个项目开发期间,业务人员和开发人员必须天天都在一起工作。 (5)围绕被激励起来的个体构建项目为开发人员提供所需的环境和支持,并且信任他们能够完成工作。,(6)在团队内部,最具有效果并富有效率的传递信息的方法就是面对面的交谈。 (7)工作的软件是首要的进度度量标准。 (8)敏捷过程提倡可持续的开发速度,责任人、开发人员和用户应该能够保持一个长期且恒定的开发速度。 (9)不断地关注优秀的技能和好的设计会增强敏捷能力。 (10)简单是最根本的。 (11)最好的构架、需求和设计出自于组织团队。 (12)每隔一定时间团队会在如何才能更有效地工作方面进行反
6、省,然后相应地对自己的行为进行调整。,2.3.2 极限编程,极限编程(eXtreme Programming)是敏捷软件开发中的一种方法。 具有强沟通、简化设计和迅速反馈等特点。 一般适合于规模小、进度紧、需求不稳定、开发小项目的小团队。观点:软件需求的不断变化是很自然的,是不可避免的,应欣然接受。极限是指对比传统的项目开发方式,XP强调把列出的每个方法和思想做到极限并做到最好。优点:轻量型、灵活;专家协作开发方式。 重视客户反馈。,2.3.2 极限编程,极限编程的核心有4个要点:交流、简单、反馈和勇气,它们构成了极限编程的精髓。 1交流 (1)开发人员与客户的交流 (2)开发人员之间的交流
7、(3)开发人员与管理人员的交流 2简单 (1)设计简单 (2)编码简单 (3)注释简单 (4)测试简单,3反馈 (1)客户对软件的反馈 (2)测试代码对功能代码的反馈 4勇气 接受任务的勇气。,2.3.3 结对编程,1什么是结对编程 结对编程是一个非常直观的概念,简单的说是指两位程序员肩并肩地坐在同一台计算机前,面对同一个显示器,使用同一个键盘和同一个鼠标一起工作。他们一起分析,一起设计,一起写测试用例,一起编码,一起单元测试,一起集成测试,一起编写文档等。基本上所有的开发环节都面对面、平等、互补地进行开发工作,并且这两人的角色可以随时交换。 2结对编程的发展历史 1995年,澳大利亚悉尼理工
8、大学计算机科学教授、国际公认的软件工程理论与实践之人类因素研究权威人士Larry Constantine,在专栏中第1次提到他所观察到的一个现象:“两个开发人员一起工作,可以比以往更快地交出完成并经过测试的代码,而且这些代码几乎是没有错误的”。这是结对编程概念的雏形。1996年,由Kent Beck、Ward Cunningham和Ron Jeffries软件开发理论与实践极限编程倡导者一同提出了极限编程及其12个实践,极限编程是由他们开发面向对象软件经验发展而来的。,2.3.3 结对编程,3结对编程的早期实践 Larry Constantine在发表于20世纪80年代初的一篇文章里说,Wit
9、htsmith公司里的“动态搭档”能够以前所未有的速度编写出漏洞更少的代码来。 在对贝尔实验室的Pasteur项目进行总结研究之后,软件模式运动中最有影响力的人物之一James Coplien,于1995年提出了“结对开发”的企业模式。 2001年秋,美国北卡州大学的Laurie Williams做了一个实验,该实验主要用于研究两个课题,即结对编程的作用和积极协作学习的重要性。 2002年,ThoughtWorks公司的Amr Elssamadisy在项目中实施结对编程从而对结对编程编程进行研究。通过对计划、提交周期、设计的简单性、测试和重构等方面和单独工作进行对比,验证了结对编程的效率比单独
10、编程更高。,2.3.3 结对编程,4结对编程角色互换 5结对编程优势与问题 (1)可以最大化地提高工作效率。 (2)可以生成更好的代码。 (3)可以减少风险。 (4)是知识传播的最好途径。 (5)可以打造出最佳的合作团队。 6结对编程分析 (1)结对编程与敏捷实践。 (2)结对编程与测试驱动开发。 (3)结对编程与代码重构。 (4)结对编程与简单设计。,2.3.4 分布式结对编程,1面对面结对编程的不足 基础设施缺乏、地理位置分离和时间安排冲突等。 2分布式结对编程概念 分布式结对编程是一种编程风格,两个开发人员在地理上是分布的,但可以通过网络在同一软件制品上同步协作。 3分布式结对编程优势,
11、2.3.4 分布式结对编程,4分布式结对编程的要求 当决定使用哪一种分布式结对编程工具时,要考虑以下几种特征。 (1)能不能容易地和当前集成开发环境进行连接,桌面共享工具如Elluminate, LogMeIn和VNC4DPP可以安装在任何集成开发环境中。 (2)能不能共享必要的文件和应用,这种工具应该支持共享程序员将用到的文件、应用或者测试工具。 (3)能不能支持传递“手势”。 (4)是否有明确的驱动和导航角色。 (5)能不能保护每个合作者的隐私,桌面共享工具允许客户完全访问拥有者的计算机,这使客户潜在地威胁到了拥有者的隐私。 (6)是否需要很大的带宽,一些工具仅仅传送合作者的代码。,2.4
12、 软件工程实践,2.4.1 概念与原则 David Hooker提出了如下7个关注软件工程整体实践的核心原则。 (1)存在价值 (2)保持简洁 (3)维护视图 (4)生产者要让消费者理解 (5)面向未来 (6)计划复用 (7)认真思考,2.4.2 软件工程实践,1沟通实践 2计划实践 制订项目计划一般有如下4个步骤。 (1)明确目标,目标必须明确、可行、具体和可以度量。 (2)制定项目工作范围,对照目标,将需要完成的工作进行分析和梳理,列出一份完成目标所需要进行的所有活动一览表,这就构成了项目的工作范围。 (3)在项目组内分配任务职责,责任矩阵是完成这一任务的最好选择。 (4)统筹规划项目间活
13、动的关联,该步骤确定各项目活动所需要的时间、人力和物力,明确各项活动之间的先后逻辑关系,通常通过网络图工具完成。 3建模实践,2.5 软件过程模型,2.5.1 传统的软件过程模型 1瀑布模型 采用瀑布模型的软件过程如图2-1所示。,2.5 软件过程模型,2.5.1 传统的软件过程模型 1瀑布模型 特点:最早、应用最广泛的软件过程模型。文档驱动的模型。优缺点并存。阶段间以固定次序相互衔接。优势:阶段的顺序性和依赖性。推迟实现。质量保证。缺陷:线性过程不切实际、文档驱动增加工作量、开发风险大、测试滞后、开发合作衔接不畅。,补充:原型模型,在初步需求分析之后,马上向客户展示一个软件产品原型,对客户进
14、行培训,让客户试用,在试用中收集客户意见,根据客户意见立刻修改原型,之后再让客户试用,反复循环几次,直到客户确认为止。,优点 良好的需求定义,能有效处理用户的模糊需求。 有利于用户培训和开发同步。 低风险开发变化较大的计算机系统。 更易维护、对用户更友好。 使总的开发费用降低,开发时间缩短。 缺点 资源规划管理较为困难,更新文档工作繁重。 容易忽视用户环境和原型环境的差异。 不利于创新。,2.5.1 传统的软件过程模型,2增量模型瀑布模型+迭代增量开发和增量提交渐增模型增量构造模型:一些阶段增量开发,一些阶段整体开发。演化提交模型:所有阶段增量开发。 原型模型,2.5.1 传统的软件过程模型,
15、2增量模型 增量模型融合了瀑布模型的基本成分和原型实现的迭代特征,采用随时间的进展而交错的线性序列,每一个线性序列产生软件的一个可发布的“增量”,如图2-2所示。,增量模型中,需求分析阶段和设计阶段按瀑布模型的整体方式开发,编码阶段和测试阶段按增量方式开发。,2.5.1 传统的软件过程模型,2增量模型 两个缺陷:需要软件具备开放式体系结构。容易退化为边做边改模型,是软件过程的控制失去整体性。增量模型和原型模型的不同在那里?优点:人员分配灵活,投入经济。能有计划地管理技术风险。,2.5.1 传统的软件过程模型,3螺旋模型瀑布模型+原型模型 强调分线分析特别适合于大型复杂的系统。每个周期包括需求定
16、义、风险分析、工程实现和评审4个阶段。,2.5.1 传统的软件过程模型,图中的4个象限分别代表以下四个活动。 (1)制订计划。 (2)风险分析。 (3)实施工程。 (4)客户评估。,2.5.1 传统的软件过程模型,3螺旋模型优点:有利于软件重用。减少测试风险。支持客户需求的动态变化。降低了开发风险。风险驱动只适合于大规模软件项目。,2.5.2 面向对象过程模型,面向对象的方法强调系统的结构应该直接与现实世界的结构相对应,应该围绕现实世界中的对象构造系统,而不是围绕功能构造系统。降低软件复杂性,提供可理解性,简化开发和维护工作。促进软件复用。,2.5.2 面向对象过程模型,1统一过程模型用例驱动
17、、架构、迭代、增量。 每个循环包括4个阶段:初始、细化、构造、移交。 每个阶段又进一步细分为多次迭代的过程,如图2-4所示。,2.5.2 面向对象过程模型,1统一过程模型每次循环迭代都会产生一个新的版本,每个版本都是一个准备交付的产品。初始阶段:建立关键用例的简化用例模型,用于刻画系统的主要功能。细化阶段:详细说明系统的绝大多数用例,设计系统架构,评估风险。成果是架构基线。构造阶段:将架构基线逐步发展成为完善的系统,准备交付给客户。主要解决的问题是早期交付给客户的产品是否完全满足用户的需求。移交阶段:用户分析产品的缺陷和不足,开发人员改正问题完善系统。,2.5.2 面向对象过程模型,统一过程定
18、义了4个阶段,又给出了5个核心工作流,包括需求、分析、设计、实现和测试。每个工作流在各个阶段所处的地位和工作将不同,图2-5给出了统一过程的核心工作流。,2.5.2 面向对象过程模型,统一过程的原则:迭代开发:专注于处理每个阶段中最高风险。 需求管理:提取、组织和文档化需要的功能和限制。 基于构件。 可视化建模:UML。 验证软件质量。 控制变更。优缺点。,2.5.2 面向对象过程模型,2构件集成模型 基于构件的开发模型由软件的需求分析和定义,体系结构设计、构件库建立、应用软件构建、测试和发布5个阶段组成,采用这种开发模型的软件过程如图2-6所示。,优势: 螺旋模型的许多特征,支持软件开发的迭
19、代。 加快开发,降低成本和风险。缺陷: 缺乏通用组装标准导致较大风险。 对开发人员要求高。 过分依赖构件。,2 . 6 能力成熟度模型,2.6.1 什么是能力成熟度模型 CMM(Capability Maturity Model,能力成熟度模型)是对于软件组织在定义、实施、度量、控制和改善其软件过程的实践中的各个发展阶段的描述,是国际公认的对软件公司进行成熟度等级认证的重要标准。 CMMI(Capability Maturity Model Integration,能力成熟度模型集成)是CMM模型的最新版本。CMMI是美国国防部的一个设想,想把现在所有,以及将被发展出来的各种能力成熟度模型集成
20、到一个框架中。这个框架有两个功能,一是软件采购方法的改革;二是建立一种从集成产品与过程发展的角度出发,包含健全的系统开发原则的过程改进。,2.6.2 软件过程成熟度5级模型,CMM的5级模型如图2-7所示。,2.6.2 软件过程成熟度5级模型,(1)初始级:过程无序且不可见。软件过程的特点是无秩序的,有时甚至是混乱的,如图2-8所示。,(2)可重复级:里程碑可见,按计划开发。已建立了基本的项目管理过程,可用于对成本、进度和功能特性进行跟踪。对类似的应用项目,过程有章可循并能重复以往所取得的成功。项目有里程碑,可分阶段检查,如图2-9所示。,2.6.2 软件过程成熟度5级模型,(3)已定义级:每
21、个阶段的内部活动可见,标准过程和项目定义过程裁剪,如图2-10所示。,(4)已管理级:过程可度量,预测值与结果之间的偏差可控,如图2-11所示。,2.6.2 软件过程成熟度5级模型,(5)优化级:过程动态调整,以及新技术的采用,如图2-12所示。,2.6.2 软件过程成熟度5级模型,每个KPA(Key Process Area,关键过程域)设定了一个或多个目标,为了达成KPA的目标,就需要有一些最重要的基础设施和活动。这些基础设施和活动称为“关键实践”,如图2-13所示。,软件过程模型 面向过程:瀑布/原型/螺旋/增量 面向对象:统一过程模型/构件集成 敏捷开发: CMM,在CMM中一共有18个关键过程域,分布在2-5级中。关键过程域的过程分为三类:管理方面、组织方面和工程方面。,2.6.2 软件过程成熟度5级模型,使用范围:用于软件过程的改进。 用于软件过程的评估。 软件能力评价。,