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