度量避坑指南,合理选择指标(下) | IDCF

作者:Patrick Kua  领导开发团队利用敏捷方法为客户提供有价值的软件,他是《回顾手册:敏捷团队指南》的作者

译者:冬哥

原文:https://martinfowler.com/articles/useOfMetrics.html

三、更恰当地使用指标的指南 

鉴于因指标使用不当而出现的不良行为,这是否就意味着它们没有立足之地?度量指标当然有其发挥空间,只是需要一种不同的方法。使用以下指南可引导你更恰当地使用指标:

  • 明确地将指标与目标联系起来;

  • 倾向于跟踪趋势而不是绝对数字;

  • 使用更短的跟踪周期;

  • 当指标停止推动变革时改变指标。

3.1 明确地将指标与目标联系起来

在传统风格中,管理层决定实现特定目标的最佳措施是什么;然后,管理层根据该措施设定目标;然后,管理层只向从事工作的人阐明这个目标,通常是用数字表示。为监控目标进展而选择的措施与实际目标本身之间的界限很模糊。随着时间的推移,衡量背后的原因消失了。即便是该指标与最终目标不再相关,人们却依然专注于实现指标。度量的一个更合适的用途是确保所选的进度度量(指标),始终与其目的(目标)相关。

例如,在软件开发的场景中,您可能会看到如下定义的指标:

  • 方法必须少于 15 行,一个方法的参数不能超过 4 个,方法圈复杂度不得超过 20。

适当地使用度量标准,每一项措施都应与其最初的目的明确联系起来。当前的跟踪和监控机制必须与其目标解耦,并明确目标以便帮助人们更好地理解指标的意图。存在于更丰富的上下文中的度量将指导人们为实现目标做出更合适、更务实并且更有用的决策。缺乏目的,付出的努力意味着人们想方设法创造性地和系统做游戏,最终将偏离真正的目标。

这是前面例子该有的样子:

  • 我们希望我们的代码不那么复杂并且更容易改变。因此,我们的目标应该是编写具有低圈复杂度(小于 20 行)的短方法(少于 15 行)。我们还应该瞄准少数参数(最多四个),以便方法尽可能保持专注。

将指标与目标明确联系起来,可以让人们更好地挑战其相关性,找到满足需求的其他方法,并帮助人们理解数字背后的意图。如果没有明确的目的,人们可能会想方设法,却无意中违背了隐含的目标。例如,许多技术可能都有助于减少方法长度,但如果不以正确的意图应用则更难阅读,从而增加整体复杂性。

软件开发的本质意味着大多数工作是知识工作,因此很难观察。监控活动(他们坐在电脑前的时间)很容易,但很难观察他们产生的价值(满足实际需求的有用软件)。人们越远离代码,他们就越难理解所涉及的复杂性。这意味着,对于离工作最远的人来说,要真正了解监控目标进展的最佳措施,即使不是不可能,也是非常困难的。

转向更恰当地使用指标意味着管理层不能孤立地提出措施。他们不能再自欺欺人地认为自己知道监控进度的最佳方法,并停止执行可能与目标最相关也可能毫不相关的措施。相反,管理层负责确保始终保持最终目标,与最了解系统的人合作,提出最有意义的措施来监控进度。

3.2 倾向于跟踪趋势而不是绝对数字

管理层对于指标难以抗拒,因为它将组织的复杂性提炼为每个人都能理解的东西,一个数字。很容易看出一个数字比另一个更大或更小,或者一个数字与另一个数字的距离有多远。但是很难看出这个数字是否仍然相关。传统的管理方法喜欢使用这些指标,因为它可以在实现目标时轻松沟通。“只要达到这个数字,我们就会没事的”。

当你将一个定性的和高度解释性的问题(想想生产力、质量和可用性)转化为一个数字时,任何数字都是相对的和随意的。5% 和 95% 的代码覆盖率可能存在显著差异,但 94% 和 95% 之间真的存在显著差异吗?选择 95% 作为目标有助于人们了解何时停止,但如果需要付出一个数量级的努力才能获得最后的 1%,这真的值得吗?这只是人们必须在他们自己的组织环境中主观解决的事情。

与目标是否实现相比,查看趋势提供了更有趣的信息。确定是否达到目标很容易,难的是,管理人员必须与有技能的人一起来完成观察趋势的工作,看看他们是否朝着期望的方向和是否以足够快的速度前进。趋势为随组织复杂性而来的绩效提供了领先指标。当趋势越来越远离理想状态时,关注数字的差距显然毫无意义。

关注趋势很重要,因为它会根据有关实施的任何更改的真实数据提供反馈,并为组织做出更多反应选择。例如,如果团队正在远离理想状态,他们可以问问自己是什么导致他们偏离目标,以及他们可以做些什么。它比简单地在计算出数字之前尽可能多地采取行动要早得多。如果一个团队发现自己趋向于理想状态,他们可以问问自己是什么在帮助他们朝着目标前进,还有什么可以做来加快这个速度。测量团队鼓励人们进行更多的实验,调整一件事并观察它对趋势的影响,

任意的绝对数字也会造成无助感,尤其是当实现目标的进展缓慢并且对其他部门或团队控制之外的公司政策的依赖阻碍了更多进展时。趋势有助于将人们的努力集中在朝着正确的方向前进,而不是在看似无法解决的差距之间陷入瘫痪。

更恰当地使用指标需要管理层更多地参与报告和记录趋势的变动,因为围绕团队建立生态系统是管理层的责任。这个生态系统包括组织的政策、工作安排或计划的方式以及团队和人员的组织方式。这种生态系统通常对个人付出的努力对趋势的影响要大得多。管理层应该对趋势感兴趣,以观察变化对这个生态系统的影响。

适当使用指标会发现趋势比绝对数字更有用。如果没有正确的趋势,任意给出的目标就没有多大意义,当考虑影响趋势的因素以及可以采取哪些措施来影响趋势时,更好的问题会浮现,而不是随意的指出数字与现实之间的差距。

3.3 指标作为棘轮

Thoughtworks 经常被要求拯救每次更改需要太长时间的软件项目。被认为很小的改变通常需要一个月以上的时间才能真正完成。这些类型的项目具有一个非常共同的特征——代码质量被视为事后考虑项,并且已经产生了大量的技术债务。

典型救援项目的代码库充满了大量代码异味。在许多领域(如许多并行继承层次结构)中都弥漫着单一的代码味道的出现频率很高;其他情况,代码味道很大,例如一个过大的方法;最坏的情况,代码异味的出现频率和程度都很大。解决这些问题中的任何一个一开始似乎都是不可能的,因为解决一个问题的努力是压倒性的。始终如一地解决单一代码异味很困难,因为它需要立即停止交付增量业务价值。

扭转低质量的趋势是唯一的出路,通过棘轮机制使其成为可能,我的同事 Chris Stevenson 在他的博客文章“使用棘轮机制修复损坏的 Windows ”中提到了这个词。

棘轮机制涉及将代码分析工具添加到持续集成的构建中,当某个指标超过某个值时,CI就会失败。团队通常都以这种方式作为开始,将其添加到持续集成构建中,以免进一步朝着错误的方向发展。在交付其他功能和业务价值的同时,逐步解决所选代码异味的问题,一次一小步。在每次小的改进上,团队都会向下修改指标的当前值。

似乎是一个无法解决的问题,一次被拆成一小块。棘轮到位以防止向后移动,每一个小的改进都会将趋势推向正确的方向。

3.4 使用更短的跟踪周期

许多组织使用指标来设定很长一段时间的目标,通常是 3-6 个月,甚至长达一年或更长时间。管理人员制定了这个目标,负责工作的人有责任尽他们所能来实现这个目标。管理层在期末重新审视这一目标,以评估从事工作的人员。在这个系统中,管理层和员工之间的关系,说得好听点,可以描述为对抗性的。员工尽其所能实现目标,而这隐含的想法是管理层没有任何的责任。

长时间之后重新审视指标的结果是,未能达到管理层的目标变得越来越不可接受。我听过经理这样说,“你有整整一年的时间来实现你的目标,但你错过了它。” 跟踪期越长,失败的风险和成本就会增加。

敏捷方法更喜欢较短的审查时间,因为任何性能差距的成本都较低。一周内没有取得足够的进步远不如一整年没有取得足够的进步重要。每周回顾进展比一年后回顾进展产生更多的选择,仅仅是因为有更多的机会做出反应和改变。在短短的一段时间(例如一周)之后,你还会获得更多关于实际发生的事情而不是计划内容的数据,这应该用于通过使用它来推动变革来影响结果。

组织可以从使用较短的跟踪周期中受益,因为它为重新规划创造了更多机会,从而实现了最大价值。

我与一个团队合作,该团队每两周将软件发布到生产环境中。该企业喜欢定期发布,因为这样他们几乎可以立即使用该软件。在使用最新版本之后部署的软件时,该企业发现他们拥有足够的功能,几乎可以完成新营销计划所需的一切,而这只是他们最初需求的一小部分。

与开发团队编写可能永远不会使用的功能不同,业务选择了剩余故事的一小部分并开始着手下一个计划。

适当使用指标可以在较小的周期内跟踪进度,因为它提供了更多关于项目将来可能会在哪里结束的信息。跟踪较小的周期有助于识别趋势,暂停使组织能够更明智地识别影响环境和趋势的速率/方向。

跟踪更短的周期还可以实现更多的协作,因为它为管理层提供了更多参与的机会。不是简单地在较大周期结束时评估人们,而是跟踪较小周期提供有关影响趋势的实际情况的更多数据。

3.5 当指标停止推动变革时改变指标

如果组织能够轻松实现目标,他们就永远不需要指标。组织可以改变方向,可以立即达到目标。不幸的是,这在现实中不会发生,这就是措施存在的原因,实现目标通常需要更长的时间。正确使用指标的第一条准则将实际目标与为监控实现该目标的进度而选择的措施分开。真正的目标必须始终明确。

准则#2 和#3,监控趋势并在更短的时间内,这样做是为了帮助组织更快地实现他们的目标。它不是通过本章前面描述的单循环学习来实现的。组织需要的是 Argyris 所说的双循环学习。适当使用指标会促使人们质疑目标,并根据收集的真实数据实施变革以实现目标。

这是双循环学习的样子:

因每周修复错误而沮丧的开发人员Dan考虑为什么他要不断修复错误。在过去的三周里,马尔科姆报告了许多关于事情没有按他预期工作的问题。他退后一步思考到底发生了什么,不再关心他总是被问到的错误数量,而是更多地关心他为什么要开始处理这些错误。

当丹拿起一个故事时,他经常向马尔科姆提出很多关于它应该如何运作的问题。丹知道马尔科姆还有其它营销活动让他忙碌,也明白马尔科姆不能坐在他旁边回答他的问题。丹在交付某些东西方面承受着巨大的压力,因此他做出了几个假设以确保他可以交付一些东西而不是什么都没有。

看着错误,Dan 意识到报告的许多错误都是基于他不断做出的那些小假设。交付某些东西的压力意味着 Dan 从来没有第一次就做出正确的东西。

当丹向马尔科姆解释这一点时,他们同意在每个新故事的开头坐下来,以确保丹的所有问题在他开始编码之前都得到解答。他们在第二周尝试这个,并且报告的错误总数减少了。

双循环学习需要更多关于实际情况的数据。较短的周期会产生更多的数据点,从而更容易看到任何趋势。这些趋势提供了对系统当前性能的洞察力,应该用于引发对系统中更深层次潜在力量的思考和问题解决,而不仅仅是跟踪性能测量。实施真正的变革有助于加速组织实现其当前目标。

改变人们工作的系统通常比关注个人更努力或更快工作的影响要大得多。在我们的故事中,丹本可以每周花更多时间来尝试修复错误,但是通过调整信息流以及马尔科姆和丹之间的工作关系,他们使系统变得更加有效。

项目的事后分析会在项目完成后进行回顾,从中汲取经验教训,希望将其应用于未来的项目或在整个组织中传播。在项目结束时进行事后分析没有机会将这些学习实际应用于项目本身。敏捷回顾的意图有所不同,他们在项目进行中寻求改变,在这种情况下,行动比最终产生的影响更大。这些会议为团队寻找变革机会创造了机会,尽管仍然依赖人员和组织来承诺这些变革。

当组织达到其目标时,就该返回用于实现目标的指标了。请记住,如果组织可以立即实现他们的目标,则永远不需要度量指标。定义、跟踪、监控和解释指标需要时间和资源,而这些时间和资源本可以更好地用于实现新的目标。适当的使用指标,组织需要随时放弃不再相关的指标,而不是保留他们习惯收集的所有指标。

你可以通过询问人们“为什么我们需要收集这个数字?”来寻找可能过时的指标的一些症状。一个糟糕的回应可能包括:“我们一直都是这样做的”,或者更糟的是,“这是我们的政策。” 这个问题不一定能区分解释不清的目标或过时的指标,因此可能需要多挖掘一些。管理层有责任确保组织的时间不会浪费在收集和维护不必要的指标上。

结论

指标在组织和团队中具有目的和地位,它们不能用作思考的替代品。组织也不能认为按数字管理就足以有效地交付软件。组织必须警惕因指标使用不当而出现的不良行为。双循环学习帮助我们理解,在组织学会更合适地使用指标之前,不可能存在关注个人行为的不同。

通过适当使用指标,组织可以将每个指标与每个人都理解的明确目标联系起来。选择用于监控进度的措施必须与目标脱钩,并随着时间的推移挑战每个指标的相关性。使用指标的组织更恰当地理解观察趋势的价值,在更短的时间内进行监控以了解个人、管理和组织的影响。更好的使用还意味着经常检查和调整这些影响,以确保在不断评估适合度的最终目标的背景下趋势加速、减速和逆转。

【相关文章】

您可能会发现以下有关使用和误用指标的文章很有趣:

  • Esther Derby 的 Gaming Incentives - 反思人们如何操纵情况以最大化他们的激励计划。

  • Vanity Metrics vs. Actionable Metrics 作者 Eric Ries - 精益创业布道者,Eric Ries 描述了如何使指标更具可操作性以及为了衡量而衡量的危险。

  • 速度是杀死敏捷性的 吉姆海史密斯 - 一篇高度相关的文章,描述了公司如何将速度误用为指标。

脚注

  • 1:Chris Arygris 和 Donald A. Schön 在他们的著作《组织学习:行动视角理论》中描述了单循环和双循环学习的概念。 

  • 2:如应用的用户故事中所述:用于敏捷软件开发。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/196366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

提升--21---JMM(Java内存模型)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 JMM--Java Memory ModelJMM 定义JMM规则:线程间通信的步骤: JMM的三大特性:原子性(Atomicity)可见性&…

微软 Power Platform 零基础 Power Pages 网页搭建实际案例实践(三)

微软 Power Platform 零基础 Power Pages 网页搭建教程之案例实践学习(三)结合Power Apps和Power Automate Power Pages 实际案例学习 微软 Power Platform 零基础 Power Pages 网页搭建教程之案例实践学习(三)结合Power Apps和Po…

练习十一:简单卷积器的设计

简单卷积器的设计 1,任务目的:2,明确设计任务2.1,目前这部分代码两个文件没找到,见第5、6节,待解决中。 ,卷积器的设计,RTL:con1.v4,前仿真和后仿真,测试信号…

Python入门07循环及常见的数据结构

目录 1 循环的语法结构2 break和continue的示例3 可迭代对象4 列表5 元组6 列表和元组的应用场景7 集合8 字典9 生成器 1 循环的语法结构 在Python中,循环是一种控制结构,用于重复执行一段代码,直到满足特定条件。Python中有两种循环结构&am…

flink sink多个topic

flink stream数据 动态写入多个topic flink1.15之前 import org.apache.flink.streaming.api.scala._ import org.apache.flink.streaming.connectors.kafka.{FlinkKafkaProducer, KafkaSerializationSchema} import org.apache.kafka.clients.producer.ProducerRecordobject…

Spring切面编程

切面编程 代码地址: orbit-hub/spring-boot-samples at master (github.com)https://github.com/orbit-hub/spring-boot-samples/tree/master 切面执行顺序 Spring5以后顺序就一切正常 正常:前置通知目标方法返回通知后置通知 异常: 前置通知目标方…

C++12.4

沙发床的多继承 多继承代码实现沙发床沙发床继承于沙发和床 代码&#xff1a; #include <iostream>using namespace std;//封装 沙发 类 class Sofa { private:string sitting;double *size; public://无参构造函数Sofa() {cout << "Sofa::无参构造函数&quo…

京东运营数据分析(京东数据采集):2023年10月京东护肤行业品牌销售排行榜

鲸参谋监测的京东平台10月份护肤市场销售数据已出炉&#xff01; 鲸参谋数据显示&#xff0c;2023年10月份&#xff0c;京东平台上护肤市场的销量为2000万&#xff0c;环比增长约28%&#xff0c;同比降低约26%&#xff1b;销售额为25亿&#xff0c;环比增长约24%&#xff0c;同…

Java基本数据类型、包装类及拆装箱详解

Java的基本数据类型和对应的包装类是Java语言中处理数据的两个关键概念。基本数据类型提供了简单而高效的方式来存储数据&#xff0c;而包装类使得基本数据类型具有对象的特性。本文将深入探讨基本数据类型与包装类的应用场景及详细描述&#xff0c;并对自动拆箱和装箱的源码实…

了解完Devops,让我们再来看看什么是SRE吧!

SRE SRE 全称是 Site Reliability Engineering&#xff0c;即网站稳定性工程师。最早是由 Google 提出&#xff0c;并且在其工程实践中发扬光大。这个团队设立目的是帮助 Google 生产环境服务运行更稳定、健壮、可靠。不同于中小型规模公司&#xff0c;Google服务于十几亿用户…

SpringBoot+SSM项目实战 苍穹外卖(3)

继续上一节的内容&#xff0c;本节完成菜品管理功能&#xff0c;包括公共字段自动填充、新增菜品、菜品分页查询、删除菜品、修改菜品。 目录 公共字段自动填充新增菜品文件上传实现新增菜品实现 useGeneratedKeys 菜品分页查询删除菜品修改菜品根据id查询菜品实现修改菜品实现…

geemap学习笔记015:下载哨兵2号(Sentinel-2)数据

前言 使用GEE下载数据应该是最常见的功能了&#xff0c;今天就介绍一下如何使用geemap下载哨兵2号(Sentinel-2)数据&#xff0c;分别包括自己画感兴趣&#xff0c;以及利用Assets中的shp文件进行下载。 1 自己画感兴趣下载哨兵2号影像 import geemap import eeMap geemap.M…

金蝶云星空表单插件单据体批量删除,序号自增

文章目录 金蝶云星空表单插件单据体批量删除&#xff0c;序号自增字段标识说明表单插件获取单据体数据包移除物料为空的行其他移除物料为空的行的方式&#xff0c;但是测试不通过&#xff0c;不建议使用序号重新生成测试 金蝶云星空表单插件单据体批量删除&#xff0c;序号自增…

Apache Doris 详细教程(三)

7、监控和报警 Doris 可以使用 Prometheus 和 Grafana 进行监控和采集&#xff0c;官网下载最新版即可。 Prometheus 官网下载&#xff1a;https://prometheus.io/download/ Grafana 官网下载&#xff1a;https://grafana.com/grafana/download Doris 的监控数据通过 FE 和…

【矩阵论】Chapter 3—线性映射和线性变换知识点总结复习

文章目录 1 线性映射及其矩阵表示2 线性映射的值域&#xff08;像&#xff09;和核3 线性变换4 酉变换和正交变换5 同态和同构6 不变子空间 1 线性映射及其矩阵表示 映射定义 设 A , B A,B A,B是两个集合&#xff0c;如果存在一个规则 f f f&#xff0c;使得对于 A A A中的元素…

B2B公司如何寻找意向客户的联系方式?

在B2B公司的营销过程中&#xff0c;少不了寻找意向客户的阶段&#xff0c;这也是销售过程中非常重要的一步。 很多新人都是拿到客户联系方式&#xff0c;就直接打电话拜访&#xff0c;俗话说不打没有准备的仗&#xff0c;因此在拜访客户之前就应该做好功课&#xff0c;充分了解…

数据结构和算法专题---2、算法思想

上文讲到算法的概念、复杂度&#xff0c;本文给大家介绍具体的算法思想&#xff0c;让大家对算法设计理念有个认识&#xff0c;后续再分别介绍各种算法。 算法思想 算法是解决问题的一种思想和方法&#xff0c;其基本思想是将一个复杂问题分解为多个简单的子问题&#xff0c;…

全网最新最全的自动化测试教程:python+pytest接口自动化-请求参数格式的确定

我们在做接口测试之前&#xff0c;先需要根据接口文档或抓包接口数据&#xff0c;搞清楚被测接口的详细内容&#xff0c;其中就包含请求参数的编码格式&#xff0c;从而使用对应的参数格式发送请求。例如某个接口规定的请求主体的编码方式为 application/json&#xff0c;那么在…

跟我学c++高级篇——动态反射之二动态列表

一、动态生成列表 在上一篇中实现了一个Map映射&#xff0c;其实就是一个表。但那个表有点维护和扩展上的不方便&#xff0c;所以后为又开始用静态展开递归的方式来遍历枚举。其不管是怎么做&#xff0c;都是要得到整个枚举体的信息&#xff0c;然后才能进行处理。 这次使用一…

医院信息化专业人员必备医院业务运作及管理流程知识(详细)

业务流程是一家医院运作的基础,医院所有业务都需要流程加以驱动。熟知医院各项业务,了解医院管理流程,有利于医院工作人员更好地投入自身岗位,提高工作效率。本文整理了常见医院业务运作及管理流程,仅供参考! 【门诊业务】 一、门诊业务的特点: 1.接诊病人多,就诊时…