软件项目估算是一件很难的事情

各种你意想不到的状况会出现
服务器君一共花费了234.043 ms进行了6次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

最近Uncle Bob发表了新的博客《为什么估算这么难?》。

Bob大叔首先抛出一个问题,如何将著名的葛底斯堡演说的237个单词以固定字体和固定行宽写在一张书签上。如果人工执行这个任务,假设每秒钟处理一个单词来寻找合适的断句点,估计5分钟内就可以完成,而且实际花费时间也和估计的差不多。然而,如果要编写程序来做,要花多久?而且是在知晓算法、没有意外情况、没有绊脚石、无需备份和恢复功能的情况下,编写程序要花多久时间?

Bob大叔提醒说:程序只不过是遵循某个过程的具体指令,而这个过程是已知的。在动手写程序之前给出3个估算,最佳情况、最差情况和正常情况。根据Bob大叔的统计,大部分人需要花上30-45分钟,也有人用了15分钟,还有人用90分钟。这样,很多人之前的估算与实际花费相差悬殊。其中一个原因,他们基于手工任务看似简单来进行估算的。

Bob大叔回忆某个下午和Kent Beck采用测试驱动开发来结对编程写这个算法。他们估计这需要10-15分钟,结果花了30分钟却毫无进展。在被迫接受这个体验后思考,为什么这算法这么难?为什么把如此简单和直观的过程写下来这么难?

其实,人类是目标导向的,在分解文字时,人类不会遵循一个过程,而是不断评估输出,然后调整做法直到正确为止,因此会预估5分钟之内完成。而过程是盲目的,它不管输出是否正确。如果过程错了,那输出结果也会错。人类不了解过程,不了解过程的难度如何。人类不是电脑,做事的时候不会遵循过程,所以无法比较过程任务和手工任务的复杂性。这就是估算为什么难,而且经常犯错的一个原因:任务看上去简单,人们基于这个表面现象来估算,之后却发现写出过程实际上是多么复杂。人们估算不准是因为估算了错误的东西。

回到分解长字符串的例子。每次分解一行,记录下分解位置和选择这个位置的原因。将其概括为三个不同的场景:

  1. 如果单词长于10个字符,在第10字符处断词。
  2. 如果第11个字符是空格,在第11字符处断词。
  3. 从第10个字符向回查找,如果找到一个空格,就在该处断词。

这些场景仍然需要被组成一个过程,但是至少知道这个过程有几个部分组成,从而使估算更容易。

这个故事的寓意是任务看似容易被人类解决,却经常被描述为复杂的过程。所以估算时,确保不要被简单的表面现象所迷惑。深入进去,尝试列举出过程所包含的场景数量。

博文显示估算失真有多容易。人脑不善于回答抽象问题,往往替换实际问题为一个直觉问题。而直觉在寻找答案时,如同博文所说,以期望结果的产生来考虑问题,不关注未知或可能出错的东西,而是关注那些能够理解的东西。

博文引发大量讨论。有人认为分解过程为小的片段并无价值,有价值的是知道哪类问题是困难的和为什么困难。也有人认为多练习有助于提高估算准确度,或者让有经验的人而不是新手估算。然而经验最可以依靠,却仍然可能出错,除非项目与之前完全一样。

除了博文所讨论的原因,还有人认为,团队水平、办公室政治、企业缺乏变更控制,也都成为导致估算不准确的原因。

更多的人吐槽:在实际中,估算往往发生在没有明确需求可以参考的时候,更不用说之后不断变化的需求、未知因素、代码基础中隐藏的陷阱。因此固执地遵循最初的时间表也使得估算看起来是不准确的。而且开发人员面对来自于客户和经理的压力时,往往倾向于低估时间表。

点击查看大图(图片来源:西乔

不确定的需求

“作为一个搞开发的,我经常被问到完成一个拼图要多久,可我连拼图的样子都没看到、是不是能够拼到一起都不知道!”— beager

“我已经把部署一个 WordPress 博客的时间估算从 5 分钟放余量到 2 周,可是最后经理把需求给我的时候,我发现有 20 多个页面、大量的自定义功能和插件需要部署和开发。我是不是又要 delay 了?!” – skiwigger

有人觉得不能坐以待毙,应该主动出击对 Business Owner 解释为什么拿不出估算:”对你的 Business Owner 说,现在要你给估算,就好像问你机票要多少钱,但是不告诉你什么时候飞、飞到哪里去、要不要商务舱!“ – TargetBoy

但是马上就有苦主反对 TargetBoy,说”你太高估你的 Business Owner 了!那帮功能紊乱的家伙!“ 接着底下就开始骂上了。

”很快,估算就变成‘砍进度’游戏了。而他们砍掉的,往往是让软件变得可维护的东西。” – beager

狂妄的需求

“我老板问我:开发一个微软 Word 那样的东西并且和 Word 兼容很难吗?我说:还不如直接让用户买 Word 更划算。老板诧异道:怎么会这样?!我:o.O ” – angrystuff

Boss:“为什么你三个月写不出来一个浏览器版本的 Office Word?!”

niloc132:“那么容易的话,你当微软是傻子啊!我要是那么牛逼,我就自己开公司了,还会在这里听你胡说八道?!”

“我一般这么回答:啊,这个要 (2 +/- 12 )个月,视我的工作时间和是否有其它的工作安排而定。”—grotgrot

开发人员的对策

逼着 lz 估算是吧,好~~~!

”别忘记 * 3!“ – hyperforce

”乘以 3 不够,乘以 PI。“ – wlievens

本文地址:http://www.nowamagic.net/librarys/veda/detail/2015,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/2015

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

大家都在看

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《深入理解MySQL核心技术》 Sasba Pacbev (作者), 李芳 (译者), 于红芸 (译者), 邵健 (译者)

《深入理解MySQL核心技术》:从公共可用性的意义上讲,MySQL源代码是开放源代码,但如果对其不了解,则实质上,它对于您来说是封闭的。MysQL开发团队的前成员Sasha Pachev通过《深入理解MySQL核心技术》给出了MySQL 5的全面指南,揭示了这一强大数据库的内部运作。您将直奔MySQL核心技术,了解各种数据结构和各种方便的功能的运作情况,了解如何添加新的存储引擎和配置选项等。 《深入理解MySQL核心技术》从结构概况讲起,在这一部分解释了MysQL的不同组件是如何协同工作的。接着将学习设置有效的可编译代码副本的步骤,然后使用基本架构添加自己的配置变量和存储引擎。

更多计算机宝库...