估计的目的
2013年2月27日
我第一次接触敏捷软件开发是在与肯特·贝克一起工作时,当时是极限编程的黎明。让我对那个项目印象深刻的一件事是我们进行规划的方式。这包括一种估计方法,这种方法既轻量级,又比我以前见过的更有效。现在已经过去了十多年,经验丰富的敏捷开发人员之间开始争论估计是否值得做,或者实际上是有害的[1]。我认为,要回答这个问题,我们必须看看估计将用于什么目的。
一个常见的场景是这样的
- 开发人员被要求(或被给予)对即将进行的工作进行估计。
- 这些任务和估计被转化为发布计划,并使用燃尽图进行跟踪
- 时间和精力都花在了监控实际进度与计划的偏差上。当实际进度最终超过估计时,每个人都会感到沮丧。为了加快进度以符合估计,开发人员被告知要牺牲质量,这只会让情况更糟。
人们都是乐观主义者,所以这些估计往往过低,即使没有压力让他们降低(而且通常至少存在一些隐含的压力)
在这个叙述中,投入到估计中的努力充其量是浪费——因为“估计就像穿着一件干净衬衫的猜测”[2]。通常,估计最终会变得有害,因为它们会鼓励功能崇拜,这是一种糟糕的情况,人们开始更重视完成功能,而不是跟踪项目的实际结果。[3]
估计也设定了期望,由于估计通常过低,因此它们设定了不切实际的期望。[4]任何时间增加或功能减少都被视为损失。由于损失厌恶,这些损失会产生放大的影响。[5]
面对这种情况,人们很容易理解为什么人们会对估计感到愤怒。这导致了一种越来越普遍的观念,即任何沉迷于估计的人都不是真正的敏捷开发人员。敏捷开发的批评者说,这意味着敏捷开发就是开发人员去做一些模糊的事情,并承诺它会在完成时完成,而且你会喜欢它。
我不认为估计本身就是一种邪恶的活动。如果有人问我估计是否是一件坏事,我的回答是标准的咨询师的回答:“这取决于”。每当有人回答“这取决于”时,后续问题就是“取决于什么”。为了回答这个问题,我们必须问我们为什么要做估计——正如我喜欢说的那样,“如果值得做好,就值得问为什么你到底要这样做”。
对我来说,估计在帮助你做出重大决策时是有价值的。
我第一个关于估计驱动的决策的例子是资源分配。组织拥有基本上固定的资金和人员,而且通常有太多值得做的事情。因此,人们面临着决策:我们做 A 还是 B?面对这样的决策,了解每个决策需要多少努力(和成本)是有用的。为了对做什么做出明智的决策,你需要对成本和收益都有所了解。
另一个例子是帮助协调。蓝色团队想要发布一个新的网站功能,但他们无法这样做,除非绿色团队构建一个新的服务来为他们提供关键数据。如果绿色团队估计他们将在两个月内完成,而蓝色团队估计他们需要一个月来构建该功能,那么蓝色团队就知道今天开始工作并不值得。他们可以至少花一个月时间来开发一些其他可以更早发布的功能。
因此,每当你想要请求估计时,你都应该始终明确该估计将用于告知什么决策。如果你找不到,或者该决策并不重要,那么这表明估计是浪费的。当你找到一个决策时,了解它会集中估计,因为决策提供了上下文。它还应该澄清所需的精度和准确性。
了解决策也可能导致你采取其他可能不需要估计的行动。也许任务 A 比 B 重要得多,以至于你不需要估计就可以将所有可用精力投入到首先完成它。也许蓝色团队成员可以与绿色团队合作,更快地构建该服务。
同样,跟踪计划也应该由它如何告知决策来驱动。我通常的评论是,计划充当基线,帮助评估变化——如果我们想要添加一个新功能,我们如何将其融入五磅袋?估计可以帮助我们了解这些权衡,从而决定如何应对变化。在更大范围内,重新估计整个发布可以帮助我们了解整个项目是否仍然是我们能量的最佳利用方式。几年前,我们有一个为期一年的项目,在重新估计后几个月就被取消了。我们认为这是一个成功,因为重新估计表明该项目将比我们最初预期的花费更长时间——早期取消使客户能够将资源转移到更好的目标上。
但请记住,跟踪计划时,估计的保质期有限。我曾经记得一个脾气暴躁的项目经理说,计划和估计就像生菜一样,几天内新鲜,一周后就有点枯萎,几个月后就认不出来了。
许多团队发现,估计提供了一个有用的强制函数,让团队成员互相交流。估计会议可以帮助更好地了解实施即将到来的故事、未来的架构方向以及代码库中的设计问题的各种方法。在这种情况下,任何输出估计数字可能都不重要。有许多方法可以进行此类对话,但是如果这些类型的对话没有发生,则可以引入估计讨论。[6]相反,如果你正在考虑停止估计,你需要确保在估计过程中进行的任何有用的对话仍然在其他地方继续进行。
参加任何有敏捷倾向的会议,你都会听到关于团队在没有估计的情况下有效工作的演讲。这通常是因为他们及其客户都明白,进行估计不会影响重大决策。例如,一个与业务紧密合作的小团队。如果更广泛的业务乐于将一些人分配到该业务部门,那么工作就可以按优先级顺序进行;这通常可以通过团队将工作分解成足够小的单元来实现。[7]团队在敏捷熟练度模型中的级别在这里起着重要作用。随着团队的进步,他们首先会努力进行估计,然后可以变得非常擅长,然后达到他们通常不需要估计的程度。[8]
估计既不好也不坏。如果你可以在没有估计的情况下有效地工作,那么就继续这样做。如果你认为你需要一些估计,那么确保你了解它们在决策中的作用。如果它们将影响重大决策,那么就继续做出你所能做出的最佳估计。最重要的是,要警惕任何告诉你它们总是需要或永远不需要的人。关于估计使用的任何论点都应遵循敏捷原则,即你应该决定哪些技术适合你的特定环境。
致谢
我再次感谢内部列表中的各种 ThoughtWorkers 对他们的评论。我特别想感谢安吉拉·弗格森、戴夫·帕特森和帕特·夸。我还应该感谢詹姆斯·肖尔,感谢他如此迅速而好地回答了我关于与熟练度模型的链接的问题。注释
1: 最近的一篇阅读文章是估计是邪恶的,这是罗恩·杰弗里斯对估计可能导致的问题的精彩讨论。
2: 这个类比是我从罗恩·杰弗里斯那里得到的,虽然我没有它的书面参考。
3: 这种情况是指标使用不当的绝佳例子。
4: 估计和期望
我特别喜欢我的同事安吉拉·弗格森对此的评论:“估计设定期望的方式取决于我们——是糟糕的项目管理(无论是项目经理还是其他团队成员)导致客户认为估计是固定的,或者原始估计 = 实际工作量/持续时间”
“事实上,我试图每周向我的主要客户传递坏消息,即使事情按预期进行……‘所以我们现在看起来进展顺利,但如果我们发现了一些比预期更长的时间,或者需求比预期更大,或者我们发现了一些新的非常重要的事情,你认为最好的行动方案是什么?’然后你探索各种选择——削减故事、增加时间、增加容量等等。这意味着当预期的意外事件发生时(因为我们知道它会发生),对话对客户来说并不显得陌生和可怕。”
5: 大致来说,人们对损失的痛苦是获得快乐的两倍。
6: 如果你这样做,像抛出估计这样的方法可以帮助讨论以良好的速度进行。
7: 当然,将工作分解成小的单元需要一些隐含的估计,但这与更常见的显式估计活动完全不同。
8: 詹姆斯·肖尔最近发表了一篇博客文章,详细介绍了他的观察结果,即熟练度如何影响估计实践。我认为对不同熟练度阶段的实践进行类似的分析将非常有用。