写点什么

估算是一种,很难的东西,如影~ 随行~

2012 年 5 月 01 日

最近 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 个字符向回查找,如果找到一个空格,就在该处断词。

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

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

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

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

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

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

InfoQ 的读者们,你们对于估算有什么样的经验?什么时候估算得准确,什么时候又不够准确呢?


给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2012 年 5 月 01 日 20:102661

评论

发布
暂无评论
发现更多内容

机构进场区块链安全基础设施准备好了么?

CECBC区块链专委会

区块链 数字资产

难得干货,揭秘支付宝的2维码扫码技术优化实践之路

JackJiang

支付宝

c++基础——杂谈2

菜鸟小sailor 🐕

c++ 语言

四年开发经验从美团、360、陌陌、百度、阿里、京东面试回来感想

Java架构师迁哥

架构师训练营第 1 期第二周课后练习题

Leo乐

极客大学架构师训练营

AI小白必读:深度学习、迁移学习、强化学习别再傻傻分不清

华为云开发者社区

人工智能 学习 迁移

数据库-技术专题-SQL编写规范

李浩宇/Alex

架构师训练营 1 期第 2 周:框架设计 - 总结

piercebn

极客大学架构师训练营

架构师训练营 1 期 - 第二周 - 设计原则

三板斧

极客大学架构师训练营

MySQL varchar类型最大值,原来一直都理解错了

flyer0126

MySQL varchar

架构师训练营第二周作业

尹斌

华为轮值董事长郭平2020全联接大会主题演讲:永远面向阳光,阴影甩在身后

华为云开发者社区

5G ICT huawei

跟着B站UP主小姐姐去华为坂田基地采访扫地僧

华为云开发者社区

华为 技术 大牛 扫地僧

保留时序数据波动细节的一种采样算法

小清新同学

监控 时序数据库

从大数据的角度来谈谈运维监控这件事儿

小清新同学

运维 监控

从『用户』到『客户』,企业服务平台如何实现高效转化?

易观大数据

一文快速入门分库分表

程序员内点事

Java 分库分表

刷爆朋友圈的字节跳动编码题,今天把解析思路分享下!

Java架构师迁哥

某大厂一位核心技术人员不小心泄漏的公司内部培训以及工作笔记内容,手慢无。

Java架构师迁哥

2B还是2C,这真是个问题

码闻强

SaaS

框架设计:作业

Nick~毓

为什么海外服务器打开网站会卡呢?

德胜网络-阳

架构师训练营第二周学习总结

尹斌

虚拟卡兑换架构设计

孙志平

传销资金盘挂靠区块链热点 肃清整顿热潮拉开帷幕

CECBC区块链专委会

区块链 金融

娱乐圈套路多?看区块链如何来破解

CECBC区块链专委会

网红 娱乐圈

SpringBoot-技术专题-提升服务吞吐量

李浩宇/Alex

来不及解释了,快上车!快速开发平台,助力企业搭乘万物互联顺风车

Philips

敏捷开发 企业开发 互联网革命

Git 操作

老菜鸟

git

什么才是“应用拓扑”?

小清新同学

运维 监控

RN运行项目报错:Unable to resolve module `./debugger-ui/debuggerWorker.js` from ``

凌宇之蓝

ios android React Native

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

估算是一种,很难的东西,如影~随行~-InfoQ