code review

2023-11-07

方法有多种,目前最被认可或运用的方法莫过于CodeReview活动了。

那么 CodeReview到底能给团队带来什么?什么样的团队需要进行CodeReview活动?如何有效开展CodeReview活动?用哪种方式会比较好呢?

 

笔者为了接地气地研究这个实践,特选择了“手机管家高权限应用组”作为试点团队进行活动开展,这是一个对CodeReview活动非常认同并且愿意持续改进的团队,经过一年的运作,该团队CodeReview活动运作成效显著。

 

接下来笔者就根据试点经验,总结一下对CodeReview这个实践的看法和思考,希望能对想要或正在进行CodeReview活动的团队提供借鉴作用。


一、CodeReview到底能给团队带来什么?
 

通过参与实战和团队成员讨论思考,我们认为CodeReview最终的作用将归到促进工程师日常代码交流和人员的成长上面来,与此同时作为辅助手段来对产品质量进行把关。

 

但一般来说,很多团队在CodeReview前期重点会是找问题(代码规范、潜在缺陷、BUG,代码设计等等),而后期随着问题的逐渐减少和习惯的逐步养成,工程师交流文化的营造将转化成重点,中期当有大批新人加入时,问题找茬将又上升为重点,如此复始。

 

总结一下,大多数情况下,找问题会是CodeReview活动启动的初衷,但越到后期它更大的意义将演变成工程师交流土壤的培育和人员成长的促进


二、什么样的团队需要进行CodeReview活动?
 

CodeReview作为业界公认的最佳实践,如果每个团队都能运用起来,固然是最好的,但是由于这项活动跟“人”这个因素密切挂钩,所以,它是否能有效运作跟团队状态、技术信仰和领导者诉求等都有莫大关系。今天,笔者想分享下个人在“到底什么样的团队需要”和“什么样的团队暂时不适合”这方面的思考。这里欢迎大家更多的交流讨论。

 

从代码质量提升的角度上看,以下类型的团队,笔者建议把CodeReview活动有效运作起来:

  1. 技术驱动型团队:一般涉及系统底层逻辑较多,功能路径难以被测试覆盖,而产品质量问题很多时候是致命的,所以这样的团队更多需要开发编码的严谨性和相关代码质量的保证活动。手机管家高权限应用组就属于这一类型。

  2. 公共服务型团队:一般服务于多个团队,一旦出现质量问题影响范围会比较广,所以除了在测试方面加以把关外,通过CodeReview活动来提升开发质量是非常有必要的。

  3. 测试缺失型团队:这样的团队由于缺乏测试环节,质量问题带到线上的风险会很高,强烈建议在开发环节做好自检工作。

  4. 新人密集型团队:新人的代码可读性往往是比较差的,特别需要组织能及时给予纠正,帮助新人养成良好的编码习惯。同时如果团队产出的代码可读性较高时,新人也可以更快上手工作。

  5. 任何有主观意愿的团队:这样的团队或领导者认同CodeReview的意义,或团队成员对代码质量提升有追求。

CodeReview活动跟人这个因素密切相关,从其带有的这个主观特点来说,笔者认为以下类型的团队暂时不适合开展CodeReview活动:

  1. 不认同型团队:即领导和团队骨干都不认同CodeReview意义的团队,这样的团队无论从推动还是坚持上都有很大挑战。

  2. 疲于应付型团队:这种团队一般没有建立必要的持续提升机制,每天淹没在各种需求沟通实现变更和优化中,自然,代码质量提升活动也很难被列入backlog。

  3. 创新型团队:这种团队的重要任务是要把产品快速推向市场进行价值验证,所以在代码编写上要求足够敏捷,代码暂时的混乱完全可以接受。

综上,笔者建议大家在考虑自身团队是否要推行CodeReview时,可结合团队实际状态进行综合考虑。但一般来说,如团队主观意愿没有问题,就可以大胆推行开展。


三、如何有效开展CodeReview活动?
 

要想在团队内部有效运作CodeReview活动,必备四要素(如下图)。如果您的团队没有把CodeReview活动有效开展下去或者正深受烦恼,这部分内容希望您仔细看看。

1、代码规范:明确Coding规则
 

如果一开始不定义好团队Coding标准,那在检视过程中就会存在两种情况:一种是各种不同的意见很难快速达成一致,影响review效率,另外一种是团队根本就不会重视代码规范的检视, 如果是前者还好,毕竟大家都还在关注什么写法是好的或对的这个问题,只要中途愿意建立起Coding规则,问题就能很快解决。而笔者跟进过的一个团队恰恰就出现了后者的情况:该团队由于前期没有明确Coding规则, 过程中大部分开发人员对规范类问题直接无视,CodeReview运作一段时间后代码中依然存在命名不规范,可读性较差等问题,直接影响了活动效果,这是我们非常不愿意看到的。

 

当然也有团队负责人说了,每天纠结于空格少了,行数字符多了等细节问题没意义啊,不想浪费这个时间,因此我们不需要代码规范。我个人不认同这个观点,因为代码规范并不只包括空格和字符等约束纬度,还包括了注释的要求,命名的规范,命名是否词能达意,代码结构安排等等影响代码可读性的因素, 如若这些方面连基本规则都没有,那一定会出现之前说的那两种情况(争议太多 or 完全忽视),效果可想而知。所以你可以根据自己的看法或需求做一定的规则定制,但不能没有Coding规则


2、检视指南:消除困惑和迷茫
 

检视指南又名CodeReview-checklist。一个团队并不是所有人都是老司机,有很多同学是没有代码review经验的,他们往往不知道应该重点 check哪些点。

 

这个时候结合自身业务特点和团队之前踩过的坑,制定一个checklist是非常必要的:

  • 什么写法可能导致性能低下?
  • 哪个接口要慎用?
  • 哪些设计方式需要规避?
  • 什么习惯容易引发内存泄漏?
  • 等等。。。

这样可以让经验不足者在不知道要review什么时,能有的放矢,过程中逐步积累起经验。

以下是一个团队建立起检视指南前后,CodeReview发现问题数的变化,足见建立检视指南的重要性

当然也有人说,我的团队代码检视都是让资深骨干做的,不存在不知道怎么review的情况

但是我想说,骨干员工的时间毕竟很宝贵,他们也往往很忙碌,为什么不让更多的成员一起来参与review工作呢,毕竟CodeReview不仅仅是找茬,也是代码的交流和学习!


3、总结优化:透明问题,持续优化(非常重要)
 

我们看到很多团队的CodeReview活动坚持不下来或逐步流于形式,其实最主要原因是过程中缺乏定期回顾和总结,从而不知道如何有效促进和帮助团队更好运作。

 

为了更好地促进这项活动,手机管家高权限应用组就专门成立了CodeReview组委会,这个组织每月都会对CodeReview运作状况进行总结,分析问题,解决问题,持续优化,其最后的效果能在团队内外均获得较高的认同度,可以说总结优化这个环节起到了非常关键的作用。


4、激励机制:激发主观能动性
 

由于CodeReview本身跟人的经验或者意识都有很大关系,很多时候我们会为调动不起开发同学的积极性而烦恼,所以为了让大家更好的参与这个活动,我们一般都需要制定相应的激励机制。也有人说了,如果是leader强制跟考核挂钩,那就不需要这个东东了,嗯,但换个角度看,跟考核挂钩难道不是另外一种“激励”方式吗?哈哈。。。

 

激励机制的设立有很多种,一般来说,都是在定期回顾的基础上根据CodeReview的实际情况对表现积极的同学进行一定的礼品奖励(选择什么礼品,要看组织的经济状况,哈哈)。

 

笔者跟进的团队每月会从CodeReview提交次数和发现问题数等纬度进行质量之星选举,礼品包括了书籍,公仔,徽章等等,效果不错,做法供大家参考。

 

总之,代码规范、检视指南、总结优化和激励机制这四个因素对成功运作CodeReview活动都非常关键,但每一项里面的内容具体要如何定义,团队在参考业界做法的基础上可根据实际情况进行一定的定制。


四、CodeReview方式很多,用哪种会比较好呢?
 

目前业界运作CodeReview的方式有多种方式:强制&非强制、线上交流&线下会议、小片段&大模块、事前&事后、高频率&低频率,等等……据了解,目前每种形态都有各自的市场,被不同的团队运用着。

 

接下来笔者个人角度分析下各种形态的优缺点,供大家参考:

  1. 强制&非强制: 按照经验,CodeReview启动前期建议采用强制要求,否则很难有效开展起来。坚持一段时间待习惯养成后再考虑自由度。

  2. 小片段&大模块:如果想要让问题暴露更充分或降低review的难度,建议采用细粒度方式进行,即小片段提交小片段review。如果更关注全局设计和逻辑思路的学习和找茬,那么可以用模块方式统一review。但很多时候这两种方式是可以结合运作的。

  3. 线上交流&线下会议: 如果想提高效率,建议采用线上方式进行交流,这里要推荐公司的Code平台,上面支持CodeReview的功能都已经比较齐全。如果更喜欢全员一起找茬的那种快感,那么可以采用线下会议方式开展,但采用开会的方式,一般成本较高,可看团队接受度。

  4. 事前&事后:这里指的是发布前还是发布后。版本发布后统一进行CodeReview的方式更多是一种代码交流活动, 起不到代码质量把关的作用。反之,如果在版本发布前就对代码进行CodeReview,就可以对质量问题起到很好的把关作用。这里是时间和质量之间的权衡。

  5. 高频率&低频率:笔者建议的是把代码交流放在每一天,所以频率越高越好。具体根据团队实际情况进行安排即可。

  6. 此外,也有团队采用模块owner把关质量的CodeReview方式,这种更多是从质量风险规避角度上考虑,在代码提交前owner检查是否有质量问题,确认没有问题后方能发布,有这方面需要的团队也可以考虑这种方式。

最后组合一下,笔者个人推荐的CodeReview方式是强制+事前+小片段+线上交流+高频率,同时,如果能结合线下的大模块方式开展代码交流活动,效果会更好,这个经验来自手机管家高权限应用组的接地气实践

但是,团队状态不一样,选择方式允许有差异,所以具体选用哪种方式组合,还是要由团队自己作主。

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

code review 的相关文章

  • 思科模拟器基础实验完整流程-初级

    文章目录 实验拓扑 第一部分 企业总部内网 第一层 接入层 第二层 汇聚层 解决 VLAN 间通信 第三层 网络层 第二部分 企业分部内网 第三部分 外部网络路由 第四部分 NAT 地址转换 第五步 VPN 实验拓扑 由图我们可以看到这张拓
  • 【SpringCloud】用【Idea】构建Maven父子工程图文(1)

    1 概述 之前老是出现idea建springCloud的maven父子工程失败 特此写下经验和教训 springboot版本 2 2 1 2 不多逼逼 图文教程直接来 新建maven空工程 事先准备好一个空文件夹 选择刚才建好的空文件夹 不
  • C# 企业微信:开启消息接受&接收消息&推送消息

    前言 微信吧 接触的人都会100 各种踩坑 就算同样东西去年做过 今年来一样踩坑 因为太多你稍微不记得一点点的细节就能让你研究N久 为此 我要把这个过程详细的记录下来 一 开启消息接受 1 拿到企业corpId 应用的Token Encod
  • proteus中如何加载C语言程序,Proteus运行Keil编写的51单片机C语言步骤

    1 在Keil 编写好程序以后 在左侧项目栏中单击鼠标右键 如下图 2 点击上图中Options for Target Target1 选项 弹出下列窗口 3 在Target标签中将Xtal MHz 中的晶振频率改为12 0 再在Outpu
  • 【周末闲谈】关于“数据库”你又知道多少?

    个人主页 个人主页 系列专栏 周末闲谈 系列目录 第一周 二进制VS三进制 第二周 文心一言 模仿还是超越 第二周 畅想AR 文章目录 系列目录 前言 数据库 数据库的五大特点 数据库介绍 数据库管理系统 DBMS 数据库的结构 数据库的操
  • 给定一个十进制正整数 n(0 < n < 1000000000),每个数位上数字均不为 0。n 的位数为 m。现在从 m位中删除 k位 (0<k < m),求生成的新整数最小为多少?例如: n = 9

    题目描述 给定一个十进制正整数 n 0 lt n lt 1000000000 每个数位上数字均不为 0 n 的位数为 m 现在从 m位中删除 k位 0
  • 如何搭建Tesla Occupancy Network的一个基线?

    作者 我叫斯蒂芬 编辑 汽车人 原文链接 https zhuanlan zhihu com p 575058907 点击下方卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 BEV感知 技术交流群 原文链
  • 前端音波绘制

    好久不曾写博客了 忙忙碌碌大半年 毕业就工作果然还是有点意思 本人贼懒 但是只要是研究了点东西的话 还是分享一下供其他感兴趣的小伙伴前车之鉴吧 回归正题 用过手机百度音乐的朋友们 这里算打个广告吧 估计会注意音乐播放后左下角那个音波绘制的看
  • 基于yolov3源码的训练过程

    基于yolov3源码的训练过程 在yolo官网上使用一下指令可以对模型的数据集进行训练 darknet detector train cfg voc data cfg yolov3 voc cfg darknet53 conv 74 但是训
  • fatfs移植和使用(在SPI_FLASH上建立文件系统)

    文件系统对于嵌入式系统的重要性是不言而喻的 有了文件系统管理数据和外设变得方便许多 同时简化了应用的开发 今天我们来以在SPI FLASH上建立文件系统为例 看看FATFS文件系统怎么移植和使用 需要准备的材料有 1 FATFS文件系统源码
  • VC项目中文件类型说明

    APS 存放二进制资源的中间文件 VC把当前资源文件转换成二进制格式 并存放在APS文件中 以加快资源装载速度 资源辅助文件 BMP 位图资源文件 BSC 浏览信息文件 由浏览信息维护工具 BSCMAKE 从原始浏览信息文件 SBR 中生成
  • Elasticsearch与Clickhouse数据存储对比

    1 背景 京喜达技术部在社区团购场景下采用JDQ Flink Elasticsearch架构来打造实时数据报表 随着业务的发展Elasticsearch开始暴露出一些弊端 不适合大批量的数据查询 高频次分页导出导致宕机 存储成本较高 Ela
  • 从键盘输入一个字符,若为小写,则改为大写再输出

    include
  • React学习笔记

    一 基础 1 概念 React是用于构建用户界面的JavaScript库 只关注视 2 特点 声明式编程 React 使创建交互式 UI 当数据变动时 React 能高效更新并渲染合适的组件 组件化 构建管理自身状态的封装组件 然后对其组合
  • 华为技术支持面试

    一面 技术面 不同面试官 面试内容差别较大 班里有些同学随便聊4 5分钟就通过了 我 大概面了15分钟 首先是三分钟的中文自我介绍 然后针对简历提问 被问到毕业课题 而且问得比较详细 叫我画出整个方案的框架图 I2C LCD的时序图 项目工
  • Linux驱动

    HC SR04超声波模块 工作原理参考 超声波模块 star air的博客 CSDN博客 超声波模块 https blog csdn net qq 41262681 article details 95940707 使用超声波测距的操作步骤

随机推荐

  • java获取post数据_java通过HttpServletRequest获取post请求中的body内容的方法

    在java web应用中 我们如何获取post请求body中的内容 以及需要注意的问题 通常利用request获取参数可以直接通过req getParameter name 的方式获取url上面或者ajax data提交上来的参数 但是bo
  • centos7.9 安装使用kafka

    安装kafka之前需要安装java8 以上版本 yum install java 1 8 0 openjdk x86 64 yum install java 1 8 0 openjdk devel x86 64 安装kafka 软件下载地址
  • 64GU盘装机后变成32G,且电脑无法识别问题解决

    问题描述 借助64G的闪迪U盘给电脑装了系统后 直接拔出后 忘记点弹出了 然后这个电脑的此电脑中就找不到这个U盘 别的电脑可以 但是在电脑右下角可以看到 64G变成32G这个问题网上解决办法很多 我是下载了DiskGenius然后格式化就好
  • scribe日志收集

    https www xiaomastack com 2014 11 11 scribe nginx php 日志管理 4 用scribe收集nginx和php日志 By 小马 十一月 11 2014 Scribe 日志管理 Leave a
  • win7 和 linux双系统安装教程,win7和centos7双系统完美安装攻略

    笔记本 台式机配置都太差了 装Vbox VM Hyper v都不能顺畅运行 太卡 于是想到开启台式机Wind7 CentOS7双系统运行模式 几经周折整理出以下安装过程 准备工作 准备辅助工具 所用工具包整理好 https pan baid
  • Centos安装python3导入ssl时解决 ModuleNotFoundError: No module named ‘_ssl‘问题

    当装好python3导入ssl模块时报以下错误 ModuleNotFoundError No module named ssl import ssl if we can t import it let the error propagate
  • 【标准解读】Autosar 复杂驱动(CDD)开发--看这一篇就够了

    系列文章目录 提示 写完文章后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一 Introduction to CDD 二 CDD设计建议 CDD开发需要注意的事项 2 1 文档 2 2行为和接口描述 2
  • Netty线程模型

    说明 1 Netty抽象出两组线程池 BossGroup专门负责接收客户端的链接 WorkerGroup专门负责网络的读写 2 BossGroup和WorkerGroup类型都是NioEventLooGroup 3 NioEventLoog
  • (转)非常好的WebApi入门文章

    如何在VS中创建基于 NET的后端应用程序 该应用程序使用C 语言从Web API中提取 让我们开始吧 为服务器后端逻辑选择语言的问题是几乎每个开发人员最重要的问题之一 特别是对于初学者 目前已经有很多不同的语言 Java NET C VD
  • 嵌入式数据结构(栈)

    嵌入式自学笔记 1 2 后进先出 3 栈的应用 从A出发进是入栈 红色的出是出栈 4 创建栈的思路 zhan zhancreat int len zhan s if s zhan malloc sizeof zhan NULL printf
  • css选择class中的第一个怎么选?使用first-of-type?

    Dom结构 div span class hha 我是span span h1 class hha 我是h1 h1 h1 我是h1 h1 h1 class hha 我是h1 h1 h1 class hha 我是h1 h1 h1 我是h1 h
  • 如何限制同一客户端登录的用户数量以及禁止同一用户同时在不同客户端登录?

    在web应用系统中 出于安全性考虑 经常需要对同一客户端登录的用户数量和一个客户同时在多个客户端登陆进行限制 具体一点就是 1 在同一台电脑上一次只允许有一个用户登录系统 2 一个用户在同一时间只允许在一个客户端登录 我最近做的一个系统就遇
  • Linux基本命令(二) 文件处理命令

    文件处理命令 touch 命令名称 touch 命令所在路径 bin touch 执行权限 所有用户 语法 touch 文件名 功能描述 创建空文件 范例 touch chen list 文件处理命令 cat 命令名称 cat 命令所在路径
  • UE4 中C++读取Json文件

    本篇文章介绍C 读取Json文件前我们先了解下Json格式 Json格式不同读取会有所区别 踩了一波坑 Json文件有三种格式 这三种格式都是正确的 这边提供一个很有用的Json文件在线编辑平台的网址 在线编辑Json网站 Json文件的三
  • STM32----中断优先级设置

    步骤一 设置中断分组 STM32中断规则 中断优先级分为抢占式优先级和子优先级 对于每一个中断需事先设置其抢占式优先级和子优先级 抢占式优先级级别高的中断可以打断抢占式优先级级别地的中断 抢占式优先级级别相同时 互相均不能打断对方中断执行
  • 计算机专业考研复试上机算法学习

    计算机专业考研复试上机算法学习 这篇博客是博主在准备可能到来的线下上机复试基于王道机试指南的学习 将各道习题链接和代码记录下来 这篇博客权且当个记录 文章目录 计算机专业考研复试上机算法学习 1 STL容器学习 1 1 vector动态数组
  • 网络爬虫之css选择器

    文章目录 通过id class选择元素 元素内部筛选 通过属性值筛选 取值 参考 通过id class选择元素 container 选择id为container的元素 container 选择所有class包含container的元素 di
  • 你不知道的JavaScript-----强制类型转换

    目录 值类型转换 抽象值的操作 JSON 字符串化 ToNumber 非数字值到数字值 Number value ToBoolean 转换为布尔类型 Boolean value 强制类型转换 字符串和数字之间的显式强制类型转换 奇特的 运算
  • Eclipse/MyEclipse闪退之后打不开工作空间的问题解决

    Eclipse MyEclipse闪退之后打不开工作空间的问题解决 在开发过程中偶尔会出现Eclipse MyEclipse闪退之后再启动时打不开工作空间的情况 可以这样解决 1 找到工作空间的目录 例如 E workspace 2 再进入
  • code review

    方法有多种 目前最被认可或运用的方法莫过于CodeReview活动了 那么 CodeReview到底能给团队带来什么 什么样的团队需要进行CodeReview活动 如何有效开展CodeReview活动 用哪种方式会比较好呢 笔者为了接地气地