Day944.度量指标 -系统重构实战

news2024/12/28 21:48:00

度量指标

Hi,我是阿昌,今天学习记录的是关于度量指标的内容。

很多时候在研发过程中,都习惯性地用“拍脑袋”的方式来看待一个事情。例如这个代码写得不好、这个自动化测试覆盖不充分、版本的发布频率太差了等等。往往只知道哪里有问题,但是却不知如何去找出根因,真正改进。对于这种情况就需要我们引入度量。

通过 度量指标,可以让在研发过程中更加明确目标,避免一开始就走成了反方向,另外,完成了阶段性工作后,又可以通过持续的度量来反馈完成的情况,帮助我们持续地改进。软件开发中,从需求到上线运营的每个阶段都有大量的度量指标,之前自动化测试就从生命周期的视角提供了不少指标。


一、开发指标

首先来看看开发相关的度量指标。通常问题比较多的度量指标,分别为圈复杂度、代码重复率、无效代码行以及代码耦合度。

其中圈复杂度、代码重复率、无效代码在五类遗留系统典型的代码坏味道中就讲过了,这重点介绍指标的目的以及如何在实践中运用这些指标。

1、圈复杂度

圈复杂度 指的是代码的嵌套复杂度。这个指标的度量目的很明显,如果圈复杂度高,就意味着代码的嵌套复杂度过高,不利于阅读理解以及测试。

很多遗留系统的问题就是缺少重构,导致大量庞大的类及方法,后续不管是扩展功能或者修改逻辑都非常容易出问题。

在实践过程中,一般结合流水线,在质量门禁中的静态代码扫描环节进行检查。

一般来说圈复杂度不能超过 10,而且越小越好

当提交的代码不符合要求时,则限制代码合入。


2、代码重复率

重复代码 指的是代码中有两个地方以上存在相同的代码行。这个指标的作用也非常明显。如果存在大量的重复代码,特别是 2 个相同的类只有个别的代码行差异,当相同部分的逻辑有变化的时候,就会导致需要在多个地方修改代码,这就是所谓的“散弹式修改”。

在实践过程中,同样可以结合流水线,在质量门禁中检查代码重复率,一般建议不超过 5%。当提交的代码不符合要求时,同样要限制代码的合入。


3、无效代码行

无效代码 指的是没有被调用的类、方法或者资源等内容。虽然无效代码不会影响功能,但是会影响整体阅读代码的体验,尤其是理解代码的难易程度。在遗留系统中,无效代码也是非常常见的问题。

同样可以结合流水线进行静态代码检查,如果发现有无效的代码行则反馈给相关人员,要求其修改。在日常的开发过程中,也应该关注 IDE 的提示,在提交前保证代码的整洁。


4、代码耦合度

那么什么样才算耦合呢?这里的 耦合 指的是所有不符合架构规则的代码调用关系就算耦合

具体可以参考运用自动化工具诊断分析Sharing项目中对 Sharing 项目的耦合分析。

当然这里有一个前提,一定是得有架构设计以及架构规则,因为如果没有规则,就没有耦合的判断依据。如果代码存在前面说的耦合情况,就代表目前的代码不符合架构的设计规则,日积月累,架构就会不断地腐化。

在在实践中,需要将架构守护变成自动化测试用例,加入到流水线的质量门禁中,以便在代码提交存在耦合时,能够及时发现并反馈。


二、自动化测试指标

自动化测试 是需要投入设计及维护,如果编写的自动化测试用例没有被执行,那么相当于就是白费力气。所以针对自动化测试进行持续度量是一项非常重要的工作。

下面,来看看自动化测试度量相关的 4 个常用关键指标,分别为测试用例数、执行频率、执行时长以及执行成功率。

1、测试用例数

测试用例数 指的是持续执行的自动化测试用例的总数。

可以通过观察这个指标来看项目整体自动测试投入的变化。

正常情况下,有效的自动化测试用例随着业务的迭代,测试的数量应该持续地增加,如果测试的数量存在大幅波动,应该重点做分析。

可以通过测试报告来获取测试的用例数,然后结合持续集成工具来统计用例数的变化。


2、执行频率

自动化测试执行频率 指的是自动化测试每天执行的次数。

无论是自动化测试的设计还是维护,都需要成本,所以只有频繁的执行才能发挥其价值。

通常自动化测试都会接入到持续集成流水线中。所以,可以通过观察自动化测试的执行频率,来查看自动化测试是否充分地执行了。


3、执行时长

自动化测试执行时长 指的是一套自动化测试用例执行所需的时间。

自动化测试的一个重要目标是验证反馈,所以反馈的周期越短,那么作用就更大。所以应该持续观察自动化测试用例执行的时长,这个数据也可以通过测试用例报告获得。

在实践过程中,如果发现有个别用例的执行时间非常长,应该重新检查。通常来说,小型测试的执行时间是毫秒级别,中大型测试的执行时间是秒级别。


4、执行成功率

自动化测试执行成功率 指的是自动化测试执行后通过的测试用例数除以测试用例总数。

如果存在用例执行失败的情况,应该及时分析,排除引入或破坏业务逻辑问题。实践当中,要避免为了让代码可以合入而注释掉失败用例的情况。另外,自动化测试执行成功率也能从某种程度反应开发代码提交的质量,建议持续观察这个指标。


三、流水线指标

当团队使用了流水线来集成发布软件时,流水线的执行情况直接反映了团队的效率以及版本的质量。所以在实践过程中,一定要持续关注流水线运行的相关指标。

流水线中常用的 4 个关键指标,分别为构建频率、构建时长、构建成功率以及平均恢复时长。

关于这 4 个指标,通常的持续集成工具都有插件支持统计查询。

1、构建频率

构建频率 指的是一段时间内持续集成流水线执行的平均频率。

如果主干日均执行频率低于 1 次,那么证明团队的代码合入频率非常低。出现这种情况,就需要去排查是任务的拆分粒度过大,还是开发人员没有及时集成代码。至少需要保证主干每天都能成功构建出一个最新可用的版本。


2、构建时长

构建时长 指的是一段时间内持续集成流水线执行的平均时长。这个指标关乎着开发人员代码合入的效率。在实际的团队辅导过程中,我曾遇到持续集成流水线平均执行时长接近 2 个小时,这反过来会影响开发人员代码合入的意愿,变成另外一个瓶颈。

针对流水线执行时间过长的的问题,需要先排查具体耗时的步骤,再针对性解决。另外,也可以采用并发以及分级的形式来提高效率。


3、构建成功率

构建成功率 指的是一段时间内持续集成流水线成功执行的次数除以执行的总数所得的比率。

如果在一段时间内执行成功率非常低,例如低于 60%,在排查掉一些环境的影响因素后,则证明这段时间内代码提交的质量不高,则需要具体分析执行失败的任务,并及时调整。


4、平均恢复时长

平均恢复时长 指的是一段时间内持续集成流水线从失败转变为成功的平均间隔时间。

通过这个指标可以促进团队更加关注流水线的运行情况。因为可以根据这个指标,判断开发人员对持续集成纪律的遵守情况,比如,是否能在流水线执行失败后立马修复。


四、总结

通过 度量指标 可以帮助明确方向,及时反馈结果,推动持续改进。

通常在项目中,都会搭建度量相关的看板来持续观察数据的变化,同时也会在团队定期的回顾会上,复盘这些数据制定改进目标。

不建议团队将度量指标纳入 KPI 中,这样非常容易导致走向另外一个极端,失去了度量关键的意义。

下面度量指标的定义、目的、建议阈值及趋势等总结成表格。给出了一些通用的建议参考阈值,具体的产品不同,情况可能会有差异。

在这里插入图片描述


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

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

相关文章

后台服务异常?测试右移告警监控早知道。。。。

目录 引言 “测试右移”思想下实践步骤 什么是“测试右移” 一、收到问题反馈 二、沟通定位问题 1.服务架构 三、讨论并选定解决方案 1.讨论分析解决方案 2.选定解决方案 四、解决方案实现 1.总体方案设计 2.编写监控脚本 3.配置服务器定时任务 五、测试环境验证…

从零开始学Java之Integer底层原理探究

前言 在之前的两篇文章中,壹哥给大家介绍了Java中的包装类及其特点、用法,但是这些内容主要是停留在”怎么用“的层面,没有太多涉及”为什么“,所以接下来壹哥会给大家讲一讲Integer这个包装类的底层原理。在现在的就业环境下&am…

Apache Tomcat CVE-2020-1938 漏洞

Apache Tomcat CVE-2020-1938 漏洞简单复现 文章目录 Apache Tomcat CVE-2020-1938 漏洞简单复现实验准备实验步骤搭建环境nmap扫描漏洞端口POC代码验证漏洞修复建议 参考链接 实验准备 所选漏洞:Apache Tomcat远程代码执行漏洞 漏洞编号:CVE-2020-193…

AppArmor零知识学习三、源码介绍与下载

本文内容参考: AppArmor配置(二)_domybest_nsg的博客-CSDN博客, Apparmor简单学习_trap0D的博客-CSDN博客, 学习LSM(Linux security module)之三:Apparmor的前世今生和基本使用_wx5b7658e51ef04的技术博客_51CTO博客…

JavaEE初阶学习:文件操作

1.文件 1.认识文件 平时说的文件一般都是指存储再硬盘上的普通文件,形如txt,jpg,MP4,rar等这些文件都可以认为是普通文件,它们都是再硬盘上存储的。 在计算机中,文件可能是一个广义的概念,就…

【云原生|Docker】12-Docker Harbor企业级镜像管理

【云原生Docker】12-Docker Harbor企业级镜像管理 文章目录【云原生Docker】12-Docker Harbor企业级镜像管理前言Harbor简介简介架构介绍组件间说明工作原理docker logindocker pushHarbor安装版本介绍安装Http模式部署https模式部署前言 ​ 上一章节我们介绍了Docker的官方的镜…

【redis】集成到SpringBoot

集成到SpringBoot 类似于java连接mysql需要JDBC 而Java连接redis则需要 对应的 工具类 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录集成到SpringBoot前言一、Jedis加依赖写业务二、lettuce加依赖写业务Jedis和…

转换字符串的最少操作次数是否所有1都至少相隔k个元素重复至少k次且长度为M的模式移除指定数字得到的最大结果 得到k个黑块的最少涂色次数

转换字符串的最少操作次数&#xff08;回顾等级&#xff1a;不值得&#xff1b;已达最优解&#xff09; 来源&#xff1a;自己LeetCode刷题 usa int minimumMoves(char * s) {int szstrlen(s);int res0;for (int i0;i<sz;i){if (s[i]X){i2;res;}}return res; }是否所有1都…

Makefile实验

一、准备C程序 1、input.h #ifndef __INPUT_H #define __INPUT_Hvoid input_int(int *a, int *b);#endif 2、input.c #include <stdio.h> #include "input.h"void input_int(int *a, int *b) {printf("input two nums: ");scanf("%d %d&q…

8年经验的面试官分享Android工程师的面试秘诀

本人目前在一家知名企业担任Android高级工程师&#xff0c;工作八年来面试不过不少Android工程师求职者&#xff0c;前后累积有两三百人。在本文内容中&#xff0c;小编将结合本人的面试经验&#xff0c;给各位正在找Android开发工作的小伙伴提出一些面试前的准备建议。 一&am…

vue3通用后台管理项目

一、创建项目 1、使用vite创建名为my-vue的项目&#xff1a;npm init vite-app my-vue 2、进入到my-vue文件夹下&#xff1a;cd my-vue 3、安装依赖包&#xff1a;npm install 4、运行该项目&#xff1a;npm run dev 二、引入element-plus 1、element-plus地址&#xff1a;http…

Camunda整体架构

REST API REST API 允许您从远程应用程序或 JavaScript 应用程序使用流程引擎。&#xff08;注意&#xff1a;REST API 的文档被分解为自己的文档。&#xff09;REST API Reference | docs.camunda.org Camunda Tasklist用于人工工作流管理和用户任务的 Web 应用程序&#xff0…

UniverSeg:通用医学图像分割模型来了!

自从今年以来ChatGPT爆火和GPT-4的发布&#xff0c;一时间在大模型的潮流下&#xff0c;通用人工智能&#xff08;AGI&#xff09;也呼之欲出。随着本月初SAM和SegGPT等通用的CV大模型的提出&#xff0c;大模型和通用模型这把火也逐渐烧到的CV领域&#xff0c;特别是图像分割领…

Linux应用编程(文件IO进阶)

一、Linux 系统如何管理文件 1.1、静态文件与 inode 文件存放在磁盘文件系统中&#xff0c;并且以一种固定的形式进行存放&#xff0c;我们把他们称为静态文件。 每一个文件都必须对应一个 inode&#xff0c;inode 实质上是一个结构体&#xff0c;这个结构体中有很多的元素&a…

【C语言】初阶指针(指针运算、二级指针及指针数组)

简单不先于复杂&#xff0c;而是在复杂之后。 目录 1. 指针运算 4.1 指针-整数 1.2 指针 - 指针 1.3 指针的关系运算 2. 指针和数组 3. 二级指针 4. 指针数组 1. 指针运算 指针-整数指针-指针指针的关系运算 4.1 指针-整数 上面这个程序的作用是将数组中每个元…

【攻城狮计划】Renesas RA2E1 开发板

&#x1f6a9;WRITE IN FRONT&#x1f6a9; &#x1f50e;介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四"&#x1f50e;&#x1f3c5;荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2022博客之星TOP10…

Scalable Recognition with a Vocabulary Tree(词汇树)

视觉单词 参考 视觉词袋&#xff08;BoVW&#xff0c;Bag of Visual Words&#xff09;模型&#xff0c;是“词袋”&#xff08;BoW&#xff0c;Bag of Words&#xff09;模型从自然语言处理与分析领域向图像处理与分析领域的一次自然推广。对于任意一幅图像&#xff0c;BoVW模…

jwt生成和解密-jose4j

jwt生成和解密-jose4j jwt的概念和生成意义在这里就不描述了&#xff0c;百度能搜到很多&#xff0c;直接上代码 官网地址 https://bitbucket.org/b_c/jose4j/wiki/Home maven <dependency><groupId>org.bitbucket.b_c</groupId><artifactId>jose4j…

【微信小程序】-- 配置uni-app的开发环境(四十八)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

Echarts图表显示不完全(多种图表解决方案)

前言 在使用Echarts画图的时候&#xff0c;有时候图表在固定大小的盒子模型&#xff08;dom容器&#xff09;中会显示不完全&#xff0c;因此我们需要对图表进行相关的调整使得图表内容显示完全。结合最近遇到的情况&#xff0c;提出一些解决方向 &#xff08;比较片面&#x…