写点什么

敏捷项目估算:什么是故事?什么是点数?

  • 2014-01-20
  • 本文字数:3340 字

    阅读完需:约 11 分钟

引言

当你要雇一位漆工来装饰你的房子,或者一位修理工来修你的车时,你会要他们先给个估算,对吗?你需要知道大概会花多少钱,需要多长时间。这是常识。

然而经验告诉我们什么?初始的估算和最终的账单有多大差距?很有可能漆工会发现有松动的石膏需要铲除,墙面需要修补和重新粉刷;修理工一定会发现要让你车子重新上路还有些其它的问题要解决。在 1951 年的《纽约客》杂志中有这样一幅漫画,Syd Hoff 画了一个修理工对他的客户说:

“当然,那不过只是个估算,实际的花费一定会更多”

如果漆工或修理工告诉我们的这些问题还不是非常紧迫,我们可以选择暂时不处理…… 然而,通常的情况是,我们会觉得不得不修复那些额外的问题。谁会想住在一个可能墙面受潮的房子里,或者开着一辆有可能方向盘失灵的车呢?

那我们怎么解决这样的问题呢?常见的做法就是我们坚持要工人给一个全面的、确定最终价格的估算,也就是通常我们叫的“报价单”,这样工人就会花更多心思用更长的时间来进行更准确的估算。然而现实中,无论他们如何用心努力,终究还是无法预知到那些意想不到的问题。

在项目中,我们面临同样的问题

传统上,项目经理往往会致力于创建很详细的估算,这个估算从财务的角度要经得起推敲。当然这样的估算是基于能够预见的情况再加上针对“已知的未知因素”所设的应急预算…… 然而就像 Donald Rumsfeld 的名言所说“有一些我们未知的未知因素——有些事情我们根本不知道我们不知道”。就像上面那些商人,我们永远无法预知那些意想不到的情况。

我们花越长的时间来创建详细的估算,麻烦却越多。我们可以把详细的估算看作是一个绑定报价,一个不同于真正交付价值的目标,它使得我们的注意力都放到能在协议的日期和成本内交付一些东西——任何东西,无论它的价值高低。

在每次实施后的回顾评审中,初始估算和实际之间的差距总是让我们备受打击,然后告诉我们自己下次再努力些。爱因斯坦曾经说过,所谓神经错乱就是“一遍又一遍地做同样的事情,却期望得到不同的结果”。因此事情不应该这样,一定有其它更好的方法。

敏捷项目显然就不是这样?我们何不就从一个大概的需求范围开始,然后在做的过程中逐渐理清细节?嗯,对,但也不全对。在敏捷项目中我们不会去创建详细的估算来束缚自己,但是对将要进行的工作量的大小有一个认识还是很重要的,这就是为什么……

为什么我们需要估算

忘掉那些传统的估算,那些漂亮的精心制作的甘特图,那些图表迫使我们的注意力都放在要进行的任务上,而不是要交付的成果。在项目中有三种活动需要我们进行一些粗略的估算。

  1. 当我们在考虑一个新提议项目的合理性时,我们需要提前知道大概的成本,这样才能决定是否值得投入。
  2. 当我们正在将新的或改进的产品推向市场时,我们需要知道那些重要的特性大概什么时候可以发布,这样我们才能安排相关的活动。
  3. 当我们在为工作排优先级时,产品负责人需要知道每个故事(或待办清单项)的成本,而团队需要知道每个故事的价值。

有件事很有意思,只要整个团队都一起参与进来共同协作,估算本身也可以变成一种很有意义的活动。它有助于团队增进理解,并保证团队每个人都对要交付的需求范围和价值达成共识。

然而对“估算”这个词的传统理解可能会让我们偏离这个方向。

使用“大小”而不是“估算”

为了避免让人误会我们讨论的是对成本和时间的估算,当我们评估一个故事的复杂程度时,有些人喜欢用“大小”而不是“估算”来描述。在90 年代当我第一次使用Scrum 和XP 时——那时它们都还没有被称为敏捷实践——我们是使用T-shirt 尺寸来评估故事的大小(S,M,L,和XL)。

现在我们使用故事点数——一种评估故事之间相对大小的方法——因此我们先找到可能最简单的故事,将它的点数设为1 点,接下来用其他的故事与它进行比较,如果另一个故事比这个更复杂,那个故事可能就是3 点。

让评估变得更有趣的是,我们不采用简单连续的数列,比如1,2,3,4,5 等——而是采用一种近似菲波拉契数列的形式,像1,2,3,5,8,13 等(就如《达芬奇密码》里面看到的)。这样当数字越大相邻数之间的间隔也越大,使得我们更容易区分哪个故事更小哪个更大。

尽管这不是一种精确的科学,但对上面提到的三种需要估算的情况这种方法已经足够好了。像John Maynard Keynes 所说,“粗略的正确好过精确的错误”。这也意味着,我们仍然需要将故事点数转换成粗略的时间和成本估算。

另一个主要用于敏捷项目的实践是建立“完成标准”,就是对一个故事要能够标注为完成并可发布所需要满足的所有条件进行全面的理解,包括各种项目,比如用户文档、翻译、广告等等。

假如我们有清晰的完成标准,就可以拿几个样例故事来计算所需要的工作量。基于这种计算我们就能为投资决策进行粗略的成本估算,为版本计划进行粗略的时间估算,让我们对故事有更充分的认识以便能协助产品负责人进行故事优先级的设置。

然而有些人仍然认为即使以故事的方式进行估算也会让我们从真正的价值交付上分心。针对这一点,有一个围绕着#NoEstimates 的讨论。

什么是#NoEstimates 讨论

如果你在Twitter 上关注了任何一位敏捷方面有影响力的人,你可能已经注意到他们有些人参与了#NoEstimates 标签的讨论。看起来这是要我们完全停止进行估算,其实它是要我们不再进行故事点数的评估,而是立即开始开发。

这个讨论自从出现后已经有了一个迅速发展的势头,因为那些在大项目中工作的人他们感觉无论是用故事点数进行评估还是仅仅统计故事的个数,团队产量的跟踪结果基本是相同的。

一定程度上这可能是因为那些有经验的交付团队每个迭代会将故事实时地(Just-in-time)以一致的标准拆分成更小的故事——这样的拆分使得团队每个迭代能产出更多潜在可交付的增量——无论项目在迭代里是采用的非常小的故事,还是适度大一些的故事,最终每个迭代的产能报告看上去都差不多。

#NoEstimates 这种方式使得故事的优先级设置更简单了,使得交付团队能够更快地开始工作。然而可怜的产品负责人和项目投资方他们仍然需要知道项目大概要花费多少成本,需要多长时间。好消息是我们还可以基于故事个数的统计来进行粗略的估算,只要项目能够建立起足够有效的度量指标来让这样的估算可行。

对于任何刚开始敏捷之旅的新团队来说,无论如何我都强烈建议你们采用故事点数进行估算,直到你具有了和那些团队一样的丰富经验和成熟度。

结论

作为总结,引用General Dwight D. Eisenhower 的一句名言:“在准备开始一个项目时,我总是发现估算的数字是没有用的,但估算的过程却必不可少”。我们仍然需要进行估算,不管这样的活动叫什么名字,不管在这样的活动中我们如何进行计算。

我要感谢Esther Derby(估算成为目标),Mike Cohn(为发布计划和优先级设置进行估算),Ahmed Sidky(全员估算),Martin Fowler(故事点数),Ian Mitchell(完成标准),Vasco Duarte(故事个数vs. 故事点数),Stephen Forte(度量与估算),Neil Killick(有经验的团队定义更小的故事),和其他很多人,感谢他们在这个话题上给我的分享——以及我上面对他们各自论文的链接引用。

关于作者

David Morris 是一位独立业务敏捷性实践者、教练和讲师;通过他的公司 Sophorum 为新西兰各地的客户提供业务分析、团队领导,教练和培训服务。他有近 30 年的项目交付经验,在这 30 年中他以团队成员,团队领导,以及自己企业的负责人身份参与了各种类型的项目,比如战略、经营和技术类的项目,并在这些项目中运用了结构化的、迭代的和敏捷的方法。

David 通过了 CBAP、ICAgile Certified Practitioner、Certified ScrumMaster 和 IT Certified Professional 的认证。他主持研究小组、专业开发讲座和训练营;帮助 Agile Auckland 和 IIBA NZ 组织活动;在欧洲和澳大利亚的的各种大会和活动上进行演讲;并参与了多本书的创作(包括“Agile Extension to the BA Body of Knowledge”);他也是一位活跃的博主,tweeter 和维基百科编辑。

查看英文原文: Estimating on agile projects: what’s the story, what’s the point?

译者信息:姚安峰,微博:霜木


感谢侯伯薇对本文的审校。

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

2014-01-20 06:566764

评论

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

深圳首辆数字人民币主题观光巴士亮相

CECBC

在Spring Bean实例过程中,如何使用反射和递归处理的Bean属性填充?

小傅哥

Java spring 小傅哥 反射调用 属性填充

你们公司的数据库出过问题么?

escray

学习 极客时间 朱赟的技术管理课 6月日更

react源码解析4.源码目录结构和调试

全栈潇晨

React Hooks react源码

React Hooks - 如何安全地使用state

蛋先生DX

大前端 React React Hooks JavaScrip 6月日更

面试系列-3 限流场景实践

李阿柯

php lua redis 面试 限流算法

GrowingIO 前端团队对于 GraphQL 的实践总结

GrowingIO技术专栏

大前端 graphql

【Vue2.x 源码学习】第二篇 - Vue的初始化流程

Brave

源码 vue2 6月日更

手把手教你在IDEA中配置Maven

打工人!

Java maven 6月日更

Dubbo SPI

青年IT男

dubbo

中断Hwi:提高鸿蒙轻内核系统实时性及执行效率的秘密武器

华为云开发者联盟

鸿蒙 硬件 中断 鸿蒙轻内核 中断信号

Spring Boot FatJar类加载机制简要分析

luojiahu

Spring Boot 类加载 ClassLoader FatJar

分治(详解残缺棋盘 —— Java代码实现)

若尘

算法 分治 java代码 6月日更

“扯皮”终结者,区块链帮农民工计薪水

CECBC

Hello Python! 第一天学 Pyhton 语言

在即

6月日更

BZZ算力挖矿系统开发功能丨BZZ算力挖矿源码设计

系统开发咨询1357O98O718

有点难的 webpack 知识点:Dependency Graph 深度解析

范文杰

webpack 6月日更

情指勤一体化指挥调度平台搭建,情报研判分析系统搭建

致恰达耶夫,致鸿蒙

脑极体

【Flutter 专题】114 图解自定义 ACEProgressPainter 对比进度图

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 6月日更

直击Huawei Mate 40产线背后的华为云IoT智能制造

华为云开发者联盟

IoT 数字化转型 数字孪生 华为云IoT

关于第四次财富狂潮的思考,区块链如猛虎出笼?

CECBC

k8s 插件管理工具之krew使用

雪雷

6月日更

Redis数据结构

邱学喆

数据库 redis 跳跃表

实现多级缓存架构设计方案

xcbeyond

缓存 缓存架构 6月日更

一文了解预训练语言模型!

博文视点Broadview

详解Camtasia的注释功能

淋雨

视频剪辑 Camtasia 录屏

HarmonyOS 2正式发布 硬件生态品牌HarmonyOS Connect一同亮相

科技汇

微博评论的高性能高可用计算架构设计

唐高为

ARTS- 日常打卡5

pjw

面试系列-2 redis列表场景分析实践

李阿柯

php 面试 redis cluster

敏捷项目估算:什么是故事?什么是点数?_文化 & 方法_David Morris_InfoQ精选文章