亚马逊AWS官方博客

RENGA公司使用Amazon CodeGuru实现代码审查自动化

原文链接:

https://aws.amazon.com/cn/blogs/machine-learning/renga-inc-automates-code-reviews-with-amazon-codeguru/

 

本文为RENGA公司董事Kazuma Ohara撰写的客座文章,并由AWS日本分部解决方案架构师Yumiko Kanasugi编辑修订。

作为全日本人气最高的公寓评论与评分网站之一Mansion Note的运营方,RENGA公司每月需要迎接超过一百万独立访问客户。Mansion Note的核心服务是向用户们展示全日本范围内各公寓与住宅的评价信息与排名数据。来自日本各地的用户,包括现住户、前住户、邻居、专家、房地产经纪人以及业主等,需要首先提交自己的身份信息,而后即可发布并分享自己对于特定公寓及住宅的评论意见。“群众的眼睛是雪亮的”,在购房者与租房者选择目标房源之前,可以在这里预习与房屋相关的各类信息,避免与预期不符或者“早知道不如选择……”之类的常见问题。

包括我自己在内,RENGA公司共拥有6位工程师。因为公司一直高度重视代码质量,因此代码审查始终是我们开发流程中必不可少的环节。但RENGA以往长期面临一项现实挑战,即随着开发规模的快速提升,代码审查任务也在等比例增长,并带来沉重的审查工作压力。此外,无论进行多少轮代码审查,其中仍会存在一些错误。因此,我们必须找到另一种行之有效的机制,在加快代码审查速度的同时改善代码审查效果。

在re: Invent 2019大会上,我们注意到Amazon CodeGuru的正式亮相。在得知CodeGuru是一项基于机器学习(ML)技术的代码审查服务之后,我们意识到它正是我们梦寐以求的工具。这项服务发布之时,我们正在对网站源代码进行重大修改,因此引入CodeGuru Reviewer就成了合乎逻辑的选择。它也没有令人失望,在实际使用中帮助我们发现了成员及原有静态分析工具未曾发现的诸多问题。在本文中,我们将一同了解RENGA为何决定采用CodeGuru,以及具体实施过程。

维护代码质量

RENGA公司成立于2012年,到2020年正好迎来八岁生日。尽管产品已经日趋成熟,但我们仍在开发方面投入大量资源,希望快速扩展更多新功能。而且在加快开发步伐的同时,我们还高度关注代码质量的维护与保持。在功能扩展过程中,低质量代码会增加系统的复杂性,甚至有可能转化为沉重的技术债务。在另一方面,只要代码质量保持住,系统再扩展也不会阻碍研发人员开发功能,编码工作本身变得简单了。在敏捷性与质量保障之间寻求平衡点成了摆在面前的现实挑战,作为初创企业的RENGA也开始亲身体会到这一点。

RENGA公司拥有一套两步走代码审核流程。首先,当开发人员向我们GitHub上的远程repo提交修复程序并发出pull请求时,将由两位高级成员对提交内容进行审核。接下来,我本人进行最终检查并将其合并至主分支当中(除非发现问题)。在构建阶段,我们还会使用Checkstyle保证代码符合基本编码原则。

过去,我们代码审查机制的成本与质量都无法令人满意。随着RENGA代码总量的增加,审核人员的工作负担也在持续加重。我们开始将约5%的工作时间用于代码审查,而落实在审核人员身上,他们每天需要额外投入1个小时完成审查工作。很明显,如果要快速发布新功能并为用户创造实际价值,代码审查将成为客观存在的严重瓶颈。另外,我们的代码审查量越大,判断问题的准确性就越差,甚至可能直接忽略某些严重问题。虽然增加审核人员看似合理,但实际执行起来却非常困难——代码审核工作不仅需要广泛的业务与技术知识,也要求相关人员对核心模块拥有深入理解。因此,我们需要引入一款自动化工具,减轻审核人员的工作负担。

采用CodeGuru Reviewer

CodeGuru Reviewer是一款自动化工具,允许用户将其无缝集成至开发管道当中,借此带来简便易行的使用体验。我们对CodeGuru寄予很高期望,因为这套基于机器学习技术的解决方案不仅有助于消除成本问题,同时也能帮助我们以不同于人工审核的方式找到新的代码解析思路。虽然该工具仍处于预览阶段,但考虑到AWS提供免费套餐,我们决定率先加以尝试。

下图所示,为RENGA开发管道的基本架构。

CodeGuru Reviewer的设置流程非常简单。我们只需要在GitHub上指定一套repo,并将其与CodeGuru相关联即可。AWS建议在实际关联之前,先为CodeGuru Reviewer创建一个新的GitHub用户。在关联完成之后,即可正式启用CodeGuru Reviewer。

以下截屏所示,为CodeGuru控制台上的Associate repository页面。

 

CodeGuru Reviewer由pull请求进行触发。一般在请求发出的15分钟之内,该工具即可在pull请求中添加注释以提供修改建议。

以下文本,为CodeGuru Reviewer生成的示例建议:

It is more efficient to directly use Stream::min or Stream::max than Stream::sorted and Stream::findFirst. The former is O(n) in terms of time while the latter is not. Also the former is O(1) and the latter is O(n) in terms of memory.

此项建议中提出的代码问题不算严重,但确实有助于提高系统性能。掌握此方法,有助于我们的开发人员编写出质量更高的代码。

下面来看CodeGuru Reviewer生成的另一条示例建议:

Consider closing the resource returned by the following method call: newInputStream. Currently, there are execution paths that do not contain closure statements, e.g., when exception is thrown by SampleData.read. Either a) close the object returned by newInputStream() in a try-finally block or b) close the resource by declaring the object returned by newInputStream() in a try-with-resources block.

尽管并未发生实际资源泄漏,但我们仍然对相关部分做出修改,在消除潜在隐患的同时提高了代码的可读性。

在采用CodeGuru Reviewer之后,我们发现该产品生成的建议虽然在数量上远低于原有静态分析工具,但建议内容的准确性明显更高,且问题误报率更低。考虑到建议数量过多本身也会给开发人员造成负担,更高的建议准确率无疑是一项重大优势。

总结

尽管代码审查过程非常重要,但大家需要保证其既不会给审核人员带来过重的工作负载,也不致成为开发流程中的瓶颈所在。通过采用CodeGuru Reviewer,我们成功实现了代码审查的自动化,同时也减少了审核人员的工作量。此外,我们也从中学习到以往所不了解的最佳编码实践,帮助我们以更自信的心态面对更多后续开发工作。着眼于未来,我们还计划衡量cyclomatic复杂度等更多指标,保证以更快的速度为客户提供更高品质的服务。期待CodeGuru Reviewer建议能进一步增加代码审查建议项。

本篇作者

Yumiko Kanasugi

Amazon Web Services日本分部解决方案架构师,负责为数字原生业务客户提供AWS服务应用支持。

Kazuma Ohara

RENGA公司(总部位于日本的互联网服务企业)董事。