【敏捷FAQ 番外篇(关于估算的、较为理论化的话题)】明明应该是排除个人依赖的估算,为什么故事点却因人而异

日本語|English|中国语
| 5 min read
Author: tomohiro-fujii tomohiro-fujiiの画像
Information

为了覆盖更广泛的受众,这篇文章已从日语翻译而来。
您可以在这里找到原始版本。

 感谢您阅读本文。我是所属敏捷小组的藤井智弘。
 在撰写第9篇(换算为人日)时,话题在“故事点究竟是在衡量什么”这一点上越展开越多,已经无法容纳在正文中。因此紧急将其抽出,作为番外篇。本文不采用一贯的问答形式,而是一路追究一个疑问到底,是一期较为理论化的内容。
 不过,我喜欢这种内容,我自己。

一直让我在意的疑问

#

 来自使用过功能点(FP)现场的人,曾多次问过我同一个问题:“FP 是排除了个人依赖的客观规模,只要遵循计数规则,无论谁来计算,结果都会几乎相同。听说故事点也是通过相对值来排除个人依赖,但对于同一个事项,不同成员却会给出 3 和 8 两种结果。明明应该是排除个人依赖的估算,为什么估算值会因人而异?是不是哪里出了问题?”

 坦白说,我自己也长期抱有这个疑问。培训中会这样说明:“人日会因人而异,但规模的比例无论谁看都是相同的。因此,只要使用相对值进行估算,就能够排除个人依赖。”那么,为什么在规划扑克中数值会出现分歧?如果分歧本就是前提,那么“排除了个人依赖”究竟排除了什么?像 FP 那样按规则计数就不会产生分歧,为什么不这么做呢?

 先说答案,它有两个层次。第一层是,“个人依赖”这个词指代了两种不同的东西,而故事点排除的只是其中一种。第二层是,敏捷的计划制定本来就不押注于估算时点的精度。下面从第一层开始依次说明。

个人依赖并不只有一种

#

 第一种是,对实施人员的依赖。同一个事项,A 做需要 2 天,B 做则需要 6 天。第二种是,对估算人员的依赖。同一个事项,A 估为 3,B 则估为 8。

 FP 是试图排除这两种依赖的度量方法。它按照规则对能够从外部观察到的功能(输入输出、查询、内部文件、外部接口)进行计数,因此不依赖于由谁来实现;如果是受过训练的测量人员,无论谁来计算,结果都会收敛到接近的值。FP 是一种“测量”;所谓测量,就是追求以相同程序测量相同对象时,能够得到相同数值的活动。

 故事点只处理第一种个人依赖。而且并不是排除它,而是绕开它。对 A 来说可能是 1 天和 2 天,对 B 来说可能是 3 天和 6 天。即使绝对值相差 3 倍,“后者是前者的 2 倍”这个比例仍然相同。在估算不确定由团队中谁来负责的事项时,只要保留比例,无论谁接手都能使用。“因为是相对值,所以能排除个人依赖”实际上的含义就是这个:所期待的是比例的不变性,而不是绝对值的客观性。

 第二种,即因估算人员而产生的差异,从一开始就没有被排除。故事点不是测量,而是判断,并且基于“该团队自己的刻度”。刻度的原器不是计数规则,而是基准故事——即“将登录页面的修改定为 3”这样一个实际存在的事项。因此,不同评估者给出不同数值并不是缺陷,而是相对估算的设计特征。

图1:两种个人依赖——对实施人员的依赖,以及对估算人员的依赖

会产生分歧,是因为本来就是这样设计的

#

 规划扑克采用“所有人同时亮牌,出现分歧后再讨论”的形式,是因为要把分歧本身作为信息来使用。如果结果分成了 3 和 8,要么是其中一方知道另一方不知道的隐患,要么是对规格的理解存在分歧。给出 3 的人或许知道某个简单的捷径,而给出 8 的人或许曾经在相同的地方吃过大亏。把这些信息都拿出来交流后,再收敛到一个数值。评估者之间的差异不是要排除的对象,而是发现理解差异的探测器。而让其收敛的过程,则是在校准刻度(啊,让我想起了毕业论文中的实验……)。

 如果在这里直接将分歧平均为 5,虽然很快,但会丢弃分歧所携带的信息。5 并不是任何一个人的判断。按照最了解情况的那个人给出的数值来决定,通常确实会更接近正确的值,但那是“那个人的刻度”,而不是“团队的刻度”。在那个人请假的 Sprint 中,或者那个人离开之后,刻度就会发生波动。如果制作规则表,按照“一个页面是 3、一个表是 2”来计数,分歧确实会消失;但那些未被写进规则的困难——旧代码中的隐患、模糊的规格、首次使用的技术——也会从数字中消失,点数越是变得客观,就越会偏离这个团队的实际感受。消除分歧的方法有很多,但它们都源自“点数应该是客观测量值”这一误解,也都会使刻度校准停止。

图2:分成 3 和 8 时——取平均、按最了解的人来定,还是通过讨论使其收敛

 故事点所追求的不是客观性,而是团队内部的一致性。不过,即使说“没有必要客观”,了解 FP 的人可能也不会接受。那么,如何保证不客观的数字具有足够的精度?这个问题将引向第二层。

精确性是在哪里形成的

#

 估算的产物不是数字,而是判断。通过赋予点数所做出的决定有三个:“是否可以将其放入这个 Sprint”“是否应该拆分”“是否应该先进行调查”,除此之外通常不会决定太多事情。做出这些判断所需的精度可以是粗粒度的。是 3 还是 5,极少会导致判断改变;但若是 3 还是 13,判断就会改变。因此点数的刻度是 1、2、3、5、8、13 这样不连续地跳跃,而这种跳跃本身就是“我们只区分到这种程度的差异”的声明。点数是将基于经验的判断,转化为可用于决策的数字。即使存在误差,只要误差没有大到足以改变判断,也就足够了。

 另一个用途是,将总点数除以速度(Velocity)来预测进度。在这种情况下,单个事项的误差会在相加过程中彼此抵消。估为 3、实际为 5 的事项,以及估为 5、实际为 3 的事项,在总计时会相互抵消。因此,存在波动没有关系。有问题的不是波动,而是偏差:所有人都朝同一个方向虚增,产生通货膨胀式的偏差。这种偏差不会被抵消,而会留在总量中。为了“稳定”速度而虚增数字之所以有问题,是因为这造成的不是波动,而是偏差。

 那么,为什么采用粗粒度的判断,误差却不会变得过大?这里正是敏捷计划制定的关键:误差并不取决于估算方法,而是由估算对象的大小和得到验证结果所需的时间决定。事项足够小,8 就不会变成 80。误差与事项的大小成正比,也与不确定性成正比。因此,只要缩小事项,并通过梳理(Refinement)提前消除不确定性,即使判断较粗,误差上限也会较低。Sprint 足够短时,几周内就能发现判断是否偏离,并反映到下一次判断中。不要同时开展过多工作也是同样的道理:并行进行的事项越少,一个偏差对其他事项造成的影响就越小。敏捷并不是通过提升估算精度,而是通过构建让估算偏差无法变大的结构来控制误差。

 如果不讨论这种结构,只谈估算方法或精度是没有意义的。这正是 FP 与故事点对比中最深层的地方。
 FP 之所以需要估算时点的精度,是因为其前提是在一开始就固定范围,并且没有在之后缩小误差的机制。如果估算出现偏差,后续没有机会弥补它。因此只能在前期确保精度,需要无论谁来计算都能得到相同数值的规则。
 故事点之所以可以采用粗粒度的判断,是因为形成精度的地方不在估算时点,而是在其周围的机制中——小事项、短 Sprint、梳理,以及实际速度。
 FP 与点数的区别,不是精度高低的区别,而是在哪里形成精度的区别。对于开头“为什么不按规则计数”的疑问,答案不是“因为不需要客观性”,而是“因为不押注于估算时点的精度”。

图3:在哪里形成精度——是在估算时点,还是在估算周围的机制中

个人依赖去了哪里

#

 回到第一层,回答一下“个人依赖是否消失了”这个问题。它没有消失,只是放置的位置不同。

 FP 将规模客观化之后,在换算为工时的阶段,还需要额外使用各种“调整特性、反映生产率的系数”——即这个团队、这项技术下,每 1 FP 需要多少小时。个人依赖被转移到了这个系数中。规模是客观的,系数则属于团队,这就是二者的分工。

 故事点以估算团队和实施团队是同一个团队为前提,将团队特有的条件纳入估算本身。剩余的校准偏差则被速度吸收。即使刻度稍有失真,速度也会用相同的失真来测量,因此预测仍然准确。个人依赖被转移到了速度中。规模和刻度都属于团队,因此速度也属于团队,这就是二者的分工。前一节提到的缩短“得到验证结果所需时间”的机制,正是在每个 Sprint 中持续进行这种吸收。

 无论哪种方法,个人依赖都不是被排除了,只是放置的位置不同。这样看,也可以说故事点的闭环更坦诚。FP 将“客观规模”和“属于团队的系数”交给不同的人、在不同的地方处理,因此系数往往容易被忽视。故事点则将估算、实施、测量闭合在同一个团队中,因此失真会被自动抵消。

图4:个人依赖的放置位置——FP 放在生产率系数中,点数放在速度中

那么,点数究竟是在衡量什么

#

 说到这里,就可以这样表述了。故事点是针对要构建之物的规模——综合了工作量、复杂性和不确定性的东西——基于该团队经验的判断,并以团队自己的刻度表示出的相对值。它不是测量值,而是判断;相比数字本身,使用它所作出的决策才是产物。

 工时是“人投入的时间”,即投入方的量;而规模则是要构建的对象一方的量。连接两者的是速度,它作为事后观测得到的换算系数,表达的是“这个团队能够以这样的节奏完成这种规模的工作”。因此,点数不是“工时的别名”。但它也不是 FP 那样的“客观规模”。它是一种只在团队内部流通的规模货币。

 回到开头的疑问。故事点并不是排除个人依赖的估算,而是属于团队的估算。它所排除的只是“由谁来实施”这一绝对值,并且也只是将其绕开到比例中。评估者之间的差异不是要排除的对象,而是达成共识的材料。而这种方式能够成立的条件,不是客观性,而是估算、实施和测量都在同一个团队中闭环,以及周围存在使偏差无法变大的结构。

 一旦采用了不闭环的用法,刻度的团队专属性就会暴露出来并导致失效。拿不同团队的点数作比较。由一个团队估算、另一个团队实施。通过换算表将其带到团队外部。第 9 篇中看到的四种类型,全部都是这种“不闭环的用法”。那一篇中写到“换算值是事项的成本,速度是团队的流量”,其区别的根源也在这里。因为流量是用只在团队内部才有意义的刻度测量出来的,一旦带到团队外部,就开始假装成成本。

现场中的一些小心得

#

 理论部分到此为止,实际现场需要做的事情并不多。

 刻度的原器是基准故事,因此请选定 2~3 个实际存在的事项,约定“将这个定为 3”,并在每次估算时参考它们。当成员发生变动时,要与新成员一起重新审视基准故事。刻度不是规则,而是共同的记忆,因此需要一套传承记忆的流程。

 出现分歧时,不要取平均,而要讨论。两端的人各自说一句理由,通常就能发现隐患或理解偏差。如果无法收敛,就拆分事项,或先将调查工作拆出来。

 当想要提高估算精度时,不要怀疑方法,而要怀疑事项的大小和 Sprint 的长度。如果 13 以上的事项成为常态,无论如何打磨估算技巧,误差都不会缩小。请先拆分。

 不要将刻度带到团队外部。对外输出的数字,如第 9 篇所写,应当是根据总点数和实际速度推导出的周期与金额。

 此外,在合同上无论如何都需要排除个人依赖的规模依据时,不要试图让点数客观化,而应另外使用 FP 这样的测量方法。点数是计划工具,FP 是合同工具。若让两者兼用,就都无法发挥各自的作用。为谨慎起见补充一点:FP 的客观性也是理念上的,实践中一直有报告指出,不同测量人员之间会出现 10%~30% 的波动。但“按规则计数”和“通过共识决定”在理念上是完全不同的,因此只要将它们作为面向不同目的的不同工具同时持有即可。

结语

#

 我们中的许多人都被教导:估算就是“猜中正确的值”。FP 是这种文化的一个高点,它以无论谁来计算都能得到同样的值为目标而设计。当在这种文化中接触到故事点时,觉得“非客观的估算是尚不成熟的估算”,是很自然的。我自己也曾这样认为。

 然而,敏捷的计划制定并不追求猜中正确的值,而是追求持续根据实际结果更新预测。因此,重要的并不是数值是否客观,而是能否持续使用相同的刻度进行衡量,以及是否维持了让偏差无法变大的结构。精度不在估算之中,而在围绕估算的机制之中。当团队中的点数出现分歧时,那不是个人依赖的暴露,而是发现理解差异的瞬间。是否在这里进行了讨论,以及事项是否足够小。这两点,是确认该团队的估算是否作为工具正常发挥作用的最简单方法。

豆蔵では共に高め合う仲間を募集しています!

recruit

具体的な採用情報はこちらからご覧いただけます。