它山之石可以攻玉! //注:本BLOG中标注“原创”的文章为本人版权所有,未经许可不得擅自使用,如有引用请注明作者“谷雨霖”。msn: cabinhome@sohu.com

敏捷开发大家谈(四)

上一篇 / 下一篇  2008-05-15 12:55:55 / 个人分类:项目管理

(五) Extreme Programming
@cd|#Ao3Y0
Q6|&p)\7Ykl mPU&F0Extreme Programming(XP,极限编程) 是一种轻量级的软件开发方法,它使用快速的反馈,大量而迅速的交流,经过保证的测试来最大限度的满足用户的需求。XP强调用户满意,开发人员可以对需求的变化作出快速的反应。XP强调team work。项目管理者,用户,开发人员都处于同一个项目中,他们之间的关系不是对立的,而是互相协作的,具有共同的目标:提交正确的软件。XP强调4个因素:
`y"TY%Y W {R0交流(communication),XP要求程序员之间以及和用户之间有大量而迅速的交流ITPUB个人空间o(\0y7|$`C
简单(simplicity),XP要求设计和实现简单和干净
&Z O y| PYc,c0反馈(feedback)通过测试得到反馈,尽快提交软件并根据反馈修改
8G6kh+Wy!l0D0勇气(courage)。勇敢的面对需求和技术上的变化
AHP*~Lu9DK0
^&L@$Q _0XP特别适用于需求经常改变的领域,客户可能并系统的功能并没有清晰的认识,可能系统的需求经常需要变动。ITPUB个人空间kv)OYC-L
XP也适用于风险比较高的项目,当开发人员面对一个新的领域或技术时,XP可以帮助减低风险ITPUB个人空间X;ic5PI
XP适用于小的项目(人员上),人员在2-12人之间,XP不适用于人员太多的项目,事实上,在需求经常变化或风险比较高的项目中,少量而有效的XP开发人员效率要远远高于大量的开发人员。
G(s8]4b}&Gb/p0
4l U;Z6?)Y^h0下面是XP的开发流程
![,f Jg!c/w O0ITPUB个人空间%u2si8V;w'kA"x/TU
ITPUB个人空间S8oumDT
XP的原则和实践:ITPUB个人空间0dd$dx Nd/T2|
ITPUB个人空间8{$}1F!@o[K
1 Planning:
p-}*X0UNCn1x0
'Ss$u3c3a(`(C$kg01)user stories。
a&Y:ymewA7]S0User stories类似use case,描述用户所见的系统功能,但避免使用大量的文档,user stories由用户编写(不仅限于描述用户界面)。User stories使用用户的语言编写,不使用技术性的语言,每个user stories限于几句话。User stories用于在release plan会议上对开发时间进行评估,也用于产生验收测试(acceptance test),必须使用可以自动进行的验收测试保证软件的正确性。User stories与传统的用户需求的区别在于详细的程度,user stories并不会确定需求的每个细节,它只是用来简单的描述系统功能,供开发人员进行估计开发进度,ITPUB个人空间.d5t]Z Q'e

2Z&L E4K7RtDH{0在开发过程中开发人员和用户会不断的交流以讨论细节问题。User story应该专注于功能,不应该过分注重用户界面等细节。一般一个user storiy在1-3周的时间完成,如果估计超过3周,说明user story太大了,需要细分。ITPUB个人空间/Tp%yrt#Cr

!f]A+}(X02)release plan.
I [fZd;KR0Y0召开一个release plan会议,产生release plan。Release plan将用于指定每个iteration的计划。开发人员对每个user story估计开发时间(在不被打断,无其他工作情况下的开发时间,包括测试),用户对user stories给出优先级,release plan会议并不制订每个iteration的计划。Release plan要用户,开发人员和管理者都同意,在完成功能范围(scope),使用资源(resource),时间(time)和质量(quality)上达成一致(一般质量是不能改变的)ITPUB个人空间h6o;R2?;])D

t1[ M3Nf?;{6?d03) small releaseITPUB个人空间sB^)HDQ _y/v
often and small release是XP的一个原则,每个release完成一些用户有意义的功能集合,尽快的提交给用户以获得反馈,及时调整,提交的越晚,调整越困难。
^D/D U{04)project velocity
+h;K0dX%_avc0团队在开发过程中要收集数据,以便于对自己的开发速度进行评估,用于以后的releazse planITPUB个人空间*q e!v ^OD-R"@

!Ti7d S8kwDqS05)iterationITPUB个人空间bAu{Gi
每个small release的周期称为iteration,每个iteration约为1-3周,在一个项目中保持每个iteration的时间相等,不要超前制定计划,每个iteration的计划在iteration的开始时制定。这样能够更灵活的应付变化。不要急于完成本次iteration没有包括的功能。要注重每个iteration的时间限制,当团队觉得不能按时完成iteration时,召开一次iteration plan会议,重新评估,减少一些user stories。ITPUB个人空间3T5p'A,H%P\N
ITPUB个人空间*n%z3K#oYE3M*{
下面是iteration的图示:
YO_,x\0ITPUB个人空间K)Gox}Bw;_~
 ITPUB个人空间I'{h b"| @
ITPUB个人空间^0L9M3H'i| ~ QZ
6)iteration plan
&P5?F } M!A3s$cD({-c0在每个iteration开始的时候召开会议,从release plan中选择还没有实现的用户最迫切需要的user stories。上一个iteration中没有通过验收测试的功能也要在这个iteration中实现。可以根据上一个iteration的实践调整团队速度。User stories和失败的测试被分解成programming task,task使用技术语言编写,作为iteration plan的详细描述。程序员主动领取task并估计完成时间,每个task应该在1-3天内完成,超过3天的task应该被细分。如果整个团队需要的时间多于或少于规定的iteration时间,调整user stories。ITPUB个人空间.F C4W\6w;W|

W^1f#Up#r4j07)move people around
:a!TP4SS!X0不要使每个开发人员局限于一项工作,不要使某项工作依赖于一个开发人员,增加知识共享,减少信息孤岛,多进行交流和培训。当项目中的所有人对所有模块都了解并可以进行开发时是效率最高的,鼓励开发人员在不同iteration中开发不同的模块。ITPUB个人空间}P R|hJF

s"ffE$R5?l(~)b&_08) stand-up meetingITPUB个人空间%m"\S/Ur x7N]9Voq
每天工作开始之前,开5-10分钟的stand-up会议(站立会议),站立的目的是为了强迫节省时间,会议的目的是交流,提出存在的问题,但不要在会议上解决问题。开一个所有人员参加的短会比多个个别人员参加的会议要高效。在会议上提出的问题可以由少数人讨论解决,这个少数人参加的会议如果涉及到代码,可以在计算机前讨论。
UOM$|Mj L0ITPUB个人空间_*Ob']|P)I(n
9) fix XP when it breaksITPUB个人空间 O&OjE6c\`n%^f q+e
XP并不是一成不变的,当团队觉得需要修改的时候,可以根据自己的情况进行修改,任何修改都要经过整个团队的讨论和达成一致
*N!n2_2|F} y0ITPUB个人空间 uV:m/n;HQl
2 DesigningITPUB个人空间9I$U'L;`!YD+LW

Zj5X y qc(?01) SimplicityITPUB个人空间,Z6~ O|$P!^
保持简单的设计,在完成同样的功能的情况下,选择简单的设计,不要急于设计没有计划的功能,应该认识到:keeping a design simple is hard workITPUB个人空间;V0E!MY9Zt
ITPUB个人空间` fq5t7A{0S
2)system metaphor
f,yS!nZq;~ w'[U0使用统一的术语描述系统,在用户,管理者和开发人员之间使用统一的术语。这将使交流清晰。
:}-H#p ef)xM6Y4`x0
o%}!~qkh,c$PaR03)CRC cardITPUB个人空间5gfHB }es0IR
使用CRC(Class, Responsibilities, and Collaboration) card进行系统设计,鼓励更多的人参加设计。每个CRC卡片表示系统中一个对象,写上对象的名字,责任和每个责任需要交互的其他对象。可以模拟对象之间的交互。CRC卡片是易于理解的,但是是非正式的,如果需要正式的文档,要将卡片转换为相应的文档。
{E5L,}o c0ITPUB个人空间l1?$PjI[5c9e
4) spike solution
W)P$h0HI1?X2V0使用spike solution减低风险,当遇到技术难题或设计问题时,使用简单的程序进行测试,找出问题,在不同的解决方法之间进行评估。在早期进行实验可以有效的降低风险。
3C-Ge'X/L_0
'Wf0al1y4y05)never add function early
R@:Mv*s0不要过早的设计没有计划的功能,在一个需求经常变化的环境中,过早的设计经常是没有用的。ITPUB个人空间5r2l`M_(bcs O;`\
ITPUB个人空间Oi$[wq$nr"^
6)refactoringwhenever and whereverITPUB个人空间[(i&N4|M2O
XP鼓励对设计和代码经常进行重构(Refactoring),目的是去除冗余,提高质量,保持设计简单。重构必须以完全测试为检验条件
!FK/nEGX3l0
(exq-o x$G(T^o0ITPUB个人空间(d`qhf+QXo%Kn
3 Coding
3wovp4_"M'Z#@0ITPUB个人空间 @%T&noO'Y$^
1) customer is alaways available
zu(\S'|9k0用户是项目组的成员之一,用户的参加贯穿整个开发过程,用户与开发人员之间的交流是重要的ITPUB个人空间1e!vk4EABE"W

'Uw'k9{i \ x|mx02) coding standard
pL'E2b+Nt]-q0使用统一的编码标准,这是保持代码整洁和共享代码的基础ITPUB个人空间$Gt^(e)w&mH
ITPUB个人空间6|%fF?\X0}
3)coding unit test first
d c$mN,G0x,y/meP0test first是XP的一个特点,在编写代码之前先编写单元测试代码,单元测试代码和代码由同一个程序员完成。先编写测试代码可以使程序员更好的理解需求,避免直接编码造成的理解偏差,对需求的不清晰,可以在编写测试代码时就发现。测试代码也是检验程序是否完成的标准。编码工作应该是以下工作的循环:
1KB |*h2b01 编写测试代码ITPUB个人空间U,I} ql,^
2 运行测试程序,确认失败ITPUB个人空间v'c0q}W%tb
3 编写实现这个测试程序要求功能的代码,不需要实现其他的功能,只需要实现刚刚满足测试程序的功能
8whxC\mG-x4x04 运行测试程序,确认成功ITPUB个人空间+Go)TK@8m:_O
实践证明,test first方式需要的编码实践少于先编码,后写测试代码
@5_#w4A6K5NY qs0
u'v#d.Q4hF04) Pair Programming
.L!U/N"L[nP#ro;j0Pair programming是XP的特色,它要求两个程序员在一台计算机上同时进行编程工作。共用鼠标和键盘,通常一个人进行战略上的思考,程序架构和函数,类之间的关系,一个人进行输入和战术上的思考,完成函数和类。两个人可以经常交换角色。Pair programming需要一段时间学习和适应,实践证明pair programming并不消耗更多的时间(人*小时),但是代码的质量得到很大的提高。(避免将两个新手放在一个pair中)ITPUB个人空间{o/\1F IG:x

{!Lk:t+th6m9i_*n05)sequential integrationITPUB个人空间!o9ml,J$D_Cz[`
要保证源代码库的状态是可标识的,同一时间,只允许一个pair的程序进行整和和测试,这样可以缩小问题产生的范围。不同的pair可以在自己的机器上随时进行整和和测试.ITPUB个人空间6`'] ?A*rOn C

m#dj$w Yi/s06) integrate often
*owF`9Q URQ0只要有可能就进行代码整合,周期可以在几个小时,最好不要超过一天。经常的整合可以避免错误的积累,可以增加可重用的代码。在一个pair认为适当的时候并通过了所有的unit test,就可以进行整合,整合后的代码必须通过测试。同一时间,只允许一个pair进行整合。(整合失败是不是要退回原有状态,供其他pair整合??)
;Zo[ Qu#B0ITPUB个人空间:F'cW@ j$\
7) 共同拥有代码ITPUB个人空间(sv q~/b0e
鼓励每个人对项目中的任何人提出新的想法,任何开发人员对项目中的任何代码都可以进行增加功能,改正错误和重构。没有代码或开发人员成为瓶颈。(我的想法:这确实很难理解,但是这确实是我梦想的目标)。为了达到这个目标,任何的代码都必须有相应的测试代码,任何代码的修改必须100%通过测试。必须加强开发人员的交流和知识共享,必须坚持统一编码标准。Pair programming可以经常交换伙伴。ITPUB个人空间WO zU n2C{L-`

6P k_ Q e']08)优化工作放在最后
5G.]P Neh `6Ko A7U0先使系统能够正常工作,不要猜测系统的瓶颈,要实际测量
@y7UDH ~0
-g0A8c-p;vBf5B09)NO overtimeITPUB个人空间$j\0Nx4k'i k
不要长时间的加班,大多数加班并不能挽回已有的延迟,连续超过两个星期的加班说明有问题存在。向一个已经延迟的项目填加人员也不是一个好的选择。
m]3A(M(q.^Z-j0
3}1FhS;j Sp*_0 ITPUB个人空间'UC8m@W'n"oVz!\)g

Ar Z:T9l ]6l^+f0ITPUB个人空间!]+mPR,axPA
4TestingITPUB个人空间`^Ljz

)a7K0|7R D)b01)所有的代码都有单元测试
X"]Q6ap.xlnz0单元测试是XP的基石,XP中的单元测试应该是可以自动进行的,所以可以很快的进行所有的单元测试,单元测试应该在编码之前创建。单元测试的代码和代码一起release,没有单元测试的代码不能够release。使用自动单元测试可以系统整合时节省大量的发现错误和改正的时间。单元测试越完善,节省的时间越多。对面向对象的编程来说,应该对每个类都有单元测试。完善的单元测试也是共同拥有代码的保证。单元测试也是可以经常重构的保证,每次重构后的代码都要重新进行测试ITPUB个人空间1~j[I2Dk1uZa
(这里的unit test好象不只限于测试某个模块的功能???,应该可以测试整合起来的整个系统,这样才能保证整合的正确性。)ITPUB个人空间l Hz,r^:]n&M9Z
ITPUB个人空间T'c O$u,R.lS F4L
2)代码在release前必须通过所有的单元测试ITPUB个人空间3G&M7`4jcA7u
ITPUB个人空间EGc,r`:}9m
3) 发现bug后,首先增加测试
!xPuZ$\k4v ?,J$\0在实际运行中发现bug,首先增加acceptance test,然后增加unit test,在增加完测试后在查找和修改代码,增加的测试保证同样的错误不会再出现ITPUB个人空间V.S)O-Q&YD%W5d
ITPUB个人空间[JG8P'h0}E
4) acceptance testITPUB个人空间-m@B.]3L'[
acceptance test根据user stories在iteration plan会议上创建,它也应该可以自动运行以便可以经常运行。User stories是否完成是以是否通过acceptance test为检验标准。ITPUB个人空间](P1jGN @,P
ITPUB个人空间YT*Se6r ngd7F
ITPUB个人空间-el u`v&Af5S/c!?Q
XP中的角色:ITPUB个人空间 AK(xg S p*I'b
ITPUB个人空间AY[ARz;?u"X
1 customer 用户
8x5Xk hBxt0在XP中,用户是项目组的一部分,用户负责编写use stories,确定优先级,和开发人员讨论需求,编写accept test,运行accept test,用户驱动iteration(release plan, iteration plan)
v,BQ!] p@-K0ITPUB个人空间G/NTj6sCl&~0h
2 开发人员
&wZf q1x `,r!H*[H0与用户讨论user stories,估计开发时间,将user stories细化成programming task
]:X7xA*cw0编写unit testITPUB个人空间3}5_4Wl H9Vl2Of`h,J
编码
f lP5|/Lp#@ F0进行重构ITPUB个人空间"eEh Bo4G1E
整合及测试,保证100通过ITPUB个人空间4jvHMA
ITPUB个人空间w.sk3n qA9yR,b
3 managerITPUB个人空间_?-vjLF6Y av[
负责对外联系,组织团队,获取必要的资源,管理团队
yqL1_%aN~Y+o0
7A3O2\ vZ+S9`04 tracker
+E0r5P yc}C0跟踪release plan/iteration plan/acceptance test
(?vN.L1Y+EJ0ITPUB个人空间,j6HF X0v6I"hnk
5 coachITPUB个人空间 n8M%s2[ D:iY
起顾问指导作用,mentor, monitor and helpITPUB个人空间O8@El PG
A Coach is respected, but also respectful. They’re willing to talk, but also willing to listen. They let the team explore, but provide a guard-rail in case of danger.ITPUB个人空间6Cns(Kj-Vtdy
监督进展,确保过程和规则,必要时改变过程,帮助解决问题,也可以参加pair programming。
_j7|O4v)xd'DM0 

TAG: 敏捷开发

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-09-07  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 27062
  • 日志数: 707
  • 文件数: 6
  • 书签数: 4
  • 建立时间: 2008-01-14
  • 更新时间: 2008-08-27

RSS订阅

Open Toolbar