随笔 - 146  文章 - 0 评论 - 498 trackbacks - 0

前两年在网上看到一个笑话集锦, 列举电视剧中的穿帮情节。 其中一个是在某缠绵冗长的言情剧中, 一个叫 “书桓” 的角色沉痛地说 - “长达八年的抗日战争就要开始了…”  书桓同学当时是怎么估计到抗日战争要打八年的?  这一技术让软件工程师和项目经理望尘莫及。

image

软件项目计划的一个重要环节就是估计项目各类工作(特别是各种功能)所需的时间。 如果你没有书桓同学的能力, 你得好好练习这一技术。 “估计” 这一技术看似容易, 其实大有学问。 Steve McConnell 还专门写了 《Software Estimation: Demystifying the Black Art》 一书, 希望能把软件估计这一神秘技术 “去神秘化”。

在开始估计之前, 我们先分清楚几个概念 - 目标,  估计和决心, 。

目标: 表明一个希望达到的状态.  例如:  软件五一之前要投放市场!  在建校一百周年之时把我校建成世界一流大学!  不论这类目标如何重要, 它们未必能够实现。

估计: 以当前了解的情况和掌握的资源, 要花费多少人力物力时间才能实现某事。

决心: 保证在某个时间之前完成预先规定的功能和质量。 例如: 我们跑步前进, 全民炼钢, 两年超英赶美!

如果我们混淆了目标, 估计和决心, 那就会犯错误, 我们历史上就有这样的例子:

- 1958年5月中共八大二次会议肯定了当时中国出现的“大跃进”形势,认为中国正经历着 “一天等于二十年” 的伟大时期。调整了“二五”计划指标,钢产量由1200万吨提高到3000万吨,粮食从5000亿斤上升到7000亿斤。提出要使中国在15年或更短的时间内,在主要工业产品产量方面在十年内超过英国、十五年内赶美国(所谓“超英赶美”)。 这是一个估计。

- 伟大领袖在他的批语中写道:“赶超英国,不是十五年,也不是七年,只需要两年到三年,两年是可能的。”  这是一个目标。

- 大跃进开展只过了半年的时间,中央在伟大领袖的影响力之下,  把赶超英国的时间由十五年改为两年。下面各级组织纷纷动员, 停止其他正常工作, 全民大炼钢铁.  这是一个决心。 

后来全国各地出现了大量的卫星, 和不能用的钢铁,  钢产量, 粮食产量在后面两年不升反降。再后来… 

 

到了1976-77 年, 中国钢产量终于超过英国。 用了18 - 19 年时间。 扣除当年瞎折腾的几年, 这和当初估计的时间差不多! 

 

这样痛心的例子在软件项目也可以看到,  软件项目的延迟更是比比皆是 - 为什么我们估计得不准呢?  因为难么?   为什么软件估计这么难呢?  其实所有的估计都难.  不信的话, 我们做一些估计的练习,  不查搜索引擎, 你估计一下下面的数目 (数量级正确就行):

 

中国陆地边界长度 (参考答案)

非洲人口密度  (参考答案)

长江一年的流量  (参考答案)

2009年中国货币流通的总量 (参考答案)

一个80岁的人一生说过多少句话 (参考答案)

 

怎么样? 你的估计和实际情况差几个数量级?

一些硬件项目的估计相对容易 - 例如: 这边有一堆砖头, 估计有 X 块, 我们 N 个人要把这些砖头搬到那边, 每人每小时可以搬 M 块, 那么我们估计大概要 X / N / M 小时。 这个估计还是比较靠谱的。

软件项目的难度还体现在另一个方面, 写软件的人的能力也是要估计出来的数值, 而且没有合适的衡量单位,  例如:  如果王屋村的移山公司程序员果冻一天能写1000 行C++ 代码。 那他 10 天就能写好10,000 行代码?!  而且什么叫 写好 10,000 行代码?  如果你估计一个项目的代码量是10万行, 难道 10个像果冻这样的人 10 天就能做完? 

所以我们做软件的估计, 事实上是 (估计的工作量 / 估计的人员能力), 如果两个估计都差一两个数量级, 那么我们最终估计的结果就会偏离十万八千里. 

我在上课的时候给学生布置这样的课堂练习:

 

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

 

很多软件项目就是这样雄心勃勃地开始的, 大家觉得当年某某牛人/公司也这样做出来世界级的软件,  我们现在还有互联网, 我们小组里还有人精通设计模式, 这有什么可怕?   他们甚至连硬件装备都不齐全, 就开始行军了.

 

你觉得他们会花多长时间?  用什么样的办法能让同学们方便地交流各自的估计, 最后到达大致理性和统一的共识?

 

答案明天揭晓。

posted on 2011-04-05 17:39 SoftwareTeacher 阅读(2731) 评论(16) 编辑 收藏

FeedBack:
#1楼 2011-04-05 21:17 徐少侠      
呵呵
陆地边界。很黑啊。
地图上的距离很好获得,可是青藏高原那里的起伏怎么办?
每秒走一米的历史数据可以用上,不过在穿越珠穆朗玛的时候就要努力加班了。
还有就是走到漠河那里也够受的。

不过既然说到硬件装备齐全,那么搞一套高达之类的机甲过来用用,可能这么一来就比较好估计工作量了。
否则自然、政治、气候....
不可估计的因素太多了。



 回复 引用 查看   
#2楼 2011-04-05 22:55 王海鹏      
我估计的陆地边界长度是1W公里。差了2.5倍
 回复 引用 查看   
#3楼 2011-04-06 00:20 excellentbright      
3年
 回复 引用 查看   
#4楼[楼主2011-04-06 09:10 SoftwareTeacher      
@excellentbright
为什么是3 年, 而不是 2 年, 4 年?

 回复 引用 查看   
#5楼[楼主2011-04-06 09:11 SoftwareTeacher      
@徐少侠
对呀, 软件项目的需求也是这样, 有很多陷阱...

 回复 引用 查看   
#6楼 2011-04-06 09:33 白吉他      
完全不知道如何估计,头疼
 回复 引用 查看   
曾经因为项目时间估不谁,被上层指责为能力有问题。
 回复 引用   
#8楼 2011-04-06 15:53 excellentbright      
@SoftwareTeacher
按照正常走路速度1m/s,每天工作时间8h在走边境2.2万公里大概需要700多天,那就是2年,但是沿途会遇到如高山险阻,而且是在边境会浪费很多时间去处理这些事情,所以粗粗估计是3年,回答的不好,见笑了呵呵呵

 回复 引用 查看   
#9楼[楼主2011-04-06 23:21 SoftwareTeacher      
@excellentbright
目的不是看谁算得准, 而是看谁能通过交流, 厘清模糊的定义, 找到合理的假设, 从而得到合适的估算。

1m/s 太绝对, 冬天在野外走, 未必能那么快。

 回复 引用 查看   
不知道6-8个人都是什么背景, it generally takes forever...
 回复 引用   
本着agile is king的原则。既然有人愿意赞助,先走一遍香港半岛海岸线作为第一步试试吧。
 回复 引用   
#12楼 2011-04-07 00:23 excellentbright      
@SoftwareTeacher
原来如此,意思就是说,很多条件需要我们回答者自己去假设和定义吧,比如看这个团队的完成这个任务的心态,是尽快完成任务还是欣赏沿途的风景...作为学生启发很大,感谢邹老师

 回复 引用 查看   
#13楼[楼主2011-04-07 08:57 SoftwareTeacher      
引用liulonnie:本着agile is king的原则。既然有人愿意赞助,先走一遍香港半岛海岸线作为第一步试试吧。

这是一个 rapid prototype 的办法. 不过还要考虑南方和北方地形和气候的差异。

 回复 引用 查看   
#14楼 2011-04-07 14:04 流牛木马      
陆地边境是2.2万公里。在良好的地面环境(比如东南部沿海),人日行12小时,共计40公里是没问题的。但在恶劣的环境,如西北部沿线广泛分布的青藏高原、喜马拉雅山、戈壁、黄土高坡沿途,日行不会超过20公里。从地图上估算,东南部良好沿线和西北部恶劣沿线各占总路程的略一半,我们由此估计日行速度是30公里。所以总共需要走734天。增加弹性时间10%,为处理伤病、恶劣气候、部分成员迷路、买路钱、麻匪打劫等突发情况,共计是808天,2年零2个月。。

以上情况是假设所有人员处于同一出发点、所有人员在全程中不会分开。如果允许多个出发点,并兵分两路(或多路),情况就完全不同了,半年内完成任务,是可能的。

 回复 引用 查看   
#15楼[楼主2011-04-09 19:43 SoftwareTeacher      
@excellentbright
引用excellentbright:
@SoftwareTeacher
原来如此,意思就是说,很多条件需要我们回答者自己去假设和定义吧,比如看这个团队的完成这个任务的心态,是尽快完成任务还是欣赏沿途的风景...作为学生启发很大,感谢邹老师


对, 需求分析的过程, 就是提问/估计/探索假设/再提问 ... 的过程。

 回复 引用 查看   
#16楼[楼主] 2011-04-09 19:44 SoftwareTeacher      
引用流牛木马:
陆地边境是2.2万公里。在良好的地面环境(比如东南部沿海),人日行12小时,共计40公里是没问题的。但在恶劣的环境,如西北部沿线广泛分布的青藏高原、喜马拉雅山、戈壁、黄土高坡沿途,日行不会超过20公里。从地图上估算,东南部良好沿线和西北部恶劣沿线各占总路程的略一半,我们由此估计日行速度是30公里。所以总共需要走734天。增加弹性时间10%,为处理伤病、恶劣气候、部分成员迷路、买路钱、麻匪打劫等突发情况,共计是808天,2年零2个月。。

以上情况是假设所有人员处于同一出发点、所有人员在全程中不会分开。如果允许多个出发点,并兵分两路(或多路),情况就完全不同了,半年内完成任务,是可能...


喜马拉雅山... 这一段不能以 20公里/天 计算。
这个问题不是一个计算的问题...

 回复 引用 查看   
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 2005978 qijWR4b4Hsc=