敏捷开发与极限编程

来源:互联网 发布:java面向对象是什么 编辑:程序博客网 时间:2024/06/10 06:46

敏捷开发与极限编程作者: 陈沛

(系摘编)

软件设计方法可以区别为重量级的方法和轻量级的方法。重量级的方法中产生大量的正式文档。

著名的重量级开发方法包括ISO9000,CMM,和统一软体开发过程(RUP)。轻量级的开发过过程没有对大量正式文档的要求。着名的轻量级开发方法包括敏捷开发(Agile Management)与极限编程(XP)。重量级方法呈现的是一种防御型的姿态。在应用重量级方法的软件组织中,由于软件项目经理不参与或者很少参与程序设计,无法从细节上把握项目进度,因而会对项目产生恐惧感,不得不要求程序设计师不断撰写很多“软件开发文档”。而轻量级方法则呈现“进攻型”的姿态,这一点从XP(极限编程)方法特别强调的四个准则—“沟通、简单、反馈和勇气”上有所体现。

敏捷软件开发宣言

  • 个体和交互 胜过 过程和工具
  • 可以工作的软件 胜过 面面俱到的文档
  •  客户合作 胜过 合同谈判
  • 响应变化 胜过 遵循计划
  • 虽然右项也有价值,但是我们认为左项具有更大的价值。

 

敏捷宣言遵循的原则

  • 我们最优先要做的是通过尽早的、持续的交付有价值的软件来使客户满意。
  • 即使到了开发的后期,也欢迎改变需求。敏捷过程利用变化来为客户创造竞争优势。
  • 经常性地交付可以工作的软件,交付的间隔可以从几个星期到几个月,交付的时间间隔越短越好。
  • 在整个项目开发期间,业务人员和开发人员必须天天都在一起工作
  • 围绕被激励起来的个体来构建项目。给他们提供所需的环境和支持,并且信任他们能够完成工作。
  • 在团队内部,最具有效果并富有效率的传递信息的方法,就是面对面的交谈。   
  • 工作的软件是首要的进度度量标准。
  • 敏捷过程提倡可持续的开发速度。责任人、开发者和用户应该能够保持一个长期的、恒定的开发速度。
  • 不断地关注优秀的技能和好的设计会增强敏捷能力。
  • 简单是最根本的。
  • 最好的构架、需求和设计出于自组织团队
  • 每隔一定时间,团队会在如何才能更有效地工作方面进行反省,然后相应地对自己的行为进行调整。

 

极限编程简介

在软件工程概念出现以前,程序员们按照自己喜欢的方式开发软件。程序的质量很难控制,调试程序很繁琐,程序员之间也很难读懂对方写的代码。1968年软件工程的概念诞生。程序员们开始摒弃以前的做法,转而使用更系统、更严格的开发方法。为了使控制软件开发和控制其它产品生产一样严格,人们陆续制定了很多规则和做法,发明了很多软件工程方法,软件质量开始得到大幅度提高。随着遇到的问题更多,规则和流程也越来越精细和复杂。

到了今天,在实际开发过程中,很多规则已经难于遵循,很多流程复杂而难于理解,很多项目中文档的制作过程正在失去控制。人们试图提出更全面更好的一揽子方案,或者寄希望于更复杂的、功能更强大的辅助开发工具(CaseTools),但总是不能成功,而且开发规范和流程变得越来越复杂和难以实施。

为了赶进度,程序员们经常跳过一些指定的流程,很少人能全面遵循那些重量级开发方法。失败的原因很简单,这个世界没有万能药。因此,一些人提出,将重量级开发方法中的规则和流程进行删减、重整和优化,这样就产生了很多适应不同需要的轻量级流程。在这些流程中,合乎实际需要的规则被保留下来,不必要的复杂化开发的规被抛弃。而且,和传统的开发方法相比,轻量级流程不再象流水生产线,而是更加灵活。

ExtremeProgramming(XP)是一种灵巧的轻量级软件开发方法。“Extreme”(极限)是指,对比传统的项目开发方式,XP强调把它列出的每个方法和思想做到极限、做到最好;其它XP所不提倡的,则一概忽略(如开发前期的整体设计等)。一个严格实施XP的项目,其开发过程应该是平稳的、高效的和快速的,能够做到一周40小时工作制而不拖延项目进度。

 

极限编程的方法

  • 规划策略(The Planning Game)
  • 结对编程(Pair programming)
  • 多次测试(Testing)
  • 不断重构(Refractoring)
  • 简单设计(Simple Design)
  • 代码集体所有权(Collective Code Ownership)
  • 持续集成(Continuous Integration)
  • 现场客户(On-site Customer)
  • 小型发布(Small Release)
  • 每周40小时工作制(40-hour Week)
  • 编码规范(Code Standards)

 

  • UserStory:开发人员要求客户把所有的需求写成一个个独立的小故事,每个只需要几天时间就可以完成。开发过程中,客户可以随时提出新的UserStory,或者更改以前的UserStory。

 

  • StoryEstimates和开发速度:开发小组对每个UserStory进行估算,并根据每个开发周期(Iteration)中的实际情况反复计算开发速度。这样,开发人员和客户能知道每个星期到底能开发多少UserStory

 

  • ReleasePlan和ReleaseScope:整个开发过程中,开发人员将不断地发布新版本。开发人员和客户一起确定每个发布所包含的UserStory。

 

  • Iteration(开发周期,或称迭代)和IterationPlan:在一个Release过程中,开发人员要求客户选择最有价值的UserStory作为未来一两个星期的开发内容。

 

  • TheSeed:第一个迭代(Iteration)完成后,提交给客户的系统。虽然这不是最终的产品,但它已经实现了几个客户认为是最重要的Story,开发人员将逐步在其基础上增加新的模块。

 

  • Refactoring(重构):去掉代码中的冗余部分,增加代码的可重用性和伸缩性。

 

结对编程

XP中,所有的代码都是由两个程序员在同一台机器上一起写的——这是XP中让人争议最多、也是最难实施的一点。这保证了所有的代码、设计和单元测试至少被另一个人复核过,代码、设计和测试的质量因此得到提高。看起来这样象是在浪费人力资源,但是各种研究表明事实恰恰相反。——这种工作方式极大地提高了工作强度和工作效率。

很多程序员一开始是被迫尝试这点的(XP也需要行政命令的支持)。开始时总是不习惯的,而且两个人的效率不会比一个人的效率高。这种做法的效果往往要坚持几个星期或一两个月后才能很显著。据统计,在所有刚开始PairProgramming的程序员中,90%的人在两个月以后都很认为这种工作方式更加高效。

项目开发中,每个人会不断地更换合作编程的伙伴。因此,PairProgramming不但提高了软件质量,还增强了相互之间的知识交流和更新,增强了相互之间的沟通和理解。这不但有利于个人,也有利于整个项目、开发队伍和公司。从这点看,PairProgramming不仅仅适用于XP,也适用于所有其它的软件开发方法。

集体拥有代码

在很多项目开发过程中,开发人员只维护自己的代码,而且很多人不喜欢其他人随意修改自己的代码。因此,即使可能有相应的比较详细的开发文档,但一个程序员却很少、也不太愿意去读其他程序员的代码;而且,因为不清楚其他人的程序到底实现了什么功能,一个程序员一般也不敢随便改动其他人的代码。同时,因为是自己维护自己的代码,可能因为时间紧张或技术水平的局限性,某些问题一直不能被发现或得到比较好的解决。针对这点,XP提倡大家共同拥有代码,每个人都有权利和义务阅读其他代码,发现和纠正错误,重整和优化代码。这样,这些代码就不仅仅是一两个人写的,而是由整个项目开发队伍共同完成的,错误会减少很多,重用性会尽可能地得到提高。

XP开发小组中的所有人都遵循一个统一的编程标准,因此,所有的代码看起来好像是一个人写的。因为有了统一的编程规范,每个程序员更加容易读懂其他人写的代码,这是是实现CollectiveCodeOwnership的重要前提之一。XP过程强调通过使用一些形象的比喻让所有人对系统有个共同的、简洁的认识。XP认为加班是不正常的,因为这说明关于项目进度的估计和安排有问题。

迭代

我们开发一个产品,如果不太复杂,会先定义需求,然后构建框架,然后写代码,然后测试,最后发布一个产品。这样,几个月过去了,直到最后一天发布时,大家才能见到一个产品。

这样的方式有明显的缺点,假如我们对用户的需求判断的不是很准确时——这是很常见的问题,一点也不少见——你工作了几个月甚至是几年,当你把产品拿给客户看时,客户往往会大吃一惊,这就是我要的东西吗?

迭代的方式就有所不同,假如这个产品要求6个月交货,我在第一个月就会拿出一个产品来,当然,这个产品会很不完善,会有很多功能还没有添加进去,bug很多,还不稳定,但客户看了以后,会提出更详细的修改意见,这样,你就知道自己距离客户的需求有多远,我回家以后,再花一个月,在上个月所作的需求分析、框架设计、代码、测试等等的基础上,进一步改进,又拿出一个更完善的产品来,给客户看,让他们提意见。就这样,我的产品在功能上、质量上都能够逐渐逼近客户的要求,不会出现我花了大量心血后,直到最后发布之时才发现根本不是客户要的东西。

转自:http://blog.renren.com/share/240770794/5885383217

0 0