原文链接:https://mp.weixin.qq.com/s/XvYfNRE12AzKoDzbraXYGw
作者:Yue Jia、Ke Mao、Mark Harman
机器之心编译
调试代码是件很无聊的事,但是由 Facebook 工程师创建的新型人工智能混合工具——SapFix 可以大大节约工程师的时间,同时还加快了新软件的推出过程。该工具可以为特定 Bug 自动生成修复程序,然后将其提交给工程师批准并部署到生产中。
SapFix 被用来加速向装有 Facebook Android 应用程序的数百万设备传输稳定代码更新的过程,这是人工智能测试和调试工具在此类大规模生产中的首次应用。Facebook 打算与工程界分享 SapFix,因为这是自动化调试发展的下一步,可能为很多公司和研究机构促进新代码的产量和稳定性。
SapFix 被设计成一个独立的工具,无论有或没有 Sapienz(Facebook 的一款智能自动化软件测试工具,在 F8 版本时发布,已部署到生产中),它都可以运行。在目前的概念验证状态,SapFix 在部署到生成前专注于修复 Sapienz 发现的 Bug。此过程从 Sapienz 开始,连同 Facebook 的推断静态分析工具一起,能帮助定位代码中需要修复的 Bug。一旦 Sapienz 发现并推断出与 Bug 相关的特定部分代码,它就可以将该信息传递给 SapFix,后者会自动参考一些策略并生成补丁。
上图说明 SapFix 如何为软件 Bug 生成补丁
为了解决高触发 bug,SapFix 创建的补丁可以完全或部分还原初始代码。对于更复杂的问题,SapFix 通过从模板修复集合中提取素材生成补丁。这些模板是从人类工程师创建的模板中自动获取的,而后者则是基于过去的修复库创建的。
当以前用过的由人类设计的模板不合适时,SapFix 将尝试基于突变进行修复。为此,它将对导致崩溃的语句的抽象语法树(AST)执行小型代码修复,调整补丁,直到找到可能的解决方案。
即使 SapFix 找到了特定的补丁,它的工作还远远没有结束。该工具为每个 Bug 生成多个潜在的补丁,并通过三个问题评价补丁的质量。即是否存在编译错误、程序是否仍然会崩溃,以及补丁是否引入了新的冲突?
为了解决最后两个问题,SapFix 在修复版本上运行已存的、开发者编写的测试,同时还会运行由 Sapienz 创建的测试。与之前补丁生成步骤一样,验证过程会自动执行,且与更大的代码库实现分离。SapFix 正在复制目前由人工完成的调试工作,但它并不是为了将补丁部署到产品代码中而设计的。
当自动生成的补丁经过全面测试后,SapFix 会将它们发送给人工评审员进行批准。这有些类似于人工生成的报告需要由其他开发者进行检查与审批,此外系统除了会自动追踪评审者的反馈外,它还会接受经批准的补丁、清理其它未经批准的补丁。在某些情况下,SapFix 可以从多个候选补丁中选择最佳的解决方案,并向工程师提出建议。
该工作流展示了 SapFix 如何基于它生成的补丁寻求工程师的反馈
如果修补方案被拒绝,它将丢弃补丁,如果被接受,则加载。由于 SapFix 的底层技术非常强大,且自动运行节省了大量时间和精力,因此 SapFix 无法实现自己提出的补丁。工程师通常比较专业,该工具依赖工程师的专业知识来确认是否应该部署提出的补丁。
由于 SapFix 仍在开发阶段,因此它无法像 Sapienz 那样投入大规模使用,Sapienz 现在每月生成数百个 Bug 报告,精准定位有 Bug 的代码行,它审核与安卓设备上的 Facebook、Instagram、Workplace 和 Messenger 等 app 相关的代码。Sapienz 的报告中大约有 3/4 的 bug 是由开发者修复的。而 Facebook 八月份开始测试 SapFix,该工具可以成功生成能够被人类工程师接受的补丁,并进入生产阶段。
Facebook 称,这标志着机器生成的补丁(经过自动化端到端测试和修补)首次部署到 Facebook 规模的代码库。这是 AI 技术的重要里程碑,进一步证明了基于搜索的软件工程可以减少软件开发中的问题。Facebook 开发 SapFix 用于处理不同种类的 bug 和软件,因此该工具有可能改变代码生成的速度和质量。这不仅适用于大规模运营的企业,还适用于几乎所有写代码的个人。不管是用于组织还是个体,SapFix 和 Sapienz 都能帮开发者减少花在 debug 上的时间,把精力用在生成更多的代码上。
即使有了这项工作,Facebook 仍想鼓励社区继续研究自动调整、改进代码。在这一领域,已经有了很多激动人心的研究,包括技术的实证研究、供社区研究解决的开放性难题与挑战,以及对近期自动改进代码的调查。作为在 Facebook 规模下部署的首个工具,SapFix 将为此挑战性研究提供新的动力与能量。
Facebook 称,将在完成额外的工程部分后,开源 Sapienz 和 SapFix。而有关这些工具的反馈会帮助相关研究者,也会帮助更广泛的 AI 社区改进自动寻找、修改代码 Bug 的任务。Facebook 目前聚焦在 SapFix 如何自动制止代码崩溃,但更长期的应用应该包括如何让软件更快、反应更敏捷。这些系统提供了极大的基线收益,开发者使用它们时效果是多变、宽泛的。