草庐IT

机器学习助力高质量软件工程

朱先忠 2023-03-29 原文

译者 | 朱先忠

审校 | 孙淑娟

引言

一般来说,软件测试往往是比较简单的:每个输入=>已知输出。然而,纵观整个软件测试的历史,会发现很多测试往往都停留在猜测水平上。也就是说,测试时由开发者构想出用户的操作流程,估计可能出现的负载并分析需要耗费的时间,然后运行测试,并将当前结果与基准答案进行比较。如果我们发现不存在回归,那么就认为当前构建方案是正确的;然后,继续后面的测试。如果存在回归,就返回。大多数时候,我们已经知道了输出结果,尽管它需要更好的定义——回归的边界清晰,并不那么模糊。其实,这正是机器学习(ML)系统和预测分析的切入点——结束歧义。

测试完成后,性能工程师所做的工作不仅是查看结果的算术平均值和几何平均值,他们还会查看有关百分比数据。例如,系统运行过程中,往往10%的最慢请求都是由系统错误导致的——该错误会产生一个总是影响程序运行速度的条件。

虽然我们可以手动关联数据中可用的属性,但是ML可能会比您以更快的速度链接数据属性。在确定导致10%的错误请求的条件后,性能工程师便可以构建测试场景来重现该行为。在修复之前和之后运行测试能够帮助确定修复已经得到更正。

图1:对绩效指标的总体信心

机器学习和数据科学的性能

机器学习有助于促进软件开发,使有关开发技术更坚固、更好地满足用户在不同领域和行业的需求。我们可以通过将管道和环境中的数据输入到深度学习算法来暴露因果模式。预测分析算法与性能工程方法相结合,可实现更高效、更快的吞吐量,深入了解终端用户如何在自然场景下使用软件,并帮助开发者降低带有缺陷的产品应用于生产环境的可能性。通过及早发现问题及其原因,您可以在开发生命周期的早期进行问题纠正,并防止对生产产生影响。总体来看,您可以通过以下方式利用预测分析来提高应用程序性能。

  • 确定根本原因。您可以使用机器学习技术来确定可用性或性能问题的根本原因,从而关注其他需要注意的领域。然后,预测分析可以分析每个集群的各种特征,提供我们需要进行更改的见解,以达到理想的性能并避免瓶颈。
  • 监视应用程序运行状况。使用机器学习技术执行实时应用程序监控,有助于企业能够及时发现系统性能降级并迅速作出响应。大多数应用程序依赖于多个服务来获得完整应用程序的状态;预测分析模型能够在应用程序运行正常时关联并分析数据,以识别传入数据是否为异常值。
  • 预测用户负载。我们依靠峰值用户流量来调整基础设施的规模,以适应未来访问应用程序的用户数量。这种方法有局限性,因为它不考虑变化或其他未知因素。预测分析有助于显示用户负载,并更好地做好应对准备,帮助团队规划其基础设施需求和容量利用率。
  • 在为时已晚之前预测停机。在应用程序停机或停电发生之前预测它们将有助于采取预防措施。预测分析模型将遵循先前的停电情形,并继续监测类似情况,以预测未来的故障。
  • 停止查看阈值,开始分析数据。可观测性和监测产生的大量数据每周最多需要几百兆字节。即使使用现代分析工具,您也必须事先知道自己在寻找什么。这导致团队不直接查看数据,而是设置阈值作为行动的触发因素。即使是成熟的团队也会寻找例外情况,而不是钻研他们的数据。为了缓解这种情况,我们将模型与可用数据源集成。然后,模型将筛选数据并计算随时间推移的阈值。使用这种技术,模型被馈送并汇总历史数据,提供基于季节性而不是由人类设定的阈值。基于算法来设置阈值有助于触发更少的警报;另一方面,这也带来更好的可操作性和更高价值。
  • 跨数据集分析和关联。您的数据大多是时间序列,因此可以更容易地查看随时间变化的单个变量。许多趋势来自多种措施的相互作用。例如,只有在同一目标同时进行各种事务时,响应时间才会下降。对于人类来说,这几乎是不可能的,但经过适当训练的算法却有助于发现这些相关性。

预测分析中数据的重要性

“大数据”通常指的是数据集。不错,是大数据集,速度提升很快,内容变化也很大。对于这样数据的分析需要专门的方法,以便我们能够从中提取模式和信息。近些年来,存储、处理器、进程并行化以及算法设计的改进都使得系统能够在合理的时间内处理大量数据,从而允许更广泛地使用这些方法。为了获得有意义的结果,您必须确保数据的一致性。

例如,每个项目必须使用相同的排名系统,因此,如果一个项目使用1作为关键值,而另一个项目使用5——就像人们使用“DEFCON 5”表示“DEFCON 1”时一样;那么,必须在处理之前对这些值进行规范化处理。预测算法由算法及其输入的数据组成,而软件开发产生了大量数据,直到最近,这些数据仍处于闲置状态,等待删除。然而,预测分析算法可以处理这些文件,针对我们无法检测到的模式,根据这些数据提出和回答问题,例如:

  • 我们是否在浪费时间测试未使用的场景吗?
  • 性能改进如何与用户幸福感相关联?
  • 修复特定缺陷需要多长时间?

这些问题及其答案就是预测分析的用途——更好地理解可能发生的事情。

算法

预测分析的另一个主要组成部分是算法;您需要仔细选择或实现它。从简单开始是至关重要的,因为模型往往会变得越来越复杂,对输入数据的变化越来越敏感,并有可能扭曲预测。它们可以解决两类问题:分类和回归(见图2)。

  • 分类:分类用于预测集合的结果,方法是从输入数据中推断标签(如“向下”或“向上”)开始,将集合划分为不同的类别。
  • 回归:当输出变量是一组实值时,回归用于预测集合的结果。它将处理输入数据来进行预测——例如,使用的内存量、开发人员编写的代码行等。最常用的预测模型是神经网络、决策树以及线性和逻辑回归。

图2:分类与回归

神经网络

神经网络通过实例学习,并使用历史数据和当前数据来预测未来价值。它们的架构允许它们识别隐藏在数据中的复杂关系,以复制我们大脑检测模式的方式。它们包含许多层,这些层接受数据、计算预测并作为单个预测提供输出。

决策树

决策树是一种分析方法,它将结果呈现在一系列“if/then”选项中,以预测特定选项的潜在风险和收益。它可以解决所有分类问题并回答复杂问题。

如图3所示,决策树类似于由算法生成的自顶向下的树,该算法能够识别将数据分割成分支状划分的各种方式,以说明未来的决策并帮助识别决策路径。

如果加载时间超过三秒,树中的一个分支可能是放弃购物车的用户。在这一条之下,另一条分支可能会指明她们是否属于女性。“yes”的回答会增加风险,因为分析表明,女性更容易冲动购买,而这种延迟会让人陷入沉思。

图3:决策树示例

线性和逻辑回归

回归是最流行的统计方法之一。在估算数字时,这一点至关重要,例如在“黑色星期五”大促活动期间,我们需要为每项服务增加多少资源。许多回归算法被设计来估计变量之间的关系,在庞大的和混合的数据集中找到关键模式,以及它们之间的关系。它的范围从简单的线性回归模型(计算拟合数据的直线函数)到逻辑回归(计算曲线)(图4)。

线性和逻辑回归总体对比

线性回归

逻辑回归

用于定义连续范围内的值,例如接下来几个月用户流量峰值的风险。

这是一种统计方法,其中参数是根据旧的集合预测的。它最适合二进制分类:y=0或1的数据集,其中1表示默认类。它的名字来源于它的转换函数是一个逻辑函数

它表示为y=a+bx,其中x是用于确定输出y的输入集。系数a和b用于量化x和y之间的关系,其中a是截距,b是直线的斜率。

它由逻辑函数表示:


其中β0是截距,β1是速率。它使用训练数据来计算系数,将预测结果与实际结果之间的误差最小化。

目标是拟合最接近大多数点的直线,减少y和直线之间的距离或误差。

它形成S形曲线,其中应用阈值将概率转换为二进制分类。

图4:线性回归与逻辑回归

这些是监督学习方法,因为算法解决了特定的属性。当你心中没有特定的结果,但想确定可能的模式或趋势时,可以使用无监督学习。在这种情况下,该模型将分析尽可能多的特征组合,以找到人类可以采取行动的相关性。

图5:有监督与无监督学习

性能工程中的“左移”

使用以前的算法来衡量消费者对产品和应用程序的看法,使得性能工程更加以消费者为中心。收集所有信息后,必须通过适当的工具和算法对其进行存储和分析。这些数据可以包括错误日志、测试用例、测试结果、生产事件、应用程序日志文件、项目文档、事件日志、跟踪,等等。然后,我们可以将其应用于数据中,以获得各种见解:

  • 分析环境中的缺陷
  • 评估对客户体验的影响
  • 确定问题模式
  • 创建更准确的测试场景,等等

该技术支持质量方面的左移(shift-left)方法,允许您预测执行性能测试所需的时间、可能识别的缺陷数量以及可能导致生产的缺陷数量,从而实现性能测试的更好覆盖,并创建真实的用户体验。可防止和纠正可用性、兼容性、性能和安全性等问题,而不会影响用户。

以下是一些有助于提高质量的信息类型的示例:

  • 缺陷类型
  • 在哪个阶段发现了缺陷
  • 缺陷的根本原因是什么
  • 缺陷是否可再现

一旦您了解了这一点,就可以进行更改并创建测试,以更快地防止类似问题。

结论

自编程诞生以来,软件工程师已经做出了成百上千的假设。但是,今天的数字用户们更加意识到这一点,而且对错误和失败的容忍度也进一步降低。另一方面,企业也在竞相通过量身定制的服务和越来越难测试的复杂软件,力图提供更具吸引力和完美的用户体验。

今天,一切都需要无缝工作,并支持所有流行的浏览器、移动设备和应用程序。即使是几分钟的撞车事故也可能造成数千或数百万美元的损失。为了防止出现问题,团队必须在整个软件生命周期中整合可观测性解决方案和用户体验。管理复杂系统的质量和性能需要的不仅仅是执行测试用例和运行负载测试。趋势可以帮助您判断情况是否得到控制、好转或恶化,以及改善或恶化的速度。机器学习技术可以帮助预测性能问题,使团队能够正确进行方案调整。最后,让我们来引用本杰明·富兰克林(Benjamin Franklin)的一句话作为结束语:“一盎司预防抵得上一磅治疗。”

译者介绍

朱先忠,51CTO社区编辑,51CTO专家博客、讲师,潍坊一所高校计算机教师,自由编程界老兵一枚。

原文标题:Performance Engineering Powered by Machine Learning,作者:

有关机器学习助力高质量软件工程的更多相关文章

  1. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  2. 软件测试基础 - 2

    Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功

  3. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  4. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  5. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  6. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

  7. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  8. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

  9. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

  10. 机器学习——时间序列ARIMA模型(四):自相关函数ACF和偏自相关函数PACF用于判断ARIMA模型中p、q参数取值 - 2

    文章目录1、自相关函数ACF2、偏自相关函数PACF3、ARIMA(p,d,q)的阶数判断4、代码实现1、引入所需依赖2、数据读取与处理3、一阶差分与绘图4、ACF5、PACF1、自相关函数ACF自相关函数反映了同一序列在不同时序的取值之间的相关性。公式:ACF(k)=ρk=Cov(yt,yt−k)Var(yt)ACF(k)=\rho_{k}=\frac{Cov(y_{t},y_{t-k})}{Var(y_{t})}ACF(k)=ρk​=Var(yt​)Cov(yt​,yt−k​)​其中分子用于求协方差矩阵,分母用于计算样本方差。求出的ACF值为[-1,1]。但对于一个平稳的AR模型,求出其滞

随机推荐