Agile方法研究综述
摘 要: 本文综述了近来新出现的Agile方法,对其应用范围、价值系统、核心实践给出了阐述,并介绍了XP、SCRUM、Crystal等主要的Agile方法及其发展趋势,在此基础上,给出了CMM与Agile方法之间的比较分析,最后提出了Agile方法待研究的问题。
关键词 Agile方法,轻载方法,CMM,XP
AN OVERVIEW OF AGILE METHODOLOGY
Abstract :Agile Methodology attempts a useful compromise between no process and too much process, i.e., "Just enough". Given in this paper is an overview of agile methodology and its trends, including XP, SCRUM, Crystal, FDD, ASD, etc.. Also given are application scope, value system, core principles, and key practices of agile methodology. Based on the above survey and analysis, a comparison between CMM and agile methodology is presented,and several issues need further research are pointed out.
Key words Agile Methodology, Lightweight Methodology, CMM, XP
1. 引言
质量和生产率是软件工程的两个核心目标,这两个目标相互作用相互影响,在具体的软件开发实施中要作具体的权衡。随着技术的迅速发展和经济的全球化,软件开发出现了新的特点,即在需求和技术不断变化的情况下实现快节奏的软件开发,这就对生产率提出了很高的要求。ISO-9000、CMM、SPICE目前已被公认为软件质量保障方面的事实标准,但由于其强调管理和控制,追求项目的可预测性和过程状态的可视性,在提高生产率方面并未予以足够的重视,实施时一方面需要大量中间制品(过程文档)的制作,给开发人员带来很大负担,另一方面,追求可预测性与实际需求的模糊和快速变化不相协调。在此情况下,出现了一些新的开发方法。
新的方法主要有Extreme Programming (简称XP)、SCRUM、Crystal Methodologies、Feature Driven Development(简称FDD)、Dynamic Systems Development Methodology(简称DSDM) 、Adaptive Software Development(简称ASD)、Pragmatic Programming等,统称轻载(Lightweight)方法,以区别于传统的开发方法(称重载方法,Heavyweight)。2001年2月,新方法的一些创始人在美国犹他州成立了Agile 联盟,将轻载方法正式更名为Agile方法,Agile有轻巧、机敏、活力的意思[1]。
Agile 方法目前还没有一个明确的定义,其特点是对软件生产率的高度重视,主要适用于需求模糊或快速变化下的、小型项目组的开发。有人称,Agile方法是在保证软件开发有成功产出的前提下,尽量减少开发过程中的活动和制品的方法,笼统的讲就是,"刚刚好"(Just enough),即开发中的活动及制品既不要太多也不要太少,在满足所需的软件质量要求的前提下,力求提高开发效率。
这些新方法提出后,引起了软件界的广泛重视,Tom Demarco认为(Cutter Trends Report),"XP对当今时代的作用可与CMM在八十年代和九十年代初的作用相媲美"。新方法在实践中也得到了巨大的成功,如IONA公司的Obix 技术支持小组在采用了XP方法后,软件生产率提高了67%[7];软件生产率组织(SPG)的Capers Jones则称,SCRUM方法可提高生产率6倍[13]。
2. Agile方法的核心理念及特点
任何软件开发方法都有一个相应的价值系统(Value system),方法通过价值系统对过程加以指导,方法只有在其应用周境(context)与价值系统相吻合时才能发挥真正效力,价值系统的基础是对世界的信仰和对软件开发特点的认识,可以说是核心理念。
Agile方法的代表人之一Martin Fowler提出了Agile方法的核心理念[2]:适应和以人为本[2]。
2.1 Agile方法基于适应而非预测。
人们不可能在软件开发之前准确地把握当时的需求及其之后的走势,这一点已由Peter Wegner用数学的方法给出了严格的证明[27,28]。设想有一个虚拟的"理想软件",它是对用户的最大满足,并能随时间的推移和形势变化而与现实保持即时同步,那么软件需求实质上是对"理想软件"的粗略的外部描述。理论上来说,软件开发应是一个跟踪过程,只能通过软件开发过程的自适应性来逼? quot;理想软件",不可能完全实现。
根据自动控制理论,自适应系统是一个强反馈系统。在软件开发中,需求的获取和分析、软件设计、编码等实质上均为前馈环节,真正的反馈环节应该是用户对可运行软件的使用、使用中与"理想软件"的比较判断及判断后与开发人员的信息交流。另外,控制理论还要求,反馈和前馈这一回路的响应速度应大于被跟踪(或被适应)的系统的变化速度,这就要求软件开发有快速的产出能力。
基于适应性特点,Agile方法通过快速、短迭代式的开发,不断产出和演化可运行软件,加强项目有关人员的信息交流等手段来提高反馈的速度、力度和准确性。在软件过程改进方面,Agile方法通过对实际反馈信息的度量,根据用户满意度(时间和质量的权衡)进行微调,相当于缺陷驱动的改进方式。
2.2 Agile方法是以人为导向而非过程导向。
软件开发中,人的因素是第一位的。人是过程的主体,而人的工作承受力是有限的,任何超出人正常承受力的过程必然导致过程结果的偏离,这一点在注重过程改进的方法中往往被忽视或低估。Agile方法认为,软件开发中的绝大部分是需要创造力的设计工作,软件人员是创造性的工作者,有主观上做好工作的意愿,不同于大工业时代生产流水线上被动性的工人,因此,在管理理念上应注重领导和协作,而非命令和控制,充分发挥软件人员的能动性和创造力。软件开发应首先着眼于有用的可执行的软件,也就是首先考虑商务目标,而不是为过程而过程。
Agile方法特别强调软件开发中相关人员间信息交流,Alistir Cockburn在对数十个项目案例调查分析后提出,"项目失败的原因最终都可追溯到信息没有及时准确地传递到应该接收它的人",而人特别擅长面对面的交流,cockburn认为面对面交流的成本要远远低于文档交流的成本,因此,Agile方法的一个共同特点就是,努力营造诚信、开放的组织氛围,根据项目中信息流通的具体情况,按高内聚、松耦合的原则将项目组划分为若干个小组(每个小组以不超过10人为宜,组员均在一个工作间内工作),通过小组内各种渠道的沟通,来减少中间制品的工作负担,提高应变能力。
2.3 Agile方法中的价值系统和指导原则
Agile联盟提出了"四个价值"、"十二个指导原则"[1]。
Agile方法的四个价值:
(1) 较之于过程和工具,更注重人及其相互作用的价值。
(2) 较之于无所不及的各类文档,更注重可运行的软件的价值。
(3) 较之于合同谈判,更注重与客户合作的价值。
(4) 较之于按计划行事,更注重响应需求变化的价值。
Agile方法的指导原则:
(1) 在快速不断地交付用户可运行软件的过程中,将使用户满意放在第一位。
(2) 以积极的态度对待需求的变化(不管该变化出现在开发早期还是后期)。Agile过程紧密围绕变化展开并利用变化来实现客户的竞争优势。
(3) 以几周到几个月为周期,尽快、不断地交付可运行的软件供用户使用。
(4) 在项目过程中,业务人员和开发人员最好能一起工作。
(5) 以积极向上的员工为中心建立项目组,给予他们所需的环境和支持,对他们的工作予以充分的信任。
(6) 在项目组中,最有用、最有效的信息沟通手段是面对面的交谈。
(7) 项目进度度量的首要依据是可运行的软件。
(8) Agile过程高度重视可持续开发。项目发起者、开发者和用户应能始终保持步调一致。
(9) 应时刻关注技术上的精益求精和设计的合理,这样能提高软件的快速应变力。
(10) 简单化(尽可能减少不必要工作的艺术)是基本原则。
(11) 最好的框架结构、需求和设计产生于自组织的项目组。
(12) 项目组要定期对其运作方面进行反思,提出改进意见,并相应进行细调。
此外,Agile方法实施中一般采用面向对象技术(接口定义良好的其它开发技术也可),另外还强调在开发中要有足够的工具(如配置管理工具、建模工具等)支持。
2.4 Agile方法的适用范围[2]
Martin Fowler认为,新方法不是到处可适用的。在以下情况下,适合采用Agile方法:
l 需求不确定和易挥发(Volatile,意指今天的要求明天就不需要了)的场合。
l 有责任感和积极向上的开发人员 。
l 用户容易沟通并能参与。
在以下情况下,不适合Agile方法:
l 超过50人的项目组
l 开发范围被限定(如由合同限定了价格)
3. Agile具体方法介绍
Agile方法是一组开发方法的统称,下面介绍几个典型的Agile开发方法。
3.1 XP(Extreme Programming)[3~9]
由Kent Beck提出,是Agile方法中最引人注目的一个,名称中Extreme的含义是将好的开发实践(Practices)运用到极致。XP最初实践于 1997年Crysler公司的C3项目(人员薪金管理),采用Smalltalk语言开发。适用于10人以下项目组、开发地点集中的场合,现已成为小组开发方法的一个典型,被业界广泛用于需求模糊和挥发性强的场合。XP基于四个价值(values)提出了十二个核心实践(Practices)。
3.1.1 XP方法的四个价值:
l 交流(Communication)。项目相关人员之间充分、多渠道(最好面对面)的沟通。
l 简化(Simplicity)。在系统可运转的前提下,做最简洁的工作;在开发中不断优化设计,时刻保持代码简洁、无冗余。
l 反馈(Feedback)。强调各种形式的反馈,如小交付、短迭代、先考虑测试再编码等。
l 胆识(Courage)。面对压力做正确的判断并敢于付诸行动,如,敢于丢弃设计不良的代码,疲惫时立即休息等。
3.1.2 XP方法的十二个核心实践:
l 工作团队(Whole Team)。所有的小组成员应在同一个工作地点工作。成员中必须有一个用户代表(On-site User),由他/她来提出需求,确定开发优先级,把握开发的动向。通常还设一?quot;教练"(Coach)角色,来指导XP方法的实施及与外部的沟通协调等。小组每个成员都应围绕用户代表,充分贡献自己的技能。
l 计划(Planning Game)。包括两类:交付计划和迭代(Iteration)计划,前者是在项目开始时对软件交付日期的粗略估计,后者是在每个迭代开始时对本次迭代的工作安排。二者都可在执行时调整,只不过迭代计划要更为具体和准确。
l 系统比拟(Metaphor)。系统比拟是待开发软件系统的一个形象化比喻,这个比喻必须是每个组员都熟悉的,它相当于一个粗略的软件体系结构(Architecture),使用户和开发人员建立一个一致的框架,从而指导开发的进行。
l 小交付(Small release)。经常交付可运行的、具有商业价值的小软件,供用户代表评估或最终使用。这里的"小"意味着软件模块能尽快(可在一个迭代内完成)、不断地交付。
l 测试(testing)。XP要求先开发测试用例(可自动执行)然后进行编码(testing then coding),而且测试要不断进行,保证代码测试要100%通过。分两种测试:单元测试和验收测试(Acceptance test)。单元测试由开发人员负责,验收测试由用户代表负责。
l 简洁设计(Simple Design)。有两个含义:一是设计只考虑当前定义的功能而不考虑以后需求的变化,二是指该设计是完成目前功能所需的最简洁的设计,要简单易懂、没有冗余。
l 结对开发(Pair Programming)。开发人员两人结一对,在一台机器前进行开发,一人打字编程另一人查看其编码,配对的两人是不固定的,建议每天轮换。
l 设计改进(Design Improvement)。在整个开发过程中,应对程序结构进行持续不断的梳理(Refactoring,在不影响程序的外部可见行为的情况下,按高内聚松耦合的原则对程序内部结构进行改进), 保持代码简洁、无冗余。
l 持续集成(Continuous Integration)。保持项目组中所有开发的模块始终是组装完毕、集成良好且可执行的,一旦新的模块通过了单元测试,应立即将其组装、集成,形成新的可执行系统。
l 代码共享(Collective code Ownership)。任何结对开发者在任何时候都可改进项目组中的任何代码。
l 编码标准(Coding Standard)。对编程风格(命名、注释、格式等)要有一个大家认可的、共同遵守的标准,使整个程序如同一人编写。
l 可持续步调(Sustainable Pace)。整个项目的开发节奏应该是可长期维持的,XP提出每周40小时工作制,即不要加班,以使开发人员能长期保持工作的高效率。
3.1.3 XP开发过程:
l 整体开发过程
如图1所示,用户代表提出用户故事(User stories,类似于用例,但更简单,不超过三句话即可,一般只涉及功能要求),项目组据此进行讨论提出系统比拟,在此活动中有可能要进行体系结构的刺探(Spike,意在试探解决有关技术难点,走通技术路线)。在系统比拟和用户故事的基础上,根据用户设定的优先级制订交付计划(制订计划中可能需要对某个技术难点进行刺探),然后开始多个迭代过程(每个迭代一般为1~3周),在迭代期内产生的新用户故事不在本迭代内解决,以保证开发不受干扰。经验收测试通过后交付使用。
l 迭代过程
如图2所示。根据交付计划和项目速率(Project velocity,实际开发时间和估计时间的比率,如估计1天完成的工作实际为2天,项目速率为2),选择要优先完成的用户故事或待消除的Bugs,将其分解为可在1~2天内完成的任务,制定本次迭代计划,然后通过每天的站立会议(Stand up meeting,参加人员站着开会以缩短时间/提高效率)解决碰到的问题、调整迭代计划,会后是代码共享式的开发工作,开发人员要确保新功能100%通过单元测试,并立即组装形成新的可运行版本,由用户代表进行验收测试。
l 代码共享的编程
如图3所示。
|
3.1.4 XP的实践和发展 约定应随之塑造和演化。
Crystal方法系列对具体的开发过程并没有严格的要求。它强调某个方法应有哪些角色及多少人参与、组织结构如何、迭代周期多长、应有哪些中间文档、采用哪些工具等。如Crystal Clear,用在6人左右的项目组(无下层小组),迭代周期应为2-3个月,角色应有项目资助者、高级设计开发员、设计开发员、用户,开发制品有:交付序列、进度安排、有注解的用例、设计纲要、通用对象模型、可执行代码、移植代码、测试用例、用户手册。 |
http://www.trucy.org/blog/fanghong/archives/2006/07/agilenueoe.html