说说代码评审

2023-11-01

 关注公众号【1024个为什么】,及时接收最新推送文章! 

本文内容:

1、代码评审的目的

2、评审准备工作

3、评审过程中容易出问题的点

4、共同成长

近一段时间以来,组内严格实行代码评审制度。参与过多次评审后发现,一次有效的代码评审并不简单,把一些思考做一下总结。

||  代码评审的目的

| 提前发现问题

问题发现越早,解决成本越小,带来的损失也越小。

| 保证代码库的健康状况

随着时间推移,代码库的健康状况往往会下降。通过代码评审,如果能使代码库整体健康状况不快速下降,就算达到目的了。

||  评审准备工作

| 评审规范

团队最好要有一套评审规范,如果没有,可以在一段时间的评审后沉淀一套规范。

有了规范,评审就可以按规范一条条过,节省时间。

有了规范,产生意见分歧时,依据规范,化解分歧。

| 评审时间节点

很多观点是每次提交代码前都要评审,但实际工作中并不可行。

自测后期就可以发起评审,最晚到测试前期。如果有问题,还有充足的时间修改、测试。

新的模块可以分阶段多次评审,优先评审核心代码,及时发现并纠正问题,避免后期大量返工。

评审不通过有大改动的,改动后要再次评审。

| 评审形式

有条件的一定要面对面评审,效率高。下文也都是基于此形式的讨论。

跨地域的可以邮件评审或者评审工具评审。

| 发起人要做什么

邀请评审人(必须包含熟悉此业务的人),提前发会议邀请,协调评审人的时间。

需求背景提前同步出来,便于评审人提前了解,节省评审时间。

准备好CL(Change List),要了然于心,确定一个合理的讲述方案。建议零星改动按列表讲,其他最好按业务流程讲。

多说一句:CL 不仅仅是改动的代码,还可能包括DB脚本、配置信息、单测、数据现状、调研方案及结论...

| 评审人要做什么

参加评审,就要对其负责(假设出现事故有问责制),做好前期必要的准备工作。时间允许的话,提前了解需求,熟悉此部分业务,预判可能出现问题的节点,重点关注哪些部分,带着问题去评审。

| 评审工具

IDE集成的对比工具即可。使用工具有很多好处:

1)可以一条一条的点,不会漏代码。千万不要滚鼠标,很容易漏;

2)有前后对比,使评审人更直观的看到原来代码什么样,你这次改成什么样;

3)可以只看改动代码,节省时间。直接看代码很容易扯到没改动的代码去。

||  评审过程中容易出问题的点

评审时,千万不要上来就讲改了哪些代码... 这只会使评审效果大打折扣。

发起人要先花上几分钟,快速讲一下本次的需求背景,原来什么样,这次什么样,要改哪些模块。让评审人快速准确的了解本次业务范围,以便接下来能够给出合理的评审意见。

| 粗心类错误

这类错误和技术水平没有太大关系。

比如 if 条件里的取反;

配置是否漏配了环境,是否拷贝后忘了修改环境相关的信息;

数据库字段长度够不够用(一般都是扩展字段容易超);

测试结束后改动的代码忘提交了;

这些可以通过和同桌交叉检查的方法来避免。

| 方案过度设计

1)过度考虑未来业务

设计满足当前需求,以及合理业务扩展即可。

经验表明,之前很多当时认为极具前瞻性的设计,后面多数都是没用的,或者用到了,也要做很大改动。

2)过度考虑极端场景

比如某个后台人工操作的场景(一个月也不一定操作一次,正好又赶上服务挂了),要不要失败系统自动重试?

类似这种通过简单的人工补救方案(业务重试、重新发起)可以达到目的,就没必要设计复杂的技术补救方案,因为每引入一个方案又会带来新的问题。

3)过度的错误兼容逻辑

为了追求数据的正确性、一致性,可能会出现各种异常数据校验、各种异常处理逻辑,层层自我重试。

很多情况下,完全可以采取 “约定大于开发” 的准则,就能减少很多校验,很多重试的处理。比如约定入参格式、返回结果,约定由谁触发重试等等。

各个行业都有约定,比如 USB、网线的排线顺序,我们不可能在提供USB口、网线口的设备上考虑各种错误线序的兼容方案、错误反馈。

| 前后业务流程有逻辑漏洞

这种问题不好发现,需要对业务足够熟悉,流程足够清楚。

可能单看 A、B 两个接口都没有问题,但 A、B 在前后流程上有依赖关系。整个流程一串起来问题就暴露出来了。

| 事务

日志类的操作不要回滚,要留痕。

事务回滚是否影响重试的请求? 

| 冗余的数据库访问、服务调用

同一流程中前后2个方法都查询了同一数据。

循环逻辑内查库、调服务。

(假设每次访问都是要收费的,是不是就能省则省了)

| 定时任务

是否幂等?

是否能重复执行?

是否能暂停?

是否能够异常继续?

是否有超时风险?

是否超过下游承载能力?

禁止limit m,n 分页。

| 影响范围有遗漏

梳理影响系统的方案是否科学。

服务治理统计出的是否全面,有没有直接调用的?

从日志、端口统计,时间范围是否够广?

一些边缘系统、定时任务是否会遗漏?

||  共同成长

| 心态要正

代码评审不是挑毛病,能有效实现功能无严重问题即可。可以给出自己的建议,但允许每个人有自己的风格。

对事不对人,发起人和评审人都要有这个意识,大家的共同目的是一致的。

| 沉淀

评审发现的问题要留心记一下,避免重复采坑。

经过一个阶段的评审之后,很多东西是可以直接拿来复用的。

| 点赞学习

好东西要点赞、相互借鉴学习(好的技术方案,好的编码习惯,或者好用的工具类),共同提高编码水平。

扯两句

评审一次费时费力,尽量让其效果最大化

一个合格的程序员绝不仅仅是写好代码这么简单

搜寻资料的过程发现了谷歌的代码评审规范,可以参考学习。
官方:https://google.github.io/eng-practices/review

中文:https://jimmysong.io/eng-practices

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

说说代码评审 的相关文章

  • IntelliJ 对于 Java 项目使用的默认构建过程是什么?

    直接从 IntelliJ 中的 IDE 构建 Java 项目非常好 它速度很快 而且很有效 我无法找到任何有关 IntelliJ 如何进行这些默认构建的文档 我猜它使用Ant 我想做的是为下载我的项目的任何人自动化这个快速 轻松的构建过程
  • Django - 使 ModelForm(ImageField 的)仅接受某些类型的图像

    我将 Pillow 2 3 0 与 Django 一起使用 并且在 models py 中有一个 ImageField 如下所示 class UserImages models Model user models ForeignKey Us
  • 应返回带有 html 代码的字符串的支持 bean 属性返回空字符串

    我的支持 bean 中有一个返回 html 代码的属性 public String getHtmlPrevisualizar return Hello world 我想要做的是在 iframe 中显示这个 html 代码 我用 JavaSc
  • 使用 conda 安装额外功能

    With pip我们可以使用方括号安装子包 例如与阿帕奇气流 https pythonhosted org airflow installation html pip install airflow all 有类似的东西吗conda或者我必
  • 选择活动时运行时崩溃

    首先我想说我几乎没有 Android 经验 这是我在 Android 中的第一个项目 而且我的老师不太擅长教学 所以我对任何过度的无知表示歉意 在进一步讨论之前先解释一下 我的应用程序的目标本质上是能够记录您在某些活动上花费了多少时间 记录
  • 如果使用 Maven,是否应该忽略 VCS 中 Eclipse 特定的文件?

    我知道为什么不将 Eclipse IDE 特定的文件提交到像 Git 我实际上正在使用的 这样的 VCS 中 这就是我使用 Maven 并让它为您生成这些文件的原因之一not将它们置于版本控制之下 但我想知道 是否应该在 gitignore
  • 如何列出所有已加载的 Spring bean 定义文件

    在大型企业系统中 并不总是清楚在 ApplicationContext 构建期间导入了哪些文件 有没有办法列出过程中加载的所有文件 我知道如何列出加载的属性文件 但不知道导入的 bean 文件 更新示例 文件 1 applicationCo
  • 我们可以将请求分派到 servlet 内的 HTML

    这可能吗 RequestDispatcher rd request getRequestDispatcher index html rd forward request response 是的 您可以将请求分派到 HTML 页面
  • 列表中的“u”是什么意思?

    这是我第一次遇到这种情况 刚刚打印了一个列表 每个元素似乎都有一个u在它前面 即 u hello u hi u hey 它是什么意思 为什么列表的每个元素前面都会有这个 由于我不知道这种情况有多常见 如果您想了解我是如何遇到它的 我会很乐意
  • Django INSTALLED_APPS 的命名约定是如何工作的?

    该网站上的教程创建了一个名为 polls 的应用程序 它使用 django 1 9 所以在 INSTALLED APPS 中它是 polls apps PollsConfig 我正在观看一个教程 他将应用程序命名为新闻通讯 并且在 INST
  • 当列表中不存在 X 时,从列表中查找大于 X 的值

    我试图从列表中查找大于特定值 在我的情况下已知 的值 Example Given list 1 2 5 10 15 list is sorted 查找大于的值X 7在这种情况下 期望的结果 返回一个包含值的列表 10 15 我尝试使用jav
  • SQL准备语句如何通过多个可能的菜单选择进行选择?

    所以我有 4 个菜单选择 产品 位置 课程类型和类别 所有这些都可以为空 使用 JSF 编程 但这应该与这个问题无关 因为它是一个 SQL 问题 菜单选择将向托管 bean 发送用户选择的变量 并使用准备好的语句使用用户选择的菜单中的信息
  • 找不到 `activityViewModels()` Hilt Android

    我在我的项目中使用 Hilt 和 MVVM 我想要一个viewModel from activityViewModel在 2 个活动中使用相同的内容 但我的 Android Studio 说未解析的参考 我的应用程序 build gradl
  • 尝试 Catch 性能 Java

    当捕获异常而不是进行检查时 try catch 需要多长时间 以纳秒为单位 假设消息具有用于查找的 HashMap 类型性能 try timestamp message getLongField MessageField TIMESTAMP
  • python:xml.etree.ElementTree,删除“命名空间”

    我喜欢 ElementTree 解析 xml 的方式 特别是 Xpath 功能 我有一个带有嵌套标签的应用程序的 xml 输出 我想按名称访问此标签而不指定名称空间 这可能吗 例如 root findall molpro job 代替 ro
  • 跟踪白色背景中的白球(Python/OpenCV)

    我在 Python 3 中使用 OpenCV 来检测白场上的白 黑球 并给出它的精确 x y 半径 和颜色 我使用函数 cv2 Canny 和 cv2 findContours 来找到它 但问题是 cv2 Canny 并不总是检测到圆的完整
  • java有类似C#的属性吗? [复制]

    这个问题在这里已经有答案了 C 属性 我的意思是 get 和 set 方法 是一个非常有用的功能 java 也有类似 C 的属性吗 我的意思是我们如何在 java 中实现类似以下 C 代码的内容 public string Name get
  • gnuplot:第 1 行:无效命令

    stackoverflow 上可爱的人们大家好 我正在尝试使用 gnuplot 绘制数据 我首先阅读表格并提取我想要的数据 我将此数据写入 dat 文件 截至目前 我只是尝试通过命令行绘制它 但会添加必要的代码以在 python 脚本工作后
  • 具有重复值的 Sqlite 列

    就说专栏吧aSQLite 数据库的非常重复 始终有相同的 4 个值 其他值可能稍后出现 但不同值的数量将少于 1000 个 VALUES hello world it s a shame to store this str many tim
  • 如何从Python枚举类中获取所有值?

    我正在使用 Enum4 库创建一个枚举类 如下所示 class Color Enum RED 1 BLUE 2 我要打印 1 2 作为某处的列表 我怎样才能实现这个目标 您可以执行以下操作 e value for e in Color

随机推荐

  • 【C++】IO流

    文章目录 1 C语言的输入与输出 2 流是什么 3 C IO流 3 1 C 标准IO流 3 2 C 文件IO流 3 2 1 二进制读写 3 2 2 文本读写 4 stringstream 字符串流 的简单介绍 5 总结 1 C语言的输入与输
  • SQLite下载、安装与连接

    1 下载SQLite SQLite官网 https www sqlite org download html 根据自己电脑操作系统配置 选择32位或64位下载 一般情况下是64位 总共两个压缩包 或者直接去 https download c
  • 如何打造优秀Web3产品

    近日 我们采访了Mysten Labs的联合创始人兼首席执行官Evan Cheng 探讨了Web3技术对消费者的价值 Web3行业应该如何更好地自我诠释 以及它对产品开发的影响 您曾谈到Web3作为一种所有权实验 这种新技术可能会改变消费者
  • Oracle中的数据导出(4)

    目录 法一 使用SQL plus命令脚本 法二 使用PLSQL Developer工具 前几篇文章描述了如何将Oracle中的数据导出到库外 但是导出的数据结果都是文本文档 这样页面查看不和谐 编辑又略显麻烦 因此这篇文章将描述如何将Ora
  • 116_QT_RCC: Error in ‘file.qrc‘: Cannot find file

    有中文路径或者名字 导致找不到文件 全部改成英文就OK了
  • 数据耦合与控制耦合

    数据耦合 其中一个模块的输出作为另一个模块的输入 那么就存在数据耦合 如 Module A中 int FunA return 1 Module B中 int b FunA 上面两个modules就存在数据耦合 控制耦合 其中一个模块可以控制
  • C语言中对用户输入的数据使用冒泡排序法后输出

    代码 include stdio h include windows h int main 先定义一个数组a 变量i j和临时变量temp 用来存放临时数据 int a 5 i j temp printf Input Five Number
  • 点云双边滤波算法(附 matlab 代码)

    一 原理概述 在二维图像领域中 双边滤波算法是通过考虑中心像素点到邻域像素点的距离 一边 以及像素亮度差值所确定的权重 另一边 来修正当前采样中心点的位置 从而达到平滑滤波效果 同时也会有选择性的剔除部分与当前采样点 差异 太大的相邻采样点
  • ABA问题的解决

    什么是ABA问题 ABA问题是发生在CAS过程当中的下面以一个例子来表示 假如有两个线程A B 两个线程都从主内存中获取了某个对象的值为value1 当进行CAS的时候A首先把value1更换成了value2 因为线程B可能没有CPU资源调
  • PYGAME关于矩形自动移动问题(碰到边界反弹)

    import pygame sys from settings1 import plant game ai setting plant game class moving def init self ai setting screen se
  • mysql学习笔记二(函数)

    函数 一 字符串函数 二 数值函数 三 日期函数 四 流程函数 一 字符串函数 select 函数 参数 注意 substring str start len 函数起始索引为1 二 数值函数 例 select ceil 1 1 gt 2 s
  • 超算云(GPU服务器)环境配置

    最近在用并行超算云GPU服务器 中国国家网格12区 搭建毕设的环境 这里记录一下 首先 超算云服务器的登录可以采用网页版 也可以采用客户端 超算云地址 https cloud paratera com 需要注意的是 并行超算云只提供wind
  • [FPGA IP系列] BRAM IP参数配置与使用示例

    FPGA开发中使用频率非常高的两个IP就是FIFO和BRAM 上一篇文章中已经详细介绍了Vivado FIFO IP 今天我们来聊一聊BRAM IP 本文将详细介绍Vivado中BRAM IP的配置方式和使用技巧 一 BRAM IP核的配置
  • 人工智能革命:从AGI到ASI的道路

    在某种程度上 我们将获得具有人类一般智能的AGI计算机后 只是一群人和计算机平等地生活在一起 哦 实际上并不会 问题是 AGI具有与人类相同的智能和计算能力水平 但仍然具有优于人类的优势 如 硬件 速度 大脑的神经元最大频率大约为200赫兹
  • 数据分析--Python将dataframe格式数据存入clickhouse

    Python将dataframe格式数据存入clickhouse 基于Python实现大批量dataframe格式数据存入clickhouse中 python 一切 基于Python实现大批量dataframe格式数据存入clickhous
  • 信用卡风控——梯度提升树方法Python实现

    本文是一个用户按时还款的预测模型 利用台湾地区一些信用卡客户的信用额度 教育程度 婚姻状况 过去的还款状态 账单等信息对客户进行评分 采用GBDT 梯度提升树 模型对数据进行分类 预测其是否会产生逾期偿还 数据来源于kaggle的一个比赛
  • dispatch_async 与 dispatch_sync

    从字面意思上看 sync 同步 async 异步 并行队列 异步 异步 dispatch async dispatch get global queue DISPATCH QUEUE PRIORITY DEFAULT 0 dispatch
  • strcpy和strdup比较和详解

    strcpy和strdup比较和详解 函数和功能描述 extern char strdup char s 头文件 string h 功能 将串拷贝到新建的位置处 说 明 strdup不是标准的c函数 strdup 在内部调用了malloc
  • matlab中如何表示开方,在matlab里面怎么输入开方号(根号)?9的开方怎么写?...

    答 sqrt 9 nthroot 8 3 人家想求的就是实数根把 不信你试试 8 1 3 和 nthroot 8 3 你就知道区别了 很多人不知道nthroot这个函数 用指数的方法画x的3次方根的图像结果发现x 答 sqrt 9 nthr
  • 说说代码评审

    关注公众号 1024个为什么 及时接收最新推送文章 本文内容 1 代码评审的目的 2 评审准备工作 3 评审过程中容易出问题的点 4 共同成长 近一段时间以来 组内严格实行代码评审制度 参与过多次评审后发现 一次有效的代码评审并不简单 把一