敏捷开发的推理
我查阅了一下敏捷开发相关的资料,结合我长期对敏捷开发的实践,我将对敏捷开发的本质进行一次探讨。本文我打算理清敏捷开发的核心,并由核心衍生出它的价值观。我希望能够通过抛出本文这块砖,能够引出高手的玉来。
符合现实的软件
软件是为着解决现实的问题而产生的。从而软件存在的意义就是与现实相适应。敏捷开发的核心即:符合现实的软件。一个符合现实的软件,才能够可持续地与现实共同发展。一旦软件与现实背离,软件的生命周期也就到了结束的时候了。
现实的世界是动态变化的,人类造出来的东西,往往是落后于世界的变化的。如,地图造出来之后,可能又多修了几条路,几个建筑;刚买了一款高配置的计算机,几个月后,自己的机器配置又处于被甩的地位了……这些变化,人是被迫要去接受。因为这些东西属于硬件,人在目前还无法轻易地改变硬件。
而与此不同的软件,则是另外一种现象了。改变软件的代价是相当低廉的。改变软件,实际上只是改变硬盘上的磁性。改变软件的容易性,带来的结果是: 一、软件开发者容易以自己的想象来决定软件怎么做。 开发出一个无用的软件,比起因为出错而要毁掉待出售的10万张地图,比起因为工艺漏洞而要招回已经出售的计算机来讲,代价太低廉了。 二、软件更加具备符合现实的条件。 开发者让软件与现实相适应,所要付出的代价非常低廉。
所以,敏捷开发的核心就是符合现实的软件。为了造出符合现实的软件,才有了进一步的价值观及方法论。
简单
简单,是在人认识到事物的本质的时候才能够获得的。在开发软件的时候,我们往往疲于应付各种各样的需求。很少有人能够将复杂的需求化为简单的概念。比如,做一个音乐软件,有“我喜欢的”、“最近播放”、“最新添加”等不同的性质的歌。有些开发者会做出三个列表来存放三种性质的歌。而实际上他们的本质是一样的,即播放列表。区别在于触发加入播放列表的条件不同而已。因而只需要做一个列表,在列表中标记每首歌的触发条件。
把软件做得很复杂,通常说明软件所抓住的本质还很少。需要再好好考虑一下如何进一步进行简化。软件的概念简单,一方面可以让用户很容易理解和操作;另一方面能够适应世界的变化。再拿以上的音乐软件来说。如何做成三个列表,再要加一个“听了又听”的歌,又得创建一个列表。而使用一个列表的方法,则只需要处理“听了又听”这个触发条件。
符合现实的软件必然是简单的。所以,敏捷开发的第一条价值观是:简单。我们在实施敏捷开发的时候,都是围绕“简单”这一价值观而进行实施的。即,时刻保证软件的简单性。简单性包括两个方面:一是对于用户而言,概念很简单;二是对于开发者而言,开发的技术及代码很简单。
软件的可持续性也取决于软件是否简单。可持续性是指,快速响应现实的变化。一个复杂的软件,要么让用户无所适从,要么让代码无法维护。这都将导致软件无法持续。这会迫使我们以制造硬件的方式来开发软件。硬件是在迫不得已的情况下才丢掉重新升级(计算机在实在没有办法用的时候,才买新的),要让软件也这样做,软件开发低廉代价的优势就白白浪费掉了。
反馈
一个软件要符合现实,就需要通过现实的反馈来发展。软件前进的动力是现实的反馈。敏捷开发是欢迎现实,拥抱变化的开发。强调该条价值观,是为了消除开发者容易犯的错误——以自己的想象去决定软件怎么做。
因而,在做一个软件之前,首先要找到能够给出反馈的人。如果连能够给出反馈的人都没有,那么这个软件就没有做的必要了。
反馈的重要性,更可以这样说:矛盾推动事物的发展。反馈是指出不足的矛,软件是弥补不足的盾。在矛的不断攻击之下,盾才能不断完善。矛之不存,盾何以壮。
在方法论上面,敏捷开发强调快速发布版本,取得现实的反馈而不是开发者大脑中自己想像的反馈。如果开发者正好也是使用者,那么软件做成的几率就要大很多。开源软件大多数都是开发者自己要解决问题而产生的。
沟通
沟通是开发者取得反馈的手段。一个优秀的开发者,是善于沟通的。沟通包含口语、写文档等各种方式。优秀的开发者应该能够清晰而有条理地表达自己的想法。
现实世界中,人们普遍认为:软件开发者因为跟机器打交道,从而是内向的,不善于沟通的。实际上,这样的开发者不能算是优秀的。他们所做的事情,更多地是把需求转化为计算机语言的工作,即翻译员。而现在都出来谷歌翻译了,人类语言翻译成计算机语言只是时间问题了。
沟通的目的是进行思想碰撞。在沟通当中了解别人的思维方式,表达自己的思维方式,进一步扬弃为更加优秀的思维方式。在优秀的思维方式之下才能保持让自己与现实相符合。优秀的开发者是不会放弃获取优秀的思维方式的机会的。
在敏捷开发当中,提出这一价值观,正是要开发者变得优秀。放弃优秀的开发者无法适应敏捷开发。
勇气
在现实生活中,缺乏勇气比较常见。比如,不敢大大方方地表白,不敢尝试新的事物……在软件开发领域,缺乏勇气更是常见:技术更新好几代了,公司还不敢使用新技术;公司不敢尝试新的开发模式(敏捷开发)……
勇气,本质上来讲,是对现状的否定。人们往往一厢情愿地相信永恒;一旦确定,就不愿意改变。这正是勇气的用武之地。勇气使人去否定永恒,拥抱改变。勇气是创造的源泉。人没有勇气,人就永远是他现在的这样了,正是勇气才迫使他去改变。
在开发的时候,我们可能花了很多时间写了很多代码,但要决定放弃已经写过的所有代码,这是非常需要勇气的。而如果能够做到这一点,在软件开发上就占据了非常有利的位置。比如,我们可能会花大量时间去写页面原型,以希望能够得到用户反馈。在确定得到用户反馈之后,我们可以完全放弃原型代码,进而可以得到更加符合现实(也更加简单)的代码。
敏捷开发强调勇气这一价值观,正是要开发者去拥抱现实的变化,让开发者及软件朝着符合现实的路线走。
迭代开发
讲完四个价值观之后,接下来我把四个价值观联系起来,得到一个方法论——迭代开发。
如图所示,简单是软件开发的起点,也是软件开发的终点。
说它是起点,是因为,如果开发的东西还是复杂的,那就有必要把概念弄得简单一些。这包含两个方面的行动:一、把复杂的系统砍掉一半的功能(广度上);二、尽可能对各个功能进行抽象(深度上,参考前面音乐软件的例子)。
接下来,我们拿着简单的软件(或者软件原型)进入沟通环节。我们可以在两个方面进行沟通:一、与用户沟通软件的逻辑是否满足要求;二、与开发者沟通软件是否在技术上代价很高,如何权衡。
沟通之后,我们可以得到现实的反馈,在现实的反馈之下,我们才有勇气进行改变,使用我们的软件继续维持其简单性。这就完成了软件的一个迭代。
结束语
敏捷开发不仅是一种开发方法,更是训练自己心智的手段。敏捷开发所训练的是:让人做符合现实的事情。在做这样的事情的时候,人更尊重的是活生生的现实而非权威(你尊重现实),人得到的是对现实敏锐的反应能力(现实回敬你礼物)。