软件工程 估计方法

一个小组的同学 (6-8 人) 决定要徒步遍历中国陆地边界, 假设供给装备齐全, 估计需要多长时间?

用什么样的办法能让同学们方便地交流各自的估计, 最后到达大致理性和统一的共识?

一般这个时候教室里一定非常热闹,  大家各抒己见, 争执得不亦乐乎。 但是最后往往谁也说服不了谁, 还有一些同学无动于衷, 觉得无从下手, 干脆不参加讨论。  在这种情况下, 可以考虑通过 Wide-band delphi 来达到快速沟通和达到意见的一致。

网上有不少关于这类方法的介绍:

http://www.stellman-greene.com/aspm/content/view/23/38/

http://en.wikipedia.org/wiki/Wide-band_delphi

http://drdobbs.com/article/printableArticle.jhtml?articleId=184414570&dept_url=/  (Dr. Drobb’s)

 

这个方法看起来复杂, 其实挺简单的:

1) 找到一个主持人 (facilitator/moderator)

2) 主持几轮讨论,  每一轮统计大家的估计, 并且询问大家估计值的前提假设是什么, 找到合理的假设, 然后继续。

例如:  第一轮, 大家的估计和假设是:

a) 300 年                 假设: 要按照边界走, 爬到珠穆朗玛峰就挂了

b) 2 年;                   假设: 两万多公里的陆上边境线。参考红一方面军在长征时候的记录,12个月走1万两千公里。所以2年即可。

c) 5 年;                   假设: 3 万公里, 一年工作 300 天, 每天20公里, 

d) 1 年;                   假设: 边界大概有10个省份, 每个省份在当地公安边防的带领下, 一个月就搞定了。 有两个月用于和各地政府取得联系。

e) 5 个月                  假设: 南宋后再无中国, 只好沿着南宋的边界走, 走走玩玩, 很快就走完了。

f) 不可能                  假设: 被有关部门请去喝茶

 

[我在微博上看到还有人说 50 天的, 不知道他的假设是什么样子…]

 

大家对各自的假设做了分析, 得出了新的共同假设: 

        沿着边界 = 离边界最近的公路或小路走, 青藏高原可以绕一下, 不必亲自到每一块界碑跟前拍照留念。 不过还得自己走。 

        陆地边界 = 中国现在的边界, 不是南宋的。 约等于2 万公里

在这样的前提下, 大家又有新的一轮估计:

    … …

然后又澄清一些假设,

    … …

最后大家的估计收敛到一个大家都比较满意的精度数值。于是估计就结束了. 注意在精度上, 大家不必太拘泥, 根据这个题目的情况, 用月做单位即可。 不必争论到底会用 1002 天还是1003 天。

主持人要记住在每一轮的估计中, 探询数值背后的假设, 这是作为项目经理最重要的能力.  另外, 要推动数值收敛, 这要求大家的假设 (也就是用户需求分析) 也要收敛, 不要天马行空。在每一轮的讨论中, 估计值的上界和下界要不断接近。

注意, 最后得到的估计数值, 也许和某人最初提出的数值很接近, 但是这意义并不大, 因为最后达成的假设也许和最初的假设大相径庭。  Wide-band delphi 的目的不是比谁的第一轮估计猜得准, 而是在较短的时间内让团队充分沟通, 交换意见。

 

在这个练习中, 很重要的一点是要估计团队自身的能力, 你看到别人能每天行军30公里, 你自己未必能够。 你听说编程大牛几天写好某模块, 你自己却花了几个星期。  在上课的时候, 有同学提到团队要先培训几年, 这也是很好的角度, 在开始使用一个全新的技术前, 一段时间的培训和练习是很有必要的。 你的估计中是否包括这些因素?

 

还有一个高级PM能考虑到的问题, 既然这是一个长期项目, 那不可避免地有人员的投入 (commitment)和变动 (attrition) 问题。 大家走着走着, 有人受伤怎么办? 有人和当地少数民族少女坠入爱河怎么办? 有人打退堂鼓怎么办?      

 

软件开发的一个特点是, 软件项目的确有不少东西可以重用别人的结果, 但是项目中最有价值的部分, 别人都还没做过, 还得自己动手. 这就要求我们去探索, 发现这样的工作到底需要多长时间。   问题是 - 探险者总是高估自己的能力低估未知的困难 - 不然他们就不会出门探险了!

 

据说, 早期的西班牙探险者到美洲达科罗拉多河大峡谷的时候, 他们站在峡谷南岸俯瞰深谷中蜿蜒的河流, 觉得那不过是一条细细的小溪而已。 队长估计用不了一天的时间就能跨越, 于是大队人马开始出发。  等他们下到山谷的一半, 才发现河流湍急, 自身的装备不够, 人困马乏, 只好又悻悻返回, 同时已经累得半死。

image

我们在做项目的时候, 也有很多次发现原来估计很容易的地方原来 “水很深”, 往前走, 也许会被淹死, 往回退, 会耽误大量的时间。 这时候大家心里都暗想 - 当时要是在项目计划的时候多做深入分析和估计就好了!  但是回过头来, 对于这种情况, 大家如果坐在峡谷边 wide-band delphi 一整天, 也依然会得出非常乐观的结论,因为没有人提出不同的 “假设”。 这时候, 我们可以考虑参考前人的经验,打听一下当地人跨越大峡谷要几天。 有些事情花的时间是客观规律, 不是由个人能力决定。  例如生一个小孩大约需要10个月, 这个估计和你的 S 是大号, 中号, 还是小号无关, 和婚礼来宾的数量也无关。 要是还不满意怀孕时间长, 再加上几个精壮男子帮忙, 也无济于事。  世界上很多事情都有人做过了, 即使和你的具体情况有种种区别, 还是可以作为参考, 例如你想徒步走遍全国, 貌似前无古人, 但是不妨看看一个骑自行车走遍全国的例子:

 [链接: http://www.lvye.cn/article-26533-1.html]

这些老人骑车用了大约200天,  小伙子走路能比他们快么?   另外, 老人们走的是城市间的连接线, 大学生们要走边境线, 难度比较一下, 原来那些小于300 天的估计都可以推翻了。

另外一个办法是快速原型法 -  用一两个先锋去探路。 例如一个项目如果能用上 Microsoft Azure 平台, 那貌似会给我们带来很多好处.  如果你光看 Azure 的宣传资料, 你觉得这简直太容易了, 咱们赶紧上马!  且慢, 这时不妨派一个人写一个简单的Azure Hello World 应用, 实际看看开发/调试/部署/支持的情况如何, 这样才能给项目估计提供更好的数据支持。

 

我自己在长期的革命斗争中, 摸索出一套经验公式: 你问一个开发人员两件事 �C 对某件事的估计时间 X, 以及他做过类似开发工作的次数 N.  那么他最终需要的时间

Y = X +/- X/N     //注: 中间的 +/- 表明或者加上, 或者减去。

例如果冻估计某个模块需要 3 天, 但是果冻从来没有做过, 那么这件事情实际花费的时间有两种可能 Y = 3 +/- 3/0.  

就是说, 这事情也许是 (3 + 无穷大),  在项目时间内压根就做不了。 例如一个学生团队一度想做 “用玩家的人脸做拳皇游戏” 

或者是 (3 - 无穷大), 不但不用做, 而且这个员工会搞出很多新的bug 来, 让团队花更多的时间来处理, 把项目拖垮. 

 

比如果冻说要实现网络用户的管理, 结果发现Asp.net 早就实现了. 但是果冻不服,非得要自己写一个。 结果写得漏洞百出,  很多其他员工来帮他擦屁股。 最后把他的代码扔了, 用标准控件来实现。

 

当 N 等于 1 的时候, 一项工作估计的实际花费范围是 [0 .. 2X],   如果员工一直做类似的项目, 他们的 N 值都在 1 以上, 估计变化的范围会越来越小, 准确度越来越高。当然, 技术在变, 市场在变, 员工的心态也在变, 员工是不甘于, 也不能一直做雷同的项目的。  

如果把这个公式展开一下, 项目的复杂程度

     a) 需求的复杂程度 - 程序员是第几次实现类似的需求?  有些外行看起来很复杂的需求 (如银行业务流程), 如果一个程序员已经做过多次相关的银行项目, 其实不向外人看的那么难。 
     b) 技术的复杂程度 - 程序员是第几次用这个技术实现? 

    一个极端的例子: 几个程序员用他们从来没用过的技术 (例如 HTML5) 去实现一个他们以前没碰到过的需求 (例如银行业务), 他们的时间估计一定很飘忽...

业界的专家也有类似的分析, 例如这个项目/过程复杂度的二维图 (图来自 Danc  “Managing game design risk: Part I”  )

Process complexity

 

一个案例:  大牛在完成一项任务, 他原计划 3 天完成, 现在是第三天的下午, 他马上就可以做完. 但是在实现功能的过程中, 他越来越意识到自己原来的想法不是最好, 他应该采取另一个办法, 才能避免后面集成阶段的额外工作. 但是他如果现在就改弦更张, 那势必要影响自己原来估计的准确性. 这样他的老板, 同事会因此看不起他?  如果他按部就班, 最后整个团队还要花更多时间在后续集成上, 但是就不是他个人的问题了. 怎么办?


你可能感兴趣的:(统计,中国,软件工程)