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.rhkb.cn/news/253876.html

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

相关文章

Linux的进程信号

注意&#xff1a;首先需要提醒一个事情&#xff0c;本节提及的进程信号和下节的信号量没有任何关系&#xff0c;请您区分对待。 1.信号概念 1.1.生活中的信号 我们在生活中通过体验现实&#xff0c;记忆了一些信号和对应的处理动作&#xff0c;这意味着信号有以下相关的特点&…

Pandas文本数据处理大全:类型判断、空白字符处理、拆分与连接【第67篇—python:文本数据】

文章目录 Pandas文本数据处理大全&#xff1a;类型判断、空白字符处理、拆分与连接1. 判断文本数据类型2. 去除空白字符3. 文本数据拆分4. 文本数据连接5. 文本数据替换6. 文本数据匹配与提取7. 文本数据的大小写转换8. 文本数据的长度计算9. 文本数据的排序10. 文本数据的分组…

大数据企业应用场景分析

目录 一、企业分析 1.1 企业领域维度分析 1.2 技术服务型维度分析 1.3 细分领域维度分析 二、大数据应用场景 2.1 数据分析 2.2 智能推荐 2.3 产品/流程优化 2.4 异常监测 2.5 智能管理 2.6 人工智能和机器学习 三、总结 前言&#xff1a;想讲清楚大数据应用对企业…

(4)【Python数据分析进阶】Machine-Learning模型与算法应用-回归、分类模型汇总

线性回归、逻辑回归算法应用请参考: https://codeknight.blog.csdn.net/article/details/135693621https://codeknight.blog.csdn.net/article/details/135693621本篇主要介绍决策树、随机森林、KNN、SVM、Bayes等有监督算法以及无监督的聚类算法和应用PCA对数据进行降维的算法…

C语言笔试题之实现C库函数 strstr()(设置标志位)

实例要求&#xff1a; 1、请你实现C库函数strstr()&#xff08;stdio.h & string.h&#xff09;&#xff0c;请在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;&#xff1b;2、函数声明&#xff1a;int strStr(char* h…

ubuntu20安装mongodb

方法一&#xff1a;直接安装(命令是直接从mongo官网Install MongoDB Community Edition on Ubuntu — MongoDB Manual复制的&#xff09; cat /etc/lsb-release sudo apt-get install -y gnupg curl curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | \sudo gp…

小程序中封装下拉选择框

小程序中没有现成的下拉选择组件&#xff0c;有个picker组件&#xff0c;但是是底部弹出的&#xff0c;不满足我的需求&#xff0c;所以重新封装了一个。 封装的下拉组件 html部分&#xff1a; <view class"select_all_view"><!-- 内容说明&#xff0c;可…

中小型网络系统总体规划与设计方法

目录 1.基于网络的信息系统基本结构 2.网络需求调研与系统设计原则 3.网络用户调查 4.网络节点地理位置分布情况 5.网络需求详细分析 6.应用概要分析 7.网络工程设计总体目标与设计原则 8.网络结构与拓扑构型设计方法 9.核心层网络结构设计 10.接入核心路由器 11.汇聚…

513. 找树左下角的值 - 力扣(LeetCode)

题目描述 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 题目示例 输入: root [2,1,3] 输出: 1 解题思路 深度优先搜索 使用 depth 记录遍历到的节点的深度&#xff0c;result 记录深度在 depth 的最…

幻兽帕鲁mac可以玩吗?

《幻兽帕鲁》&#xff08;英文&#xff1a;Palworld&#xff09;是一款近期在 Steam 爆红的动作冒险生存游戏&#xff0c;游戏设置在一个居住着「帕鲁」的开放世界中&#xff0c;玩家可以战斗并捕捉帕鲁&#xff0c;也能用它们来建造基地、骑乘和战斗。 不过目前《幻兽帕鲁》仅…

Appium使用初体验之参数配置,简单能够运行起来

一、服务器配置 Appium Server配置与Appium Server GUI&#xff08;可视化客户端&#xff09;中的配置对应&#xff0c;尤其是二者如果不在同一台机器上&#xff0c;那么就需要配置Appium Server GUI所在机器的IP&#xff08;Appium Server GUI的HOST也需要配置本机IP&#xf…

Android Studio安装过程遇到SDK无法安装问题解决

首次打开studio遇到该类问题&#xff0c;需要下载SDK文件&#xff0c;后又发现SDK由于是Google源&#xff0c;无法进行正常安装&#xff0c;故转而进行SDK的镜像安装。 一、下载SDK Tools 地址&#xff1a;AndroidDevTools - Android开发工具 Android SDK下载 Android Studio…

macbook电脑如何永久删除app软件?

在使用MacBook的过程中&#xff0c;我们经常会下载各种App来满足日常的工作和娱乐需求。然而&#xff0c;随着时间的积累&#xff0c;这些App不仅占据了宝贵的硬盘空间&#xff0c;还可能拖慢电脑的运行速度。那么&#xff0c;如何有效地管理和删除这些不再需要的App呢&#xf…

C++面试宝典第27题:完全平方数之和

题目 给定正整数 n,找到若干个完全平方数(比如:1、4、9、16、...),使得它们的和等于n。你需要让组成和的完全平方数的个数最少。 示例1: 输入:n = 12 输出:3 解释:12 = 4 + 4 + 4。 示例2: 输入:n = 13 输出:2 解释:13 = 4 + 9。 解析 这道题主要考察应聘者对于…

JVM-运行时数据区程序计数器

运行时数据区 Java虚拟机在运行Java程序过程中管理的内存区域&#xff0c;称之为运行时数据区。《Java虚拟机规范》中规定了每一部分的作用。 程序计数器的定义 程序计数器&#xff08;Program Counter Register&#xff09;也叫PC寄存器&#xff0c;每个线程会通过程序计数器…

SpringCloud-Eureka原理分析

Eureka是Netflix开源的一款用于实现服务注册与发现的工具。在微服务架构中&#xff0c;服务的动态注册和发现是必不可少的组成部分&#xff0c;而Eureka正是为了解决这一问题而诞生的。 一、为何需要Eureka 在微服务架构中&#xff0c;服务之间的协同合作和高效通信是至关重要…

网络原理TCP/IP(1)

文章目录 端口号UDP协议 在网络通信中&#xff0c;协议非常重要 协议进行了分层 应用层就是对应着应用程序&#xff0c;是程序员打交道最多的这一层&#xff0c;调用系统提供的网络api写出来的代码都是属于应用层的 应用层有很多现成的协议&#xff0c;但是更多的还是程序员需要…

Redis篇之集群

一、主从复制 1.实现主从作用 单节点Redis的并发能力是有上限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;就需要搭建主从集群&#xff0c;实现读写分离。主节点用来写的操作&#xff0c;从节点用来读操作&#xff0c;并且主节点发生写操作后&#xff0c;会把数据同…

RabbitMQ详解

RabbitMQ 1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&a…

设计模式理解:单例模式+工厂模式+建设者模式+原型模式

迪米特法则&#xff1a;Law of Demeter, LoD, 最少知识原则LKP 如果两个软件实体无须直接通信&#xff0c;那么就不应当发生直接的相互调用&#xff0c;可以通过第三方转发该调用。其目的是降低类之间的耦合度&#xff0c;提高模块的相对独立性。 所以&#xff0c;在运用迪米特…