您现在的位置是:首页 >人工智能 > 2021-05-11 17:54:03 来源:
认识那些评论和编写Facebook代码片段的机器人
空指针异常就像拥有一个从未构建过的房子的地址。这意味着程序员已经引用了一个实际上不存在的对象,因为它从未在代码中描述过。实际上,空指针是非常常见的并且相对容易修复 - 很容易让人觉得无聊。
不幸的是,发现和修复这些错误的繁琐工作仍占用了开发人员的大部分时间和精力。2016年对1,000个Android应用程序的评估 [PDF]发现空指针比任何其他类型的错误导致更多崩溃,包括非法参数,数组索引超出范围异常和错误令牌。
为了让开发人员的工作更有价值,Facebook现在使用两种名为Sapienz和SapFix的自动化工具来查找和修复其移动应用程序中的低级错误。Sapienz通过许多测试运行应用程序,以确定哪些操作会导致崩溃。然后,SapFix建议对开发人员进行修复,他们会对其进行审核并决定是否接受修复,提出自己的问题或忽略问题。
工程师们于2017年9月开始使用Sapienz审查Facebook应用程序,并逐渐开始将其用于公司的其他应用程序(包括Messenger,Instagram,Facebook Lite和Workplace)。今年5月,该团队将在加拿大蒙特利尔举行的国际软件工程会议上描述其最近采用的SapFix (他们正在招聘)。
据该团队称,到目前为止,Sapienz和SapFix的组合运作良好。“这节省了开发人员的时间,这是我们的主要目标,” Facebook工程经理马克哈曼说。哈曼也是伦敦大学学院的软件工程教授,他与创始人岳佳和柯茂共同创办了Sapienz,他们的前创业公司Majicke是Facebook于2017年2月收购的。
自首次亮相以来,Sapienz每个月都会发现数百种新方法让每个Facebook的应用程序崩溃。虽然其中一些崩溃不是开发人员主要担心的问题,但大约75%的崩溃事件已经受到保护。
目前,SapFix仅建议修复空指针,但团队希望有一天能够扩展该系统以协助处理许多不同的错误类型。作为其修复的起点,SapFix依赖于在Facebook开发的另一个名为Getafix的工具提供的模板 。这些模板基于人类开发人员针对类似问题所做的先前修复。
自动化错误修复,至少对于某些类别的错误,应该让开发人员可以编写更多代码或解决更难的问题 - 类似于处理故事的逻辑和语义而不是修复拼写和语法错误。
加州大学圣巴巴拉分校的计算机科学教授Giovanni Vigna说:“我认为在未来,这将成为主流,因为它具有重要意义。” “而不是支付昂贵的质量保证工程师找到琐碎的错误,付钱给他们找到超级难题。而简单的,自动化。“
到目前为止,关于自动化错误修复的大部分工作仅限于学术实验室或DARPA竞赛,但Facebook的进展表明这些技术现在已开始进入主要科技公司的工作流程。“就真实部署而言,Facebook的系统是我听过的第一个,”维尼亚说。
Harman预测,使用像SapFix这样的工具,可以在两到五年内消除特定类型的错误 - 这意味着它们将被自动化系统完全找到并修复。本地化为几行代码的错误比更复杂的代码更可能位于灭绝列表中。
瑞典KTH皇家理工学院软件技术教授Martin Monperrus的前景更加保守。他说自动虫修复“仅在开始时”,并将其与运输史上的“早期自行车水平”进行比较。
SapFix当然还有改进的余地。“它经常会提出不好的解决方案,”哈曼说。但是,他补充说,完美不一定是目标。“我们不一定每次都是对的; 它只需要经常足以帮助开发人员。“
Sapienz帮助的一项任务是决定运行哪些测试以确定哪些用户操作会导致应用程序崩溃。此类操作可能包括一次单击两个按钮,在结帐时应用多个优惠券代码,或从列表中选择多个选项。提出这些测试是一个复杂的问题,因为正如哈曼所说,“即使是一个简单的应用程序也有比宇宙中的恒星更多的测试用例。”
尽管可以通过称为随机模糊测试的技术自动生成测试,但这样做计算成本高,并且可能产生极长或其他不切实际的情况(例如一次触摸屏幕上的20个位置)。当开发人员手动设计这些测试时,他们经常会忽略他们没有明确设计的案例。
Sapienz不是依赖于随机生成的或开发人员设计的测试,而是生成可能的测试列表,并支持那些以最短步骤产生崩溃的测试。它还优先考虑具有更高覆盖率的测试,这意味着他们点击应用程序中的更多屏幕。从那里,它略微改变这些测试(通过改变点击或交换一个步骤)来提出另一批类似的测试,并重复该过程。
在评估结束时,Sapienz将找到快速可靠地崩溃应用程序的新方法。使用预测模型,Sapienz根据他们可能的常见和严重程度对这些崩溃进行优先排序。系统使用一系列启发式规则来研究可能产生问题的代码行,并在Facebook的代码审查工具中注释这个位置,允许开发人员看到系统的注释覆盖在他们编写的实际代码上。
Facebook的开发者每周进行超过100,000次提交,Android的Facebook应用程序包含数百万行代码。Sapienz全天候运行数百个仿真器来检查代码发布前后的代码,每天进行数万次测试。
“这是这些技术如何慢慢成为主流的一个很好的例子,”维尼亚说。“我认为未来我们会看到越来越多这样的事情。”