Code Review 从结构化和严格的形式演变为灵活的、基于工具的异步过程,即 Modern Code Review (MCR)
。巴西南里奥格兰德州联邦大学 (UFRGS)和阿雷格里港信息学研究所合著的论文《A Systematic Literature Review and Taxonomy of Modern Code Review》 系统分析了 139 篇论文和来自行业、开源项目的问卷,详尽的记录了十多个细节性发现,能帮助我们了全面了解采用 MCR 的动机、挑战和好处,以及哪些影响因素导致哪些结果,并总结了改进 MCR 流程的提案
。
- 多种因素影响 MCR 的采用。 在行业中,它的采用受到文化、产品、工具、开发过程和团队的影响。 在开源项目中,影响更多的是人文和社会方面,尤其是黑客伦理。
- 在开源项目中,平均有一个或两个审阅请求的审阅者。 总的来说,小的代码改动和长篇大论的审查请求描述更容易吸引审查者。 开发人员更愿意邀请
有经验的审阅者
。 - 审阅者表示困惑,通常是由于缺少基本原理、对非功能性需求的讨论以及对代码不熟悉。在开源项目中,每个请求平均有两到三个审阅意见。
新人往往会受到更多关注
。 - 当涉及熟悉代码的
经验丰富的作者、经验丰富且积极且高度一致的审阅者时,审阅请求的完成时间会更短
。 - 被接受的代码更改通常由经验丰富的开发人员编写,并包含带有积极情绪的审查反馈。 考虑到审查反馈分析,
放弃代码更改的主要原因是重复和缺乏反馈
。 审查代码更改后,产品质量往往会提高
。 更多地参与代码审查、审查活动的更多经验以及审查者更熟悉项目也是降低发布后缺陷可能性的因素。- 编程经验可能会影响审查人员在代码检查期间的注意力和脑力劳动。 在审查代码时,与语言处理和数学相关的特定大脑区域会增加活动,有经验的开发人员倾向于将编程语言视为自然语言。
MCR 和结对编程在成本方面是可以互换的,除非在测试驱动开发中采用后者——在这种情况下,MCR 的成本更低
。- 单元测试比 MCR 发现更多的故障,但后者在检测和隔离缺陷的潜在来源方面需要更少的时间。
- 静态分析工具提出的警告很少在代码审查期间被删除。 依赖于持续集成的上下文、频繁构建的项目和状态为 passed 的自动构建,与审查者的参与度增加有关。
MCR 流程
MCR 有多种目的,其中最主要的是提高代码质量和发现缺陷。此外,MCR 还可以促进知识共享、团队协作、学习新技能、遵循编码标准等其他目的。
- MCR 的过程:MCR 的过程通常包括以下几个步骤:
- (1)代码作者创建并提交一个代码变更请求(Code Change Request),并指定一个或多个代码审查者;
- (2)代码审查者接受或拒绝该请求,并在合适的时间对代码变更进行检查和评估;
- (3)代码审查者给出他们对代码变更的意见、建议或批评,并与代码作者进行沟通和讨论;
- (4)代码作者根据代码审查者的反馈修改并更新他们的代码变更;
- (5)代码审查者确认修改并批准或拒绝最终版本的代码变更;
- (6)如果批准,则将代码变更合并到主分支;如果拒绝,则重新开始整个过程。
- MCR 的角色:MCR 有两个主要角色:代码作者(Code Author)和代码审查者(Code Reviewer)。代码作者是指创建并提交代码变更请求的人,他们负责编写高质量且符合规范的代码,并根据反馈进行修改。代码审查者是指检查并评估代码变更请求的人,他们负责发现并指出问题,给出有用且友好的意见,并与作者进行沟通和协作。
- MCR 的工具:MCR 有多种工具可以支持其实施,其中最常用的是基于 Web 的协作平台,如 GitHub、GitLab、Bitbucket 等。这些工具可以提供以下功能:
- (1)创建、管理和跟踪代码变更请求;
- (2)展示和比较不同版本的代码变更;
- (3)添加注释、评论或建议到特定行或区域;
- (4)发送通知或提醒到相关人员;
- (5)集成其他工具或服务,如静态分析器、测试框架、持续集成系统等。
- MCR 的挑战:
- 选择合适的审查者:审查者的选择会影响MCR的效率和效果,因为不同的审查者可能有不同的专业知识、可用性、工作负载、兴趣等。如果选择了不合适的审查者,可能导致审查时间过长、审查质量低下、审查冲突频繁等问题。
- 保持审查参与度:审查参与度是指代码作者和代码审查者在MCR过程中的积极性和主动性。高参与度可以促进MCR的沟通、协作和信任,从而提高MCR的效果和质量。然而,保持高参与度并不容易,因为MCR可能受到多种因素的影响,如时间压力、工作优先级、人际关系等。
- 编写有效的评论:评论是指代码审查者对代码变更给出的意见、建议或批评。有效的评论可以帮助代码作者改进他们的代码,并提高MCR的效果和质量。然而,编写有效的评论并不容易,因为评论需要考虑多种因素,如内容、形式、语气、时机等。
- 处理多样化的代码变更:代码变更是指代码作者对原有代码所做的修改或添加。多样化的代码变更是指代码变更在大小、类型、复杂度、风格等方面有所不同。处理多样化的代码变更是一项挑战,因为不同的代码变更可能需要不同的审查策略、方法和工具。
- 评估MCR的影响:MCR的影响是指MCR对软件产品和软件过程所产生的正面或负面的结果。评估MCR的影响是一项挑战,因为MCR的影响可能难以量化或隔离,而且可能受到多种因素的干扰或混淆。
改进 MCR 的提案
提案是指支持 MCR 的技术和工具,它们可以帮助代码审查者和作者更好地进行 MCR,可提高 MCR 的效率、效果和质量,以及减少 MCR 的成本和复杂性。提案可以分为以下几种类型:
- 代码审查者推荐器:这种提案旨在为代码变更找到合适的审查者,考虑到审查者的专业知识、可用性、工作负载、兴趣等因素。例如,ReviewBot 是一个基于机器学习的代码审查者推荐器,它使用代码变更的特征和历史数据来预测最佳的审查者。
- 代码检查支持:这种提案旨在帮助代码审查者检测代码变更中的缺陷、风险、坏味道等问题,使用静态分析、动态分析、规则检测等方法。例如,Code Defect AI 是一个基于深度学习的代码缺陷检测工具,它使用自然语言处理和图神经网络来识别代码中的潜在错误。
- 代码质量评估:这种提案旨在帮助代码审查者评估代码变更的质量,使用软件度量、复杂度分析、可维护性指标等方法。例如,Code Quality Advisor 是一个基于软件度量的代码质量评估工具,它使用多个维度来衡量代码变更的可读性、可测试性、可理解性等属性。
- 代码变更可视化:这种提案旨在帮助代码审查者可视化代码变更的结构、语义、影响等信息,使用图形化界面、颜色编码、交互式操作等方法。例如,ChangeScribe 是一个基于自然语言生成的代码变更摘要工具,它使用语法树和程序依赖图来生成描述代码变更目的和影响的自然语言句子。
- 代码变更摘要:这种提案旨在帮助代码审查者快速了解代码变更的主要内容和目标,使用自然语言生成、信息抽取、文本摘要等方法。例如,ChangeScribe 是一个基于自然语言生成的代码变更摘要工具,它使用语法树和程序依赖图来生成描述代码变更目的和影响的自然语言句子。
- 代码审查指导和反馈:这种提案旨在帮助代码审查者和作者提高MCR的效果和质量,使用教育性提示、建议性评论、积极性奖励等方法。例如,Review Assistant 是一个基于教育性提示的代码审查指导工具,它使用机器学习和自然语言处理来生成针对不同类型问题的个性化提示。