书城计算机网络综合应用软件设计
8724600000006

第6章 软件工程概述(4)

1.CMM的组成

CMM由5个成熟度等级组成。除了等级1外,每个成熟度等级都由几个关键过程区域组成。每个关键过程区域又划分为5个称作共同特点的部分。共同特点规定一些关键实践,当这些关键实践群体得到认真执行时,关键过程区域的目标就能得以实现。

CMM的成分包括以下几个内容。

1)成熟度等级(Maturity levels)

一个成熟度等级是在实现成熟软件过程中的一个完整定义的平台。5个成熟度等级提供CMM的顶层结构。

2)过程能力(Process Capability)

软件过程能力描述通过遵循软件过程能实现预期结果的程度。一个组织的软件过程能力提供一种预测组织承担下一个软件项目时预期的最可能结果的方法。

3)关键过程区域(Key Processareas)

每个成熟度等级由若干关键过程区域组成。每个关键过程区域标识出一串相关的活动,当它们作为群体完成时,就达到一组目标,此组目标对建立该过程成熟度等级是至关重要的。关键过程区域是分别定义在各个成熟度等级并与之相连在一起的。例如,等级2的一个关键过程区域是软件项目策划。

4)目标(Goals)

目标概括了一个关键过程区域中的关键实践,并可用于确定一个组织或项目是否已有效地实施该关键过程区域。目标表示每个关键过程区域的范围、边界和意图。例如,软件项目策划关键过程区域的一个目标是“软件估计已文档化,供策划和跟踪软件项目使用”。参见“软件能力成熟度模型1.1版”。

5)共同特点(CommonFeatures)

将关键实践分别归入下列5个共同特点中:执行约定、执行能力、执行的活动、测量和分析及验证实施。共同特点是一种属性,它能指示一个关键过程区域的实施和规范化是否是有效的、可重复的和持久的。执行的活动这个共同特点描述实施活动。其余4个共同特点描述规范化因素,它们使得过程成为组织文化的一部分。

6)关键实践(KeyPractices)

每个关键过程区域用若干关键实践加以描述,当实施这些关键实践时,能帮助实现该关键过程区域的目标。关键实践描述是对关键过程区域的有效实施和规范化贡献最大的基础设施和活动。例如,软件项目策划这个关键过程区域的一个关键实践是“按照已文档化的规程制定项目的软件开发计划”。

2.CMM的5个等级

1)初始级

在初始级,软件开发过程基本上处于无序的状态,整个过程的特征是特定的和偶然的,有时甚至是混乱的,项目的成功往往依赖于个人能力。项目经常处于混乱状态。

2)可重复级

在可重复级上,已建立管理软件项目的方针和实施这些方针的规程,也就是建立基本的项目管理过程,能够跟踪费用、进度和功能;有适当的、必要的过程规范;借鉴以前项目的成功经验成为了可能。等级2组织的过程能力可概括为有纪律的,因为软件项目的规划和跟踪是稳定的,能重复以前的成功。

3)已定义级

在已定义级,软件的工程活动和管理活动已经被文档化和标准化,并与整个组织的软件过程相集成。所有的项目都使用统一的、文档化的、组织过程认可的版本来开发和维护软件。等级3组织的软件过程能力可概括为标准的和一致的,因为无论软件工程活动还是管理活动,过程都是稳定的和可重复的。

4)已管理级

在已管理级上,组织对软件产品和过程都设置定量的质量目标。此时,软件过程和产品质量的详细度量数据被收集,通过这些度量数据,软件过程和产品能够被定量地理解和控制。等级4组织的软件过程能力可概括为可预测的,因为过程是已测量的,并在可测的范围内运行。

5)优化级

在优化级,整个组织集中精力对通过的数据反馈进行不断的过程改进。因而在此阶段的软件过程能力可特征化为不断改进。

1.5.2XP

极限编程是敏捷模式(Agile Model)的典型代表,与CMM这些重量级(Heavyweight)的软件过程模型相比较而言,传统的CMM,ISO/IEC15504等软件过程模型通过加强软件组织级别管理与过程控制,强调通过大量的中间制品,如大量过程文档的制作以实现软件质量的保证,但却忽视了开发人员工作效率的提高;强调软件过程的可预见性、可控制性和可视性,而忽视对日益复杂多变的软件环境的适应性。正是为了弥补传统重载软件工程模型的不足,人们提出了敏捷模式(Agile Model)。因而敏捷模式的特点可以归纳为两点:一是基于对环境多变性的适应而不是对过程的预测;二是强调以人为导向而非以过程为导向。

KentBeck在他的开篇之作《Extreme Programming Explained—Embrace Change》(1997)最早提出了极限编程。题目中的“Embrace Change”道出了提出极限编程的初衷。现代企业环境日益复杂,变化莫测。传统的假定需求不可变的软件过程模型,如线性模型,已经过时。必须针对企业环境多变,客户需求多变这一事实,提出新的软件过程模型,XP就是这样的软件过程模型,充分地体现了极限编程的特点。所以XP实质上是以开发符合变化的客户需求的软件为目标而产生的一种方法。它的成功得益于特别强调客户满意度,XP使开发者能够更有效地响应客户的需求变化,甚至在软件生命周期的后期,也能做到对客户需求的变化及时响应。极限编程在国外已经很多大公司加以实践,并被证明是很有效的软件过程模型。

1.XP的过程

用户代表提出用户故事(User Stories,实际上是对需求的一种简明易懂的描述),开发小组根据用户故事进行系统比拟,并进行初步的体系结构刺探(spike,意在试探需要解决的技术难点,走通技术路线)得到系统比拟的结果。开发小组以系统比拟用户需求以及体系结构刺探得到的可能难点为基础,根据用户设定的优先级来制定发布计划,然后开始一个个迭代过程。每次迭代结束时,进行用户验收测试,若仍需继续改进,则继续迭代,否则就完成了一次小交付。

本质上XP是一种高度动态的软件过程,它通过一系列较短的迭代周期,来降低软件开发风险,适应系统需求的变更。所以极限编程通常比较适用于需求容易变化的环境,同时由于其极为重视沟通而忽视中间制品的制作,它通常对于场地集中,10人以下的开发团队较为合适。

2.XP的4个价值

1)交流(Communication)

XP充分强调了项目开发人员之间的充分交流,同时也强调客户的积极参与。

2)简化(Simplicity)

现代设计领域越来越倾向于简约之美。复杂系统的可靠构建往往出之于最为简单的设计思路。XP顺应了这一潮流,它强调在系统可以运转的前提下,做最简洁的工作;在开发中不断优化设计,时刻保持代码简洁、无冗余。

3)反馈(Feedback)

XP是高度动态的软件过程,它强调通过各种形式的反馈(这些反馈包括小交付、短迭代、测试先行等内容)以实现高度迭代的动态过程。

4)胆识(Courage)

XP以人为导向还体现在提倡开发者勇敢的面对压力,做正确的判断,并敢于付诸行动。如丢弃设计不良的代码,甚至重新设计,程序员在疲惫时立即休息,每星期工作40小时等,这些都充分体现了XP以人为导向的特点。

3.XP的11个核心实践

1)工作团队(Whole Team)

除了传统软件开发团队的一些角色,如程序员、系统分析师、项目经理这样的角色外,XP编程的Team中还包含了用户代表(On—site User)。由他来提出需求,确定开发优先级,把握开发动向。通常在XP团队中还有类似教练(Coach)的角色,以指导XP方法的实施与外部的沟通和协调。XP强调小组所有成员对整个团队的贡献。

2)计划(Planning Game)

XP中的计划包括两类:一类是发布计划(Release Planning),一类是迭代计划(Iteration Planning)。前者是指在项目开始时,所进行的项目过程交付日期所需资源所进行的粗略计划;后者是指每次迭代时,对此次迭代的工作计划的详细安排。

3)系统比拟(System Metaphor)

系统比拟是一种组员都可以接受,都易于理解的一种形象比喻,它描述了系统的功能或者运作方式。本质上它是系统架构的一种形象化的描述,其目的是为了促进组员之间的沟通与理解。

4)简单设计(Simple Design)

简单设计包含两方面内容:一是XP从不考虑将来的需求,只实现眼前要实现的功能,以简化设计;二是XP的设计尽可能简单易懂。XP的设计不是一劳永逸的事,而是不断重构,不断改进的过程,甚至在最后交付的时候都可能有设计改进。

5)设计改进(Design Improvement)

简单的设计并不意味着XP不关心设计质量,相反XP对设计要求是相当高的。XP通过持续不断的设计改进,也就是重构(Refactoring)来提高整个设计的质量。重构着眼于移除重复代码(可以通过面向对象的封装或者继承加以实现),目的在于加强软件系统中各模块内部的联系[也就是要提高系统的内聚性(Cohesion)],弱化系统各模块之间的联系[也就是降低系统的耦合性(Coupling)]。

6)结对编程(PairProgramming)

所谓结对编程,是指两个程序员肩并肩用同一台电脑编程。这样的做法看似在浪费人力,但事实上对于促进沟通,提高设计代码的质量确实有益。

7)测试驱动的开发(TestDrivenTesting)

XP通过经常性的测试以实现对设计代码的反馈。XP的测试包括单元测试和验收测试。XP的测试策略和技术是XP过程得以存在的基础。XP的测试策略是测试先行,测试用例的书写先于编码的完成,其测试技术主要是通过特定的测试框架(如Nunit,Junit等工具)实现自动化测试,以提高测试效率。

8)持续集成(Continuous Integration)

保持项目组中的所有模块始终是组装完毕,集成良好且可以执行的状态,一旦通过某一新的模块的单元测试,就将新的模块集成到整个系统中,并运行系统集成测试。这种做法非常便于查找测试中的Bugs,为增量开发提供了方便。显然这种做法必须以便捷的测试为基础,否则集成测试将是一件复杂痛苦的过程。

9)代码共享(Collective Code Ownership)

任何结对开发者在能够充分理解代码含义的前提下可以对项目组的任何代码做出改进。

10)编码标准(Coding Standard)

代码共享显然鼓励成员修改别人的代码,但前提是理解别人的代码。为此,提出编码标准这一核心实践,它要求全体成员尽可能遵守共同的编码规范,以促进沟通。

11)可持续步调(Sustainable Pace)

整个项目的开发节奏应该是可以长期维持的,为此,XP提出各种策略,如每周工作40小时,以保证成员能够以较高的工作效率长期工作。XP从1997年开始被提出,到今天虽然只有短短的十几年时间,但是发展普及非常迅速,其内容也愈加丰富。

思考题

1.简述通过软件工程所要达到的目标是什么?

2.可以从哪几个角度衡量软件的质量?并简述其具体内容。

3.简述软件开发技术。

4.什么是软件工程管理,主要包括哪些内容?

5.软件过程管理核心的主要内容是什么?