在Facebook规模上的自动化错误修复

在Facebook规模上的自动化错误修复

💡 原文英文,约2100词,阅读约需8分钟。
📝

内容提要

SapFix是Facebook开发的自动修复工具,旨在简化调试过程。它通过自动生成修复方案并提交给工程师批准和部署。SapFix结合了Sapienz和Infer等工具,能够识别、分析和修复软件缺陷。它采用模板修复、变异修复和回滚修复等策略,并在Facebook的持续集成和部署系统中完成修复过程。SapFix已成功修复多个软件缺陷,并得到开发人员的积极反馈。

🔎

延伸解读

SapFix 的修复策略与优先级

SapFix 采用模板修复、变异修复、完全回滚和部分回滚四种策略。模板修复基于 Getafix 从历史人工修复中提取的模式,变异修复目前仅针对空指针异常。当两者均失败时,SapFix 会尝试回滚导致高频崩溃的 Diff,且优先选择完全回滚,因为部分回滚可能引入连锁问题。这种优先级设计平衡了修复效果与风险。

人机协作:开发者作为最终把关者

尽管 SapFix 能自动生成并测试补丁,但最终部署必须由开发者审核批准。审核者通常是提交原始 Diff 的工程师,因其最了解相关代码。Facebook 强调,开发者的把关对 SapFix 的成功至关重要,且开发者可能更倾向于自己修改而非直接采用建议。这体现了自动化工具在工业规模应用中仍需人类监督。

实际效果与性能数据

在三个月内,SapFix 处理了 57 个空指针异常崩溃,生成 165 个补丁,其中 131 个通过测试,55 个提交给开发者。从故障检测到发布修复的中位时间为 69 分钟,最快 37 分钟,最慢约 1.5 小时。时间波动主要受 CI/CD 系统负载和计算资源影响。这些数据表明 SapFix 在工业规模上可行,但效率仍有优化空间。

经验教训与当前局限

Facebook 从 SapFix 中总结出:端到端自动修复在工业规模可行,但开发者把关不可或缺;回滚策略对高频崩溃有效;SapFix 更擅长处理新出现的故障,对已有崩溃效果有限;开发者可能更愿意自己修改而非直接采用建议。此外,SapFix 主要消除症状而非根因,根因修复仍需进一步研究。

❓

Q&A

SapFix是什么?它由Facebook的哪些工具组成?

SapFix是Facebook开发的自动修复工具,旨在简化调试过程。它结合了Sapienz和Infer等工具,能够识别、分析和修复软件缺陷。

SapFix的修复流程包括哪些步骤?

SapFix的修复流程包括:开发人员提交Diffs,SapFix使用Sapienz选择测试用例执行,当Sapienz定位到崩溃时,SapFix按优先级尝试模板修复、变异修复、完全回滚和部分回滚,生成多个候选修复并评估质量,最后选择最佳补丁提交给人工审核。

SapFix采用哪些修复策略?

SapFix采用模板修复、变异修复、完全回滚和部分回滚四种修复策略。模板修复基于Getafix从历史修复中提取的模式;变异修复目前仅支持空指针异常(NPE);回滚策略用于高频率崩溃,优先完全回滚,若冲突则尝试部分回滚。

SapFix的修复效果如何?有哪些实际应用数据?

SapFix已成功修复多个软件缺陷。在3个月内,它处理了57个NPE崩溃,生成了165个补丁,其中131个通过测试,55个提交给开发人员。从故障检测到发布修复的中位时间为69分钟,最快37分钟,最慢约1.5小时。开发人员反馈积极。

SapFix在Facebook的哪些应用上使用?

SapFix已用于Facebook应用家族中的六个关键Android应用:Facebook、Messenger、Instagram、FBLite、Workplace和Workchat。这些应用包含数千万行代码,每天有数亿用户使用。

Facebook从SapFix中学到了哪些经验教训?

Facebook从SapFix中学到的经验包括:端到端自动修复在工业规模上可行;开发人员作为最终把关者至关重要;回滚对高频率崩溃有用;SapFix最适合新出现的故障;需考虑开发者社会学;SapFix更侧重于消除症状而非根本原因。

🏷️

标签

➡️

继续阅读