CodeReview的挑战

540b124768f815a513ef71b69be0eebd.png

保证CodeReview质量的前提条件

有良性的社交压力

保证CodeReview质量的先决条件在于建立一个良性、有效的社交压力机制。这种机制始于招聘过程,我们需要吸引那些拥有基础专业素养的开发者,其中包括能够承受并积极响应CodeReview中社交压力的能力。

设想一下,当你紧张地编写代码,而交付时间又步步逼近时,面对组织对单元测试的严格要求,你可能会考虑降低标准,甚至为了应付工具的覆盖率要求而编写一些不那么有用但能提高覆盖率的测试。然而,一想到你的代码即将接受同事们的严格审查,那种压力便会促使你避免选择那些短期收益高但长期损失大的“投机”行为。

CodeReview是对前面所有工作的检查

下面是我总结的CodeReview的关注点:

基础功能方面

修改范围:我在CR时第一关注点是修改范围与需求是否一致,如果修改范围扩大,会造成变更不可控,是极为危险的。

安全性:是否有严格的准入校验,检查是否有可能导致安全问题的地方,如SQL注入、跨站脚本(XSS)问题等。对于敏感数据,要确保其在使用、传输和存储过程中的安全性。

功能实现:代码是否满足功能需求或修复了相应的Bug,代码实现的逻辑是否正确?这个会通过在方案评审时就做好准备。设计方案评审需要3人以上有CR权限同学参加,最后CR人至少是这三人中的两个。

自我检查机制:比如与第三方交互前后要打日志,是否需要配套相关的数据一致性措施。当然,这些在设计阶段一般会定好。

错误和异常处理:检查是否有错误处理和异常处理机制,以防代码在遇到错误时崩溃。

可靠性方面

性能优化: 检查代码是否有可能影响性能的地方,如是否有不必要的循环,是否使用了正确的数据结构、算法时间复杂度和空间复杂度是否达标。

可维护性和可扩展性: 针对代码的结构和设计进行审查,代码是否易懂,接口设计是否良好,逻辑是否清晰,是否遵循遵循开放/封闭等设计原则,是否利于后续的扩展和维护。

可测试性:检查代码是否容易进行单元测试,是否有足够的测试覆盖率。这个一般会通过CI/CD来保证,一般会有一个整体性的要求,比如要达到85%的行级单测覆盖率、80%的分支覆盖率、100%的单测成功率。但需要人工Review来保证这些测试案例是真正有效的案例。

可以发现这些关注点,需要在设计阶段就定义好,CodeReview是做兜底的。CodeReview发现的问题,问题可能不是在编码阶段才产生,需要去仔细辨别问题发生的环节,做深入剖析。

CodeReview中最突出的问题

真正的问题没有发现,纠结的问题与开发者无法达成共识

有的同学做CodeReview的时候,依赖的是差异对比工具,往往只看到改了什么,但没有对工程深刻的理解,也没有实际把代码放到IDE中追踪修改方法被调用的地方涉及到几处,可能修改范围被扩大了,没有发现。发现的只是一些可维护性方面的问题,通常是一些代码坏味道,常见的包括:

重复的代码、过长函数、过大类、过长参数列、发散式变化、霰弹式修改、依恋情结、数据泥团、基本型别偏执、冗赘类、夸夸其谈未来性、令人迷惑的暂时值域、过度耦合的消息链、狎昵关系、异曲同工的类、内幕交易。

这些问题都非常重要,但带着这些问题上线不一定会引起真正的线上问题。但是修改范围扩大造成的影响可能会产生预想不到的问题。也有很重要的一点:代码坏味道的问题,往往仁者见仁,就像zookeeper建议部署单数个节点一样,两个人不容易协商出共识。谁妥协得多了,都会造成影响力方面的损失。

所以这对CR同学的技术功底提出了很大的挑战,CR同学需要是把事情想明白的人。比如,提出下面的CR问题。

未使用最佳实践:例如,未使用Java 8及以上版本的特性(如Lambda表达式、Stream API等),或者未使用第三方库来简化代码。

这就面临着需要和开发者解释清楚:

未使用Java 8及以上版本的特性(如Lambda表达式、Stream API等)可能会造成以下问题:

  1. 代码可读性降低:Java 8引入的Lambda表达式和Stream API等特性可以极大地简化代码,提高代码的可读性。如果未使用这些特性,可能会导致代码冗长、复杂,从而降低可读性。

  2. 代码效率降低:Stream API等特性可以更加高效地处理集合数据,例如过滤、映射、归约等操作。如果未使用这些特性,可能会导致代码效率降低,尤其是在处理大量数据时。

  3. 难以维护:随着Java版本的更新,新的特性和工具不断出现,使用这些新特性可以更方便地维护和更新代码。如果未使用Java 8及以上版本的特性,可能会使代码难以维护,因为需要使用旧的、可能已经被淘汰的工具和方法。

但提出的这些观点能不能得到开发者的赞同,因为这并不意味着必须盲目追求使用Java 8及以上版本的特性。在实际开发中,应根据具体的需求和场景来选择合适的工具和技术。在一些简单的场景下,使用旧的特性可能更加简单和直观。因此,在选择是否使用Java 8及以上版本的特性时,需要权衡各种因素,做出最优的决策。

如果CR提出的问题不能有效的说服对方,会对个人影响力造成伤害,以至于对工作的开展起到不利影响。

CodeReview的这些挑战,对CR同学的能力提出了很高的要求,在工作中,需要不断去打磨这个能力。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务(基础篇-001-介绍、Eureka)

目录 认识微服务(1) 服务架构演变(1.1) 单体架构(1.1.1) 分布式架构(1.1.2) 微服务(1.1.3) 微服务结构 微服务技术对比 企业需求 SpringCloud(1.2) …

34.网络游戏逆向分析与漏洞攻防-游戏网络通信数据解析-登录数据包的监视与模拟

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果 内容参考于:易道云信息技术研究院VIP课 上一个内容:33.游戏登录数据…

基于大数据的空气质量预测和可视化分析

城市空气质量数据采集系统设计与实现 🏙️ 研究背景 🌬️ 城市化与环境挑战:随着城市化进程的加快,环境污染问题,尤其是空气质量问题,已成为公众关注的焦点。数据监测的重要性:城市空气质量数…

Qt 压缩/解压文件

前面讲了很多Qt的文件操作,文件操作自然就包括压缩与解压缩文件了,正好最近项目里要用到压缩以及解压缩文件,所以就研究了一下Qt如何压缩与解压缩文件。 QZipReader/QZipWriter QZipReader 和 QZipWriter 类提供了用于读取和写入 ZIP 格式文…

思科网络中DHCP中继的配置

一、什么是DHCP中继?DHCP中继有什么用? (1)DHCP中继是指一种网络设备或服务,用于在不同的子网之间传递DHCP(动态主机配置协议)消息。DHCP中继的作用是帮助客户端设备获取IP地址和其他网络配置信息&#x…

边缘计算【智能+安全检测】系列教程-- Jeton Agx Orin 基础环境搭建

1 .前期准备 Jetson Agx Orin 比Jetson Agx Orin Xavier的算力要高,性能要好通常用来做自动驾驶的AI推理,具体外观如下图 1.刷机软件sdkmanager:下载链接 NVIDIA账号需要注册,正常一步一步往下走就行。在ubuntu18以上的系统安…

[iOS]GCD(一)

[iOS]GCD(一) 文章目录 [iOS]GCD(一)GCD的概要GCD的APIDispatch Queuedispatch_queue_createMain Dispatch_set_target_queuedispatch_afterDispatch Groupdispatch_barrier_asyncdispatch_applydispatch_applydispatch_suspend/dispatch_resumeDispatch Semaphoredispatch_onc…

LeetCode 面试经典150题 14.最长公共前缀

题目: 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 思路: 代码: class Solution {public String longestCommonPrefix(String[] strs) {if (strs.length 0) {return &…

c语言 实现切片数组

文章目录 前言一、接口定义1、创建切片2、销毁切片3、添加元素4、切片长度5、切片容量 二、完整代码三、使用示例1、一般使用流程2、直接append3、自定义类型 总结 前言 由于c语言没有集合类的标准库,需要用时只能自己实现,由于c语言没有泛型&#xff0…

腾讯云GPU云服务器_GPU云计算_异构计算_弹性计算

腾讯云GPU服务器是提供GPU算力的弹性计算服务,腾讯云GPU服务器具有超强的并行计算能力,可用于深度学习训练、科学计算、图形图像处理、视频编解码等场景,腾讯云百科txybk.com整理腾讯云GPU服务器租用价格表、GPU实例优势、GPU解决方案、GPU软…

Android 项目新建问题总结

title: Android 项目新建问题总结 search: 2024-03-24 tags: “#Android 项目新建问题总结” Android 项目新建问题总结 一、gradle 项目每次都自动下载依赖包到C盘 背景:idea 首次打开一个 gradle 项目,都会在 C 盘下载项目所需的依赖包,但…

在fstab文件中配置UUID方式自动挂载数据盘、swap、目录(**)

linux如何挂在硬盘,自动挂载和手动挂载(详细说明)https://gitcode.csdn.net/65eedcea1a836825ed7a06f4.html 解决linux重启后磁盘挂载失效的问题 https://blog.csdn.net/sugarbliss/article/details/107033034 linux /etc/fstab 文件详细说…

服务消费微服务

文章目录 1.示意图2.环境搭建1.创建会员消费微服务模块2.删除不必要的两个文件3.检查父子模块的pom.xml文件1.子模块2.父模块 4.pom.xml 添加依赖(刷新)5.application.yml 配置监听端口和服务名6.com/sun/springcloud/MemberConsumerApplication.java 创…

【JavaEE初阶系列】——阻塞队列

目录 🚩阻塞队列的定义 🚩生产者消费者模型 🎈解耦性 🎈削峰填谷 🚩阻塞队列的实现 📝基础的环形队列 📝阻塞队列的形成 📝 内存可见性 📝阻塞队列代码 &#…

02-MySQL数据库的基本使用与密码设置

一、服务端口 3306端口和33060端口,是我们启动数据库后开启的监听端口; 3306端口:是我们MySQL服务的监听端口,用来连接数据库使用; 33060端口:MySQL-shell服务的端口,MySQL-shell是MySQL架构集群…

day3-QT

1>使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函。将登录按钮使用qt5版本的连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin",密码是…

DBA工作经验总结

目录 一、MySQL8.0创建一张规范的表 1.表、字段全采用小写 2.int类型不再加上最大显示宽度 3.每张表必须显式定义自增int类型的主键 4.建表时增加comment来描述字段和表的含义(防止以后忘记) 5.建议包含create_time和update_time字段 6.核心业务增…

FloodFill算法——力扣被围绕的区域

文章目录 题目解析算法解析代码解析 题目解析 被围绕的区域 我们来解读一下这个题目,这个题目的意思就是求出被X围绕的O有多少个,那么什么是被围绕呢?也就是没有出路并且连通的O不能到四条边上,这就算是被围绕了,可是…

oracle 19c RAC补丁升级

1.停止集群件备份家目录 ----两节点分别操作 cd /u01/app/19.3.0/grid/bin/ crsctl stop crstar -zcvf /u01/app.tar.gz /u01/app/u01/app/19.0.0/grid/bin/crsctl start crs2.两节点 GI、DB OPatch 替换(都得执行) ----# 表示 root 用户,$…

npm、nrm、nvm详解与应用

本文全面介绍了 npm、nrm 以及 nvm 这三个与 Node.js 开发密切相关的工具。首先,对 npm 进行了定义和功能解释,包括其在依赖管理、项目管理、脚本执行、版本控制和社区贡献等方面的作用。接着,详细介绍了 npm 的常用命令和设置下载源的操作&a…