敏捷开发核心的角色是“人”,是“笨人”开发软件的方法学。
敏捷开发的核心方法是,测试,重构,迭代。唯一的目的就是编写出高质量的源代码。测试,重构,迭代,都是围绕这一个目的展开。只是在不同的阶段,不同的情景下,侧重点不一样。
1、测试、重构、迭代
敏捷提倡测试优先,在编写任何一个功能前,首先写出测试代码。这叫测试驱动开发(TDD)。
TDD主要有两个好处,一是为重构保驾护航。重构的经典书籍《重构:改善既有代码的设计》明确指出,重构是在保证程序既有功能不变的情况下,对源代码的改善。而保证程序功能不变的重要的手段,就是有测试,有了测试,我们才能放心对代码进行重构。因为这种重构是“安全的”,每次重构后我们可以进行测试。如果没有相应的测试,我觉得哪个程序员都不敢轻易的更改代码,这种改变有不可预料的风险,让人感觉很痛苦。但是有测试保驾护航的的重构,是心情愉快的,想重构那只管重构,反正有测试为验证。
同时,重构是敏捷开发中的一个重要实践。在迭代开发中,绝对不能少了重构。
TDD的第二个好处,就是改善设计。因为了要能对代码能够测试,这个目标“逼迫”程序员对程序进行“解耦”,因为耦合密切的功能,很难进行测试,所以“逼迫”程序员对接口编程。对“接口”编程,是公认的面向对象设计的一个良好实践。可以设计出遵守“单一职责”和“开闭原则”的类和模块。
像我这种笨人很适合用TDD,因为这个方法可以给我带来重构的信心,也能帮助我带来模块化的代码。
2、迭代、重构、测试
敏捷提倡迭代开发持续集成,开始没必要做出详细的设计方案,而是逐步的增加功能,完善设计。像我这种笨人,在接到一个软件项目时候,顶多可以做到理解客户需求(因为笨,也不可能全部理解),做不到根据一下子设计出满足客户需求的软件构架方案。比如系统应该有哪个模块,格模块之间有什么关系,我看不到那么深。即使调动全部脑子细胞,也做不到这点。
在开始,只做出满足客户部分需求的系统,然后逐步的增加功能以致满足客户全部需求。在每一次迭代前,我都会考虑,怎样在目前的系统架构中实现增加的需求。如果增加需求很容易,那就直接增加,如果很困难,那就修改系统架构,要保证在系统架构中增加任何功能都是和谐的,心情愉快的。当然,做到这点的前提是,在上一次的迭代,做的足够好,我们有大量遵守了“单一职责”和“开闭原则”的类和模块。这样,在本次迭代中,修改系统构架才不会困难,才愿意修改系统构架。
所以用敏捷的方法开发软件,要大脑时时刻刻保持清醒,如果我们脑力无法在开始做出强大出色的完美的设计,那就在整个开发过程中,尽量充分利用智慧有限的大脑,随时随地改善设计,改善代码。为了大脑能够保持清醒,各种修身养性的方法中第一条就是休息好。所以敏捷告诉我们,要想我们的大脑清醒,那就每周工作40小时。
敏捷为什么提倡开始“简单设计”,就是因为“笨人”做不到完美的设计,只能在开发过程中,逐步领悟软件涉及的问题领域的问题本质,才慢慢的改善设计。
3、群体的智慧
敏捷提倡结对开发和代码共享,为什么要这样?一个小故事胜过千言万语。
1906年秋的一天,英国科学家弗朗西斯•伽尔顿(Francis Galton)离开位于普利茅斯的家,动身前往一个乡村集市。伽尔顿时年85岁,岁月已经在他身上留下抹不去的痕迹,不过他仍然对自己已经赢得的声誉—当然还有恶名充满好奇,这些都源于他在统计学和遗传科学上的所做的工作。但在那个特殊的日子里,激起伽尔顿好奇心的则是牲畜。
伽尔顿的目的地是一年一度的英格兰西部食用家畜和家禽展会,这是当地农民和城镇居民组织起来对彼此饲养的牛、羊、鸡、马和猪等的品质品头论足的地方性集市。对一位科学家而言(尤其是一位已经上了年纪的人),用整整一下午时间徜徉于一排排畜栏之间,考察驮马并对猪的生长情况进行评估似乎有些奇怪,不过他的举动肯定事出有因。伽尔顿只关心两件事情:一件是对牲畜的体质状况的评价;另外一件是进行成功喂养的方法,如保留好的做法,摒弃不好的方面。因为这个展览会同时也是优秀饲养方法的展览会。
伽尔顿关心繁殖的原因在于,他相信只有很少一部分人身上存在能确保社会各团体健康的必要的遗传特征。而他的研究生涯也大多是在衡量这些遗传特征中度过的,不过,他的目的是为了证实绝大多数人都不具备这些特征。譬如,在1884年伦敦国际博览会举办期间,伽尔顿发起成立了“人体测量实验室”,在该实验室里他用自己研制的设备对参加展会的人进行测验,测验项目还涉及“视力和听力的敏锐度、色感、眼睛的判断力以及反应时间”。实验的结果使得他对一般人的智力基本不抱信心:“大多数人生性愚钝,冥顽不化,这几乎无法让人相信。”伽尔顿认为,在选择配偶和优生优育时只有通过权力加以控制,才能确保社会健康发展。
伽尔顿有一天在会场漫步时,来到了一处猜重量比赛赢大奖的地方。一头肥壮的公牛在牛群中很醒目,因此它被牵到展台上供大家品鉴,聚拢过来的人纷纷排队对这头牛的体重下赌注。(他们在就这头牛宰杀和去毛后的体重下赌注呢。)只要花6便士你就可以买一张印有编号的票,然后在票上填写自己的名字和地址及估计重量,重量估计最准的人会得到奖品。
一共有800个人想碰碰运气,这些人来自各行各业。其中有许多人还是屠户和农民,他们想必对判断牛的体重很在行,不过也有一些人似乎不擅此道。“许多外行也想和屠户那样的内行一争高下,”伽尔顿后来在《自然》杂志上刊登的一篇文章中写道,“那些对马缺乏真正了解的职员和其他人,都只是在报纸、朋友和自己想象力的指引下才争相下注的。”这好比一个民主国家,能力和兴趣存在根本差异的人手上都握有一张选票,这个类比令伽尔顿茅塞顿开。“普通的竞争者也许很适合对牛的净重进行评估,正如有投票权的普通人对他要投票的政治议题的利弊更有判断力一样。”他写道。
伽尔顿感兴趣的是弄清楚“有投票权的普通人”能做什么,因为他希望证实的是有投票权的普通人能力非常有限。于是,他将竞猜变成一场事先毫无准备的实验。当竞猜结束,奖品分发完毕后,伽尔顿从竞猜组织者那里借了一张票,然后对参加竞猜打赌的人进行了一系列统计分析。伽尔顿对竞猜结果进行编号(总计787份竞猜数据,后来他不得不排除13份,因为这些竞猜数据无法辨认),从高到低依次排列,并将这些数据制成图表,看看是否呈钟形曲线。此外,他将所有竞猜者的估计重量都附在表上,然后计算出这组竞猜数据的平均值。你不妨说这个平均值就是普利茅斯参加竞猜的这个群体的集体智慧。如果这个群体是单个人的话,那么牛的体重的猜测结果会是多
少呢?
毫无疑问,伽尔顿认为这个小组的平均猜测值与标准值相去甚远。毕竟,几个非常聪明的人和一些平庸的人及一大堆愚钝者混在一起,似乎更倾向于得出一个愚蠢的答案。不过,伽尔顿错了。这个群体猜测的牛经屠宰和去毛后净重为1197磅,事实上这头牛的净重为1198磅。换句话说,这个群体的判断基本称得上完美。
这是《群体的智慧:如何做出最聪明的决策》一书中的小故事,这本书很不错。它告诉我们群众多样、独立的思考,会碰撞出比群众中最聪明的人还英明的决策。这真实三个臭皮匠顶上一个诸葛亮。我为什么认为敏捷是方法是一个好方法,这是一个重要的原因。他们通过实践知道了,在软件开发中团队的力量大于个人。从两个完全不同的领域得出惊人一致的结论。
因为编程的是笨人,所以要借助群体的智慧,至于一个编码,一个在旁边看,这只是表面上形式而已。结对编程和代码集体所有的本质深刻原因是群众的智慧大于个人。
呵呵,像我这中笨人,最适合结对编程了,经常遇到有的问题想不到,别人一提醒,马上就明白了。可惜我只是个soho,每人和我结对编程,这是一大遗憾。