[转] Agile Software Development 敏捷软件开发
原文作者:kkun
原文地址:http://www.cnblogs.com/kkun/archive/2011/07/06/agile_software_development.html
敏捷是什么
敏捷开发是一种软件开发方法,基于迭代和增量开发,通过自组织,跨团队,沟通协作完成开发工作。
敏捷宣言的诞生
2001年2月11日到13日,17位软件开发领域的领军人物聚集在美国犹他州的滑雪胜地雪鸟(SnowBird)雪场。经过两天的讨论,“敏捷”(Agile)这个词为全体聚会者所接受,用以概括一套全新的软件开发价值观。这套价值观,通过一份简明扼要的《敏捷宣言》,传递给世界,宣告了敏捷开发运动的开始。
敏捷开发宣言内容
我们一直在实践中探寻更好的软件开发方法,身体力行的同时也帮助他人。由此我们建立了如下价值观:
个体和互动 高于 流程和工具
工作的软件 高于 详尽的文档
客户合作 高于 合同谈判
响应变化 高于 遵循计划
也就是说,尽管右项有其价值,我们更重视左项的价值。
英文原文:
We are uncovering better ways of developing software by doing it and helping others do it. Through this work we have come to value:
Individuals and interactions over processes and tools
Working software over comprehensive documentation
Customer collaboration over contract negotiation
Responding to change over following a plan
That is, while there is value in the items on the right, we value the items on the left more.
敏捷开发的12条准则
准则1:
Our highest priority is to satisfy the customer through early and continuous delivery of valuable software.
我们的最高目标是,通过尽早和持续地交付有价值的软件来满足客户。
准则2:
Welcome changing requirements, even late in development. Agile processes harness change for the customer's competitive advantage.
欢迎对需求提出变更——即使是在项目开发后期。要善于利用需求变更,帮助客户获得竞争优势。
准则3:
Deliver working software frequently, from a couple of weeks to a couple of mouths, with a preference for the shorter timescale.
要不断交付可用的软件,周期从几周到几个月不等,且越短越好。
准则4:
Business people and developers must work together daily throughout the project.
项目过程中,业务人员与开发人员必须在一起工作。
准则5:
Build projects around motivated individuals. Give them the environment and support they need, and trust them to get the job done.
要善于激励项目人员,给他们以所需要的环境和支持,并相信他们能够完成任务。
准则6:
The most efficient and effective method of conveying information to and within a development team is face-to-face conversation.
无论是团队内还是团队间,最有效的沟通方法是面对面的交谈。
准则7:
Working software is the primary measure of progress.
可用的软件是衡量进度的主要指标。
准则8:
Agile processes promote sustainable development. The sponsors, developers, and users should be able to maintain a constant pace indefinitely.
敏捷过程提倡可持续的开发。项目方、开发人员和用户应该能够保持恒久稳定的进展速度。
准则9:
Continuous attention to technical excellence and good design enhances agility.
对技术的精益求精以及对设计的不断完善将提升敏捷性。
准则10:
Simplicity -- the art of maximizing the amount of work not done -- is essential.
要做到简洁,即尽最大可能减少不必要的工作。这是一门艺术。
准则11:
The best architectures, requirements, and designs emerge from self-organizing teams.
最佳的架构、需求和设计出自于自组织的团队。
准则12:
At regular intervals, the team reflects on how to become more effective, then tunes and adjusts its behavior accordingly.
团队要定期反省如何能够做到更有效,并相应地调整团队的行为。
敏捷方法之Scrum
Scrum 基础介绍:http://zh.wikipedia.org/wiki/Scrum
Scrum Role 角色:
Product Owner, Team, Scrum Master, Chicken and the Pig
产品经理,团队,Scrum Master,鸡和猪,有一则小故事如下:
一只鸡对一头猪说:“我们合伙开家饭店吧!”猪想了想,说:“那我们给这个饭店起什么名字呢?”鸡说:“鸡蛋和火腿!”猪回答到:“那还是算了吧,你要做的只是下几只鸡蛋,我把命都搭上了!”
Scrum Meetings
① Sprint 计划会议(Sprint Planning Meeting)
需求澄清,确定那些用户故事需要在接下来的迭代里完成
根据Product Owner制定的产品或项目计划在Sprint的开始时做准备工作。
他要准备一个根据商业价值排好序的客户需求列表。这个列表就是Prodct Backlog[需求池],一个最终会交付给客户的产品特性列表,它们根据商业价值来排列优先级。
商业价值"公式":As a <type of user> I want <some functionality> so that <some benefit>
② 每日站立会议(Daliy Meeting)
在会议上每个团队成员回答三个问题(During the meeting, each team member answers three questions)
1. 昨天你完成了那些工作?(What have you done since yesterday?)
2. 今天天你打算做什么?(What are you planning to do today?)
3. 完成你的目标是否存在障碍?(Do you have any problems that would prevent you from accomplishing your goal?)
会议准时举行(The meeting starts precisely on time.)
任何人都可以参加,但只有团队内部人员发言(All are welcome, but normally only the core roles speak.)
会议时长限制为15分钟(The meeting is timeboxed to 15 minutes.)
会议时间地点应该固定(The meeting should happen at the same location and same time every day)
③ 评审会议(Sprint Review Meeting)
评审会议在每个迭代结束后举行,在会议上团队演示此次迭代中完成了那些工作,一般会有相关的DEMO演示。
At the end of each sprint a sprint review meeting is held. During this meeting the Scrum team shows what they accomplished during the sprint. Typically this takes the form of a demo of the new features.
这个会议演示的内容应该是启动会议上确定的那些内容。
During the sprint review the project is assessed against the sprint goal determined during the Sprint planning meeting.
④ 回顾会议(Sprint Retrospective Meeting)
冲刺回顾会议一般限时为3个小时(The sprint retrospective meeting is timeboxed to 3 hours.)
仅团队成员参加,产品经理和Scrum Master,产品经理可以选择性参加(It is attended only by the team, the scrum master and the product owner. The product owner is optional.)。
会议上团队中每个成员需要回答两个问题(Start the meeting by having all team members answer two questions):
1. 此次冲刺中那些地方做得好?(What went well during the sprint?)
2. 下个迭代中那些地方可以改进? (What could be improved in the next sprint?)
Scrum Master 记录每个成员的答案(The scrum master writes down the team’s answers in summary form)。
团队为这些改进意见评定优先级(The team prioritizes in which order it wants to talk about the potential improvements)。
Scrum Master在回顾会议中不允许给出答案,但要鼓励成员自己找到较好的办法(The scrum master is not in this meeting to provide answers, but to facilitate the team’s search for better ways for the scrum process to work for it)。
这些改进工作可以添加至下个迭代中,作为一个非功能性工作,回顾会议最不担心的就是变化(Actionable items that can be added to the next sprint should be devised as high-priority non functional product backlog. Retrospectives that dont result in change are sterile and frustrating.)。
测试驱动开发(TDD/Test-Driven Development)
测试驱动开发不是指测试人员驱动开发人员搞开发,一开始我真这么认为了,实际上测试驱动开发指:
以测试用例为出发点,不写一行代码的情况下,编写单元测试,从而无法通过,然后开始编写代码使之通过测试。
这样做的好处是直指目标,达到目标被视一最高优先级,TDD的执行离不开重构,因为这种开发方式完全漠视设计。
所以设计在开始时一定很差,通过不断的重构达到最优的代码,绝不会过度设计,也不会做偏。
网上多半会说实践后你会喜欢上它,它的大概流程如下图所示:
极限编程XP
XP是一个轻量级的、灵巧的软件开发方法;同时它也是一个非常严谨和周密的方法。它的基础和价值观是交流、朴素、反馈和勇气;即,任何一个软件项目都可以从四个方面入手进行改善:加强交流;从简单做起;寻求反馈;勇于实事求是。XP是一种近螺旋式的开发方法,它将复杂的开发过程分解为一个个相对比较简单的小周期;通过积极的交流、反馈以及其它一系列的方法,开发人员和客户可以非常清楚开发进度、变化、待解决的问题和潜在的困难等,并根据实际情况及时地调整开发过程。
结队编程Pairng Program - 即时反馈
http://www.oschina.net/news/15664/when-to-use-pair-programming
http://www.blogjava.net/moxie/archive/2006/09/14/69714.html
流模式(Flow)— 两个程序员共同从事一个有趣又有挑战性的问题。
指导模式(Coaching)— 老练的程序员在解决问题方面有经验和知识,可以与其他不能有效地独自解决问题的程序员分享。
看板 - 工作可视化,专注于当下
ToDo,OnGoing,Done,Impediment
燃尽图 Burn down
燃尽图是当前SPRINT工作进度的图表,展示了还有哪些工作未完成,每天都会更新,它简单的展示了工作进度,非常直观。实事上还有其它类似的图表,如发布燃尽图等。大概长什么样子呢?请瞧下图:
英文原文:
The sprint burn down chart is a publicly displayed chart showing remaining work in the sprint backlog. Updated every day, it gives a simple view of the sprint progress. It also provides quick visualizations for reference. There are also other types of burndown, for example the release burndown chart that shows the amount of work left to complete the target commitment for a Product Release (normally spanning through multiple iterations) and the alternative release burndown chart,[14] which basically does the same, but clearly shows scope changes to Release Content, by resetting the baseline. It should not be confused with an earned value chart.
敏捷估算扑克 - 合理的任务分解
http://community.techexcel.com.cn/010DevSuite/070Agile_Scrum/010Posts/010Agile_Poker
http://www.csaipm.com/cost/201005101141211188.htm
敏捷方法中的估算应该是由团队成员共同进行,而不是由项目经理“闭门造车”式地得出。这样做的原因之一是因为开发团队是由不同经验的同事组成,对于同一个问题,经验不同的人往往会给出不一样的解决方案。如果可以将所有人的能力集中到一起,那么最后对问题的求解也就八九不离十了。
持续集成(Continuous Integration)- 团队协作的基础
http://lxj8495138.iteye.com/blog/259102
http://www.hansky.com.cn/cn/dokuwiki/doku.php/corp/case/digitalchina
什么是持续集成(Continuous Integration)?
这个名词已经在软件开发领域持续了N年,一个比较简单的定义如下:
持续集成(CI)是一种实践,可以让团队在持续发布的基础上收到反馈并进行改进,不必等到开发周期后期才寻找和修复缺陷。
单元测试 Unit Test - 重构的保障
http://www.hudong.com/wiki/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95
单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。
通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。
敏捷测试 Agile Test
http://subject.csdn.net/agile-testing.htm
所谓敏捷测试,就是指测试遵循敏捷宣言进行,把开发作为顾客看待。与敏捷宣言中的“个体和交互比过程和工具更有价值”一样强调人的作用。
代码重构 Reconstruction
Duplicated Code(重复代码)
Long Method(过长函数)
Large Class(过大的类)
Long Parameter List(过长参数列)
Divergent Change(发散式变化)
Shotgun Surgery(霰弹式修改)
Feature Envy(依恋情结)
Data Clumps(数据泥团)
Primitive Obsession(基本类型偏执)
Switch Statements(switch惊悚现身)
Parallel InheritanceHierarchies(平行继承体系)
Lazy Class(冗赘类)
Speculative Generality(夸夸其谈未来性)
Temporary Field(令人迷惑的暂时字段)
Message Chains(过度耦合的消息链)
Middle Man(中间人)
Inappropriate Intimacy(狎昵关系)
Alternative Classes with Different Interfaces(异曲同工的类)
Incomplete Library Class(不完美的库类)
Data Class(纯稚的数据类)
Refused Bequest(被拒绝的遗赠)
Comments(过多的注释)
Extract Method(提炼函数)
Inline Method(内联函数)
Inline Temp(内联临时变量)
Replace Temp with Query(以查询取代临时变量)
Introduce Explaining Variable(引入解释性变量)
Split Temporary Variable(分解临时变量)
Remove Assignments to Parameters(移除对参数的赋值)
Replace Method with Method Object(以函数对象取代函数)
Substitute Algorithm(替换算法)
Move Method(搬移函数)
Move Field(搬移字段)
Extract Class(提炼类)
Inline Class(将类内联化)
Hide Delegate(隐藏"委托关系")
Remove Middle Man(移除中间人)
Introduce Foreign Method(引入外加函数)
Introduce Local Extension(引入本地扩展)
Self Encapsulate Field(自封装字段)
Replace Data Value with Object(以对象取代数据值)
Change Value to Reference(将值对象改为引用对象)
Change Reference to Value(将引用对象改为值对象)
Replace Array with Object(以对象取代数组)
Duplicate Observed Data(复制"被监视数据")
Change Unidirectional Association to Bidirectional(将单向关联改为双向关联)
Change Bidirectional Association to Unidirectional(将双向关联改为单向关联)
Replace Magic Number with Symbolic Constant(以字面常量取代魔法数)
Encapsulate Field(封装字段)
Encapsulate Collection(封装集合)
Replace Record with Data Class(以数据类取代记录)
Replace Type Code with Class(以类取代类型码)
Replace Type Code with Subclasses(以子类取代类型码)
Replace Type Code with State/Strategy(以State/Strategy取代类型码)
Replace Subclass with Fields(以字段取代子类)
Decompose Conditional(分解条件表达式)
Consolidate Conditional Expression(合并条件表达式)
Consolidate Duplicate Conditional Fragments(合并重复的条件片段)
Remove Control Flag(移除控制标记)
Replace Nested Conditional with Guard Clauses(以卫语句取代嵌套条件表达式)
Replace Conditional with Polymorphism(以多态取代条件表达式)
Introduce Null Object(引入Null对象)
Introduce Assertion(引入断言)
Rename Method(函数改名)
Add Parameter(添加参数)
Remove Parameter(移除参数)
Separate Query from Modifier(将查询函数和修改函数分离)
Parameterize Method(令函数携带参数)
Replace Parameter with Explicit Methods(以明确函数取代参数)
Preserve Whole Object(保持对象完整)
Replace Parameter with Methods(以函数取代参数)
Introduce Parameter Object(引入参数对象)
Remove Setting Method(移除设值函数)
Hide Method(隐藏函数)
Replace Constructor with Factory Method(以工厂函数取代构造函数)
Encapsulate Downcast(封装向下转型)
Replace Error Code with Exception(以异常取代错误码)
Replace Exception with Test(以测试取代异常)
Pull Up Field(字段上移)
Pull Up Method(函数上移)
Pull Up Constructor Body(构造函数本体上移)
Push Down Method(函数下移)
Push Down Field(字段下移)
Extract Subclass(提炼子类)
Extract Superclass(提炼超类)
Extract Interface(提炼接口)
Collapse Hierarchy(折叠继承体系)
Form Tem Plate Method(塑造模板函数)
Replace Inheritance with Delegation(以委托取代继承)
Replace Delegation with Inheritance(以继承取代委托)
Tease Apart Inheritance(梳理并分解继承体系)
Convert Procedural Design to Objects(将过程化设计转化为对象设计)
Separate Domain from Presentation(将领域和表述/显示分离)
Extract Hierarchy(提炼继承体系)
代码 Code Review
不想重复说了,同单元测试一样重要。
总结
以上是个人经过理论学习,实践检验后总结的一篇文章,其中大部分观点、素材皆来自网络和公司敏捷活动中所得。我想要说的是,我是支持这些观点的,我认为这些方法论可以很好的指导日常开发工作,能够解决实际问题,That's All。