所有的估算都是错的,但并非都没有用处

Dr Milan Milanović 2023年8月10日

如果你在团队中使用 Scrum 框架,你会使用 story points 来估算故事、任务等的所需工作量。一些管理层也会考虑这一点,进行计划、衡量你的生产力,甚至在你完成某项工作时让你负责。然而,他们需要明白软件估算总是错误的。

主要原因是估算本质上是预测,是对未知未来的推断。我们都知道不可能预见到最终结果,但人们往往会忘记这一点,并根据估算做出承诺。

制定计划通常是好的,因为它们允许我们迭代地工作,不断为客户提供价值。然而,项目通常非常复杂,涉及许多团队以及团队之间的依赖关系。

为什么计划会失败? 有很多原因,例如需求不明确、未考虑到知识水平、软件需求被低估、未考虑技术债务等等。

此外,还有一些其他因素导致 Estimation 失败

  1. **Hofstadter’s Law(侯世达定律)**指出,“它总是比你预期的要花费更长的时间,即使你考虑了侯世达定律”。它强调了估算的递归性质,即考虑到任务的复杂性和人类的乐观情绪通常会导致低估。
  2. **Brook’s Law(布鲁克斯定律)**指出,“向延期的软件项目增加人手会使其更加延期”。这条定律强调了增加团队规模以加快项目速度的负面影响。新团队成员需要时间来上手,并且额外的沟通会增加,进一步延迟项目。
  3. Planning Fallacy(计划谬误):这种认知偏差会导致人们低估完成任务所需的时间和资源。在软件估算中,开发人员可能需要更多地关注潜在的障碍或对自己的能力过于乐观,从而导致不准确的估算。
  4. Bikeshedding(脚踏车棚效应):这条规律指出,人们倾向于关注琐碎的细节,而不是项目的关键方面。在软件估算中,这可能导致过度强调容易理解的任务,而低估更复杂的任务。
  5. **Parkinson’s Law(帕金森定律)**指出,“工作会膨胀,直到用完完成它所用的时间”。这条定律表明,如果截止日期过于宽松,开发人员可能会在任务上花费比必要更多的时间,从而导致效率低下和延迟。
  6. **Ninety-Ninety Rule(90-90规则)**指出,“最初90%的代码占用了最初90%的开发时间;剩余10%的代码占用了另外90%的开发时间。” 这条规则强调了准确估算修复错误、优化和润色所需时间的难度。

此外,我们还必须处理 The Cone Of Uncertainty(不确定性锥)(由 Steve McConnell 引入软件开发领域)。通常,在项目的早期阶段,我们仍然不了解所有需求,但我们需要做出许多决定。 在这里,不确定性很高。 随着项目的进行,我们掌握了更多信息,不确定性降低。

The Cone of Uncertainty

⚠️ 请注意,在“The Leprechauns of Software Engineering”一书中,作者声称“不确定性锥”从未基于可靠的数据。它最初是 Barry Boehm 的主观猜测,Steve McConnell 通过他的 1996 年著作“Rapid Development”将其推广开来。

对此有哪些补救措施? 在他的著作“Software Estimation Without Guessing”中,George Dinwiddie 提供了宝贵的见解和技术,以提高软件估算的准确性和可靠性:

除此之外,我的经验是:

估算 = 复杂性 + 不确定性

"Software Estimation Without Guessing" by George Dinwiddie

除了以上所有内容外,Vasco Duarte 在他的著作“NoEstimates: How to Measure Project Progress Without Estimating”中提出了一种替代方法。

他反对传统的估算方法,例如 story points。 Duarte 认为这些方法不够准确,造成了一种精确性的谬论,并导致沟通不畅和不适当的压力。 相反,他建议放弃 story points(实际上,每个用户故事都值一个 story point)并交付能够提供重大价值的少量工作,利用吞吐量或周期时间等经验数据来准确反映能力和生产力。

衡量标准应基于吞吐量(在设定的时间范围内完成的任务数)、周期时间以及从开始到完成一项工作所需的时间。 诸如 Kanban 之类的可视化系统可以帮助跟踪进度并识别瓶颈。 定期的回顾和反馈可以实现持续改进,从而增强迭代开发的重要性,以促进快速交付少量增量价值。

“NoEstimates: How To Measure Project Progress Without Estimating,” by Vasco Duarte