Code Review的亲身实践

2023-11-07

Code Review,中文叫代码审查,指的是完成了部分功能的代码开发之后,在代码真正合并到仓库主分支之前,邀请同事帮你进行代码的审核和检查,检查代码的质量、规范、设计等等方面的过程。

代码审查的好处

知识共享

进行代码审查的好处很多,其中一个就是可以让团队的整体水平快速得到提升。一个团队中有资深的工程师也有刚毕业的人,水平参差不齐。对于刚进入团队的人来说,不熟悉很多团队的规范,那么就可以通过代码审核的过程进行指导和分享。

如果系统之间非常复杂,互相之间的依赖调用很多,一次代码的修改可能会影响其他系统的运行,这时候,如果有比较熟悉这个系统的人的提醒和指导就可以及时发现问题,新人可以在这个过程中学到系统设计的原则,如何编写可读性和复用性强的代码,学习到系统工程最佳实践等等。团队的水平因此而得以提升。

对于团队中的资深人士来说,他们可能觉得帮助新人会浪费自己的时间,其实不然。当整个团队更加优秀,水平更高,就可以帮忙分担更多重要的任务,而自己也可以抽身去解决更难的问题或者进行自我提升。

团队的沟通能力越强、设计能力越好其实也是节省了自己的时间。谁不希望可以高效地和别人合作完成任务呢?与其低水平地交流合作,事情还迟迟完成不了,不如投入一些时间提高团队的战斗力。

更好的代码质量

许多公司团队不注重代码质量,认为工作完成了,功能上线了就可以了。其实大家没有看到软件的生命周期中,成本最重的一个环节就是持续的维护和更新迭代。

代码质量差,是将来欠下的技术债。代码随心所欲地写,每个人有每个人的喜好,没有任何规范,也不注重可读性。虽然系统表面上解决了当下的问题,但是当团队成员流动,新人接手项目后,发现读不懂,代码如“屎”山,项目推翻重做,之前的投入付诸东流。这个用人成本是否有考虑过?

举个简单的例子,就像建造一个楼房,为了赶工期不注重工程质量,房子外形是符合交付标准了,但是房子内部的东西偷工减料,楼房的使用寿命没过多久就变成危楼,无法使用了,造成了大量的人力和资源的浪费。

开源软件对代码的审核非常严格,这也是为什么开源软件的质量那么高以及能够经久不衰。开源项目的委员会会非常严格地审核每一行代码。良好的设计和优秀的代码质量才得以让开源软件保持稳定的迭代,以及持久的生命力。

代码审查的目的

代码审查有诸多的好处,而它的目的就是要引入团队协作规范,让所有贡献代码的人都能够按照一定的流程和约定来完成开发任务。

许多公司的代码审查流于形式,只是走个过场,虽然需要别人同意才能够把代码合并进主分支,但是没有人对代码进行严格的考核,代码风格也没有统一的约束。

有些人对代码审查比较反感,认为是一种拖慢进度的强制流程。然而据我观察,对于那些能够真正运用好代码审查的公司,这对员工来说是一种福音,更像是大家共同建设的一种工程师文化。因为对于个人而言,可以快速地学习和提升,对于公司而言,软件的质量得到了保证,是一种双赢的举措。

代码审查的心态

良好的代码审查,少不了人和人之间建立起的良好氛围,如谦逊,友善,互信互助和成长型心态。

作为审核别人代码的人,需要就事论事,评论的语气要尊重他人,客观公正,带着帮助别人的心态去完成审核。不要带有主观色彩,也不要有针对个人的行为。

作为提交代码的人,不要害怕被别人发现自己的短板,不要对自己做的不好的地方遮遮掩掩。带着成长型的心态,发现问题就去解决,不会的东西就去学,虚心请教和学习,收起玻璃心,一切以成长为目的。一旦团队建立起良好的学习氛围,代码审核的机制会朝着正循环滚动。

代码审查的经验技巧

讲述了以上诸多的背景,来到正题,在国外大厂里,code review到底是怎么做的呢?

清晰的开发指导

  • 首先将团队要求、开发经验整理成一份清晰的开发指引,让新人通过阅读文档就能够知道应该怎么做,让团队成员能够步伐一致
  • 比如写单元测试的要求,代码风格如何统一,命名规范,异常信息如何写等等
  • 优秀示例: [1].Contributing to Apache Spark

自我检查

  • 提交代码前,先自己对照开发指导进行检查,避免PR(合并请求)被反复打回,减少不必要的时间浪费
  • 自己检查和发现一些低级的问题,这也是对别人时间的尊重

PR要足够小

  • 尽量保证每次code review的代码量在100行左右。太长的代码变化会让查看的人看起来很费劲
  • 功能变化较大的改动,也可以尽量拆分成若干个子任务或者模块,并在PR中描述清楚分别在实现哪个模块
  • PR足够小,对于双方来说都是双赢,审核代码的人能够看得更快速,而提交代码的人,可以让代码更快地合并到主分支

详细的上下文描述

有些人提交code review,什么也不说,就一段代码给到审核的人,以为别人什么都知道,应该知道他要实现的功能和达到的目的。

其实作为提交者,应该站在对方的角度思考,假设对方对自己的实施过程一点都不了解,应该怎么提供更加详细的信息。

  • 提供尽可能详细的前因后果。为什么要做这次改动,实现的目的是什么,是否有设计文档的链接,是否还有额外的参考文档,所有的信息都可以整理清楚写到描述框中
  • 如果你的代码只是实现了部分的功能,也要具体说明实现了哪一部分
  • 还可以在讨论区指出,自己为什么这样实现。虽然代码说明了一切,但是一些额外的描述,可以让对方更加容易理解,降低沟通的成本
  • 如果自己对某些代码存有疑虑,也可以指出并讨论,说明这不是最终的方案,还有待斟酌等

以上的目的,都是为了让对方更好理解自己的目的,详细的文档也为了以后再翻阅提供便利。

快速回应评论,关闭已解决的问题

  • 一旦有人评论了你的代码,应该尽快回复并解决,拖得越久,代码审核的成本越高
    • 一方面,在你审核的过程中,会有新的代码合并到主分支,会导致你需要不断地同步自己的代码,解决代码冲突,造成时间的浪费
    • 另一方面,时间长了,又要去回忆当时的一些讨论,会导致代码迟迟无法合并
  • 已经解决的问题,可以点击”Resolve“,让整个review的过程更加清晰,也知道自己的代码进度如何

找到正确的人帮你审核

  • 在一个大型的软件中,模块非常多,有些人特别熟悉某些模块,应该找到对应的负责人来协助你审核代码

如何审核别人的代码

系统设计

从系统和站在组织的角度,问以下问题:

  • 从系统的角度,这份代码的改动会引起兼容性的问题吗?它能够很好的跟其他系统整合吗?
  • 该代码的改动会不会引起系统故障或者影响其他依赖的系统的使用?
  • 现在是改变这个功能的恰当时机吗?整体的代码是否符合逻辑?

功能性

从功能性的角度考察:

  • 代码是否能够实现开发者想要的目标?
  • 这份代码是否包含测试?这些测试覆盖的场景是否足够多?是否考虑到了一些边界情况?并发的情况下性能怎么样,会不会产生死锁等问题?
  • 把自己想象成一个用户的角度,功能是否满足,是否考虑全面,是否存在一些bug?

代码风格和命名规范

  • 这些代码的命名是否规范?如果让一个不太熟悉的人来看这份代码,是否能够通过命名就了解其含义?
  • 代码有没有遵守约定的代码风格?比如 [2].Google Java style guides
  • 提交的代码如果想要做一些代码格式化的调整,如缩进和换行等等,需要放到另外的PR中进行,避免跟功能代码混在一起,给阅读代码的人造成不便。

测试

  • 如果代码中没有包含测试,要求开发者再附上完善的单元测试。原则上,每次代码改动都应该有其对应的单元测试。
  • 确保测试是正确的,合理且有意义的以及能够尽可能覆盖足够多的情况。

文档

  • 检查是否需要更新相应的文档。比如一次大的修改,需要记录一些release note或者README。或者一些必要的注释放到代码中,以备后续查阅。
  • 删除掉不必要的注释以及已弃用的代码等。

以上只是摘录了部分比较主要的review流程,如果想要了解更多的细节,可以到 [3].What to look for in code review 查阅。

Code Review 黑话

Code Review过程中有一些常见的缩写/术语,列出来以备不时之需~

  • LGTM: Looks good to me. 这句话通常代表代码可以合并了。
  • PR: Pull request「合并请求」,有些地方也叫 Merge Request(MR).
  • NIT: nitpick. 意思是有点吹毛求疵,不是非常重要,常指一些代码风格的问题。
  • WIP: Work In Progress. 意思是代码还没有完全好,还在进行中,但是可以先整体看一下。
  • TL;DR: Too Long; Didn’t Read 「太长懒得看」,README 文档常见
  • a.k.a.: also known as 「又称作」,比如 GitHub (a.k.a. GayHub) 。聊天消息里更常见到。
  • RFC: Request for comments 「请求意见稿」

Reference

[1].Contributing to Apache Spark

[2].Google Java style guides

[3].What to look for in code review

[4].Code Review Developer Guide by Google

[5].How We Do Code Review by Microsoft

[6].Code Review最佳实践 - 云+社区 - 腾讯云 (tencent.com)

[7]. 技术领域英文缩写和术语

[8]. Github 黑话大全

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Code Review的亲身实践 的相关文章

  • 对开发来讲,业务重要还是技术重要?

    很多开发者为天天写业务代码无暇提升技术而焦虑 苦恼 比如 又如 又如 再如 那么 作为开发者 到底该怎么面对 写业务代码 这件事呢 今天我们就从以下几个方面聊聊这个话题 什么是业务 业务和技术的关系 业务和因解决业务而衍生的业务 对业务的态
  • java转go语言,值得转吗?

    有这个想法的不在少数了 也就意味着这条路并不是想想的那样 Java确实比以前卷了 但是你能保证转过去比别人做的更好 别拿自己的劣势跟别人的优势争 先守好自己的一亩三分地 把技术提高一个层次 相对来说卷的人数就少了 其实拿GO语言和JAVA相
  • vue遍历Map,Map在vue中的使用方法

    Map在vue中的使用方法 html 遍历的时候要遍历两遍
  • 到底是学JAVA好还是.net,未来哪个前景好?

    Java就目前来看 前景绝对没有问题 从语言排行榜来看 Java从未跌出前3 Java目前主要占据两个领域 服务端开发 以及安卓开发 尤其是在安卓开发领域 绝对是牢牢地霸占第一的位置 首先java有着非常广泛的市场应用 WEB开发 安卓应用
  • 什么是区块链----概念

    前言 从2016年年初开始 区块链这个概念越来越热越来越火 有人说他可以颠覆金融行业 也有人觉得这就是个噱头 这个2016火起来的技术其实早在2008年 比特币的诞生就基于区块链 技术火归火 落地的应用却没有那么多 周围的朋友同学都听说过这
  • 机器入门学习方法与学习路径

    机器学习方法与学习路径 1 数学基础 有无数激情满满大步向前 誓要在机器学习领域有一番作为的同学 在看到公式的一刻突然就觉得自己狗带了 是啊 机器学习之所以相对于其他开发工作 更有门槛的根本原因就是数学 每一个算法 要在训练集上最大程度拟合
  • 机器人 串口配置文件serial.INI

    SERIAL INI Configuration of the serial ports and their protocols Lindemann 27 02 2002 KUKA Controls update comments and
  • 请使用mysql连接池

    在初次使用 python 的 pymysql工具包连接 mysql数据库 的时候 总是发生数据库连接失败的情况发生 经过多方确认 发现这种情况不是自己的连接方式错了 而是mysql数据库服务器因为网络出现闪断 导致在查询的时候发生连接出错的
  • 在C++11通过SFINAE机制实现静态检查类成员是否存在并分情况处理,以及一种通用宏的实现

    目录 引入 目的 代码 测试 TIPS 引入 c 模板中 我们无法知道参数类是否具有某个成员 例如下面代码 我们希望下面的代码中能够打印t的成员变量a的值 然而当类型T不包含成员a时 调用下面的代码就会报错 template
  • JAVA之初识springMVC框架

    1 环境 操作系统 Mac OS 10 12 6 Tomcat v7 0 JDK 1 7 工具 eclipse 2 新建项目 用eclipse新建项目 选择Dynamic Web Project 将项目字符集改为UTF 8 3 编辑web
  • 使用QT纯代码创建(查找)对话框详细步骤与代码

    一 创建项目文件 打开Qt Creator gt 文件 gt 新建文件或项目 gt 选择Qt Widgets Application 为项目起名字 输入类的名字 二 了解每个文件的作用 项目创建完毕之后就会出现以下几个文件 先来分别介绍以下
  • mysql 字符集问题整理

    mysql 字符集问题整理 一直对mysql字符集没有明确的概念 mysql为了方便 设置了各种层级的字符集 最近在移植mat数据库时 顺便把这个问题整理清楚 供参考和学习 文章最后有word版本 有两张图片以及不同文字的颜色区分 首先是M
  • 汽车电子行业静态分析和代码审查规则

    汽车电子行业静态分析和代码审查规则 查了很多编码规则大都是PDF版 最终我整理出了几份word版的 并且帮大家排版好了可直接用于书写测试大纲或报告 下载链接在我的下载中 规则包含以下 1 MISRA C 2012 2 MISRA C 200
  • Docker-swarm 介绍,集群,多服务部署实战

    一 什么是Docker Swarm Swarm是Docker公司推出的用来管理docker集群的平台 几乎全部用GO语言来完成的开发的 代码开源在https github com docker swarm 它是将一群Docker宿主机变成一
  • 代码检视拟定方案(已完成,非代码博文,开发流程相关)

    代码检视拟定方案 为什么要进行代码检视 提前发现代码逻辑问题 优秀的代码分享 坏味道代码警示 要求别人的同时提高对自己的要求 性能初步检查 抽象组件 函数沉淀 常量抽取 设计模式引入 解决代码审查消耗大量时间精力问题 结对编程 利于双方代码
  • 非常详尽的 Linux 中 WEB服务器配置与管理 (通过例子来讲解)

    Apache服务器的安装与启动 检查是否已经安装了APACHE并启动它 这是已安装好的状态 root root rpm qa grep httpd httpd tools 2 2 15 53 el6 x86 64 httpd 2 2 15
  • linux中mysql启动服务命令(合集)

    linux的mysql启动服务命令 linux的mysql启动服务命令1 使用mysqld启动 关闭MySQL服务 mysqld是MySQL的守护进程 我们可以用mysqld来启动 关闭MySQL服务 关于mysqld MySQL 5 6官
  • C#与Java的不同

    https www cnblogs com Yan3399 p 17324904 html 1 C 对应java中关键字 base super this this sealed final 1 base关键字 对应java super C
  • 2021最新阿里代码规范(前端篇)

    简介 2021最新阿里代码规范 前端篇 此规范根据阿里最新前端规范整理 如有雷同 纯属巧合 前端代码规范 一 编程规约 一 命名规范 1 1 1 项目命名 全部采用小写方式 以中线分隔 1 1 2 目录命名 全部采用小写方式 以中划线分隔
  • 对技术行业的深度思考

    技术行业是当今世界最为热门和发展迅猛的领域之一 无论是互联网 人工智能还是区块链 技术的快速发展正在改变着我们的生活和社会 然而 我们是否真正思考过技术在我们生活中的影响和意义 本文将对技术行业展开深度思考 探讨其带来的优势与挑战 以及如何

随机推荐

  • STM32 USB接口 一键下载电路详解与过程分析

    要想了解一键下载电路的工作过程 首先要了解STM32的几种启动模式 STM32的几种启动模式如下表所示 从表中可知 我们想用串口下载代码 就要配置BOOT0为1 BOOT1为0 但是如果想让STM32一复位就运行代码 就要配置BOOT0为0
  • IT项目管理作业6

    练习 教材练习题6 教材练习题7 收集网上资料 总结看板在软件项目中的使用 约2 3页 练习题6 表6 4显示的是一个小项目网络图中的数据 所有的工期和时间以天来计算 该网络图共有9个节点 活动 起始节点 终止节点 估计的工期 A 1 2
  • RecyclerView 显示不全问题

    按道理ItemCount的数量应该是跟onCreateViewHolder调用次数一致的 但在实际开发中遇到不一致的情况 可能出现的问题 某一个item的高度太高 导致其他的item无法在可显示的范围内 RecyclerView只有在显示范
  • c++类模板案例

    案例要求 创建一个数组类模板 可以对内置数据类型以及自定义数据类型的数据进行存储 将数组中的数据存储到堆区 构造函数中可以传入数组的容量 提供对应的拷贝构造函数以及operator 防止浅拷贝问题 提供尾插法和尾删法对数组中的数据进行增加和
  • JS/jq 实现复选框默认选中

    div div
  • Java-方法的重写(Overriding)和重载(Overloading)

    方法的重载 Overloading 方法的重载是指一个类中定义多个同名的方法 但方法的参数类型 参数个数或参数顺序不同 重载的规则 相同的方法名 参数列表不同 类型 个数 顺序的不同 最好相同的返回值类型 可以不同 可以抛出不同的异常 可以
  • 网页三剑客之 HTML

    本章开始我们来介绍一下网页前端部分 我们只是简单的介绍一些常用的各种标签 其目的在于为我们后面的项目做准备 我们并不要求能完全掌握前端的语法 但是在见到以后能够认识这些代码就可以了 想走后端开发的 前端不需要多么熟悉 毕竟在各个企业中前后端
  • 四种常用的自动化测试框架

    一直想仔细研究框架 写个流水账似的测试程序不难 写个低维护成本的测试框架就很难了 所以研究多种测试框架还是很有必要的 知道孰优孰劣 才能在开始编写框架的时候打好基础 今天读到了KiKi Zhao的翻译文章 觉得很是不错 写了一点学习心得 有
  • Numpy简单入门

    概述 Numpy是高性能科学计算好数据分析的基础包 提供了矩阵运算的功能 在深度学习和数据分析领域广泛应用 使用 创建array数组 vector np asarray 1 2 3 4 创建zero数组 a np zeros 10 创建向量
  • FatFS文件系统的使用(STM32)

    目录 1 Fatfs相关文件 2 驱动测试 3 重试机制 4 实现较为复杂的文件操作 4 1 获取磁盘容量 4 2 遍历目录 获取文件大小和数量 以及查找 删除等操作 4 3 认识文件权限和错误码 1 Fatfs相关文件 fatfs的介绍这
  • 聊聊leader的自我修炼

    这是鼎叔的第十七篇原创文章 行业大牛和刚毕业的小白 都可以进来聊聊 欢迎关注本人专栏和微信公众号 敏捷测试转型 大量原创思考文章陆续推出 4月3号晚上 鼎叔作为嘉宾参与小道消息播客的直播分享节目 和主持人老徐和兔子畅谈测试管理的那些事 本文
  • 【廖雪峰python入门笔记】列表生成式

    1 生成列表 要生成list 1 2 3 4 5 6 7 8 9 10 我们可以用range 1 11 gt gt gt range 1 11 1 2 3 4 5 6 7 8 9 10 但如果要生成 1x1 2x2 3x3 10x10 怎么
  • Web系统大规模并发:电商秒杀与抢购

    http blog jobbole com 91754 一 大规模并发带来的挑战 在过去的工作中 我曾经面对过5w每秒的高并发秒杀功能 在这个过程中 整个Web系统遇到了很多的问题和挑战 如果Web系统不做针对性的优化 会轻而易举地陷入到异
  • Android图片加载优化方案

    1 前言 在电商APP中 图片在整个页面中占比最大 清晰高质量的图片能够明显提升转化率 但是APP运行环境错综复杂 往往我们会遇到 图片压缩导致模糊 列表加载长时间显示空白图 查看大图黑屏过久 甚至因为图片过大导致crash等 如下效果展示
  • Java编程思想课后练习题——第三章-操作符

    本文主要依据 Java编程思想 的示例及课后练习 通过个人编写 同时参考答案的代码写法 主要目的是用于自己熟悉编码风格 同时可以给更多人提供参考 只完成了部分练习 练习1 package 操作符 import static net mind
  • VScode安装

    1 下载安装VScode 下载地址 Visual Studio Code Code Editing Redefined 浏览器下载很慢 我们进入下载页面 复制下载链接 https az764295 vo msecnd net stable
  • ubunutu20.04 pycharm使用anaconda下环境(主要是pytorch)

    新建pycharm项目和anaconda环境 打开pycharm new project new environment using conda 修改环境名 项目名 python版本选择3 9 我的电脑pyTorch在3 9上跑通了 其他版
  • SAP应付模块详解

    本文介绍以下内容 应付模块的基础知识 主数据 供应商 发票处理 付款及清账 预付款 应付票据 其他特别总账业务 供应商余额查询 定期处理 月末及年末年初的操作 应付模块报表 应付模块设计的流程清单和方案要点 由于应付模块和应收模块在很多方面
  • LaTex 之 数学运算符号

    属于号 in 开根号 sqrt 求和符号 sum 积分符号 int min max 大于等于 小于等于号 导言区使用两个宏包 usepackage amsmath usepackage amssymb 大于等于号 geqslant or g
  • Code Review的亲身实践

    Code Review 中文叫代码审查 指的是完成了部分功能的代码开发之后 在代码真正合并到仓库主分支之前 邀请同事帮你进行代码的审核和检查 检查代码的质量 规范 设计等等方面的过程 代码审查的好处 知识共享 进行代码审查的好处很多 其中一