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 NPE

    for (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 的目标之一。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

idea自带的HttpClient使用

1. 全局变量配置 {"local":{"baseUrl": "http://localhost:9001/"},"test": {"baseUrl": "http://localhost:9002/"} }2. 登录并将结果设置到全局变量 PostMapping("/login")public JSONObject login(H…

前端文件下载的多种方式

前端文件下载的多种方式。 前言a标签下载a标签常用属性介绍- target&#xff0c;href&#xff0c;download。 window.location.href下载window.open下载iframe 下载动态生成a标签下载文件url下载文件流下载blob文件流转换常用类型 使用 streamSaver 看实时下载进度 前言 如果我…

spring boot(2.4.x之前版本)和spring cloud项目中自动装配的监听执行顺序

目录 扫描 org.springframework.context.ApplicationListener 指定的类 内置的监听 spring boot 中的监听 spring boot autoconfigure 中的监听 spring boot context 中的监听 将加载的监听进行排序 spring boot 中的监听 spring boot context 中的监听 监听执行 监听…

讲讲GPT-4模型中13万亿个token的故事

Token从字面意思上看是游戏代币&#xff0c;用在深度学习中的自然语言处理领域中时&#xff0c;代表着输入文字序列的“代币化”。那么海量语料中的文字序列&#xff0c;就可以转化为海量的代币&#xff0c;用来训练我们的模型。这样我们就能够理解“用于GPT-4训练的token数量大…

Java stream 流的基本使用

Java stream 的基本使用 package com.zhong.streamdemo.usestreamdemo;import jdk.jfr.DataAmount; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.util.ArrayList; import java.util.Comparator; import java.util.Li…

springboot165科研工作量管理系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

notepad++成功安装后默认显示英文怎么设置中文界面?

前几天使用电脑华为管家清理电脑后&#xff0c;发现一直使用的notepad软件变回了英文界面&#xff0c;跟刚成功安装的时候一样&#xff0c;那么应该怎么设置为中文界面呢&#xff1f;具体操作如下&#xff1a; 1、打开notepad软件&#xff0c;点击菜单栏“Settings – Prefere…

LLaMA 入门指南

LLaMA 入门指南 LLaMA 入门指南LLaMA的简介LLaMA模型的主要结构Transformer架构多层自注意力层前馈神经网络Layer Normalization和残差连接 LLaMA模型的变体Base版本Large版本Extra-Large版本 LLaMA模型的特点大规模数据训练 LLaMA模型常用数据集介绍公共数据来源已知的数据集案…

LeetCode1365之切披萨的方案数(相关话题:二维前缀和,动态规划)

题目描述 给你一个 rows x cols 大小的矩形披萨和一个整数 k &#xff0c;矩形包含两种字符&#xff1a; A &#xff08;表示苹果&#xff09;和 . &#xff08;表示空白格子&#xff09;。你需要切披萨 k-1 次&#xff0c;得到 k 块披萨并送给别人。 切披萨的每一刀&#xf…

Zoho Mail企业邮箱商业扩展第1部分:入门

今天让我们来认识一下王雪琳&#xff0c;她是一位独立经营的营销咨询机构的个体企业家。在开始自己的事业之前&#xff0c;她进行了广泛的市场调研&#xff0c;明确了自己的业务定位&#xff0c;并全力以赴地投入到了自己的企业中。 一、创业背景 王雪琳的营销业务主要集中在…

新手小白做steam搬砖项目,这些内幕要了解

转眼2024年已经过去了五分之一&#xff0c;很多粉丝都在问steam搬砖项目真的假的&#xff0c;害怕项目的风险&#xff0c;担心steam搬砖项目到底能不能做&#xff0c;所以一直在犹豫和徘徊。我发现很多人想赚钱&#xff0c;但苦于找不到好的副业&#xff0c;高门槛的项目又做不…

Sealos 携手字节跳动火山引擎为帕鲁玩家送上春节福利

Sealos 携手字节跳动火山引擎为帕鲁玩家送上春节福利 游戏服务器是一个重资源业务&#xff0c;服务器成本非常之高&#xff0c;特别帕鲁服务器都 4C16G 起步&#xff0c;Sealos 与火山引擎结合实现了大幅的降本增效。 我们新起了 https://bja.sealos.run/?uide54c6ibx 专属集…

无人机在化工消防救援中的应用,消防无人机应用场景分析

火灾对社会环境具有较大影响&#xff0c;因此需要重视消防灭火救援工作&#xff0c;注重现代化技术的运用&#xff0c;将无人机应用到救援过程并保障其应用质量。无人机是一项重要技术&#xff0c;便于消防灭火救援操作&#xff0c;使救援过程灵活展开&#xff0c;排除不利影响…

@RequestBody、@RequestParam、@RequestPart使用方式和使用场景

RequestBody和RequestParam和RequestPart使用方式和使用场景 1.RequestBody2.RequestParam3.RequestPart 1.RequestBody 使用此注解接收参数时&#xff0c;适用于请求体格式为 application/json&#xff0c;只能用对象接收 2.RequestParam 接收的参数是来自HTTP 请求体 或 请…

CSS:九宫格布局

九宫格布局效果如下&#xff1a; HTML 结构&#xff1a; <div class"container"><div class"item">1</div><div class"item">2</div><div class"item">3</div><div class"item&q…

高可用 k8s 1.29 一键安装脚本, 丝滑至极

博客原文 文章目录 集群配置配置清单集群规划集群网络规划 环境初始化主机配置 配置高可用ApiServer安装 nginx安装 Keepalived 安装脚本需要魔法的脚本不需要魔法的脚本配置自动补全加入其余节点 验证集群 集群配置 配置清单 OS&#xff1a; ubuntu 20.04kubernetes&#xf…

有道ai写作,突破免费限制,无限制使用

预览效果 文末提供源码包及apk下载地址有道ai写作python版 import hashlib import time import json import ssl import base64 import uuidfrom urllib.parse import quote import requests from requests_toolbelt.multipart.encoder import MultipartEncoder from Crypto.C…

【多模态大模型】GLIP:零样本学习 + 目标检测 + 视觉语言大模型

GLIP 核心思想GLIP 对比 BLIP、BLIP-2、CLIP 主要问题: 如何构建一个能够在不同任务和领域中以零样本或少样本方式无缝迁移的预训练模型&#xff1f;统一的短语定位损失语言意识的深度融合预训练数据类型的结合语义丰富数据的扩展零样本和少样本迁移学习 效果 论文&#xff1a;…

欢迎来到操作系统的世界

&#x1f31e;欢迎来到操作系统的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f64f;作者水平很有限&#xff0c;如果发现错误&#xff…

Adobe Camera Raw for Mac v16.1.0中文激活版

Adobe Camera Raw for Mac是一款强大的RAW格式图像编辑工具&#xff0c;它能够处理和编辑来自各种数码相机的原始图像。以下是关于Adobe Camera Raw for Mac的一些主要特点和功能&#xff1a; 软件下载&#xff1a;Adobe Camera Raw for Mac v16.1.0中文激活版 RAW格式支持&…