关于估算的行为在我活着的历程中一度是引起过我的察觉的。
初中阶段,晚上寝室聊天环节,我应该是对某个小场地进行了周长的大致估算,引来大家的一致反对,当时我意识到其实我对我所估算的话题内容心里根本没有什么数,只是凭着感觉,随便说了一个数字。
“一圈应该怎么也得有200米吧?”我如是说道。
后来我清楚地意识到自己并不擅长做估算这个事情,所以这些年来,我已经下意识地让自己不去做关于距离、重量、面积、花费等各方面的估算,并且会觉得周围人进行类似话题的讨论而感到无趣。
懒得参与这样的事情。
第二次系统读本书,看到第七章时又觉得作者所言很有道理,做出一个准确率较高的估算,在很多场合的确很重要,回想之前GTD,年度计划等,都是书中引导自己进行估算,估算完成某件事情或项目所需要的时间,并让我可以正视自己要做的事情,放弃一些不重要的事情,make everything clear。
接下来谈一谈该章提到的有意思的估算例子,包括一些我进行估算的过程,以及书中的提示。
密西西比河一天流出多少水?
有两个思路。
其一是估算它的出口的横截面积,乘以流速。
另一个是流域面积乘以年降水量除以天数。
令人惊奇的是这两种完全是两个方向的思路算出来的结果竟然很相近。
关于估算的作用,书中举了一例。
Martin公司为夏季奥林匹克运动会构建通信系统方案,并进行了一系列计算。
度量了自己发送一封单字符邮件所需要的时间后,可以得出结论为该方案不可行。
这种验证成本很小的估算技术,由此而省下了巨大的人力与财力,既然根本无法实现,就换方案而不要浪费时间。说明估算在系统设计阶段起到了至关重要的作用。
对于这种不可能,书中的写法很有趣儿。这样的句子,着实让我惊叹了一小会儿。
计算显示,即使在宽松的假设下,提案中的系统也只有在每分钟至少有120秒的情况下才能正常运转。
提到了一些关于估算的基本技巧,包括从多个思路来验证,量纲检验,经验法则。
当然,作为一种能力,想增强它并让它为己所用,最好的办法还是加强实践。
其中提到的一个经验法则很出名:72法则。它在估算指数过程的增长非常便利。
一个典型的例子为:
假设以年利率r%投资一笔钱y年,如果ry=72,那么y年后你的投资差不多会翻倍。*
那么,作为程序员,正在编写的这个程序运行起来会占多少内存呢?
进行关于特定语言存储方式的考虑以及具体的编写情况后,可以得到一个粗略的值,而真正跑起来进行验证,可能又为大相径庭,若此时仔细探究下去,分析原因,那么一定会在这个过程中学到很多意想不到的知识。
由于估算的不准备性,在进行设计时,要根据这个点,来设置安全系数。
书中的例子是一个已经断裂的大桥,和后人的设计增加了6倍的强度并无比牢固的例子。
但工作中更常见的一个例子是开需求评审会时,对自己要做的需求进行估时。
能够准备估计自己对一个需求的开发时间,是程序员一个很重要的职业技能。
有种说法是,新手程序员估1天结果做10天;有些经验的程序员估5天,做了3天;精于此道的程序员估3天就是3天。
由于会有一些意想不到的情况出现,新手程序员往往会乐观估计,而最终难以交付。
书中建议引入安全系数:
为了补偿我们的知识局限,在估算实时软件系统性能的时候,以2、4或6的系数来降低对性能的估计;在做出可靠性/可用性保证时,给出一个比我们认为能达到的目标差10倍的结果;在估算规模、开销和时间进度时,给出保守2倍或4倍的结果。
一个常见的估算法则被总结为Little定律,这句话就像一个常识公式一样可以背一背:
队列中物体的平均数量为进入速率与平均停留时间的乘积。
其实,现在分析一下,自己这么多年来懒得进行估算是因为真的要做好这件事并不容易。
首先需要一些生活经验,需要查一些必要的资料,基于需要进入短时间的较深层度的思考,而偏偏在我需要做出估算说出“这个跑道大约也就200米吧”时,是以一种无所谓的轻松语气和思想随口一说。彼时真要是让我开始认真起来去进行估算还真不会有那个心思。
但阅读本章,让我意识到估算的重要性,意识到了这是一个有时需要正襟危坐、全神贯注去思考才能完成的行为,并且要根据结果而做出接下来重要决定的事情,需要转变对估算的认识与态度,决定了估算是否会为你做得更多。
以下是几个值得一提的课后习题。
第七章最后其实是给了两份练习,分别在附录B和课后题。
在这里记一些有意思的题目以及一些解题过程。
[__, __] 2000年1月1日美国的人口数量,以百万为单位。
关于美国人数,脑子中可以蹦出的唯一的一条信息是4亿,而且它来自很早之前且一直没有更新过,应该上小学前就知道了,离2000年不远,所以我填答案为[350, 450],而实际结果为272.5万。
[__, __]拿破仑的出生年份。
刺客信条美国与法国两代主角是一个时代的,康纳是美国独立战争时期,而亚诺是法国大革命时期,康纳与华盛顿有交集而亚诺与拿破仑有交集,说明华盛顿与拿破仑年代相差不会太远。
估算华盛顿的年龄可以考虑美国历史,大约是200年,到了1818年,再减去个3、40年,我给出的答案是:[1750, 1780]。
而拿破仑是1769年出生。
使用Little定律的两个例子:
估算所在城市的人口死亡率。
论述“25美分硬币的平均寿命是30年”的真伪。
会发现不过是已知公式中两个参数的值求公式中的另一个值,但这种问题往往不够直观,需要稍微思索一番。