前几天和同事们去西交大做校园宣讲,当然我是去帮忙加旁听的。:-) HR和同事们介绍了很多关于公司的情况,包括文化,价值观,敏捷开发等等,很多东西我都是第一次学习到,后来我对马同学说,你那富有激情的关于公司的敏捷介绍让我收获很大,他说我这句话给他很大的鼓舞,呵呵。
下面我将马同学的讲解简单介绍一下,首先看下面这个图:
这两个圆圈表示不同的视角上的敏捷实践,包括开发者视角和项目管理的视角。接下来从里向外进行介绍,因为有些实践我了解得不清楚,如果下面有哪些说得不对的地方也请大家指出。
Test-Driven Development,测试驱动开发,它是敏捷开发的最重要的部分。在ThoughtWorks,我们实现任何一个功能都是从测试开始,首先对业务需求进行分析,分解为一个一个的Story,记录在Story Card上。然后两个人同时坐在电脑前面,一个人依照Story,从业务需求的角度来编写测试代码,另一个人看着他并且进行思考,如果有不同的意见就会提出来进行讨论,直到达成共识,这样写出来的测试代码就真实反映了业务功能需求。接着由另一个人控制键盘,编写该测试代码的实现。如果没有测试代码,就不能编写功能的实现代码。先写测试代码,能够让开发人员明确目标,就是让测试通过。
Continuous Integration,持续集成。在以往的软件开发过程中,集成是一件很痛苦的事情,通常很长时间才会做一次集成,这样的话,会引发很多问题,比如build未通过或者单元测试失败。敏捷开发中提倡持续集成,一天之内集成十几次甚至几十次,如此频繁的集成能尽量减少冲突,由于集成很频繁,每一次集成的改变也很少,即使集成失败也容易定位错误。一次集成要做哪些事情呢?它至少包括:获得所有源代码;编译源代码;运行所有测试,包括单元测试、功能测试等;确认编译和测试是否通过,最后发送报告。当然也会做一些其它的任务,比如说代码分析、测试覆盖率分析等等。 在我们公司里,开发人员的桌上有一个火山灯用来标志集成的状态,如果是黄灯,表示正在集成;如果是绿灯,表示上一次集成通过,开发人员在这时候获得的代码是可用而可靠的;如果显示为红灯,就要小心了,上一次集成未通过,需要尽快定位失败原因从而让灯变绿。在持续集成上,我们公司使用的是自己开发的产品CruiseControl
Refactoring,重构。相信大家对它都很熟悉了,有很多很多的书用来介绍重构,最著名的是Martin的《重构》,Joshua的《从重构到模式》等。重构是在不改变系统外部行为下,对内部结构进行整理优化,使得代码尽量简单、优美、可扩展。在以往开发中,通常是在有需求过来,现在的系统架构不容易实现,从而对原有系统进行重构;或者在开发过程中有剩余时间了,对现在代码进行重构整理。但是在敏捷开发中,重构贯穿于整个开发流程,每一次开发者check in代码之前,都要对所写代码进行重构,让代码达到clean code that works。值得注意的是,在重构时,每一次改变要尽可能小,用单元测试来保证重构是否引起冲突,并且不只是对实现代码进行重构,如果测试代码中有重复,也要对它进行重构。
Pair-Programming,结对编程。在敏捷开发中,做任何事情都是Pair的,包括分析、写测试、写实现代码或者重构。Pair做事有很多好处,两个人在一起探讨很容易产生思想的火花,也不容易走上偏路。在我们公司,还有很多事都是Pair来做,比如Pair学习,Pair翻译,Pair做PPT,关于这个话题,钱钱同学有一篇很有名的文章对它进行介绍,名为Pair Programming (结对编程)。
Stand up,站立会议。每天早上,项目组的所有成员都会站立进行一次会议,由于是站立的,所以时间不会很长,一般来说是15-20分钟。会议的内容并不是需求分析、任务分配等,而是每个人都回答三个问题:1. 你昨天做了什么?2. 你今天要做什么? 3. 你遇到了哪些困难?站立会议让团队进行交流,彼此相互熟悉工作内容,如果有人曾经遇到过和你类似的问题,那么在站立会议后,他就会和你进行讨论。
Frequent Releases,小版本发布。在敏捷开发中,不会出现这种情况,拿到需求以后就闭门造车,直到最后才将产品交付给客户,而是尽量多的产品发布,一般以周、月为单位。这样,客户每隔一段时间就会拿到发布的产品进行试用,而我们可以从客户那得到更多的反馈来改进产品。正因为发布频繁,每一个版本新增的功能简单,不需要复杂的设计,这样文档和设计就在很大程度上简化了。又因为简单设计,没有复杂的架构,所以客户有新的需求或者需求进行变动,也能很快的适应。
Minimal Documentation,较少的文档。其实敏捷开发中并不是没有文档,而是有大量的文档,即测试。这些测试代码真实的反应了客户的需求以及系统API的用法,如果有新人加入团队,最快的熟悉项目的方法就是给他看测试代码,而比一边看着文档一边进行debug要高效。如果用书面文档或者注释,某天代码变化了,需要对这些文档进行更新。一旦忘记更新文档,就会出现代码和文档不匹配的情况,这更加会让人迷惑。而在敏捷中并不会出现,因为只有测试变化了,代码才会变化,测试是真实反应代码的。 这时有人会问:代码不写注释行吗?一般来说好的代码不是需要大量的注释吗?其实简单可读的代码才是好的代码,既然简单可读了,别人一看就能够看懂,这时候根本不需要对代码进行任何注释。若你觉得这段代码不加注释的话别人可能看不懂,就表示设计还不够简单,需要对它进行重构。
Collaborative Focus,以合作为中心,表现为代码共享。在敏捷开发中,代码是归团队所有而不是哪些模块的代码属于哪些人,每个人都有权利获得系统任何一部分的代码然后修改它,如果有人看到某些代码不爽的话,那他能够对这部分代码重构而不需要征求代码作者的同意,很可能也不知道是谁写的这部分代码。这样每个人都能熟悉系统的代码,即使团队的人员变动,也没有风险。
Customer Engagement ,现场客户。敏捷开发中,客户是与开发团队一起工作的,团队到客户现场进行开发或者邀请客户到团队公司里来开发。如果开发过程中有什么问题或者产品经过一个迭代后,能够以最快速度得到客户的反馈。
Automated Testing ,自动化测试。为了减小人力或者重复劳动,所有的测试包括单元测试、功能测试或集成测试等都是自动化的,这对QA人员提出了更高的要求。他们要熟悉开发语言、自动化测试工具,能够编写自动化测试脚本或者用工具录制。我们公司在自动化测试上做了大量的工作,包括Selenium开源项目。
Adaptive Planning,可调整计划。敏捷开发中计划是可调整的,并不是像以往的开发过程中,需求分析->概要设计->详细设计->开发->测试->交付,每一个阶段都是有计划的进行,一个阶段结束便开始下一个阶段。而敏捷开发中只有一次一次的迭代,小版本的发布,根据客户反馈随时作出相应的调整和变化。
敏捷开发过程与传统的开发过程有很大不同,在这过程中,团队是有激情有活力的,能够适应更大的变化,做出更高质量的软件。
本文地址: http://www.cnblogs.com/blusehuang/archive/2007/10/17/926802.html

posted on 2007-10-17 01:46
紫色阴影 阅读(11892)
评论(36) 编辑 收藏 网摘 所属分类:
Agile
评论
| 2007-10-17 08:35
学习并实践中。。。。。。
| 2007-10-17 09:04
学习下吧,大致看了下文章,本人对敏捷什么都不懂,不过感觉站立会议非常好,可以确定自己工作的方向,不致偏离。
| 2007-10-17 09:05
敏捷是好东西
我一直坚持在学习和使用
我感觉:
敏捷开发不是一种软件开发技术
敏捷开发是一种软件开发态度
敏捷开发的适用场景是在:
复杂多变的需求
或非典型的不确定型需求
如果是非常明确的需求,不合适适用敏捷开发
因为相对瀑布模型,敏捷开发需要更多及更高的人力资源
以及开发时间
| 2007-10-17 09:20
敏捷对人的要求太高了,不容易组织起这样的团队。
| 2007-10-17 09:29
"在我们公司里,开发人员的桌上有一个火山灯用来标志集成的状态"
--------------------------------
牛!
“我们公司使用的是自己开发的产品CruiseControl”
--------------------------------
更牛!
| 2007-10-17 09:31
结对编程
这个倒是不少公司可以做到的
只是这仅仅是敏捷的皮毛了
敏捷,要求整个软件开发过程的每个环节都要体现
可更改:敏捷默认任何东西都是要变的
快速版本提交:敏捷就是说可以很快得到响应,不论是要立刻看设计文档,还是立刻做一次系统集成
最小化复杂性:每次为了解决当前问题时都努力不做过度设计,方案就是针对目前的问题,扩展以后碰到了在说
| 2007-10-17 09:51
我好想敏捷一把..
| 2007-10-17 09:52
好想加入你们公司啊!^_^,多么有趣的工作。
| 2007-10-17 09:55
@随风逝去
是啊,而且团队每天的沟通,促进交流
| 2007-10-17 09:59
@徐少侠
当然如果确实是需求不变,那也不会出现这么多开发模型了
敏捷开发是用来适应变化,对人员要求很高,技术功底、沟通技巧和承受压力等等
| 2007-10-17 10:00
@Kevin_Shan
欢迎 欢迎 :)
| 2007-10-17 10:01
@徐少侠
恩 是的 敏捷是不考虑以后过多的扩展情况,只针对现有的需求来进行简单设计开发
| 2007-10-17 10:17
好文章。
支持敏捷开发。
不过好象国内使用敏捷开发的公司并不多。
| 2007-10-17 10:30
西交的演讲没去上,不过西电的演讲我去了。演讲确实很让人激动。以前只是大概知道敏捷是怎么回事。不过现在感觉这个开发过程是不错的。
| 2007-10-17 10:40
@YD
西交,西工大的我都去了,就是西电的没去 呵呵
| 2007-10-17 10:46
不错哦~
| 2007-10-17 11:57
@紫色阴影
大家都往好听了说, 我往不好听了说, 敏捷开发怎么看怎么象聚集一小部分能力达标的人外派到某项目做现场施工..., 如果真的严格做到接一个项目, 就只围绕这个项目尽心尽力, 说发标单位把这些人的这些时间给暂时雇佣打零工也未尝不可~
这说实在的, 就是国内外小公司最熟悉的做法, 没什么高深的. 敏捷的贡献其实不在于把重型变轻型, 相反是找出了一套适应于这种其实最普遍存在的开发过程的规范, 跟CMM也没啥本质区别. 不过从另一方面讲, 这种贡献是弥足珍贵的, 它可以作为结束野路子团队们混乱的开始.
但是说实话, 我不喜欢敏捷的宣传. 作为有利益存在的个体, 你们公司和一些大嘴搞这个绝对正当; 可问题是很多野路子团队未必下决心改头换面, 而是反而拉着一张虎皮做起了大旗, 我说不准也会成为其中一员也不一定. 我一向的想法是, 没有足够水平的人(技术水平和管理水平)压阵, 敏捷就和乱搞没什么两样, 而恰恰水平足够的人很少.
最后要说的是, 敏捷出现的背景可能很多人没有考虑, 现在实现任何一个东西, 成本比10年前大大降低了, 因为开源和复用造就的工具箱逐渐齐全. 有人说1个人或者1个小团队单挑的时代过去了, 我倒是觉得, 随着工具箱的充实, 开发者理念的成熟, 小团队单挑大项目的时代, 才刚刚开始...
最初的这段时间只是逐渐让用户了解和接受这种方式, 考虑到敏捷的宣传对小公司有利, 在这点上昧着良心, 我又嫌大嘴们宣传不够. 未来很有可能真正得利的, 不是MS/IBM不说, 甚至也不是Martin这样的团队, 培养起用户习惯, 才发现已经有了很多不吭不哈干起活却得心应手的一群人, 自己培养的人才也都出去压自己的阵去了. 比如LZ将来说不准就是这样一个公司的头儿也不一定 :)
LZ也不要说Martin自己举的那些例子, 或者你的所闻所见,证明敏捷已经能做多大的项目了. 首先项目大不代表项目的复杂度很难划分出一个一个适合小团队的子项目, 说白了就是存在着某个层面上的简单性, 这是当前敏捷做大项目的前提.
其次, 我又要说大家不高兴的了, 其实很多项目, 咱们觉得挺难挺大挺复杂, 只是因为咱们的认识水平太低. 90后的程序员赶上了最好的时代, 因为未来10年各种工具箱会逐渐的趋于完整和更加易用, 而成熟的理念对他们那代人来说咱们经常需要痛苦的去理解的一些概念, 对他们来说就是天经地义.
总之, 这是一个动荡的年代, 谁能作为一个程序员或者其它类型的软件开发周边人员, 活到10年后还不被淘汰, 真的不好说呢...
| 2007-10-17 13:22
@怪怪
说实在的,我只是把现在公司里的一些敏捷实践记录下来而已,所谓介绍也就没有宣扬鼓吹的意思
我以前经历过传统软件的开发流程,也有过郁闷不爽的时候,因为在项目中期,牵一发而动全身,想做点改动都难。而敏捷正是为了解决这一点的,它适合小型团队,需求不明确的项目,它能提高生产力以及面对变化的适应能力。
其实对于敏捷开发我还没有入门,也许过几年经历过多个项目后会更有说法吧
| 2007-10-17 13:27
@怪怪
外界对于敏捷开发也是有很多争论,褒贬不一,不管怎么说,我选择也支持我喜欢的。
| 2007-10-17 13:58
不错,学习!
| 2007-10-17 14:04
敏捷开发个人认为还是需要时间来考验的,目前看来不是很适合大的项目,比如说100人以上的。
在一些小的,但是需求又固定不了的项目还可以。(估计就是为这些而起得名词吧)
| 2007-10-17 15:34
一般一个项目的核心和基本的需求不会剧烈变化,其它20%的功能有可能频繁变化。对频繁变化的功能使用敏捷方式开发。时间容许,对核心部分可以考虑先做框架,一般在以往的项目积累中都会有这方面的积累。
| 2007-10-20 01:07
总结得太好了,目前正在实践这些
| 2007-10-21 19:46
MS有很多项目也是在MSF框架下,使用敏捷方法开发的,比较流行的是用scrum。不过,在MCS这边,少有测试驱动这种做法的。我理解的敏捷的本质就是快速开发和预期变化,至于什么来驱动的,是不是结对,都只是一些招式而不是心法了。
| 2007-10-21 23:28
我想请教lz一个问题,不是challenging是虚心请教。现在传统公司的人是一级向一级汇报,程序员要向经理回报。所以自己作为程序员,都不敢花精力做unit test之类的工作,更别提refacting或者做创造性的工作来改善项目质量了,因为怕没有output,被经理误解效率低。请问你们的客户公司如果也这样,那怎么办?
| 2007-10-22 09:52
@armstrong
敏捷开发内很多实践都是baby step,把业务需求分解成一个一个的Story,然后由测试->实现->...->重构,由于每一步都很小而且有单元测试做保证,开发效率不会低
如果客户公司认为做这些会导致效率低,那我们会用实践来证明
| 2007-10-22 13:40
一个好的工具是成功的一半,尤其对这些敏捷开发,更是如此.如果有哪个团队正在或将要采用Scrum,不妨试一试AgileTime,这是一个不错的工具,看得出该系统的开发人员对Scrum有很好的理解:打开www.agiletime.com.cn,然后用AT1026/demo登入.
| 2007-10-26 16:08
哦哦哦,原来 紫色阴影 就是你啊, 久仰久仰 ~_~
| 2007-11-16 09:40
通俗易懂支持一下。
| 2008-01-07 23:54
请教一下,我是在一个中国传统的软件开发公司,大家都是老顽固,可能一下接受不了agile开发。要想慢慢转型成agile开发,很多人提议从TDD入手,可大家都多年没有写单元测试的习惯,更谈不上了TDD了。不过我想story和stand up还是可以让人接受的,不知道这样可不可以行得通。就是我每周一也会对本周的任务和需求进行分解成多张story(电子的),然后也让每个程序员自己选择卡片,充当卡片的责任人。也每天早上开一次stand up meeting。等这两个大家都习惯了之后再让大家接受别的思想,不知道可行不可行,希望大家能给点意见。
| 2008-01-10 23:32
| 2008-10-19 10:54
ClearWorks,应用生命周期管理(ALM)整体解决方案,
软件项目管理开创性的,创新性的,突破传统的革命!
www.sevenuc.com
| 2008-11-19 10:45
讲解得很清楚。。。受益匪浅,我们公司也是用敏捷开发的,eg:pair,stand up meeting等。。前阵子也好像有Thoughtwork的同事来这边装那个火山灯。。不过我们公司在Minimal Documentation上感觉做得有些不足,所以对新手来说想融入进来比较困难。。。很高兴看到你的blog。。以后请多多指教~~
| 2009-03-24 09:03
因为相对瀑布模型,敏捷开发需要更多及更高的人力资源
以及开发时间
这句是关键啊
对人的要求是比较高的
| 2009-03-24 09:08