团队的Code Review实践

news2025/1/17 21:41:10

高效地进行 Code Review 一直是我们想要做的事情,如何持续保持高效 Review 也是我们日常开发中所亟需解决的问题。

在疫情爆发之前,团队大多是线下一起办公。大家会聚在一起 Code Review,把讨论出的反馈记录在便利贴并贴在白板上。而当远程、线上的同事越来越多后,我们选择将 Code Review 的反馈记录在 Trello 等电子看板上。

今天我们总结了一种比较高效的 Code Review 方案,并带来了一个比较好用的工具。下面来和大家分享一下我们团队 Code Review 实践的历程。

Code Review的好处

一直以来,人们都说 Code Reivew 作为敏捷开发中重要的一环,实践 Code Review 有很多益处,那么到底 Code Review 有什么益处呢? 到底是因为什么魔力,我们这么笃定每天去做 Code Review?

我们认真地思考了 Code Review 的益处,认为以下几点在整个敏捷开发流程中起到了至关重要的作用。

互相学习,知识共享

我们无法保证项目中每个人都拥有相同的知识储备,而且对于同一个问题,不同的人有不同的解决方案。通过 Code Review 我们可以快速地、有重点地将自己的知识传递给其他人。其他人也可以将代码上下文、知识以及更好的解决方案提供给我们,让我们做出更优的实现。

Code Review 可以让业务上下文在团队中共享。日常工作中,开发人员只会对自己负责的这块业务比较熟悉。通过 Code Review 的方式,我们可以快速了解到其他业务上下文,更好地了解业务知识,让每位同学对系统都有更全面的认识。

统一风格,提高代码质量

团队一般会有统一的代码规范。有些规范可以借助工具扫描来实现统一,工具扫描不到的就要靠 Code Review 来统一规范。

莎士比亚说过:“一千个人眼里有一千个哈姆雷特”,针对同一段代码可能多种实现都是可行的。如果没有统一的风格,不便于后续对代码的维护。通过 Code Review 的方式,我们可以在团队内达成共识,形成统一的代码规范,为后续开发提供标准,让代码看起来是同一个人写的。

尽早暴露问题,降低修复成本

代码开发过程中,我们很容易陷入到自己所预定的 Happy Path 中,反复验证却无法发现问题。通过 Code Review 我们可以借助他人的视角来审查自己的代码。是复制的时候变量名忘记了修改,还是忘记了测试异常情况,或是理解错业务含义等等。代码从写完到 Review 的时间间隔越短,解决问题的成本越低。和测试左移类似,Code Review 也可以将问题左移,从而尽早暴露,尽早修复。

我们团队的 Code Review 实践经历

谈了 Code Review 这么多好处,那么如何实践 Code Review 呢?下面我们将自己团队 Code Review 的经验分享出来,与大家共同思考 Code Review 的最佳实践:

团队最初采用的 Code Review 方式是,每位开发分别讲解自己的代码。这种方式的好处是同一个功能的代码能够集中讲解。但实施一段时间后发现超时严重,主要原因如下:

  1. 讲代码的节奏不好把控。有人讲得慢,导致严重超时。
  2. 远程办公,不同讲解人切换成本高。可能会遇到屏幕共享、声音等设备问题。

由此引发下面的问题:

  1. 每天只能 review 2、3个人的代码
  2. 有的开发人员不够主动,很久才会轮到TA
  3. Review 的代码有遗漏

为了解决上面的问题,我们将 Code Review 改为如下形式:

  1. 每天一位主持人带团队 Code Review
  2. 选择当天所有的提交记录,一起 Review
  3. 主持人驱动 Code Review,做简单讲解
  4. 复杂代码,提交人讲解
  5. 主持人通过工具记录 Code Review 的问题

这种方式主持人把控节奏,并且没有了切换成本,大大加快了 Code Review 的速度。而且每天每个人的提交都能被 review 到。此外,借助 Code Review 问题记录工具,效率大幅提升。

我们认为通过主持人驱动的方式能够更加高效地进行 Code Review,所以将其采纳为我们团队的 Code Review 最佳实践。

但 Code Review 中手动记录问题的过程非常烦琐:发现问题 -> 切换Trello -> 手动建卡 -> 手动记录问题代码的位置。在此期间,我们开发了一款基于 JetBrains 平台 (比如 Intellij IDEA、WebStorm) 的 Code Review 插件(在IDE的插件市场搜索 Thoughtworks Code Review Tools 即可体验)。我们在后文中将会详细介绍此插件。

Thoughtworks Code Review Tools 介绍

这个 Code Review 工具可以帮我们:

  • 创建 Code Review 反馈 卡片并指定 owner
  • 卡片会自动记录代码位置
  • 添加反馈卡片的类型(标签)
  • 增加卡片截止时间
  • 支持 JetBrains 下的所有 IDE
  • 支持问题分类,方便利用 Trello board 仪表盘统计

安装及配置

准备电子看板

插件需要配合 trello(在线看板管理工具) 使用。我们需要先注册trello,并新建 Code Review 看板。

安装插件

在 IDEA 插件市场搜索 Thoughtworks code review tools 并进行安装

Github: https://github.com/MTWGA/thoughtworks-code-review-tools

下载页面
下载页面

配置插件

进入偏好设置 -> TW Code Review Tools 菜单进行配置插件信息

Trello Token 申请地址: https://trello.com/app-key

配置页面
配置页面

Trello Board 信息从Trello Board 地址栏可以找到,如下图

Trello Board 信息
修改完成后可以直接点击 “Test Connection” 进行测试 或者直接点击右下角 Apply 进行保存配置

记录反馈

在 IDE 中选择相应的代码,而后使用快捷键 command+option+i 呼出 “code review feedback” 提示框。首先输入或者选择人名,按 Tab键切换输入框,依次输入类型、反馈。最后按 Enter 键提交。

Code review Feedback 页面
Code review Feedback 页面

提交成功后就有相应的提交成功的提示信息,如下图

提交成功信息
提交成功信息

我们也可以在 Trello上查看到信息,如下图:

Trello 看板图片
Trello 看板图片

查看 Code Review 状况

在 Trello 的 Code Review 看板上点击标题左侧的“看板”,转换视图到仪表盘即可查看统计的信息。具体操作如下图:

转换视图
转换视图

按照标签选择,查看code review分类信息
按照标签选择,查看code review分类信息

至此,Code Review 工具的配置及使用介绍完成。

Code Review 插件可以帮助我们快速记录 Code Review 的反馈信息(代码位置、反馈类型、截止时间,涉及的人员)。这些信息可以帮助开发者精确找到需要优化的代码位置以及优化建议,方便开发者更快速、准确地优化代码。

在开展Code Review一段时间之后,逐渐积累起了一定量的数据。此时我们可以通过统计工具分析数据。比如按照问题类型进行统计,对于出现次数多的问题分类,可以针对性展开培训,提升团队成员技能。

培训完成后,我们可以根据新一轮统计结果分析培训效果,观察团队是否确实得到了提升,从而形成闭环。

总结

Code Review 的好处虽然被广泛认可,但想做好 Code Review 并不容易。首先团队需要对开展 Code Review 达成共识,然后针对自己团队的特性,采用相匹配的实践方式。关于工具,可以尝试文中提到的 Code Review 插件以及电子看板。在提升自动化程度的同时,积累 Code Review 数据,指导团队针对性地提升技能。

使用插件过程中有任何问题或建议,请联系插件开发团队:LiHui(hui.li@thoughtworks.com)

PengJie(jie.peng@thoughtworks.com)

GeMaida(maida.ge@thoughtworks.com)

LiYiming(yiming.li@thoughtworks.com)

LiQiang(qiangli@thoughtworks.com)


文/Thoughtworks 盖迈达
原文链接:团队的Code Review实践

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

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

相关文章

Baklib|如何为你的营销计划制作Wiki页面

当你需要快速查找信息时,你会怎么做?很有可能,你会直接去谷歌——在输入你的查询之后,十有八九,搜索引擎会带你去wiki百科。wiki百科是一个巨大的在线百科全书。在这个数据库中,几乎所有的文章都有链接。 现在想象一…

Maven之POM介绍

POM介绍前言POM基础为什么要学习POM什么是POMSuper POMMinimal POM(POM的最低配置)POM特点Project Inheritance(项目继承性)Project Aggregation(项目聚合)Project Inheritance VS Project AggregationProject Interpolation and …

《FFmpeg Basics》中文版-00-简介

欢迎 亲爱的读者们, 欢迎来到这本书,它将使您熟悉FFmpeg项目的许多有趣的特性。下面的几个大公司都是FFmpeg使用者: Facebook,最大的社交网络,用FFmpeg技术处理用户的视频。Google Chrome,流行的web浏览器&#xff0…

EDI通信中常用的网络排查方法

在知行之桥EDI系统运维工作中不可避免会碰到各种网络问题,本文将分享一些我们运维同事常用的一些网络问题排查定位方法,帮助大家快速的定位原因,解决通信问题。 1.Ping: 作用:ping用于确定本地主机是否能与另一台主机…

shell脚本下用plot给iostat和CPU的采样画图的写法

目前大多的互联网客户,在导入SSD之前,基本会要求OEM或者SSD厂商提供一些性能数据图,所以 作图也基本成了测试人员的必备技能,单盘的性能可以用Excel表格导入,但是复杂的可能会比较麻烦。就需要我们借助工具来作图了。 本篇文章简单…

第9章 Apache-Dbutils实现CRUD操作

1. Apache-DBUtils简介 *commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。 *API介绍: org.…

java和vue的大学生奖学金助学金系统奖学金系统助学金系统

简介 大学生奖学金助学金系统。学生申请自己需要的奖助学金,上传证明材料。该学院的辅导员可以下载学生的证明材料以及根据学生的综合成绩来审核是否通过,若不通过请输入不通过原因。管理员可以导入学生excel和辅导员excel以及学生综合成绩excel、分布公…

鲲鹏代码迁移工具介绍

鲲鹏代码迁移工具介绍 代码迁移工具介绍 代码迁移工具是什么? ✨我们为什么会需要用到代码迁移工具? ✨处理器所支持的指令集不同,意味着开发者可能需要对代码进行跨平台的迁移。 这里我们常见到便是x86平台的代码往arm平台进行迁移 通常…

主流组件库学习

主流组件库差异性对比 NutUI - 京东研发的移动端 UI 组件库,支持 Vue3、Taro 多端适配,面向电商业务场景Vant - 有赞研发的移动端 UI 组件库,支持 Vue3、微信小程序、支付宝小程序TDesign Mobile - 腾讯研发的移动端组件库,适合在…

Redis第二章_实战篇_短信登录+缓存策略+秒杀+分布式锁>>

Redis第二章_实战篇_短信登录缓存策略秒杀分布式锁>> 文章目录Redis第二章_实战篇_短信登录缓存策略秒杀分布式锁>>开篇导读1、短信登录1.1、导入黑马点评项目1.1.1 、导入SQL1.1.2、有关当前模型1.1.3、导入后端项目1.1.4、导入前端工程1.1.5 运行前端项目1.2 、基…

Spring(十一)- Spring Bean的依赖注入注解

文章目录一、Spring Bean的依赖注入注解1. 通过Value直接注入普通属性2. 通过Value注入properties文件中的属性3. Autowired注解,用于根据类型进行注入4. Qualifier配合Autowired可以完成根据名称注入Bean实例,使用Qualifier指定名称5. Resource注解既可…

三款Zookeeper可视化工具、ZooInspector、prettyZoo、ZooKeeperAssistant

三款Zookeeper可视化工具、ZooInspector、prettyZoo、ZooKeeperAssistant①Zookeeper图形化工具:ZooInspector1.下载完后,解压压缩包,进入zookeeper-dev-ZooInspector.jar目录后执行run jar包命令2.登录客户端:输入zk服务的ip和端…

XCTF1-web disabled_button weak_auth view_source cookie backup

一个不能按的按钮 题目描述 X老师今天上课讲了前端知识,然后给了大家一个不能按的按钮,小宁惊奇地发现这个按钮按不下去,到底怎么才能按下去呢? 进入场景 题目提示为前端设置的问题,查看网页源码,定位…

Django + Nginx https部署实战(第二辑)

如何使用Nginx把网站升级为Https? Https是Http协议的升级版,由于证书的引入,使得用户与网站之间的通讯变得更加安全。 在使用https之前,我们必须了解的事情 证书颁发机构 证书颁发机构是一家知名且受信任的组织,它对网…

基于MMDetection训练VOC格式数据集

一 环境说明 基于前述安装MMDetection,数据集为VOC格式,主要版本如下: Python:3.7.8 CUDA:11.3 cuDNN:8.4.0 torch:1.12.0 torchvision:0.13.0 mmcv-full:1.6.0 MMDetec…

机器学习极简入门笔记-5-无监督学习-K-means

目录 第17章 KNN算法(有监督学习算法,放在此位置是为了与下一章的K-means做对比) 17.1 KNN算法原理 17.2 KNN中的K 第18章 K-means——最简单的聚类算法 18.1 K-means算法步骤 18.2 K-means算法具体细节 18.3 启发式算法 18.4 K-mean…

介绍a股level2数据接口委托队列的作用

a股level2数据接口可以实现量化交易的准确性,那用户在交易的过程中会发现在“委托队列”中,如果出现一些有规律性的单子,往往是主力之间的盘口暗语。 例如排在靠前的都是大单,封单相当坚决,如果细心一点还会发现都是拖…

Spring Security 自定义拦截器Filter实现登录认证

前言 需求来源: 微信小程序获取授权码code, 通过授权码code, 获取微信用户信息(比如openid,unionId), 并记录登录状态(比如token信息的获取); 原本打算使用Spring Security中OAuth2.0的机制 实现用小程序登录,发现小程序再已经获取授权码code登录流程和Spring Secu…

Intellij插件之~图形界面Swing UI Designer

资料 Java Swing 介绍 JavaFX快速入门 Java Swing 图形界面开发简介 GUI Designer Basics scrcpy ScrcpyController Services 创建一个Gui Form文件(类form文件) 创建一个Gui Form 此时生成两个类, 是自动关联的 鼠标可以拖入控件,每拖入一个组件,在TestForm…

领悟《信号与系统》之 信号与系统的描述-下节

信号与系统的描述-下节一、信号的基本运算1. 信号的基本运算1. 加法 、减法2. 乘法、除法3. 微分 、差分4.积分、迭分2. 关于时间(自变量)的运算1. 位移2. 反折3. 尺度变换二、阶跃信号与冲激信号1. 单位阶跃信号2. 单位阶跃信号的特性3. 单位冲激信号4.…