Code Review 最佳实践

理论上讲,Code Review 对开发人员来说是件好事。它能帮助我们:

  • 提高我们代码的可读性
  • 尽早发现漏洞和安全问题
  • 提供一个安全网络,以确保所有任务都得到充分完成

但现实是,code review 对于所有相关人员来说通常是一种不舒服的体验,导致评审具有对抗性、无效,甚至根本没有评审。

下面是一个快速指南,帮助创建一个有效的 code review 过程。

我们为什么要进行 Code Review?

在进行 code review 评审流程时,首先要回答的问题是:我们 code review 的目的是什么?当你问这个问题时,你很快会发现有很多理由进行 code review 。甚至可能会发现团队中的每个人对为什么要 code review 都有不同的看法。

  1. 发现漏洞
  2. 检查潜在的性能或安全问题
  3. 确保代码可读
  4. 验证功能是否满足要求
  5. 确保设计合理
  6. 分享已实现的功能和更新设计的知识
  7. 检查代码是否符合标准
  8. ……或者其他几百个原因

如果团队中的每个人都有不同的“为什么”,那么他们会在代码中寻找不同的东西。这可能导致一些反模式:

  • code review 需要很长时间,因为每个审查者都会发现一套需要解决的问题
  • 审查者变得沮丧,因为每次审查都会根据谁审查它而提出不同类型的问题
  • 审查员和代码作者之间可以进行乒乓球式的审查,因为每次新的迭代都会暴露出不同的问题

为代码审查设定一个单一的目标,可以确保参与审查的每一个人,无论是代码作者还是审查者,都了解审查的原因,并能集中精力确保他们的建议符合这一原因。

我们在寻找什么?

只有当我们理解了为什么要进行评审时,我们才能找出评审过程中我们想要寻找的东西。正如我们之前已经看到的那样,在评审过程中可能会有许多不同的事情需要我们去寻找,我们需要缩小范围,关注我们真正关心的事情。

例如,如果我们已经决定了代码审查的主要目的是确保代码的可读性和可理解性,那么我们将花费更少的时间来担心已经实现的设计,并更多地关注我们是否理解这些方法,以及功能是否处于有意义的位置。这个特定选择的副作用是,有了更可读的代码,更容易发现错误或不正确的逻辑。更简单的代码通常也具有更好的性能。

我们应该尽可能地自动化,所以人工代码审查员永远不应该担心以下问题:

  • 格式和风格检查
  • 测试覆盖率
  • 性能是否满足特定要求
  • 常见的安全问题

事实上,人工审查员应该关注的内容可能非常简单——代码“可用”吗?它是否:

  • 可读
  • 可维护
  • 可扩展

这些都是无法自动化的检查。从长远来看,这些是开发人员最关心的代码功能。

然而,开发人员并不是唯一重要的人,最终代码需要完成一项工作。我们的业务关心的是:代码是否按照预期完成了工作?是否有自动化的测试或一组测试来证明这一点?

最后,它是否满足所谓的非功能性需求?考虑到监管要求(例如审计)或用户需求(如文档)等事项非常重要。

谁参与Code Review?

有了明确的目的和一套在评审中要查找的内容,我们就更容易决定哪些人应该参与评审。我们需要决定:

谁负责审查代码?

很容易认为应该是一位或几位资深或经验丰富的开发人员。但如果关注点是确保代码易于理解,那么初级开发人员可能是最适合审查的人——如果一位没有经验的开发人员都能理解代码中的情况,那么对每个人来说,理解起来可能就很容易了。如果审查的重点是分享知识,那么你可能会希望每个人都审查代码。对于其他目的的审查,你可能有一组评审人员,每次审查时从中随机选择几位。

谁负责审核签字?

如果我们有多于一个的评审员,那么了解谁最终负责表示评审完成是很重要的。这可能是一个人,一组特定的人,一定比例的评审员,特定代码区域的指定专家,或者评审甚至可以被单个否决停止。在高度信任的团队中,代码作者可能是决定何时反馈足够且代码已更新以充分反映所提出担忧的人。

谁来解决意见分歧?

评审可能有多于一个的评审者。如果不同的评审者给出了相互冲突的建议,作者应该如何解决?是由作者本人决定吗?还是有一个领导或专家可以仲裁并决定最佳方案?了解在代码评审过程中如何解决冲突是非常重要的。

Code Review 的时机

“时机”包含两个重要的组成部分:

我们什么时候开始 Code Review?

传统的代码审查发生在所有代码完成且准备投入生产时。通常,在审查完成之前,代码不会被合并到主干/主分支,例如拉取请求模型。但这并不是唯一的方法。如果代码审查是为了分享知识,那么审查可以在代码合并后进行(或者代码可以直接提交到主分支)。如果代码审查是一个增量审查,目的是帮助改进代码设计,那么审查将在实现过程中进行。一旦我们明白了:为什么要进行审查;我们在寻找什么;以及谁参与,我们就可以更容易地决定何时是进行审查的最佳时机。

什么时候完成 Code Review?

不明白何时完成审查是导致审查工作无限期拖延的主要因素。没有什么比永无止境的审查更让人沮丧的了,开发者感觉他们一直在做同一件事,但产品仍然没有进入生产环节。决定何时完成审查的指南将取决于参与审查的人员和审查进行的时间:

  • 通过知识共享评审,每个人都有机会查看代码,然后可以签字确认。
  • 通过网关评审,通常会有指定的单个高级人员(守门人)在解决所有问题后表示完成。

其他类型的评审可能需要一套标准,评审完成前需要通过这些标准。例如:

  • 所有评论已通过代码中的修复解决
  • 所有评论要么导致代码更改,要么导致问题跟踪器中的票据(例如,为新功能或设计更改创建票据;为即将推出的功能票据添加额外信息;或创建技术债务票据)
  • 所有标记为阻止器的评论都已以某种方式解决,而未来需要观察或学习的评论则不需要“修复”

我们在哪里评论?

代码审核不一定要在代码审核工具中进行。结对编程是代码审核的一种形式。审核可以只是将同事拉过来,与他们一起浏览你的代码。审核可能通过查看分支并在文档、电子邮件或聊天频道中发表评论来完成。或者,代码审核可能通过 github pull 请求或代码审核软件来进行。

总结

进行代码审查时需要考虑很多事情,如果每次审查我们都担心所有这些事情,那么任何代码都无法通过审查过程。对我们来说,实施有效的代码审查过程的最佳方法是考虑:

  • 我们为什么要进行审查?有了明确的目的,审查人员的工作就更容易了,代码作者也不会对审查过程感到意外。
  • 我们在寻找什么?当我们有了目标,我们就可以在审查代码时创建一套更集中的需要检查的事项
  • 谁参与了?谁负责审查,谁负责解决意见冲突,谁最终决定代码是否可以使用?
  • 我们什么时候审查,什么时候审查完成?在编写代码的过程中,审查可以迭代发生,也可以在过程结束时进行。如果我们没有明确的指导,代码最终可以使用,那么审查可能会无限期地进行下去。
  • 我们在哪里审查?代码审查不需要特定的工具,审查可以像让同事在办公桌前浏览我们的代码一样简单。

一旦这些问题得到回答,我们就应该能够创建一个对团队有利的代码审查过程。请记住,审查的目标是将代码投入生产,而不是证明我们有多聪明。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/770698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xcode生成静态库.a

一、生成静态库 1.打开 Xcode 创建一个新的 Static Library 工程,取名applestudio 2.创建工程完毕后,简化目录结构 删除系统自动创建的同名类:applestudio.h和applestudio.m 把自己的代码复制进去,如例子:guiconnect.h…

Unix环境高级编程-学习-08-自旋锁与屏障

目录 一、多线程相关文章链接 二、自由抒发 1、自旋锁 2、屏障 三、函数介绍 1、pthread_spin_init (1)声明 (2)作用 (3)参数 (4)返回值 (5)注意点 …

libVLC 视频裁剪

使用 libVLC 进行视频裁剪并不是直接支持的功能,因为 libVLC 主要是一个媒体播放库。然而,你可以通过调整播放窗口的大小和设置视频输出的区域来实现一种“视觉上的裁剪”。这意味着视频本身并没有被修改,但可以控制显示给用户的视频区域。 …

docker-面试题

文章目录 2022-docker-面试题一、通用问题1、Docker 和虚拟机有啥不同?2、Docker 安全么?3、如何清理后台停止的容器?4、如何查看镜像支持的环境变量?5、当启动容器的时候提示:exec format error?如何解决问…

多个用户同时执行耗时较长的sql如何保证数据库的性能不被因此变得缓慢

当多个用户同时执行耗时较长的 SQL 查询时,可以采取一些措施来保证数据库的性能不会因此变得缓慢。以下是一些常用的方法: 优化查询语句:确保 SQL 查询语句是经过优化的,包括正确使用索引、避免全表扫描、减少不必要的连接和子查询…

前端Ajax请求从后端获取二进制文件并下载

大家都知道前端的下载除了最简单的a标签href,还有时候需要验证token,此时后台会给一个返回二进制的下载接口。如果你用ajax普通的get,post请求,接口会返回乱码。那么本文就带你封装一个处理二进制下载的方法。 1.设置responseTyp…

[网鼎杯2018]Unfinish 两种方法 -----不会编程的崽

网鼎杯太喜欢搞二次注入了吧。上次是无列名盲注,这次又是二次注入盲注。。。不知道方法还是挺难的。哎,网鼎嘛,能理解透彻就很强了。能自己做出来那可太nb了。 又是熟悉的登录框。不知道这是第几次看见网鼎杯的登录框了。后台扫描一下&#x…

『Apisix入门篇』从零到一掌握Apache APISIX:架构解析与实战指南

📣读完这篇文章里你能收获到: 🌐 深入Apache APISIX架构: 从Nginx到OpenResty,再到etcd,一站式掌握云原生API网关的构建精髓,领略其层次化设计的魅力。 🔌 核心组件全解析&#xff…

【嵌入式学习】Qtday03.26

一、思维导图 二、练习 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }void Widget::on_login_btn_clicked() {if(ui->…

OC对象 - Block解决循环引用

文章目录 OC对象 - Block解决循环引用前言1. 循环引用示例1.1 分析 2. 解决思路3. ARC下3.1 __weak3.2 __unsafe_unretained3.3 __block 4. MRC下4.1 __unsafe_unretain....4.1 __block 5. 总结5.1 ARC下5.2 MRC下 OC对象 - Block解决循环引用 前言 本章将会通过一个循环引用…

flask_restful的基本使用

优势: Flask-Restful 是一个专门用来写 restful api 的一个插件。 使用它可以快速的集成restful api 接口功能。 在系统的纯api 的后台中,这个插件可以帮助我们节省很多时间。 缺点: 如果在普通的网站中,这个插件就没有优势了&…

测试环境搭建整套大数据系统(十二:挂载磁盘到hadoop环境)

一:链接硬盘 将硬盘连接到计算机的 SATA 接口或 USB 接口,并确保硬盘通电并处于可用状态。 二:查看硬盘信息 sudo fdisk -l三:创建分区 gdisk /dev/vbd重新扫描磁盘 partprobe /dev/vdb格式化磁盘 mkfs.ext4 /dev/vdb2查看磁…

前端学习之css基本网格布局

网格布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>网格布局</title><style>.a{/* grid网格布局 */display: grid;width: 400px;height: 400px;border: 1px solid red;/* 设置当前…

iOS开发之SwiftUI

iOS开发之SwiftUI 在iOS开发中SwiftUI与Objective-C和Swift不同&#xff0c;它采用了声明式语法&#xff0c;相对而言SwiftUI声明式语法简化了界面开发过程&#xff0c;减少了代码量。 由于SwiftUI是Apple推出的界面开发框架&#xff0c;从iOS13开始引入&#xff0c;Apple使用…

RabbitHealthContributorAutoConfiguration 检测到 RabbitMQ 相关依赖时自动配置健康检查

RabbitHealthContributorAutoConfiguration 是 Spring Boot 自动配置机制的一部分&#xff0c;它负责在检测到 RabbitMQ 相关依赖时自动配置健康检查。下面我会详细解释其工作原理&#xff0c;并尝试提供一些相关的源码片段&#xff08;注意&#xff0c;源码可能因 Spring Boot…

我在京东做数据分析,一位京东数据分析师的工作日常

有人说&#xff1a;“种下一棵树最好的时间是十年前&#xff0c;其次是现在”。任何时候&#xff0c;我们都应该抓住机遇&#xff0c;说不定就是改变你现状的一个机会。 2020年&#xff0c;我在疫情得到控制后&#xff0c;面试入职京东大数据组&#xff0c;截止目前&#xff0…

获取高德安全码SHA1

高德开发者平台上给的三种方法 获取安全码SHA1&#xff0c;这里我自己使用的是第三种方法。 1、通过Eclipse编译器获取SHA1 使用 adt 22 以上版本&#xff0c;可以在 eclipse 中直接查看。 Windows&#xff1a;依次在 eclipse 中打开 Window -> Preferances -> Androi…

Linux logout命令教程:如何安全地退出Linux会话(附实例详解和注意事项)

Linux logout命令介绍 logout命令用于退出当前的登录Shell。这个命令可以被普通用户用来结束他们自己的会话。 Linux logout命令适用的Linux版本 logout命令在所有主流的Linux发行版中都是可用的&#xff0c;包括但不限于Debian、Ubuntu、Alpine、Arch Linux、Kali Linux、R…

flask_restful结合蓝图使用

在蓝图中&#xff0c;如果使用 Flask_RESTful &#xff0c; 创建 Api 对象的时候&#xff0c;传入蓝图对象即可&#xff0c;不再是传入 app 对象 /user/__init__.py from flask.blueprints import Blueprintuser_bp Blueprint(user,__name__)from user import views /user…

word文件如何转PDF格式?word转PDF的方法

在当今数字化时代&#xff0c;文档格式的转换已成为日常生活和工作中不可或缺的一部分。其中&#xff0c;将Word文档转换为PDF格式更是受到了广大用户的青睐。本文将详细介绍Word转PDF的方法&#xff0c;帮助读者轻松实现文档格式的转换&#xff0c;并探讨转换过程中的注意事项…