ITPUB??ì3
ITPUB论坛 » 项目过程 » 敏捷软件开发:原则、模式与实践

标题: [精华] 敏捷软件开发:原则、模式与实践
离线 developerm
海豚


精华贴数 0
个人空间 0
技术积分 2515 (590)
社区积分 2106 (525)
注册日期 2005-3-21
论坛徽章:24
现任管理团队成员ITPUB元老会员2007贡献徽章嫦娥生肖徽章2007版:羊2008北京奥运纪念徽章:田径
ITPUB新首页上线纪念徽章生肖徽章:猪    

发表于 2007-10-11 15:25 



__________________
不以物喜,不以已悲,达则兼济天下、穷则独善其身!
只看该作者    顶部
离线 X-Power
老会员



精华贴数 0
个人空间 0
技术积分 782 (2313)
社区积分 47 (4765)
注册日期 2006-6-14
论坛徽章:4
行业板块每日发贴之星ITPUB新首页上线纪念徽章开发板块每日发贴之星开发板块每日发贴之星  
      

发表于 2007-10-17 08:42 
多谢啦


__________________
只看该作者    顶部
离线 lawer-bbc
版主


精华贴数 2
个人空间 0
技术积分 17086 (53)
社区积分 2195 (509)
注册日期 2007-1-12
论坛徽章:107
现任管理团队成员管理团队2007贡献徽章会员2007贡献徽章ITPUB新首页上线纪念徽章  
      

发表于 2007-10-29 20:40 
敏捷开发的精神内涵

从根本上来说,所有的敏捷开发实践,诸如TDD(译注1)、结对编程(译注2)、持续集成(译注3)和重构(译注4),都有一个统一的观念--永远不被阻拦。这就好像是一个优秀的撞球选手总要确保他的每一次击球都能为下一击创造好机会,每个优秀的敏捷开发者每有一点进展也都要确保下一步。一个优秀的敏捷开发者决不会走出一步,然后就无法再有进展,或是让别人没办法再有进展。

那你怎么知道你的进度停下来了呢?如果你无法让系统运行,进度就是停下来了。如果你不能通过测试,进度就是停下来了。在敏捷世界里,进度只能由通过测试的可运行系统来衡量。如果系统无法运行或是测试失败,那么所有的进度都会停下来,因为反馈循环能告诉我们代码出了问题还是一切良好。当编写的代码无法执行的时候,就好像是驾驶着汽车却看不到挡风玻璃的外面。车轮或许还在转动,但你不知道正在驶往哪个方向,或许你正要驶落悬崖。保持系统随时可运行就像是保持挡风玻璃的清洁。除非我们能看见东西,否则我们无法取得进展。

仔细想想,例如,两个程序员正开发一个项目。Jack说他要写J模块,而Bob说他要写B模块。当Bob写代码写到一个程度就必须要去找J。可是J还没完成, Bob就不得不等。假如Bob那时是个优秀的敏捷开发者,他决不会让事情发展到那一步。他会给J创建一个接口,然后用假代码(stub code)实现它,这样他就可以使得自己那部分的测试能持续运行,因而可以继续开发下去。

设想一个四人团队工作在一个三层架构的管理信息系统上。他们已经通过架构的抽象层次来分好了工。Gerry和George工作在GUI上,Marvin在中间层,而Debeay在数据库。当增加新功能的时候,Debeay做的头一件事情就是去改变开发库的表结构。GUI要等中间层运行起来了才能运行。 Debeay已将黑漆涂洒在了挡风玻璃上,整个团队就像是瞎子开车。假如Debeay那时是个优秀的敏捷开发者,她会发现一种能够循序渐进的修改数据结构的方法,增加新的列或是表而不用改变旧的。一直到迭代的最终完成,数据结构会达到成品的样子,而系统在此过程中绝不会中止运行。

保持系统能够持续运行是第一目标。你绝不会做出一些事情以至于会让系统被破坏超过几秒钟。如果你要做一个巨大的设计改变,你会找到一种方式,让每一步的改变都微小到可以确保系统能运行。如果你能找到一种方式能保持所有测试的可持续运行,就不会让系统中止超过几秒钟。

这可不是一个容易掌握的观念。开发者总是习惯于做出一些改变把整个系统搞乱,然后再试图去一块块的拼凑起来。很多人很热衷于这种体验。其实,我曾于一个开发者交谈,他说把系统撕得粉碎再把它拼凑起来是一个程序员所必需的本事。他为他有能力做这种事而感到自豪。因为这对他的自尊来说很重要,我不得不很礼貌的劝说他,他的这种自我成就感是建立在他所冒的风险和为雇主创造利润背道而驰的基础上的。实际上,他对这种赖以生存的能力感到欢喜雀跃。他是一个嗜险成性的人,而且他在拿雇主的财产冒险,这可不是专业行为。敏捷开发好像一场谨慎的象棋游戏,不是一个不计后果的code-chicken游戏(译注5)。优秀的敏捷开发者为他们的目标小心的策划了一条路线,那就是每走一小步都能保持系统的可运行和测试的通过。

一些开发者认为这样做效率低而且缓慢。他们觉得先把系统弄乱然后再重组为一个新的会来得更快些。也许有时候这样做更快些,然而,这样做就像是你想要开车去商店,于是就调整方向直指商店,把挡风玻璃漆成黑色,然后不管红灯和路况就径直的朝着商店开。如果碰巧能行,你就开得更快。但更多的时候这么开在路上就会出岔子。

这个目标可以延伸到团队和组织的各个层面。决不被阻拦意味着你设置好了你的开发环境以至于阻拦的事情不会发生。优秀的敏捷团队使用不被阻拦的源代码控制方法。如果Bill有个模块已经签出(check out),Bob也可以将其签出,但第一个拆入(check in)的人是成功的。假设核心团队正在为我们打造一个可复用的框架,而我们需要的一些功能还没就绪,我们会先自己写好它,等他们好了的时候再使用核心团队的功能。如果企业架构支持我们的这种迂回婉转的方式,那么我们就只需花上几天时间来学习它,然后就能忽略企业架构,而让功能的开发以一种简单的方式来进行。我们就不会被阻拦。

译注:

1,TDD,测试驱动开发,详情请参见“TDD的三条军规”。

2,结对编程,pair programming,又译作“配对编程”。代码由结对的程序员使用一台电脑共同完成。结对人员中的一位控制编码,另一位观察正输入的代码并寻找代码中的错误和可改进地方。两人频繁互换角色,而且结对的关系每天至少改变一次,以便每个程序员在一天中可以在两个不同的结对中工作。据Laurie Williams和Nosek的研究表明,结对非但不会降低开发团队的效率,而且会大大减少缺陷。

3,持续集成,continuous integration。程序员每天会多次拆入(check in)他们的代码并进行集成,规则很简单,第一个拆入的只要完成拆入就可以了,所有其他的人负责代码的合并(merge)工作。为了避免合并时间过长,团队的成员会非常频繁的拆入他们的模块。因此,XP团队每天会进行多次系统构建,并重新创建整个系统。

4,重构,refactoring。随着我们添加一个个特性或是处理一个个错误,代码的结构会逐渐退化,最终会导致纠结不清,难于维护。XP团队通过经常性的代码重构来扭转这种退化。重构就是在不改变代码行为的前提下,对其进行一系列小的改造,旨在改进系统结构的实践活动。

5,code-chicken,密码鸡,一种在北美颇为流行的益智类游戏。

(原文链接网址:http://www.butunclebob.com/Artic ... eOfAgileDevelopment; Robert C. Martin的英文blog网址: http://www.butunclebob.com/ArticleS.UncleBob)

作者简介:Robert C. Martin(昵称Uncle Bob)是Object Mentor公司总裁,面向对象设计、模式、UML、敏捷方法学和极限编程领域内的资深顾问。他不仅是Jolt获奖图书《敏捷软件开发:原则、模式与实践》(中文版)(《敏捷软件开发》(英文影印版))的作者,还是畅销书Designing Object-Oriented C++ Applications Using the Booch Method的作者。Martin是Pattern Languages of Program Design 3和More C++ Gems的主编,并与James Newkirk合著了XP in Practice。他是国际程序员大会上著名的发言人,并在C++ Report杂志担任过4年的编辑。


__________________
If you don't know where you're going, any road will do.If you don't know where you are, a map won't help.
E-mail:max656798@21cn.com
只看该作者    顶部
离线 lawer-bbc
版主


精华贴数 2
个人空间 0
技术积分 17086 (53)
社区积分 2195 (509)
注册日期 2007-1-12
论坛徽章:107
现任管理团队成员管理团队2007贡献徽章会员2007贡献徽章ITPUB新首页上线纪念徽章  
      

发表于 2007-11-15 15:15 
回顾一下《敏捷软件开发宣言》

我们正在通过亲身实践和帮助他人实践,揭示更好的软件开发方法。通过这项工作,我们认为:
个体和交互 胜过 过程和工具
可以工作的软件 胜过 面面俱到的文档
客户合作 胜过 合同谈判
相应变化 胜过 遵循计划
虽然右项也具有价值,
但我们认为左项具有更大的价值。

原则性的东东我们做到了那些?


__________________
If you don't know where you're going, any road will do.If you don't know where you are, a map won't help.
E-mail:max656798@21cn.com
只看该作者    顶部
离线 lawer-bbc
版主


精华贴数 2
个人空间 0
技术积分 17086 (53)
社区积分 2195 (509)
注册日期 2007-1-12
论坛徽章:107
现任管理团队成员管理团队2007贡献徽章会员2007贡献徽章ITPUB新首页上线纪念徽章  
      

发表于 2007-11-16 15:27 
学习《敏捷宣言遵循的原则》

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

好的原则,知易行难的原则。作为努力的方向吧!


__________________
If you don't know where you're going, any road will do.If you don't know where you are, a map won't help.
E-mail:max656798@21cn.com
只看该作者    顶部
离线 lawer-bbc
版主


精华贴数 2
个人空间 0
技术积分 17086 (53)
社区积分 2195 (509)
注册日期 2007-1-12
论坛徽章:107
现任管理团队成员管理团队2007贡献徽章会员2007贡献徽章ITPUB新首页上线纪念徽章  
      

发表于 2007-11-18 17:45 
看看《面向对象设计的原则》

SRP
单一职责原则
就一个类而言,应该仅有一个引起它变化的原因。
OCP
开发-封闭原则
软件实体(类、模块、函数等)应该是可以扩展的,但是不可修改。
LSP
Liskov替换原则
子类型必须能够替换掉它们的基类型。
DIP
依赖倒置原则
抽象不应该依赖于细节,细节应该依赖于抽象。
ISP
接口隔离原则
不应该强迫客户依赖于他们不用的方法。接口属于客户,不属于它所在的类层次结构。
REP
重用发布等价原则
重用的粒度就是发布的粒度。
CCP
共同封闭原则

包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包产生影响,则对该包中所有类产生影响,而对其他包不造成任何影响。
CRP
共同重用原则

一个包中的所有类应该是共同重用的。如果重用了包中的一个类,那么就要重用包中所有类。
ADP
无环依赖原则

在包的依赖关系图中不允许存在环。
SDP
稳定依赖原则

朝着稳定的方向进行依赖。
SAP
稳定抽象原则

包的抽象程度应该和其稳定程度一致。

开篇后前几页都是些原则性的东东呕。。。


__________________
If you don't know where you're going, any road will do.If you don't know where you are, a map won't help.
E-mail:max656798@21cn.com
只看该作者    顶部
离线 lawer-bbc
版主


精华贴数 2
个人空间 0
技术积分 17086 (53)
社区积分 2195 (509)
注册日期 2007-1-12
论坛徽章:107
现任管理团队成员管理团队2007贡献徽章会员2007贡献徽章ITPUB新首页上线纪念徽章  
      

发表于 2007-11-19 21:33 
了解《极限编程实践》的概念
完整团队
XP项目的所有参与者(开发人员、业务分析师、测试人员等等)一起工作在一个开放的场所中,他们是同一个团队的成员。这个场所的墙壁上随意悬挂着大幅的、显著的图表以及其他一些显示他们进度的东西。
计划游戏
计划是持续的,循序渐进的。每2周,开发人员就为下2周估算候选特性的成本,而客户则根据成本和商务价值来选择要实现的特性。
客户测试
作为每个所期望的特性的一部分,客户定义出自动验收测试来表明该特性可以工作。
简单设计
    团队保持设计恰好和当前系统功能相匹配,它通过了所有的测试,不包含任何重复,表达出了编写者想表达的所有东西,并且包含尽可能少的代码。
结对编程
    所有的产品软件都是由两个程序员、并排坐在一起在同一台机器上构建的。
测试驱动开发
    程序员以非常短的循环周期工作,他们先增加一个失败的测试,然后再使之通过。
改进设计
    随时改进糟糕的代码,保持代码尽可能的干净、具有表达力。
持续集成
    团队总是使系统完整地被集成。
集体代码所有权
    任何结对的程序员都可以在任何时候改进任何代码。
编码标准
    系统中所有的代码看起来就好像是被单独一个——非常值得信任的——人编写的。
隐喻
    团队提出一个程序工作原理的共同景像。
可持续的速度
    团队只有持久才有获胜的希望。他们以能够长期维持的速度努力工作。他们保存精力,他们把项目看作是马拉松长跑,而不是全速短跑。

极限编程的思想在很多开发团队中得到不同程度的应用。。。


__________________
If you don't know where you're going, any road will do.If you don't know where you are, a map won't help.
E-mail:max656798@21cn.com
只看该作者    顶部
离线 lawer-bbc
版主


精华贴数 2
个人空间 0
技术积分 17086 (53)
社区积分 2195 (509)
注册日期 2007-1-12
论坛徽章:107
现任管理团队成员管理团队2007贡献徽章会员2007贡献徽章ITPUB新首页上线纪念徽章  
      

发表于 2007-11-21 00:50 
《敏捷软件开发:原则、模式与实践》
第I部分 敏捷开发之篇首语
作者首先引用了Tom DeMacro和Timothy Lister在《人件》第5页的话,“人与人之间的交互是复杂的,并且其效果从来都难以预期,但却是工作中最为重要的方面。”
然后从三个层次阐述了对引言的理解:
(一)原则、模式和实践都是重要的,但是使它们发挥作用的是人。正如Alistair Cockburn所说,“过程和方法对于项目的结果只有次要的影响,首要的影响是人。”
(二)如果想要项目取得成功,就必须构建起具有合作精神的、自组织的团队。
(三)那些鼓励构建这种团队的公司比那些认为软件团队不过是由无关紧要的、雷同的一群人堆砌的公司具有大得多的竞争优势,有凝聚力的团队将具有最强大的软件开发力量。

人、团队、公司,逐层深入、环环相接,发人深省啊。


__________________
If you don't know where you're going, any road will do.If you don't know where you are, a map won't help.
E-mail:max656798@21cn.com
只看该作者    顶部
离线 lawer-bbc
版主


精华贴数 2
个人空间 0
技术积分 17086 (53)
社区积分 2195 (509)
注册日期 2007-1-12
论坛徽章:107
现任管理团队成员管理团队2007贡献徽章会员2007贡献徽章ITPUB新首页上线纪念徽章  
      

发表于 2007-11-21 23:49 
《敏捷软件开发:原则、模式与实践》

第I部分 敏捷开发 第1章 敏捷实践之篇首语
海因里希•海涅(1797—1856,德国诗人)说:“教堂尖顶上的风标,即使由钢铁制成,如果不懂得顺应风势的艺术,一样会被暴风立即摧毁。”
许多人都经历过没有实践的指导而导致的项目噩梦。缺乏有效的实践会导致不可预测性、重复的错误以及努力的白白浪费。延期的进度、增加的预算和低劣的质量致使客户对我们丧失信心。更长时间的工作却生产出更加低劣的软件产品,也使得开发人员感到沮丧。
一旦经历了这样的惨败,就会害怕重蹈覆辙。这种恐惧激发我们创建一个过程来约束我们的活动、要求有某些人为制品(artifacts)输出。我们根据过去的经验来规定这些约束和输出,挑选那些在以前项目中看起来好像工作得不错的方法。我们希望这些方法这次还会有效,以消除我们的恐惧。
然而,项目并没有简单到使用一些约束和输出就能可靠防止错误的地步。当连续犯错误的时候,我们会对错误进行诊断,并在过程中增加更多的约束和人为制品来防止以后重犯这样的错误。经过多次这样的增加之后,我们就会不堪巨大、笨重的过程的重负,极大地降低我们完成工作的能力。
一个大而笨重的过程会产生它本来企图去解决的问题。它降低了团队的开发效率,使得进度延期、预算超支。它降低了团队的响应能力,使得团队经常创建错误的产品。遗憾的是,许多团队认为,这种结果是他们没有采取更多的过程方法引起的。因此,在这种失控的过程膨胀中,过程会变得越来越庞大。
用失控的过程膨胀来形容2000年前后的许多软件公司的情形是很合适的。虽然有很多团队在工作中没有使用过程的方法,但是采用庞大、重型的过程方法的趋势却在快速增长,在大公司中尤为如此。

看到过程方法的由来、演变,不难体会过犹不及。。。


__________________
If you don't know where you're going, any road will do.If you don't know where you are, a map won't help.
E-mail:max656798@21cn.com
只看该作者    顶部
离线 allen8cs
初级会员



精华贴数 0
个人空间 0
技术积分 8 (114659)
社区积分 0 (1431575)
注册日期 2007-6-18
论坛徽章:0
      
      

发表于 2007-11-22 21:05 
thanks a lot


只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问