矫捷开发一千零一问系列之三十二:敏捷开发与野路子的区别是什么?(二)

敏捷开发一千零一问系列之三十二:敏捷开发与野路子的区别是什么?(二)

这是敏捷开发一千零一问系列的第三十三篇。(在这里提问之一之二之三问题总目录

(续前文)
4. 不会满足于现状

对野路子而言,一般不相信“有最好的方法”。其实敏捷也不相信。那么两者有什么区别呢?
野路子相信:反正也没有最好的方法,为什么要费劲不断改进?我们这样的野路子也挺好的啊。
敏捷开发相信:由于没有最好的方法,所以一定还有比现在更好的方法,要不断改进进行寻找。

这里的野路子相信的事情,也是做敏捷开发中最常见的误解之一。两种思想都相信没有最好的方法,听起来都很敏捷,但结果却大相径庭。
如果经常听到有人因为“世界上没有最好的方法,现在这个就不错”,那么多半已经陷入到只顾个体(至少我的情况没有那么糟)或只顾眼前(现在情况还不太糟,以后再说吧)。这也是问题1和2的衍生品。

5. 对技术卓越性的追求不同

技术卓越性体现在很多地方,个人感觉有两点是最重要的,其他的则主要是为了支撑两点。
5.1 在开发过程中,生产率很高
要做到这一点有这么几个细节:
a. 很少生产无用的东西
包括生产完成后客户不用,或客户看了之后发现与实际需要相差很大而进行了改动
b. 很高的复用率
由积木直接搭建整体,节省时间
c. 很高的质量
很多人认为质量与进度(或生产率)不可调和,其实本人的经验是,只有质量高到一定程度,才有生产率可谈。否则时间都花费在测试和改Bug上了。
日后会有一篇文章详细介绍我见过的几个项目的实际情况,以及对质量与进度关系平衡的几个方法。
5.2 在修改和维护过程中,生产率很高
a. 很高的可维护性
可维护性可以细分为很多因素,最基本的包括:简洁的代码,不重复的代码,封装的代码(指只暴露接口),内聚的代码(指有限的功能)等。
有很多人问简洁的代码是否难以读懂。实际上多数商业产品的代码,都可以在几乎不增加单行长度、单行复杂度(变量和运算符)的情况下压缩到现在尺寸的1/5~1/20。这个数字十分惊人,但10年以上开发经验且经历过多个大项目重构的开发人员,可能会立刻点头同意。
b. 很高的可读性
有必要注释的代码,包括自解释的代码,分层的代码,封装的代码等。
c. 很高的质量
质量的影响无处不在,在一个摇摇欲坠的产品上面增加或改变功能,都是一件很费时的事情。
d. 很高的复用率
如果代码像是由对众多已有函数的调用,而非一行一行似曾相识的代码组成的,修改过程会变得相对简单。
把积木推倒重来是一件令人愉悦的事情,而把沙雕推倒重来是个灾难。
我们刚刚花两个月推倒了产品中的一半的功能,但只修改和增加了1/10左右的代码。

对技术卓越性的要求,是敏捷12原则之一。野路子往往重视敏捷中提到的max the undo(尽量能不写就不写)的概念来抵制文档,但很少提及对技术卓越性的追求。
技术卓越性的追求,可以认为是敏捷开发对问题2(长期与短期利益的平衡)的响应。也就是技术卓越虽然未必能加快现在的开发(其实这是个偏见,正确答案是“能”,否则只能说技术还不够卓越),但对未来的修改和维护往往至关重要,否则就难以重构。

上面这些总结,多数在敏捷12原则中都有描述,有些不在,但多数包含在本系列的之一无我(问题1/2/5),之二无住(问题3/4),具体可以在本文第一行的链接中查找。

下面顺便抄一个敏捷12原则,及与文章中提到的5个问题的对应:

问题1/2:
1。我们最优先要做的是通过尽早的、持续的交付有价值的软件来使客户满意
2。即使到了开发的后期,也欢迎改变需求。敏捷过程利用变化来为客户创造竞争优势。
3。经常性的交付可以工作的软件,交付的间隔可以从几周到几个月,交付的时间间隔越短越好
4。在整个项目开发期间,业务人员和开发人员必须天天都在一起工作
7。工作的软件是首要进度度量标准。
8。敏捷过程提可持续的开发速度。责任人、开发者和用户应该能够保持一个长期的、恒定的开发速度。
正如问题1中分析的,敏捷开发的“无我”或“团队”的概念实际上包括了客户、企业。这几个做法其实对客户的益处超过团队。
只有真正做到无我,并把客户受益作为自己能受益的基础之一,才能做到,做好。在非零和博弈中,客户受益和团队受益不会完全矛盾的,这毕竟不是抢劫。

问题3/4:
6。在团队内部,最具有效果并且富有效率的传递信息的方法,就是面对面的交谈
12。每隔一定时间,团队会在如何才能更有效地工作方面进行反省,然后相应地对自己的行为进行调整。

问题5:
9。不断地关注优秀的技能和好的设计会增强敏捷能力。
11。最好的构架、需求和设计出自与自组织的团队。
这几个和问题2有交叉。

不在5个问题中的原则,不过,这只是说明它们和“敏捷开发与野路子”无关,或比较牵强。
5。围绕被激励起来的人个来构建项目。给他们提供所需要的环境和支持,并且信任他们能够完成工作。
10。简单----使未完成的工作最大化的艺术----是根本的。

详情可参考周金根老师的说明(上面12原则:http://www.cnblogs.com/zhoujg/archive/2009/07/12/1521443.html