软件工程 估计方法

 

上回书说到 -

一个小组的同学 (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 应用, 实际看看开发/调试/部署/支持的情况如何, 这样才能给项目估计提供更好的数据支持。

 

我自己在长期的革命斗争中, 摸索出一套经验公式: 你问一个开发人员两件事 – 对某件事的估计时间 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 天完成, 现在是第三天的下午, 他马上就可以做完. 但是在实现功能的过程中, 他越来越意识到自己原来的想法不是最好, 他应该采取另一个办法, 才能避免后面集成阶段的额外工作. 但是他如果现在就改弦更张, 那势必要影响自己原来估计的准确性. 这样他的老板, 同事会因此看不起他?  如果他按部就班, 最后整个团队还要花更多时间在后续集成上, 但是就不是他个人的问题了. 怎么办?

 

整个软件项目的时间估计也可以从两个方面来看 -

a) 自底向上  团队成员各自估计底层模块和单个功能 (和单元测试) 所需的时间, 再加上集成, 及基本测试的时间, 就是大概的开发时间。 这还没有考虑各个模块之间的相互依赖性.

b) 回溯       团队从整个项目最终交付之日往回倒推 -  

如果在十一就要交付整个软件, 那么九月一号就要完成基本测试

如果九月一号要完成基本测试, 那么八月一号就要代码完成 (Code Complete)

如果八月一号要代码完成, 那么我们要有16 周的开发任务, 那意味着我们四月一号就要开始, 而且四月一号要有第一批设计规格说明书 (spec)

我倒! 今天已经四月七号了! 你还在看博客!

 

在敏捷开发的项目中, 团队一般不过分强调 “估计”的价值,因为它就是一个“猜”字。 “猜得准”不是团队的目标。 团队的目标是把软件写出来, 让用户满意。   如果猜错了,没关系,微调项目进度即可,不要为了“猜得准” 而踌躇不前; 或者为了让当初的猜测看起来靠谱而不如实报告进度。

 

在敏捷的开发流程中, 还有不少看似山寨的办法, 我接触到的有:

估计扑克牌 – 扑克牌上面是1, 2, 3, 5, 8, 13, … 等数字, 大家出牌来估计某功能花费的时间。 这副牌我给了我们项目的PM, 她拿去打拖拉机了。

划拳估计法 - 几人一声呐喊, 同时出拳, 几个手指代表几天, 我们项目组还没有正式演练过.

t-shirt 尺寸法 – 用 S, M, L, XL 代表估计的时间长度, 对于尺寸超大的任务, 要考虑把它们分解为比较细小可掌控的小任务.

这些方法都是强调快速得到粗粒度的估计, 然后进入实现阶段. 一个团队经过一次里程碑之后, 再回过头看看原来的估计和实际花费时间的差距。  经过一两次里程碑, 成员们就可以了解在我们项目中, 一个尺寸为 S 的任务大概要多少天。

 

关于时间估计, 这里有更多相关内容:

http://www.pmhut.com/agile-estimating-%E2%80%93-estimation-approaches

 

回到上一个博客提到的目标, 决心和估计的区别, 当一个程序员果冻听到大老板说 - 果冻, 这个项目十一要交付使用, 你估计能行么?

果冻首先想到的不是用哪一种时间估计方法, 而应该反问  - 老板, 您已经给了一个商业目标, 现在你是想听客观的估计呢?  还是我主观的决心?

老板一定会对果冻另眼相看的 Smile

 

另一个目标/决心/估计的故事: 某项目本来进行得很顺利, 大领导非要全体人员脱产开一天的动员大会, 会议结束时, 领导热情地问大家: 大家对如期完成项目有信心么?   这时, 项目经理站起来说: 我们本来是可以按期完成的, 现在开了一天会, 我们已经延期了一天。 对这样的经理, 我要点【赞】。 

 

Steve McConnel 曾经详细说明了软件估计的 10 种罪, 很值得一读:

    http://www.ewh.ieee.org/r5/central_texas/austin_cs/presentations/2004.08.26.pdf 

 

既然是一个面试问题, 下面是我的一些打分标准:

  1. 能用靠谱的模型推算出中国陆地边界的长度,  1 分。
  2. 直接用长度除以人步行速度,  -1 分.
  3. 在面试中能反问面试官的各种假设, 3 分.
  4. 能在多轮迭代中收敛估算值, 2 分.
  5. 能提出人的培训问题,  2 分
  6. 能提出人的投入及变动问题, 2 分
  7. 在别人提出不同模型后, 不加分析而坚持己见的, –5 分
  8. 在讨论中不敢坚持自己分析的, –5 分 
  9. 能提出目标 / 估计 / 决心 的区别的, 2 分。
  10. 能提出几种不同的估计方法的, 3 分.

6 分及格, 10分优秀。 Smile

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

现代软件工程 10 绩效管理

[现代软件工程 讲义 ] 我们前文讲了怎样衡量软件工程师的能力, 工程师如何成长, 如何证明自己的成长, 等等. 这些都是在一个独立的, 不受外界干扰的空间中做出来的判断。 我们假设一个有能力的工程师, 到了另一个团队, 仍然是一个有能力的工程师。 如何衡量个人在团队中的绩…

电子计算机和多媒体教材分析,电子计算机多媒体教学设计模板

电子计算机多媒体教学设计模板教学目的:1、知识与技能(1)会写5个生字,理解词语意思。(2)理解课文内容,了解什么是计算机,什么是多媒体设备。(3)了解.电脑与多媒体之间的关系并能口述。2、过程与方法(1)通过查找资料感悟计算机飞速…

软件工程 - 团队博客第二阶段成绩

正如我在学期开始的时候跟大家介绍的那样, 如果所有团队都做同样的事情, 那么分数就采用 1/n 的体系。 第一名得满分, 第二名得 1/2 的分数, 第三名得 1/3 的分数… 大家都在一个地方写博客, 项目都是同样有趣, 所以我们采用 1/n 体系, 满分 20 分. 第一组: Seven …

计算机java培训总结,java培训总结范文

java培训总结范文在现在这个科技飞速发展的时代,计算机已经悄然走进我们的生活,并且占据了不可动摇与替代的地位,无论是在工作还是生活,学习还是娱乐中,当我们意识到的时候,却突然发现我们已经离不开这个叫…

戴尔r720服务器增加内存,dell r720服务器加了一根内存后,开机显示configuring memory,卡在这里进不了系统,请问这是什么情况?...

新添加硬盘,需要进BIOS进行检测之后保存新的硬件配置再进入。BIOS检测方法:1、开机按F2进行BIOS设置 。2、进入BIOS,将启动模式选择成UEFI。3、开机按F11进行UEFI启动。4、进入Boot Manager,选择UEFI Boot Menu。5、选光驱(插入系…

现代软件工程讲义 0 课程概述

这门课的教学方案在这里. 根据学生和学校的具体情况, 可以进行调整。 师生关系 首先要明确的是, 在这门课中的师生关系是什么样的. 大学目前的师生关系是怎样, 什么样才是理想的师生关系? 我们先看一些例子: Retailer / customer (餐馆/食客)? 一些学生说, 我既然交了…

现代软件工程讲义 1 软件工程概论

几乎所有程序员都知道“数据结构+算法 程序 ” 这句名言。但是在实际的学习和工作中,也有不少人产生了疑问。例如: 1. 我写了二叉树的周游算法实现,在这里,二叉树是数据结构,周游的实现细节是算法。…

qq修改群名服务器失败,如何解决qq群名片改不了的问题

我们在进入一个qq群的时候,一般都会修改自己的群名片,但是有时我们会发现改不了的问题,这时我们应该怎么办呢?下面就让学习啦小编告诉你如何解决qq群名片改不了的问题的方法,希望对大家有所帮助。解决qq群名片改不了的方法电脑登…

软件工程 项目管理的目标和细节

项目管理的最高目标并不是要保证让 “ideal” 和 “actual” 的线吻合, 因为项目中出现意外和需求的变化是很正常的事。 项目管理的目标是处理这些意外和变化, 让软件能如期发布, 尽量满足客户的要求。 例如: http://www.cnblogs.com/takeitandgo/archive/2011/05/26/2059363…

现代软件工程 学生自我评价表

每年上完 <现代软件工程课>, 我都要收集同学们对自己上课前/后的评价。这样可以看到同学们到底在什么地方得到提高, 提高了多少. 这样可以分析课程设计各个环节的效果, 以便跟踪和改进。 下面是我使用的自我评价表: 匿名调查&#xff0c;整个学期, 你在这门课平均每周花…

IT 行业的创新 - 创新的迷思 (1-4)

[这是和北大同学交流的讲稿, 暑期课程-职业规划与领导力发展 课程的一部分] Myths of innovation 创新, 创新型人才, 创新型企业, 创新型国家, 这些都是最近时髦的词汇, 我在微软亚洲研究院创新工程组工作, 看过创新的猪跑, 也吃过创新的猪肉, 在这里和同学们分享一下我的…

IT 行业的创新 - 创新的迷思 (5-6)

[这是和北大同学交流的讲稿, 暑期课程-职业规划与领导力发展 课程的一部分] Myths of innovation 创新, 创新型人才, 创新型企业, 创新型国家, 这些都是最近时髦的词汇, 我在微软亚洲研究院创新工程组工作, 看过创新的猪跑, 也吃过创新的猪肉, 在这里和同学们分享一下我的体会…

IT 行业的创新 - 创新的迷思 (7-8)

[这是和北大同学交流的讲稿, 暑期课程-职业规划与领导力发展 课程的一部分] Myths of innovation 创新, 创新型人才, 创新型企业, 创新型国家, 这些都是最近时髦的词汇, 我在微软亚洲研究院创新工程组工作, 看过创新的猪跑, 也吃过创新的猪肉, 在这里和同学们分享一下我的体会…

创新 - 王屋村的魔方们

最近我和一些同学们讨论了一些有关 “创新” 的问题。 我不由得想起王屋村发生的一个故事。 王屋村原来没有人玩过魔方. 有一年开学, 一个叫果冻的同学从爪哇国带了这个新奇玩意到学校。 他口里念念有词, 转来转去, 居然能把魔方从凌乱的颜色组合还原成整齐的六面。 哇, 太神奇…

技能的反面 - 魔方和模仿

魔方的故事 大概是在我小学五年级的时候, 大家开始玩魔方&#xff0c;我们家也买了一个。 我和几个小孩折腾了一会, 没搞出什么名堂。我哥摆弄了好一会, 嘿! 弄出一面一样的颜色。后来我也琢磨出来怎么把一面颜色拼出来。 再后来我才知道魔方有一些模式和一些口诀&#xff0c…

软件工程讲义 3 两人合作(2) 要会做汉堡包

[上回书说到这里: http://www.cnblogs.com/xinz/archive/2011/08/07/2130332.html ] 很多同学憧憬在大型软件团队中和各式各样的人打交道, 推动项目进展, 但是他们往往连一对一的合作的技巧和经验都很缺乏。 请问, 从小学到高中, 大家有没有练习过 1:1 的合作? 上课? 没有…

现代软件工程讲义 4 团队和流程

Advanced Software Engineering, Team Structure and Development Process 软件团队和开发流程 非团队和团队 在讲团队之前, 我们要讲什么是“非团队”。王屋村里经常发生这样的一幕: 王屋村的大智要把一堆砖头从村头搬到村尾。 他到顶球酒吧前, 看到前面三三两两地蹲着一…

现代软件工程讲义 12 绩效管理

我们前文讲了怎样衡量软件工程师的能力, 工程师如何成长, 如何证明自己的成长, 等等. 这些都是在一个独立的, 不受外界干扰的空间中做出来的判断。 我们假设一个有能力的工程师, 到了另一个团队, 仍然是一个有能力的工程师。 如何衡量个人在团队中的绩效? 如果一个工程师能…

校园招聘 - 比较容易的面试题

又到校园招聘的季节了, 自从和一些同事出版了《编程之美》一书之后, 我经常收到一些关于面试, 编程, 和“题库”的询问。 其实我自己对算法没有什么研究, 有些问题都答不上, 研究院最近搬了一次家&#xff0c; 原来的 “题库”也不知道搬到那一层楼去了。 不过, 常在河边走,…

现代软件工程讲义 2 工程师的能力评估和发展

Advanced Software Engineering 现代软件工程 讲义 软件工程师的能力评估和职业发展 介绍: 个人软件流程, 职业发展&#xff0c; 个人绩效的衡量和提高, 软件开发是科学, 工程, 手艺, 或是艺术? 我们刚讲了软件工程, 它包括了什么呢? 软件工程包括了开发&#xff0c;…