怎样做好Code Review

Code Review方案

定义

Code Review代码评审是指在软件开发过程中,通过对源代码进行系统性检查的过程。通常的目的是查找各种缺陷,包括代码缺陷、功能实现问题、编码合理性、性能优化等;保证软件总体质量和提高开发者自身水平

code review 的好处

    1. 提高代码质量。
    1. 及早发现潜在缺陷,降低修改/弥补缺陷的成本。
    1. 促进团队内部知识共享,提高团队整体水平。
    1. 评审过程对于评审人员来说,也是一种思路重构的过程。帮助更多的人理解系统。
    1. 是一个传递知识的手段,可以让其它并不熟悉代码的人知道作者的意图和想法,从而可以在以后轻松维护代码。
    1. 鼓励程序员们相互学习对方的长处和优点。
    1. 可以被用来确认自己的设计和实现是一个清楚和简单的。

code review形式

一般code review有两种形式,一种是代码评审会议,我称之为Code Review Meeting,就是将团队成员都组织起来开会,让代码Owner上去讲自己代码的实现和思路,其它人发表意见和进行讨论,也有把这种叫做team review。另外一种是一对一评审,我称之为Single Review,就是项目owner提交代码之后,让reviewer在空闲的时候帮忙评审代码,并且写出批注,owner收到批注后,进行修改或者回复。但注意这里的reviewer并不是只有技术主管或架构师之类的才能做,代码质量监管仅仅靠架构师是不够的,需要所有经验丰富或有专长的同学参与其中。也有人将这个形式叫peer review。 现在大部分公司都使用为Single Review形式,或者两者混合使用。

code review 工具

我们这里只介绍single review形式的工具。现在有比较受好评code review工具有Facebook的Phabricator,Google的Gerrit,他们都是开源的.另外微软也有他的code review工具TFS(Team Foundation Server),据说也挺好用,不过是收费的。不过现在大家用得最多的code review方式是基于Pull Request工作流方法,结合gitlab或者github来使用。现在Git是最流行的代码管理工具,结合gitlab的pull request,很容易实现code review。

Code Review流程

这里介绍一下基于gitflow+gitlab来做code review的流程。要在gitlab里做好code review需要有个前提,就是做好权限管理。每个成员在项目里都有对应的角色,例如owner,master,developer等。然后项目代码里设置受保护分支,master一定是受保护的分支,还可以根据需要设置其他分支为受保护分支。developer权限的成员是不能向master或者其他受保护分支push代码的。

所以结合code review,开发中的整个流程就是:建立feature分支-->编写代码-->push分支代码-->gitlab上发起一个合并请求(pull request)-->审核人员审核代码,如有需要,提出修改意见-->开发人员修改代码-->审核人员审核通过,合并代码,删除分支

下面介绍一下详细的流程,和对应的git操作命令:

1、根据开发任务,建立git分支, 分支名称模式为feature/任务名,比如关于API相关的一项任务,建立分支feature/api。 git checkout -b feature/api

2、运行git branch 确认切换到了feature/api分支

3、编辑代码完成开发任务, commit相关代码 git add -A git commit -m "implement api architecture"

4、将分支代码push到服务器 git push origin -u feature/api

5、登录到gitlab源代码库,如http://192.168.0.2/native/record-app ,点击合并请求(Pull request)按钮去创建一个合并请求(pull request)

6、再pull request详细页面, 填写相关标题/说明/reviewer, 目前请将reviewer设成相关人员

7、请提醒reviewer去审核pull request,系统也会发邮件提醒reviewer

8、Reviewer打开pull request页面,查看代码修改情况,也可以在相应的代码处添加注视,提示代码作者哪里应该修正。

9、代码作者根据reviewer的要求,调整代码后commit/push到服务器。 然后reviewer继续设置, 如此循环,知道没有问题。

10、当代码没有问题以后, 需要将任务代码merge到主代码库, 有两种方法: a、Reviewer可以在pull request页面点击Merge按钮, 把代码merge到主代码库 b、Reviewer手动本地merge, 并push到服务器。 git pull origin develop git log ..develop

如果看到develop里有修改没在当前分支, 那么运行git rebase develop来把develop的修改加入到当前分支 运行一下合并命令 git checkout develop git merge --no-ff feature/api git push

11、代码作者删除feature子分支。 git checkout develop git branch -D feature/api git push origin :feature/api

git pull origin develop

总结:核心流程就是 建立分支--发起PR请求--审核--合并,不断的循环反复。

code review注意事

cr中应该有的态度

待补充

觉得很好的一篇文章CodeReview正确的姿势是什么? - 知乎

参考资料

学习笔记_Git之CodeReview流程

使用gitlab做git flow及代码审查

Git工作流指南:Pull Request工作流

如何做好代码审查?Code Review Meeting还是Single Review

我们是怎么做Code Review的

如何进行高效迅速的CodeReview

如何有效的做Code Review

知乎上的讨论:

有人实践过 Phabricator 以及 Arcanist 作为 code review 的工具么?

大家的公司的code review都是怎么做的?遇到过什么问题么?

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

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

相关文章

【机器学习】正则化

正则化是防止模型过拟合的方法,它通过对模型的权重进行约束来控制模型的复杂度。 正则化在损失函数中引入模型复杂度指标,利用给W加权值,弱化了数据的噪声,一般不正则化b。 loss(y^,y):模型中所有参数的损失函数&…

[论文阅读] |RAG评估_Retrieval-Augmented Generation Benchmark

写在前面 检索增强能够有效缓解大模型存在幻觉和知识时效性不足的问题,RAG通常包括文本切分、向量化入库、检索召回和答案生成等基本步骤。近期组里正在探索如何对RAG完整链路进行评估,辅助阶段性优化工作。上周先对评估综述进行了初步的扫描&#xff0…

mkcert的安装和使用,5分学会在本地开启localhost的https访问方式

mkcert官方仓库地址:https://github.com/FiloSottile/mkcert#installation mkcert 是一个简单的工具,用于制作本地信任的开发证书。它不需要配置。 简化我们在本地搭建 https 环境的复杂性,无需操作繁杂的 openssl 实现自签证书了&#xff…

在WebSocket中使用Redis出现空指针异常解决方案

文章目录 在WebSocket中使用Redis1.问题描述2.原因3.解决步骤1.新建一个SpringUtil.java类,通过getBean的方法主动获取实例2.在WebSocketSingleServer.java中导入 在WebSocket中使用Redis 1.问题描述 在controller 和 service中都可以正常使用Redis,在…

xcode安装visionOS Simulator模拟器报错解决方法手动安装方法

手动安装方法: 手动下载visionOS Simulator模拟器地址: https://developer.apple.com/download/all/ 选择 Xcode 版本 sudo xcode-select -s /Applications/Xcode.app # 用 Xcode-beta 的话是: # xcode-select -s /Applications/Xcode-beta…

openssl3.2 - 测试程序的学习

文章目录 openssl3.2 - 测试程序的学习概述笔记openssl3.2 - 测试程序的学习 - 准备openssl测试专用工程的模板openssl3.2 - 测试程序的学习 - test\aborttest.copenssl3.2 - 测试程序的学习 - test\sanitytest.copenssl3.2 - 测试程序的学习 - test\acvp_test.copenssl3.2 - 测…

邻接矩阵、关联矩阵

邻接矩阵: 邻接矩阵是一种用来表示图中顶点间相互连接关系的矩阵。在邻接矩阵中,矩阵的行和列都代表图中的顶点。 对于无权图,如果顶点 i 和顶点 j 之间有一条边,则矩阵中的元素 Aij​(位于第 i 行和第 j 列&#xff…

编译Opencv3.3 版本遇到的Cuda版本变更导致:CUDA_nppicom_LIBRARY (ADVANCED)链接找不到的问题根本解法:

前言: Opencv 开源库的使用是必须的,但是,开源项目的特性,造成,版本的依赖性比较复杂, 尤其是针对某一款老硬件的SDK,往往随着某个开源库的使用,导致,无法编译的问题&am…

(bean的创建图)学习Spring的第十天(很重要)

大致框架按如下 第一次细分 bean对象还未创建 操作第一个map 引入BeanFactoryPostProcessor , 即Bean工厂后处理器 , 为Spring很重要的扩展点 BeanFactoryPostProcessor内部的方法 可以对BeaDefinition进行修改 , 也可进行BeanDefinition的注册 ( 原有在xml文件配置的bean…

从零学习Linux操作系统 第二十部分 mariadb数据库的管理

一、对于数据库的基本介绍 1.什么是数据库 数据库就是个高级的表格软件 2.常见数据库 Mysql Oracle mongodb db2 sqlite sqlserver … 3.Mysql (SUN -----> Oracle) 4.mariadb (Mysql的一种) 数据库中的常用名词 1.字段 :表格中的表头 2.表 &…

Day01_变量和数据类型(注释,关键字,标识符,数据类型,字面量,变量,常量,进制,计算机存储单位,Java的基本数据类型的存储范围,计算机如何表示数据)

文章目录 JavaSE_Day01 变量和数据类型学习目标1.1 注释(*comment*)(掌握)1.2 关键字(*keyword*)(掌握)1.3 标识符( identifier)(掌握)1.3.1 标识符的命名规则…

构造器模式

构造器模式 意图 将一个复杂对象的构建和表示分离,使得相同的构建能创建不同的表示。 解释 案例:想象一个角色扮演游戏的特征生成器。最简单的选择是让计算机为你创建角色。如果你想手动选择特征的细节像职业、性别、头发的颜色等。特征的产生是一个循…

js实现动漫拼图1.0版

文章目录 1 实现效果视频2 功能实现思路3代码实现 1 实现效果视频 拼图1.0 2 功能实现思路 布局忽略(小白学前端,不献丑了) 左侧拼图格 左侧4*4的拼图小格子 利用表格实现,规划好td的大小,给每个格子加上背景图片&…

Flink问题解决及性能调优-【Flink不同并行度引起sink2es报错问题】

最近需求,仅想提高sink2es的qps,所以仅调节了sink2es的并行度,但在调节不同算子并行度时遇到一些问题,找出问题的根本原因解决问题,并分析整理。 实例代码 --SET table.exec.state.ttl86400s; --24 hour,默认: 0 ms …

MySQL查询—联合查询、子查询

关于表格的创建,请看上一篇文章——MySQL查询—连接查询 1、联合查询:把多次查询的结果合并,形成一共新的查询集。 UNION,UNION ALL 语法: SELECT 字段列表 FROM 表A..&#…

qt-C++笔记之使用信号和槽实现跨类成员变量同步响应

qt-C笔记之使用信号和槽实现跨类成员变量同步响应 —— 杭州 2024-01-24 code review! 文章目录 qt-C笔记之使用信号和槽实现跨类成员变量同步响应1.运行2.main.cpp3.test.pro4.编译 1.运行 2.main.cpp 代码 #include <QCoreApplication> #include <QObject> #…

Linux下Docker搭建部署Typecho博客【详细版】

Linux下Docker搭建部署Typecho博客【详细版】 一、环境准备1.1.准备阿里云服务器【新用户免费使用三个月】1.2.准备远程工具【FinalShell】1.3.系统信息1.4.安装所需软件包1.5.设置docker镜像源1.6.更新yum软件包索引1.7.确认停用selinux 二、安装Docker2.1.安装Docker-Ce2.2.查…

【RTP】webrtc 学习3: webrtc对h264的rtp解包

rtp_rtcp\source\video_rtp_depacketizer_h264.cc【RTP】webrtc 学习2: webrtc对h264的rtp打包 中分析了打包过程的代码,这样再来看解析过程的源码就容易多了:本代码主要基于m79,m98类似。这里注明了jitterbuffer 会再次 做 解析stap-a 变为NAL units解析ParseFuaNalu 第一…

ACL、VLAN、NAT笔记

一、ACL ---访问控制列表 1.ACL的作用 1&#xff0c;访问控制&#xff1a;在路由器流量流入或流出的接口上&#xff0c;匹配流量&#xff0c;然后 执行设定好的动作。 ---- permit 允许 , deny 拒绝 2&#xff0c;抓取感兴趣流&#xff1a;ACL可以和其他服务结合使用。ACL只…

MyBatis 如何整合 Druid 连接池?

Mybatis 如何整合 Druid 数据连接池呢&#xff1f;首先打开创建的 Maven 工程&#xff0c;找到 pom.xml 文件&#xff0c;添加 Druid 依赖。 <!--druid连接池--> <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId&…