《A++ 敏捷开发》- 4 三点估算

估算是一个范围,不是一个数

唐工:你估计完成开发用户登录模块要多少天?
小李:3天。
唐工:能在3天完成的可能性有多高?
小李:可能性很高。
唐工:可否量化一点?
小李:可能性为50%~60%
唐工:所以很有可能不止3天,要4天了。
小李:对的,其实也有可能要56天,但我估计概率不大。
唐工:你信心有多少?
小李:难说,有95%的信心可以在6天之内完成。
唐工:所以有可能要用上7天了?
小李:这样说吧,如果所有可能出问题的都出了问题,甚至会10天或11天,但这种概率很低。
唐工再问小李:是能否给我一个确实能完成这个模块的日期?
小李:正如我前面说,很可能3天,但也有可能4天。
唐工追问:你可以说4天吗?
小李:也有可能56天。
唐工结束对话:OK,请你尽力6天之内完成这个模块。
唐工貌似请求,但实际是要求小李承诺这个模块要在6天之内开发完。假如这个模块的开发时间超过6天,唐工就有依据说小李没有尽力导致延误了。
所以从以上对话,可以看到作为开发专业人员,必须分清估算和承诺。作为专业人士,我们不应该给一些没有把握的承诺,误导对方。中国老话说“一诺千金”就是这个道理。

从单点到三点估算

上面是被单点估算误导的例子,误以为那个天数是有把握达成的,所以我们最好从单点估算变成三点估算,除了估算最可能的天数,还有最佳和最差共三点。但项目是由一系列的任务组成(如第二任务依赖于第一个任务的完成),如何计算所有任务的总天数? 下面用例子说明如何用3种使用三点估算估计的方法(ABC)估算总天数:

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 步总方差:

   (方差

   = Sigma^2 = \sigma ^2 )

假定:总方差 = 每步方差的总和

总方差= 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步的总均值大概是14。也可以用方程式计算标准差,总的标准差(sigma)3.13左右。
  • 也可用蒙特卡洛模型(假定步骤都是正态分布),得出很类似的正态分布,总的平均也接近1495%置信区间是8.02 ~ 20.37,接近上面算出的均值 ± 两个标准差数值。
  • 但因3个步骤都是明显往右偏,所以不能假设它们是正态分布,更合适的是使用三角形分布,然后用蒙特卡洛估算起来的分布,看见最后的图明显是类似往右有个尾巴,能更正确反应3个步骤加起来的天数的估计分布。
  • 跟假定正态分布的结果比较,很明显看到用三角形分布结果往右偏,上限是 26.45(比正态分布的20.37 高)。不是正态分布的话,左面就没有长尾巴,所以就会比本来正态分布的下限高,下限是 10.38(比正态分布的8高)。
  • 从这简单例子看到,如果我们要把三点估算加起来,尤其是非正态分布的话,就不能用简单的方程式,或者假定它是正态分布来计算,需要用蒙特卡洛模型假设三角形分布才能真正反应总体的分布。

从这3个偏左分布步骤例子看起来好像有些偏差,但不是很严重。如果我们看见用10个步骤都是偏一边分布,总分布会如何?是否相差会更远?

利用蒙特卡洛模拟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

分析10 个步骤模拟结果

  • 为什么用三角形分布模拟出来不是偏左的分布(类似前面3步结果),而是一个正态分布。

以上实验验证了中心极限定理,无论本来是什么形状的分布,如果随机抽样够多,样本的平均值分布接近正态分布。所以如果本来只是3个步骤的时候还是可以看出是三角形偏左,但到了用10个步骤相加时,得出的分布便非常接近正态分布。

(中心极限定理会在后面数据分析里用上,例如通过画控制图判断过程是否稳定)

  • 实验结果也验证了当每一步都类似正态分布可以用PERT公式计算每一步的预计值和标准差,然后计算总结果的分布(不需要蒙特卡洛模拟),但如果非正态分布(如偏左的三角形分布)便需要使用蒙特卡洛模拟,不然预估会有偏差(类似上面3步模拟的结果)。

问答 Q&A

问:为什么要花这么多精力去研究分布,我们日常不都是单点估算吗?

答:例如你觉得把整个公司的人均生产率从1.14一年后提升到1.21算不错吗?(注)

问:不是非常好,还算可以。

答:如果本来的分布和提升后的目标是如下图,你觉得怎么样?



问:提升就太微小了。

答:从这简单例子看到所有估算都应包含两部分:分布和中间趋势(例如平均值)。

另一例子:假如我们预估生产率是的分布是如下图,达到或超越1.14 这目标的概率是65%:


但如果告诉你目标是1.14只是目标平均值,分布是如下图:

预测生产率的分布完全在目标范围之内。

(  注:生产率单位 每人天产出代码的功能点数,类似有效代码行数都是衡量软件规模的单位。)


在下一部分,我们会看到如何使用PERT三点估算的实例。

附件

蒙特卡洛(Monte Carlo)模拟

当结果不能用数学公式计算的时候(例如是三角形分布),可以用电脑随机模拟结果。例如:

  • 计算3个步骤的总共人天,每个步骤的概率都是三角形分布,电脑随机功能模拟:
    • 第一次模拟:步骤1得出1.3,步骤2得出1.2,步骤3得出2.0,得出3个步骤的总工期是4.5人天。
    • 第二次模拟:步骤1得出1.5,步骤2得出1.15 ......
  • 如果我们模拟1000次、10000次,便能模拟出总分布。
  • 因为是电脑随机模拟,出来的结果会有些偏差,但差异不会太大。(例如上面10步三角形分布的模拟结果偏差都没有低于0.3%)


  

  

  

  

相关推荐

  1. 敏捷开发精准估算

    2024-01-18 23:54:01       21 阅读
  2. 再谈敏捷开发

    2024-01-18 23:54:01       21 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-18 23:54:01       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-18 23:54:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-18 23:54:01       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-18 23:54:01       20 阅读

热门阅读

  1. Go语言网络轮询器

    2024-01-18 23:54:01       37 阅读
  2. 24校招,阿里巴巴测试开发工程师二面

    2024-01-18 23:54:01       28 阅读
  3. vue3自定义指令

    2024-01-18 23:54:01       41 阅读
  4. 智慧校园大数据云平台介绍

    2024-01-18 23:54:01       39 阅读
  5. 支付功能的实现

    2024-01-18 23:54:01       35 阅读
  6. RPM命令详解2---查询&验证

    2024-01-18 23:54:01       29 阅读
  7. Android13系统长按power键关机弹框中添加截屏按钮

    2024-01-18 23:54:01       30 阅读
  8. SpringBoot缓存相关注解的使用

    2024-01-18 23:54:01       38 阅读
  9. 解决前端因后端接口迁移大量地方修改接口问题

    2024-01-18 23:54:01       36 阅读