唐工:你估计完成开发用户登录模块要多少天?
小李:3天。
唐工:能在3天完成的可能性有多高?
小李:可能性很高。
唐工:可否量化一点?
小李:可能性为50%~60%。
唐工:所以很有可能不止3天,要4天了。
小李:对的,其实也有可能要5、6天,但我估计概率不大。
唐工:你信心有多少?
小李:难说,有95%的信心可以在6天之内完成。
唐工:所以有可能要用上7天了?
小李:这样说吧,如果所有可能出问题的都出了问题,甚至会10天或11天,但这种概率很低。
唐工再问小李:是能否给我一个确实能完成这个模块的日期?
小李:正如我前面说,很可能3天,但也有可能4天。
唐工追问:你可以说4天吗?
小李:也有可能5、6天。
唐工结束对话:OK,请你尽力6天之内完成这个模块。
唐工貌似请求,但实际是要求小李承诺这个模块要在6天之内开发完。假如这个模块的开发时间超过6天,唐工就有依据说小李没有尽力导致延误了。
所以从以上对话,可以看到作为开发专业人员,必须分清估算和承诺。作为专业人士,我们不应该给一些没有把握的承诺,误导对方。中国老话说“一诺千金”就是这个道理。
上面是被单点估算误导的例子,误以为那个天数是有把握达成的,所以我们最好从单点估算变成三点估算,除了估算最可能的天数,还有最佳和最差共三点。但项目是由一系列的任务组成(如第二任务依赖于第一个任务的完成),如何计算所有任务的总天数? 下面用例子说明如何用3种使用三点估算估计的方法(A、B、C)估算总天数:
A)假定都是正态分布,用模型估计:
先用PERT方程式计算每一步的预计值与标准差:
预计值 (Expected Value EV) = (Best + 4xMost Likely + Worst ) /6
标准差 (Sigma) = (Worst - Best) / 6
步骤Step | 最佳Best | 最可能Most Likely | 最差Worst | 预计值EV | 标准差Sigma |
1 | 1 | 3 | 12 | 4.167 | 1.833 |
2 | 1 | 1.5 | 14 | 3.5 | 2.167 |
3 | 3 | 6.25 | 11 | 6.5 | 1.333 |
10.75 | 14.168 |
如果假定是正态分布,按以上预计值和标准差,使用蒙特卡洛模拟,从下图可看到,95% 置信区间是8.02 ~ 20.37。
B)直接用PERT方程式计算总天数的均值与标准差:
如不用模拟,直接把3步的均值加起来:
4.2 + 3.5 + 3.6 = 14
计算3 步总方差:
? ?(方差
???
假定:总方差?= 每步方差的总和
总方差= 9.77
Sigma 𝜎?= 3.13
95%范围计算公式为:均值的总和±2𝜎 = (4.2+3.5+6.5)±2𝑥3.13 = 14±6.26=7.74 ~ 20.26
结果与蒙特卡洛模拟预测类似。
C) 假定都是三角形分布,用模型估计:
如果用三角形分布,95%置信区间是 10.38 ~ 26.45。
从这3个偏左分布步骤例子看起来好像有些偏差,但不是很严重。如果我们看见用10个步骤都是偏一边分布,总分布会如何?是否相差会更远?
如果每步都估算天数,10个步骤的总天数就是500天(把10个估算值加起来)。
但如果每个步骤都是三点估算:
Process 过程 | 天数 | ||
步骤step | 最佳 | 最可能 | 最长 |
1 | 27 | 30 | 75 |
2 | 45 | 50 | 125 |
3 | 72 | 80 | 200 |
4 | 45 | 50 | 125 |
5 | 81 | 90 | 225 |
6 | 23 | 25 | 63 |
7 | 32 | 35 | 88 |
8 | 41 | 45 | 113 |
9 | 63 | 70 | 175 |
10 | 23 | 25 | 63 |
500 |
很明显看到每一步都是偏左的分布,所以可预计总天数应不止500天,但估多少才合适?
假定每步骤是三角形分布,用模型估计重复10,000次,得出下面分布:
得出95%区间是 617 ~ 865
??
过程Process | 天数Durations | ||||
步骤step | 最佳 | 最可能 | 最差 | 预计值 | 标准差 |
1 | 27 | 30 | 75 | 37 | 8 |
2 | 45 | 50 | 125 | 61.66 | 13.33 |
3 | 72 | 80 | 200 | 98.66 | 21.33 |
4 | 45 | 50 | 125 | 61.66 | 13.33 |
5 | 81 | 90 | 225 | 111 | 24 |
6 | 23 | 25 | 63 | 31 | 6.66 |
7 | 32 | 35 | 88 | 43.33 | 9.33 |
8 | 41 | 45 | 113 | 55.66 | 12 |
9 | 63 | 70 | 175 | 86.33 | 18.66 |
10 | 23 | 25 | 63 | 31 | 6.66 |
500 | 617.33 |
A) 用PERT方程式计算每一步的预计值与标准差:
??得出95% 区间是 525.3 ~ 709.3 (= 617.3 ?±??92 )
B) 假定是正态分布,按以上预计值和标准差,使用蒙特卡洛模拟,得出的总分布的结果几乎一致,都是左右平均分布的正态形。
得出95%区间是 526 ~ 707
以上实验验证了“中心极限定理”,无论本来是什么形状的分布,如果随机抽样够多,样本的平均值分布接近正态分布。所以如果本来只是3个步骤的时候还是可以看出是三角形偏左,但到了用10个步骤相加时,得出的分布便非常接近正态分布。
(中心极限定理会在后面数据分析里用上,例如通过画控制图判断过程是否稳定)。
问:为什么要花这么多精力去研究分布,我们日常不都是单点估算吗?
答:例如你觉得把整个公司的人均生产率从1.14一年后提升到1.21算不错吗?(注)
问:不是非常好,还算可以。
答:如果本来的分布和提升后的目标是如下图,你觉得怎么样?
问:提升就太微小了。
答:从这简单例子看到所有估算都应包含两部分:分布和中间趋势(例如平均值)。
另一例子:假如我们预估生产率是的分布是如下图,达到或超越1.14 这目标的概率是65%:
但如果告诉你目标是1.14只是目标平均值,分布是如下图:
预测生产率的分布完全在目标范围之内。
(? 注:生产率单位 每人天产出代码的功能点数,类似有效代码行数都是衡量软件规模的单位。)
在下一部分,我们会看到如何使用PERT三点估算的实例。
当结果不能用数学公式计算的时候(例如是三角形分布),可以用电脑随机模拟结果。例如: