我在ThoughtWorks经历的一些敏捷交付项目中,估算方式有采用人天的“绝对”估算,估算值采用的是自然升序序列,比如1、2、3、4、5... 。也有采用复杂度相对估算,估算值有采用自然升序数列的,最多的还是斐波数列(1,2,3,5,8,13,21,34.....,前头去掉了一个1)。我还听过一种相对估算,估算值采用衣服尺寸,比如:S,M,L,XL,XXL,XXL。由于经验匮乏,这种估算我本人只是听说过,实际中没有经历过,但我对这种估算是心存疑虑的...
那为什么斐波那契数列是被使用最多的呢?是因为它是一组神奇的数字吗?是因为它背后有推动者在推动吗?这些原因可能都有吧。
回到估算活动本身,它注定只是一个估计值,通常不可能做到精确,也没必要做到精确。因为软件开发工作不像流水线上固定的工序这么简单,它面临了很多的不确定性,由于这些不确定性的存在,我们只能凭借已有的知识和经验做出一个估算,知识和经验越丰富,估算会越接近实际。所以,估算只是一个帮助我们更好衡量工作、管理项目交付的手段而已。至于那些试图做出“绝对”精确估算的项目通常会吃闭门羹(预留了巨大Buffer行为的不在本文讨论范围内)。
既然是相对精确的估算,那如何区分两个不同对象差别呢?如果两者看起来差不多,反正都是估算嘛,何不用一个数字代表呢,比如,自然升序序列中的4和5,本身两者差异不大,我好像都用4或者都用5也可以,反正也没那么精确,没必要非得说A是4,B是5。所以,为了体现出两个目标对象的相对差异,通常建议是采用能够有较为明显差异的数值。而且这个差异通常是通过半分比凸显出来的 -- 韦伯定律。
韦伯定律,德国生理学家E.H.韦伯通过对重量差别感觉的研究发现的一条定律,即感觉的差别阈限随原来刺激量的变化而变化,而且表现为一定的规律性,刺激的增量(△I)和原来刺激值(I)的比是一个常数(K),用公式表达即K=△I/I,这个常数叫韦伯常数、韦伯分数或韦伯比率。
针对韦伯定理举个例子。给你两个分别为1斤、2斤中的两个铅球,你会较为容易感受到重量的不同,当给你30斤、31斤重的铅球,你就可能就很难区分两个孰轻孰重了,同样是1斤的差值,但差值比例一个是(2-1) / 1 = 100%,一个是 (31-30) / 30 = 3%。
如何更明显体现出两个对象相对的差异,斐波那契额数列就是一个很好的手段,这个数列中两个数差比接近黄金分割0.618(不信,你计算试一试),这个差异(韦伯常数)已经能够很明显体现出差异了。基于此,你也可以采用翻倍序列,比如1、2、4、8、16....,这个差异也很明显,但这种具有翻倍规律的数字可能会让人不禁想问一个问题 -- 这个工作量真的是那个的两倍吗?即便如此,Scrum Alliance创始人Mike Cohn对翻倍序列给与了一定认可。
在你经历的交付项目中,你有用过其他的估算方式吗?期待你的分享~