DevOps落地笔记-20|软件质量:决定系统成功的关键

上一课时介绍通过提高工程效率来提高价值交付效率,从而提高企业对市场的响应速度。在提高响应速度的同时,也不能降低软件的质量,这就是所谓的“保质保量”。具备高质量软件,高效率的企业走得更快更远。相反,低劣的软件质量,高效率则会让企业死得更快。高质量的软件是企业一直在追求的目标,那么又有哪些指标可以帮助我们识别软件存在的问题呢?这就是今天就介绍一些有关这方面的内容。

什么是软件质量?

如今,任何一个企业都是数字化企业,任何一家数字化企业都是以软件为业务核心。因此,软件的质量是企业生死存亡的关键因素,务必要引起重视。既然软件质量如此重要,领导者需要了解当前软件质量是多少,存在什么问题,软件质量的发展趋势是什么,这些就是软件质量的度量。

软件质量也包含两部分:内部质量外部质量

& 内部质量:是指被开发人员感知的质量,比如,代码的缺陷、坏味道、不合理的架构设计等。内部质量是造成外部质量的源头,在开发过程中要尽早发现、尽早修复内部质量问题,提高发布到生产环境中产品的外部质量。

& 外部质量:是指能够被用户感知到的质量。比如,用户在使用产品的过程中出现异常,服务不可用,响应迟钝等现象,影响用户体验。外部质量是决定产品是否成功的关键,提高外部质量是团队成员的最终目标。

& 下面分别从内部质量和外部质量两个方面介绍软件的质量。

内部质量

企业在实施 DevOps 的实践中,也一直在尝试将代码质量的检查集成到流程中,比如持续交付流水线中集成静态代码检查,单元测试覆盖率检查等环节。针对代码质量检查的工具也有很多,常用的有 SonarQube、PMD、FindBugs 等。下面这张图是 SonarQube 代码质量检查的概览页面。
在这里插入图片描述
代码质量检查

代码质量度量是针对代码本身的度量,根据开发人员的主动和被动,以及对软件造成的影响大小,可以分为Bug 和漏洞以及技术债务。

& Bug 和漏洞

Bug 和漏洞是开发人员在开发业务功能时,在无意识行为下产生的代码问题,即并不是开发人员故意为之。这类问题一般不易被发现,一旦被发现需要及时修复,因为会对软件造成严重影响。Bug 是指代码中的错误,可能会阻止程序按预期运行,影响的是程序的可靠性。漏洞是指代码中的问题,心怀不轨的人会利用这些问题破坏程序的安全性。

比如:Java 语言中,字符串和装箱类型的比较使用 equals() 进行比较。下面这段代码就会检查出 Bug。

String firstName = getFirstName(); String lastName = getLastName();if (firstName == lastName) { ... };

这是因为使用==或!=比较运算符,比较的是内存地址而不是具体的值。在某些情况下,即便 firstName 和 lastName 具体的值相等,但也返回 false。
缺陷和漏洞的度量,一般采用数量和级别,级别分为BLOCKER(阻断)、CRITICAL(严重)、MAJOR(主要)、MINOR(次要)、INFO(提示)。

& 技术债务。

技术债务是指开发人员在开发和设计的时候,为了能满足短期的效益而采取的权宜之计。比如:缺乏自动化测试的代码,包含坏味道的代码。坏味道是指不会阻止程序的正常运行,但可能会对代码的可维护性产生影响。如上图中技术债务需要1天偿还,包含坏味道 86 个,这些就是对技术债务的度量。

如下面就是一个坏味道的例子,当数组或集合返回 null 时,调用方需要做 null 判断,否则就会抛出空指针异常。

public static List<Result> getResults() {return null;                             // Noncompliant}public static Result[] getResults() {return null;                             // Noncompliant}public static void main(String[] args) {Result[] results = getResults();if (results != null) {                   // Nullity test required to prevent NPEfor (Result result: results) {/* ... */}}}

除此之外,还包含圈复杂度、函数代码行、文件代码行、重复代码率、重复文件数等度量。

测试质量检查

测试阶段又称为质量保证(QA)阶段,是软件开发过程中确保软件功能性和非功能性需求满足用户要求的阶段。为了提高测试效率,很多企业逐渐减少人工测试的比率,提高自动化测试的比率。测试阶段的质量度量可以使用测试覆盖率和测试缺陷数量来表示。

测试覆盖率。

测试覆盖率是衡量代码质量的一个方法,是指自动化测试中代码的覆盖程度,包含单元测试、集成测试、回归测试的测试覆盖率。上图中 54.6% 是测试覆盖率的度量。测试覆盖率越高,发现问题的概率越大,在测试阶段发现的问题越多,软件发布到生产环境后问题就会越少。

但是关于测试覆盖率“多少算是合适?”这一问题,很多人是存在分歧的。业界普遍认为测试覆盖率达到 80% 就足够了。这里强调的是,测试一定是有效测试,无效的测试即便 100% 覆盖也没有任何意义。

& 测试缺陷数量。

测试缺陷数量是指在测试阶段发现的代码问题的数量。如下图所示。每一个缺陷又可以按缺陷类型、严重程度、发现阶段进行标记。

1.缺陷类型:用户体验问题、性能问题、接口问题、界面问题、环境问题等。

2.严重程度:致命缺陷、严重缺陷、一般缺陷、轻微缺陷和建议等。

3.发现阶段:功能测试、单元测试、集成测试、用户验收测试等。
在这里插入图片描述
测试阶段的目的就是发现问题,所以我们不能惧怕发现问题。在实际开发过程中,测试人员给开发人员提 Bug,开发人员会很抵触,好像是污蔑自己的编码智商,使得开发和测试也会处于对立局面。另外,测试人员要分清哪些是 Bug,哪些是需求改进,不要将需要优化的需求也作为 Bug 提给开发人员。

虽然会度量测试阶段的缺陷数量,但不要作为衡量团队成员能力的依据,也不会作为绩效考核的标准。还是前面提到的,要以结果性、全局性的指标为最终指标。

外部质量

上面介绍了内部质量,以及通过代码检查和自动化测试来保证内部质量,在开发流程中也集成了工具和制度。虽然我们做了大量的质量保证活动,就一定能交付高质量的产品吗?答案是“不一定”。内部质量并不能说明用户对产品是满意的还是抱怨的,也不能说明用户使用过后,是想继续使用还是想舍弃。由于缺少这些相关的度量信息,以至于无法判断产品的质量状态。因此,要从用户满意度、产品非功能性等方面评估产品的外部质量。

用户满意度

用户满意度是从最终用户的角度对产品的评判。企业在调查用户满意度方面已经很成熟了,有多种方式可以收集用户对产品或服务的评价信息。拨打过 10086 的同学都知道,客服在结束时都会说“请您稍后对我的服务做出评价,满意请按 1,不满意请按 2”,这就是收集用户满意信息的一种方式,其他的还有:

& 调查问卷;

& 互联网产品卸载时的弹窗;

& 投诉与建议。

这几种方式,都可以了解用户对产品的哪些功能不满意,为后期进行产品功能优化时提供依据。那么,用什么方式度量用户满意度比较合适呢?业界认为“净推荐值(NPS)”是衡量用户满意度的黄金标准。这是计算某个客户会向其他人推荐某个企业或服务可能性的指数,采用 0-10 分进行打分,分数越高说明你越愿意推荐这个企业或服务。

产品非功能性

除了用户本身对产品或服务的直观感受外,用户在使用产品过程中感知的产品非功能性问题也是衡量产品质量一个因素。比如产品的可靠性、性能等。

& 可靠性:是指用户在使用产品的过程中出现服务不可用的概率。这里既可以指具体的人使用产品功能,也可以指系统间的调用或通信。总之,给用户带来的影响是不能正常的使用产品。

& 性能:是指用户在使用产品时的流畅性,未出现卡顿、延迟等现象。比如,打开一个页面需要 10s 以上,虽然还能够使用产品,但用户体验不好。

产品的非功能性问题会最终影响用户满意度,一般通过用户反馈的缺陷和问题数量及严重程度来度量产品的可靠性,通过应用程序性能监控系统(APM) 度量产品的性能。随着DevOps实践的不断深入,通过蓝绿部署、金丝雀发布等方法,先在一小部分用户使用新版本,以便提前发现软件存在的问题,从而避免让更多用户受到影响。以及使用混沌工程,提前发现问题,减少产品不可用的概率。这些方法都是针对产品的非功能性采取的防控措施。

总结

本课时主要介绍了软件质量,这一决定产品成功与失败的关键要素。软件的质量分为内部质量和外部质量,二者相辅相成,互相影响。内部质量是源头,外部质量是结果。提高内部质量会进一步提升外部质量,外部质量也会反过来促进内部质量的提升。DevOps 的目标是在提高研发效率的同时,也要提高软件产品的质量。

如今市场竞争越发激烈,用户在第一次使用后,认为产品或服务没有达到满意,是不会再有第二次机会的。因此,软件的质量是企业研发的重中之重,也是企业实施 DevOps 的目标之一。

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

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

相关文章

消息中间件之RocketMQ源码分析(八)

RocketMQ中的消息过滤 RocketMQ设计了消息过滤&#xff0c;来解决大量无意义流量的传输:即对于客户端不需要的消息&#xff0c; Broker就不会传输给客户端&#xff0c;以免浪费宽带&#xff0c;RocketMQ4.2.0支持Tag过滤、SQL92过滤、Filter Server过滤 Tag过滤 第一步:用户发…

蓝桥杯Web应用开发-CSS3 新特性【练习三:文本阴影】

文本阴影 text-shadow 属性 给文本内容添加阴影的效果。 文本阴影的语法格式如下&#xff1a; text-shadow: x-offset y-offset blur color;• x-offset 是沿 x 轴方向的偏移距离&#xff0c;允许负值&#xff0c;必须参数。 • y-offset 是沿 y 轴方向的偏移距离&#xff0c…

Swift Combine 管道 从入门到精通三

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二 1. 用弹珠图描述管道 函数响应式编程的管道可能难以理解。 发布者生成和发送数据&#xff0c;操作符对该数据做出响应并有可能更改它&#xff0c;订阅者请求并接收这些数据。 这…

LoveWall v2.0Pro社区型校园表白墙源码

校园表白墙&#xff0c;一个接近于社区类型的表白墙&#xff0c;LoveWall。 源码特色&#xff1b; 点赞&#xff0c; 发评论&#xff0c; 发弹幕&#xff0c; 多校区&#xff0c; 分享页&#xff0c; 涉及违禁物等名词进行检测&#xff01; 安装教程: 环境要求&#xff1b;…

一文读懂|Apollo自动驾驶平台9.0全面解读

2023年12月19日&#xff0c;百度正式推出了Apollo开放平台的全新升级版本--Apollo开放平台9.0&#xff0c;面向所有开发者和生态合作伙伴&#xff0c;以更强的算法能力、更灵活易用的工具框架&#xff0c;以及更易拓展的通用场景能力&#xff0c;继续构筑自动驾驶开发的领先优势…

极限的反问题【高数笔记】

1. 什么是极限反问题&#xff1f; 2. 极限反问题分为几类&#xff1f; 3. 每一类极限反问题的具体做法是什么&#xff1f; 4. 每一类极限反问题具体做法是否有前提条件&#xff1f; 5. 例题&#xff1f;

本地安全策略 | 服务器管理 | 配置项

本地安全策略 Windows 本地安全策略是一组在本地计算机上配置的安全设置&#xff0c;用于管理计算机的安全性和访问控制。这些策略是针对单个计算机的&#xff0c;与域策略不同&#xff0c;本地安全策略不通过域控制器进行集中管理。本地安全策略通过本地组策略编辑器进行配置…

Linux---线程

线程概念 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列” 一切进程至少都有一个执行线程 线程在进程内部运行&#xff0c;本质是在进程地址空间内运行 在Linux系统中&#xff0c;在CPU眼中…

数据结构第十二天(队列)

目录 前言 概述 源码&#xff1a; 主函数&#xff1a; 运行结果&#xff1a; 前言 今天和大家共享一句箴言&#xff1a;我本可以忍受黑暗&#xff0c;如果我不曾见过太阳。 概述 队列&#xff08;Queue&#xff09;是一种常见的数据结构&#xff0c;遵循先进先出&#…

25、数据结构/二叉树相关练习20240207

一、二叉树相关练习 请编程实现二叉树的操作 1.二叉树的创建 2.二叉树的先序遍历 3.二叉树的中序遍历 4.二叉树的后序遍历 5.二叉树各个节点度的个数 6.二叉树的深度 代码&#xff1a; #include<stdlib.h> #include<string.h> #include<stdio.h> ty…

UDP是什么,UDP协议及优缺点

UDP&#xff0c;全称 User Datagram Protocol&#xff0c;中文名称为用户数据报协议&#xff0c;主要用来支持那些需要在计算机之间传输数据的网络连接。 UDP 协议从问世至今已经被使用了很多年&#xff0c;虽然目前 UDP 协议的应用不如 TCP 协议广泛&#xff0c;但 UDP 依然是…

提速MySQL:数据库性能加速策略全解析

提速MySQL&#xff1a;数据库性能加速策略全解析 引言理解MySQL性能指标监控和评估性能指标索引优化技巧索引优化实战案例 查询优化实战查询优化案例分析 存储引擎优化InnoDB vs MyISAM选择和优化存储引擎存储引擎优化实例 配置调整与系统优化配置调整系统优化优化实例 实战案例…

Linux学习笔记(centOS)—— 文件系统

目录 一、Linux中的文件 打开方式 二、目录结构​ 三、相关命令 切换目录命令 列出当前目录下的文件和目录命令 一、Linux中的文件 “万物皆文件。” 图1.1 所有文件 打开方式 图形化界面左上角的位置→计算机&#xff0c;打开以后就可以看到Linux全部的文件了&#xf…

C语言:操作符详解

创作不易&#xff0c;给个三连吧&#xff01;&#xff01; 一、算术操作符 C语言中为了方便计算&#xff0c;提供了算数操作符&#xff0c;分别是:,-,*,/,% 由于这些操作符都是有两个操作数&#xff08;位于操作符两边&#xff09;&#xff0c;所以这种操作符也叫做双目操作…

【操作系统】MacOS虚拟内存统计指标

目录 命令及其结果 参数解读 有趣的实验 在 macOS 系统中&#xff0c;虚拟内存统计指标提供了对系统内存使用情况和虚拟内存操作的重要洞察。通过分析这些指标&#xff0c;我们可以更好地了解系统的性能状况和内存管理情况。 命令及其结果 >>> vm_stat Mach Virtu…

查看NodeJs版本和查看NPM版本

Windows10 Dos命令下 查看NodeJs版本和查看NPM版本 NodeJs的命令是&#xff1a;node -v Npm的命令是&#xff1a;npm -v 下图&#xff1a; 记录下&#xff01;~

Springboot 整合 Elasticsearch(三):使用RestHighLevelClient操作ES ①

&#x1f4c1; 前情提要&#xff1a; Springboot 整合 Elasticsearch&#xff08;一&#xff09;&#xff1a;Linux下安装 Elasticsearch 8.x Springboot 整合 Elasticsearch&#xff08;二&#xff09;&#xff1a;使用HTTP请求来操作ES 目录 一、Springboot 整合 Elasticsea…

DC-7靶机渗透详细流程

信息收集&#xff1a; 1.存活扫描&#xff1a; 由于靶机和kali都是nat的网卡&#xff0c;都在一个网段&#xff0c;我们用arp-scan会快一点&#xff1a; arp-scan arp-scan -I eth0 -l └─# arp-scan -I eth0 -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:dd:ee:6…

【蓝桥杯冲冲冲】[NOIP2017 提高组] 宝藏

蓝桥杯备赛 | 洛谷做题打卡day29 文章目录 蓝桥杯备赛 | 洛谷做题打卡day29[NOIP2017 提高组] 宝藏题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1样例 #2样例输入 #2样例输出 #2提示题解代码我的一些话[NOIP2017 提高组] 宝藏 题目背景 NOIP2017 D2T2 题目描…

机器人学、机器视觉与控制 上机笔记(2.1章节)

机器人学、机器视觉与控制 上机笔记&#xff08;2.1章节&#xff09; 1、前言2、本篇内容3、代码记录3.1、新建se23.2、生成坐标系3.3、将T1表示的变换绘制3.4、完整绘制代码3.5、获取点*在坐标系1下的表示3.6、相对坐标获取完整代码 4、结语 1、前言 工作需要&#xff0c;想同…