`

程序员修炼之道——估算

 
阅读更多

   快!通过56k modem线发送《战争与和平》需要多少时间?存储一百万个姓名与地址需要多少磁盘空间?1 000字节的数据块通过路由器需要多少时间?交付你的项目需要多少个月?
  在某种程度上,这些都是没有意义的问题——它们都缺少信息。然而它们仍然可以得到回答,只要你习惯于进行估算。同时,在进行估算的过程中,你将会加深对你的程序所处的世界的理解。
  通过学习估算,并将此技能发展到你对事物的数量级有直觉的程度,你就能展现出一种魔法般的能力,确定它们的可行性。当有人说“我们将通过ISDN线路把备份发给中央站点”时,你将能够直觉地知道那是否实际。当你编码时,你将能够知道哪些子系统需要优化,哪些可以放在一边。
提示18
Estimate to Avoid Surprises
估算,以避免发生意外

  作为奖励,在这一节的末尾我们将透露一个总是正确的答案——无论什么时候有人要你进行估算,你都可以给出答案。
多准确才足够准确
  在某种程度上,所有的解答都是估算。只不过有一些要比其他的更准确。所以当有人要你进行估算时,你要问自己的第一个问题就是,你解答问题的语境是什么?他们是需要高度的准确性,还是在考虑棒球场的大小?
l       如果你的奶奶问你何时抵达,她也许只是想知道该给你准备午餐还是晚餐。而一个困在水下、空气就快用光的潜水员很可能对精确到秒的答案更感兴趣。

l       p的值是多少?如果你想知道的是要买多少饰边,才能把一个圆形花坛围起来,那么“3”很可能就足够好了。如果你在学校里,那么“22/7”也许就是一个好的近似值。如果你在NASA(美国国家航空航天管理局),那么也许要12个小数位。

  关于估算,一件有趣的事情是,你使用的单位会对结果的解读造成影响。如果你说,某事需要130个工作日,那么大家会期望它在相当接近的时间里完成。但是,如果你说“哦,大概要六个月”,那么大家知道它会在从现在开始的五到七个月内完成。这两个数字表示相同的时长,但“130天”却可能暗含了比你的感觉更高的精确程度。我们建议你这样度量时间估算:

时长
 报出估算的单位
 
1-15天
 天
 
3-8周
 周
 
8-30周
 月
 
30+周
 在给出估算前努力思考一下
于是,在完成了所有必要的工作之后,你确定项目将需要125个工作日(25周),你可以给出“大约六个月”的估算。
同样的概念适用于对任何数量的估算:要选择能反映你想要传达的精确度的单位。

 

估算来自哪里

  所有的估算都以问题的模型为基础。但在我们过深地卷入建模技术之前,我们必须先提及一个基本的估算诀窍,它总能给出好的答案:去问已经做过这件事情的人。在你一头钻进建模之前,仔细在周围找找也曾处在类似情况下的人。
  看看他们的问题是怎么解决的。你不大可能找到完全相符的案例,但你会惊奇有多少次,你能够成功地借鉴他人的经验。

 

理解提问内容

  任何估算练习的第一步都是建立对提问内容的理解。除了上面讨论的精确度问题以外,你还需要把握问题域的范围。这常常隐含在问题中,但你需要养成在开始猜想之前先思考范围的习惯。常常,你选择的范围将形成你给出的解答的一部分:“假定没有交通意外,而且车里还有汽油,我会在20分钟内赶到那里。”


建立系统的模型

  这是估算有趣的部分。根据你对所提问题的理解,建立粗略、就绪的思维模型骨架。如果你是在估算响应时间,你的模型也许要涉及服务器和某种到达流量(arriving traffic)。对于一个项目,模型可以是你的组织在开发过程中所用的步骤、以及系统的实现方式的非常粗略的图景。

  建模既可以是创造性的,又可以是长期有用的。在建模的过程中,你常常会发现一些在表面上不明显的底层模式与过程。你甚至可能会想要重新检查原来的问题:“你要求对做X所需的时间进行估算。但好像X的变种Y只需一半时间就能完成,而你只会损失一个特性。”

  建模把不精确性引入了估算过程中。这是不可避免的,而且也是有益的。你是在用模型的简单性与精确性做交易。使花在模型上的努力加倍也许只能带来精确性的轻微提高。你的经验将告诉你何时停止提炼。

 

把模型分解为组件

  一旦拥有了模型,你可以把它分解为组件。你须要找出描述这些组件怎样交互的数学规则。有时某个组件会提供一个值,加入到结果中。有些组件有着成倍的影响,而另一些可能会更为复杂(比如那些模拟某个节点上的到达流量的组件)。

  你将会发现,在典型情况下,每个组件都有一些参数,会对它给整个模型带来什么造成影响。在这一阶段,只要确定每个参数就行了。

 

给每个参数指定值

  一旦你分解出各个参数,你就可以逐一给每个参数赋值。在这个步骤中你可能会引入一些错误。诀窍是找出哪些参数对结果的影响最大,并致力于让它们大致正确。在典型情况下,其值被直接加入结果的参数,没有被乘或除的那些参数重要。让线路速度加倍可以让1小时内接收的数据量加倍,而增加5毫秒的传输延迟不会有显著的效果。

  你应该采用一种合理的方式计算这些关键参数。对于排队的例子,你可以测量现有系统的实际事务到达率,或是找一个类似的系统进行测量。与此类似,你可以测量现在服务1个请求所花的时间,或是使用这一节描述的技术进行估算。事实上,你常常会发现自己以其他子估算为基础进行估算。这是最大的错误伺机溜进来的地方。


计算答案

  只有在最简单的情况下估算才有单一的答案。你也许会高兴地说:“我能在15分钟内走完五个街区。”但是,当系统变得更为复杂时,你就会避免做出正面回答。进行多次计算,改变关键参数的值,直到你找出真正主导模型的那些参数。电子表格可以有很大帮助。然后根据这些参数表述你的答案。“如果系统拥有SCSI总线和64MB内存,响应时间约为四分之三秒;如果内存是48MB,则响应时间约为一秒。”(注意“四分之三秒”怎样给人以一种与750毫秒不同的精确感。)

  在计算阶段,你可能会得到看起来很奇怪的答案。不要太快放弃它们。如果你的运算是正确的,那你对问题或模型的理解就很可能是错的。这是非常宝贵的信息。

 

追踪你的估算能力

  我们认为,记录你的估算,从而让你看到自己接近正确答案的程度,这是一个非常好的主意。如果总体估算涉及子估算的计算,那么也要追踪这些子估算。你常常会发现自己估算得非常好——事实上,一段时间之后,你就会开始期待这样的事情。

  如果结果证明估算错了,不要只是耸耸肩走开。找出事情为何与你的猜想不同的原因。也许你选择了与问题的实际情况不符的一些参数。也许你的模型是错的。不管原因是什么,花一点时间揭开所发生的事情。如果你这样做了,你的下一次估算就会更好。

 

 

估算项目进度

  在面对相当大的应用开发的各种复杂问题与反复无常的情况时,普通的估算规则可能会失效。我们发现,为项目确定进度表的惟一途径常常是在相同的项目上获取经验。如果你实行增量开发、重复下面的步骤,这不一定就是一个悖论:

l       检查需求

l       分析风险

l       设计、实现、集成

l       向用户确认

  一开始,你对需要多少次迭代、或是需要多少时间,也许只有模糊的概念。有些方法要求你把这个作为初始计划的一部分定下来,但除了最微不足道的项目,这是一个错误。除非你在开发与前一个应用类似的应用,拥有同样的团队和同样的技术,否则,你就只不过是在猜想。

  于是你完成了初始功能的编码与测试,并将此标记为第一轮增量开发的结束。基于这样的经验,你可以提炼你原来对迭代次数、以及在每次迭代中可以包含的内容的猜想。提炼会变得一次比一次好,对进度表的信心也将随之增长。

 

terate the Schedule with the Code
通过代码对进度表进行迭代
 

  这也许并不会受到管理部门的欢迎,在典型情况下,他们想要的是单一的、必须遵守的数字——甚至是在项目开始之前。你必须帮助他们了解团队、团队的生产率、还有环境将决定进度。通过使其形式化,并把改进进度表作为每次迭代的一部分,你将给予他们你所能给予的最精确的进度估算。

在被要求进行估算时说什么

  你说:“我等会儿回答你。”

  如果你放慢估算的速度,并花一点时间仔细检查我们在这一节描述的步骤,你几乎总能得到更好的结果。在咖啡机旁给出的估算将(像咖啡一样)回来纠缠你。

 

分享到:
评论

相关推荐

    程序员修练之道英文版

    《程序员修炼之道》是一本备受推崇的编程领域经典著作,英文原版名为"The Pragmatic Programmer",由Andrew Hunt和David Thomas共同撰写。这本书旨在帮助程序员提升技能、提高工作效率,并在软件开发过程中培养出更...

    软件估算——“黑匣子”揭秘

    资源名称:软件估算——“黑匣子”揭内容简介:在《软件估算——“黑匣子”揭秘》一书中,著名的软件开发书籍的作者Steve McConnell揭开了围绕在软件估算周围的层层迷雾。作者在深入浅出地介绍了与软件估算有关的...

    工程建设项目经理培训教材——费用估算和控制.PPT

    《工程建设项目经理培训教材——费用估算和控制》 在工程建设项目管理中,费用估算和控制是至关重要的环节,它不仅关乎项目的经济效益,还直接影响到工程的进度和质量。本教材详细阐述了这一主题,旨在提升项目经理...

    与老大的交谈——估算项目时间

    上一次我们聊到估算项目的时间进度!,感谢很多博友的建议。我也向我们老大咨询了一下,他给了我很多宝贵的意见。以下是我跟老大的一些交谈,希望对大家有所帮助。以下是老大给我的建议,大家可以考虑一下。这三个...

    为什么程序员不擅长估算时间

    程序员不擅长估算时间是软件开发领域的一个普遍现象,这涉及到多个因素。首先,软件开发的复杂性和不确定性使得准确预测时间成为一项挑战。编程任务往往涉及众多未知因素,比如需求的模糊性、技术难题的出现、代码的...

    软件工程——程序员进阶

    "软件工程——程序员进阶"这个主题涵盖了从设计思想到架构设计的广泛知识,旨在帮助程序员提升技能,成为一名更专业的软件开发者。这里,我们将深入探讨其中的核心知识点。 首先,提及的是弗雷德里克·布鲁克斯...

    电波传播特性估算——其他场强估算模型.pptx

    电波传播特性估算在无线网络规划与优化中扮演着至关重要的角色。无线网络的性能、覆盖范围和质量很大程度上取决于信号在空气中传播的方式。本文将详细介绍三种常用的场强估算模型:Hata模型、COST-231 Walfish-...

    72020——收藏资料.9 利用估算解决问题.ppt

    标题中的“72020——收藏资料.9 利用估算解决问题.ppt”表明这是一个关于数学教学的课件,主要聚焦于利用估算来解决实际问题。描述中并未提供额外信息,但标签为空,因此我们将仅依据部分内容来展开讨论。 在小学...

    软件系统规模估算方法论介绍-功能点分析法

    本文主要探讨一种基于业务视角的估算方法——功能点分析法,这种方法适用于软件公司、企业以及管理层在不同场景下的规模估算需求。 功能点分析法,顾名思义,是以软件提供的功能数量作为衡量规模的基础。这种方法从...

    敏捷开发修炼之道

    《高效程序员的45个习惯:敏捷开发修炼之道(选载).doc》可能包含了敏捷开发中的核心理念和实践策略,如: 1. **持续集成**:频繁地将代码集成到主干分支,以便尽早发现并解决冲突和错误。 2. **用户故事**:用简洁...

    智慧运营,银行业竞争的下一个决胜之地——下一代中国银行业运营模式研究

    中型股份制银行为例粗略估算,假设其2016年营业收入为1,000亿元,若运营转型可 以将成本收入比下降一个百分点,将意味着约10亿元的利润增加。 从“集中”阶段向“精益运营”和“ 智慧运营”阶段迈进,国内银行业将在...

    Aerodynamic Force.rar_气动_气动估算_气动力估算_飞机 气动估算_飞机 气动力

    飞机气动力计算的程序,根据实际参数估算不同飞行状态下的气动力系数。

    电波传播特性估算——奥村模型.pptx

    《电波传播特性估算——奥村模型》 无线网络规划与优化的核心环节之一是对电波传播特性的准确估算。奥村模型(Okumura Model),由奥村等人在日本东京通过大量实测数据建立,旨在描述100MHz至1500MHz频率范围内,30...

    项目管理之活动持续时间估算.xlsx

    估算活动持续时间是根据资源估算的结果,估算每个活动需要的工作时段的数据的过程,其作用是确定完成每个活动所需花费的时间量,为制订进度计划过程提供主要输入。估算方法主要有: ① 类比估算:根据历史项目的数据...

    项目管理修炼之道

    《项目管理修炼之道》这本书是项目管理领域的一部经典之作,它深入浅出地探讨了如何有效地进行项目管理,帮助读者提升项目管理的技能和效率。以下是对书中的关键知识点的详细阐述: 1. **项目生命周期与阶段**:...

    资产估算申报明细表——在产品(XLS格式).xls

    资产估算申报明细表——在产品(XLS格式).xls

    Web系统软件开发项目的成本估算模型

    为此,本文旨在探讨一种新的成本估算模型——人天评估模型,并对其原理和应用进行深入分析。 #### 二、传统软件成本估算方法及其局限性 传统的软件成本估算方法主要包括基于代码行数(LOC)、功能点分析(FP)和...

    基于人工神经网络与空间仿真模拟的区域森林碳估算比较——以龙泉市为例.pdf

    《基于人工神经网络与空间仿真模拟的区域森林碳估算比较——以龙泉市为例》这篇文章探讨了两种不同的森林碳储量估算方法——人工神经网络(BP神经网络)和空间仿真模拟(高斯序列协同仿真,SGCS),并通过实际案例...

Global site tag (gtag.js) - Google Analytics