大厂怎么做Code Review?

2023-11-07

发现坏味道的实践,就是Code Review:对计算机源代码系统化地审查,常用软件同行评审的方式进行,其目的是在找出及修正在软件开发初期未发现的错误,提升软件质量及开发者的技术。团队对 CR本身的理解有差异,有的团队:

  • 在一个完整的开发周期结束之后

  • 每周一次

  • 每天都要

CR是一个沟通反馈的过程

为什么要做 CR?

没人保证自己写出来的代码没问题,而规避个体问题的主要方式就是使用集体智慧,团队的力量,这是从个体的角度在看问题。

看待 CR还有一个团队视角:CR的过程,也是一个知识分享,保证一些细节的知识不再是隐藏在某一个人的头脑中,而是摆在团队。

无论是从哪个角度看 CR,它的本质,就是沟通反馈的过程。把对这段代码的理解分享给你,你把你对这段代码的想法共享给我。有人给出代码实现的知识,有人贡献技术理解。如果我们理解了CR是个沟通反馈的过程,那就可以把沟通反馈的一些原则运用到CR。

沟通反馈,希望沟通要尽可能透明、及时。把这样的理解放到 CR中,就是要尽可能多暴露问题,尽可能多做 CR。

暴露问题

要发现啥问题?如果泛泛地回答,那自然就是代码实现中的各种问题。细化,做CR时,我们可以从下面几个角度来看代码:

  • 实现方案的正确性

  • 算法的正确性

  • 代码的坏味道

实现方案

应该是设计评审关注的内容,但在实际工作中,并不是所有团队都能够很好地执行设计评审,而且设计评审有时也关注不到特别细的点。所以,一些实现方案问题只能延迟到CR才发现。

批量处理的 REST 接口

接到请求经过一些处理之后,它会调用另外一个服务,因为这个服务只支持单一的请求,所以,REST 接口只能一个个地向这个服务发送请求。

若一切正常,这个接口没问题。但若在处理过程中出现失败,没有把所有的请求发给另一个服务,这个接口的行为是什么样呢?需要客户端重新发起请求,还是服务端本身重新调用接口?如果是服务端负责重试,那么,这个方案本身没有任何重试机制,即一个请求一旦出错,它就丢了,业务不能顺利地完成。

显然,一般人只考虑正常情况,而没有考虑失败场景。把它做成一个完整的方案,很可能还需要做一个后台服务,善后未能得到有效处理的任务。这就不是代码调整,而是设计方案调整。

这是发量多程序员写程序经常会出现的问题:正常情况一切顺利,异常情况却考虑不足。

算法正确性

嵌套代码,对于循环语句,我们要把处理一个元素的代码提取出来。不过,这有时候也会带来一些意外惊喜。

某段代码就是把循环里对于一个元素的处理拆了出去。但对于每个元素的处理,都要每次查询一次DB,得到相应元素,修改后再回存。

于是,每段代码单独来看,都是对的,但合在一起就有极大性能问题,本可以通过一次查询解决的问题变成N次查询,耗费大量网络 I/O!

有人时常觉得自己项目的代码太慢,代码最多只是看起来写的还不错,一眼难看问题。看了半天,在一个遍历图像像素点的循环里发现了一个图像复制的代码,即每循环一次,都要把整个图像复制一遍,代码慢就很正常啊。

如果这是一个面试,相信每个人都能尽力高性能地解决问题,但在日常业务开发,就难免敷衍了事,代码和人,有一个能 run 就行了。

实现方案的正确性至少还有人评估,算法的正确性最终影响性能,也会有性能指标监控,团队也都会关注。但代码坏味道最容易被忽略,因为很多互联网团队疲于奔命一直有写不尽的需求,对于坏味道的标准太低了!

CR频率

和人的体质一样,不同团队的频率不同,最糟糕的肯定是不评审,闭眼睛勇往无前,这种外包级团队就不管了。常见的评审频率是每个迭代评审一次,也有每次周会评审。

推荐提升评审的频率,比如,每天一次。评审周期过长,导致堆积太多问题,让人产生无力感,根本也改不动了。遇到实现方案存在问题的,几乎要重写,影响项目进度。

提升评审频率,评审的周期就会缩短,每个周期内写出来的代码就是有限的,人就有心力去重构。

如果把CR推至极致,就是有个人随时随地来做 CR。极限编程的理念,就是把好的实现推向极致,而 CR的极致实践就是结对编程。结对编程就是两个人一起写一段代码:

  • 一个人主要负责写

  • 一个人则站在用外部视角保证这段代码的正确性

好的结对编程对两个人的精力集中度要求是很高的,两个人一起写一天代码其实是很累的一件事,不过,也正是因为代码是两个人一起写,代码质量会提高很多。对于团队中的新人提升也极大。这种高强度的训练和反馈,本质上就是一种刻意练习,而刻意练习是一个人提升最有效的方式。虽然现实里多数团队根本没有条件做大规模结对编程。但对个体来说,创造一些机会与高手一起写代码也是很好的。即便不能一起写,去观摩高手写代码也能学到很多东西。再退一步,实在身边没有机会,去网上看看高手写代码也是一种学习方式。

总结

对于大部分人,CR只是一个发现问题的过程,本文讨论的是CR是一个沟通反馈的过程。站在沟通反馈的角度,尽可能多地暴露问题,尽可能多地做CR。

CR可以从实现方案正确性、算法正确性和代码坏味道的角度去发现问题。CR的频率是越高越好,频率越高,发现和解决问题的难度越低,团队越容易坚持下去。

如果把CR推向极致就是随时随地做CR,就是结对编程。

CR暴露的问题越多越好,频率越高越好。

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

大厂怎么做Code Review? 的相关文章

  • AT3590 Inserting ‘x‘ 题解

    本题是一道双指针的模拟题 题意 给你一个字符串 s s s 你可以在 s s s 的任意位置插入 x x
  • 好的习惯----程序员成长之路(from老大邮件)

    对于好程序员 有很多好的习惯 为什么要把这个习惯放在第一个呢 有很多人如果阅读过 高效能人士的七个习惯 其中第一个习惯就是积极主动 如果从这个角度来看 我把解决解决每一个问题放在首位从理论上是完全没问题的 但我要说说我们程序员独特的地方 所
  • [4G+5G专题-133]: 部署 - 4G/5G常见的室内部署方案

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 121554032 目录 第1章 概述
  • 总结】python sklearn模型中random_state参数的意义

    这是在决策树CART模型时 遇到的 random state 是为了固定随机状态的 主要用在随机数据集 数据集的随机划分 设置决策树模型参数 设置随机森林模型参数 random state 取值大小可以是任意一个整数 在调参缓解 只要保证其

随机推荐

  • 基于Docker的JMeter分布式压测实战讲解

    一个JMeter实例可能无法产生足够的负载来对你的应用程序进行压力测试 如本网站所示 一个JMeter实例将能够控制许多其他的远程JMeter实例 并对你的应用程序产生更大的负载 JMeter使用Java RMI 远程方法调用 来与分布式网
  • 即将离开CSDN,转其他平台

    CSDN的几大作死操作 1 同质化太特么严重了 博客抄来抄去的 内容审核形同虚设 经常搜一个问题 从第一条到最后一条都是一模一样的内容 2 资源付费 资源付费本身是没有任何问题的 但是CSDN里面有几个有用的资源 很多大家花了钱一下载 发现
  • windows凭据密码怎么查看_管理Windows访问凭证,快速访问局域网上的共享资源

    内部网访问其他电脑的共享资源 基本上需要输入访问对方电脑资源允许的账号和密码 在第一次的访问中选择保存凭据后 以后访问就不要输入相应的账号和密码了 但也会出现因修改相关的访问密码或者取消了访问账号的改变 这样就会出现凭据失效的情况 下面介绍
  • 类似-Xms、-Xmn这些参数的含义:

    类似 Xms Xmn这些参数的含义 答 堆内存分配 JVM初始分配的内存由 Xms指定 默认是物理内存的1 64 JVM最大分配的内存由 Xmx指定 默认是物理内存的1 4 默认空余堆内存小于40 时 JVM就会增大堆直到 Xmx的最大限制
  • Python通过ARIMA模型进行时间序列分析预测

    ARIMA模型预测 时间序列分析预测就是在已有的和时间有关的数据序列的基础上构建其数据模型并预测其未来的数据 例如航空公司的一年内每日乘客数量 某个地区的人流量 这些数据往往具有周期性的规律 如下图所示 有的数据呈现出简单的周期性循环 有的
  • Linux嵌入式学习---c语言之循环结构

    Linux嵌入式学习 c语言之循环结构 一 while语句循环 1 1一般形式 1 2累加求和 二 do while语句循环 2 1do while语句一般形式 2 2do while语句特点 三 for语句循环 3 1for语句的一般形式
  • vue-resource请求数据的使用方法

    vue resource vue js关于客户端请求数据的官方插件 使用vue resource请求数据的步骤 1 安装vue resource插件 记得添加 save 若安装淘宝镜像用cnpm npm install vue resour
  • [蓝桥杯2023初赛] 整数删除

    给定一个长度为 N 的整数数列 A1 A2 AN 你要重复以下操作 K 次 每次选择数列中最小的整数 如果最小值不止一个 选择最靠前的 将其删除 并把与它相邻的整数加上被删除的数值 输出 K 次操作后的序列 输入格式 第一行包含两个整数 N
  • vscode:visual studio code 调试php

    简介 php是动态语言没有调试器的话排错起来很是麻烦 vscode可以说是程序员的福音 启动速度快 插件越来越多 跨平台 现在说一下vscode上调试php文件 所需文件 xampp 集成服务器 vscode Xdebug php debu
  • Rightware的Kanzi界面很快你的全液晶汽车仪表盘

    锋影 e mail 174176320 qq com 这是一个屏幕在行动的Kanzi UI编辑器 这是说 汽车仪表板没有显著在过去的几十年里发展公平 不知怎么的 我觉得喜欢的东西是会改变的 但什么也没做 至少在一个大的方式 当日产GTR天际
  • 面试必问的Spring IoC与Spring AOP面试题,你能get到几问?

    Spring IoC Q1 IoC 是什么 Q2 IoC 容器初始化过程 Q3 依赖注入的实现方法有哪些 Q4 依赖注入的相关注解 Q5 依赖注入的过程 Q6 Bean 的生命周期 Q7 Bean 的作用范围 Q8 如何通过 XML 方式创
  • (含源码)「自然语言处理(NLP)」RoBERTa&&XLNet&&语言模型&&问答系统训练

    来源 AINLPer 微信公众号 每日更新 编辑 ShuYini 校稿 ShuYini 时间 2020 07 27 引言 本次内容主要包括 稳健优化Bert模型 RoBERTa 自回归预训练模型 XLNet 无监督多任务学习语言模型 生成预
  • 【BT 协议】HFP 协议

    原文链接 https blog csdn net shichaog article details 52123439 HFP Hands free Profile 让蓝牙设备可以控制电话 如接听 挂断 拒接 语音拨号等 拒接 语音拨号要视蓝
  • C++:智能指针及其实现原理

    更多C 知识点 C 目录索引 1 RAII思想 定义一个类来封装资源的分配与释放 构造函数中完成资源的分配及初始化 析构函数中完成资源的清理 可以保证资源的正确初始化和释放 如果对象是用声明的方式在栈上创建局部对象 那么RAII机制就会正常
  • 从 MySQL 到 OBOracle:如何处理自增列?

    业务需要将数据库转换为 OceanBase 数据库 但源端涉及到 Oracle 及 MySQL 两种不同数据库 需要合并为 OceanBase 中单一的 Oracle 模式 其中源端 MySQL 数据库需要改造为 OB Oracle 并做异
  • 天梯题集——复数四则运算(fabs)

    复数四则运算 include
  • K8S kube-proxy- iptable模式实现原理分析

    每台机器上都运行一个kube proxy服务 它监听api server 和endpoint变化情况 维护service和pod之间的一对多的关系 通过iptable或者ipvs为服务提供负载均衡的能力 通常kube proxy作为deem
  • mysql auto reconnect_Python mysql (using pymysql) auto reconnect

    I m not sure if this is possible but I m looking for a way to reconnect to mysql database when the connection is lost Al
  • 手把手教你解决二维数组旋转问题

    一 背景 最近做算法题发现有些题目都需要将一个数组顺时针或逆时针旋转 之前发的题解中也涉及到过这类题 但没有细讲 在这里讲一下思路 手把手带你找到对应关系 本文代码示例均使用java 但重要的是思路 思路 思路 与语言无关 如果大家不明白我
  • 大厂怎么做Code Review?

    发现坏味道的实践 就是Code Review 对计算机源代码系统化地审查 常用软件同行评审的方式进行 其目的是在找出及修正在软件开发初期未发现的错误 提升软件质量及开发者的技术 团队对 CR本身的理解有差异 有的团队 在一个完整的开发周期结