代码审查那些事

代码审查(code review)是指对源代码进行系统化地审查,是软件开发中的最佳实践之一,代码合并之前必须审查通过才行,可及时发现隐藏问题,提高代码质量。

1 为什么要代码审查

代码审查环节,或者流于形式,或者根本没有,软件质量只依赖事后的测试;认真执行是有诸多优势的。

  1. 统一编码规范
    审查代码风格,统一编码规范,有助于代码的可读性,也方便接盘者快速上手。

  2. 提前发现缺陷
    代码审查最直接的优点是发现软件逻辑问题,性能等等潜在风险,提前发现缺陷可以有效节省人力和时间。

  3. 提高代码质量
    代码审查与优化修复,确保代码在健壮性、设计合理性、代码结构等方面持续提升整体质量。

  4. 知识分享
    每一次的代码审查都是一次知识的分享,磨合一定时间后,软件设计融合集体的智慧,团队内相互审查,也是互相学习的一种途径。

  5. 团队共识
    经过讨论与交流逐步达成的团队共识,特别是对架构理解和设计原则的认知,在共识的基础上团队也会更有凝聚力,软件设计方式与会趋于一致,特别是在较多新人加入时尤为重要。

2 代码审查原则

如果变更可提升整体代码质量,就可以让它通过,即使还不完美,这是代码评审准则的最高原则。没有完美的代码,只有更好的代码。评审者不应强求代码提交者在每个细节都写得很完美,应该考量修复时间与修改重要性之间的平衡。

以客观的技术数据为准,而非个人偏好。在代码排版样式上,遵从编码规范,所有代码保持风格一致,但如果新奇代码在编码规范未提及,那就接受作者的样式。同时有多种可行方案时,如果作者能证明这些方案基本差不多,那就接受作者的选择;否则,应以软件设计原则为准,而不应由评审者的个人喜好来决定。

如果没有参考规则,那么评审者应该保证新代码与当前软件库风格一致,至少不会恶化软件的质量,一旦恶化就会带来破窗效应,导致软件质量逐渐下降。

代码审核者应该看什么

命名:变量、函数等命名是否清晰易懂?
注释:核心代码的注释是否都一目了然?
代码排版:所有的代码是否都遵循编码规范?
设计:代码是否设计良好?是否适合当前系统?有没兼容旧版或预留扩展接口?
功能:代码实现的行为与需求是否相符?
复杂性:代码可以更简单吗?如果由其他开发者接手,能否很快理解吗?
文档:开发者是否同时更新了相关文档?

推行代码审查机制,开发流程上专门有这个环节,代码必须审核通过才可以提交。审核结果或记录公开透明,团队内互相审查其他人的代码,甚至明确考评和代码审查表现相关,这样就能落实代码审查制度。

3 怎么做代码审查

3.1 作为代码提交者

发起时机:软件变更发布前提交代码审查申请。
代码行数:提交代码行数最好在500-1000行以下(非有效代码除外),一个高质高效的代码审查最好控制在一个小时以内。

3.2 作为代码评审者

主要从代码逻辑和质量两方面来评审。

代码逻辑

功能完整:代码实现是否满足需求,有没理解偏差。
逻辑设计:是否符合软件框架,功能细节处理是否考虑边界条件和并发控制。
数据安全:是否存在数据安全隐患,参数篡改或丢失。
性能隐患:是否存在损害性能的隐患,如死循环等。
测试用例:单元测试用例的验证逻辑是否有效,测试用例的代码行覆盖率和分支覆盖率。

代码质量

编码规范:命名、注释、架构分层、软件排版等是否符合编码规范。
可读性:是否逻辑清晰、易理解,避免使用奇淫巧技。
简洁性:是否有重复可简化的复杂逻辑,代码复杂度是否过高。
可维护性:是否分层清晰、模块化合理、高内聚低耦合、遵从基本设计原则。
可扩展性:是否仅满足本次需求,是否有必要的扩展设计。
可测试性:代码是否方便写单元测试及分支覆盖,是否便于自动化测试

3.3 评审注意事项

沟通是至关重要的,团队要始终保持沟通,并在整个过程中保持透明度,代码审查提供清晰的反馈修复建议。同时,要记住反馈应该集中在批评代码本身,而不是代码的作者。尽快完成评审,避免过度追求完美,抓住重点,水至清则无鱼。

4 代码审查避免流于形式

代码审查失去意义,主要是审核与否不影响流程,或者时间紧迫必须保项目进度,或者审核结果修改建议无法执行。一旦认为审查是可有可无,后续就越发流于形式。

时间与进度的矛盾

项目压力大时间紧,以致草草分析不做设计,直接编码不做重构,前期快了最后总要有谁来背锅。

每次代码审查的建议都是一次技术交流,但是审查后,发现问题太多,或者改动太大,影响项目计划,理论上要求编码前设计评审方案,实际工作可能是发布前审查,为了项目进度只能认可既定事实。

或者代码审查的力度不够,只能提出一些浅表的问题,建议无非是一些格式、注释、命名之类不痛不痒的问题,草草了事,这个现象其实更为普遍。

评审者不了解业务和代码

代码提交人需编写清晰的修改描述,必要的情况下评审者应熟悉需求,否则,脱离功能实现无法发现真正的逻辑问题。

反馈建议未修改

这一点极为重要,需要对修改后的代码再次审查,确保理解一致,问题建议有接受执行。

代码审查耗费人力

代码审查可能很耗时,特别是处理大型代码库或复杂变更时,评审人员需要花费时间和精力仔细审查代码,这可能会影响整体的开发速度和项目进度。代码审查需要多个团队成员的参与,包括作者和评审人员。这可能对团队资源产生负担,特别是在人员有限的组织中。

5 小节

程序员的智慧结晶都尽在代码之中,而代码审查是打磨它更加的纯洁无瑕、精致完美,这也值得大家一起持续精进,即使实际存在诸多阻碍。

在这里插入图片描述

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

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

相关文章

依赖注入实现原理

依赖注入实现原理 一、Autowire 流程图: Autowire的后置处理器类是AutowiredAnnotationBeanPostProcessor,在启动时会执行这里面的方法 步骤一:寻找注入点 在创建一个Bean的过程中,Spring会利用AutowiredAnnotationBeanPostPro…

Go Lang Fiber介绍

利用GoLang Fiber进行高性能Web开发 在不断发展的Web开发世界中,选择合适的框架至关重要。速度、简洁性和强大的功能集是每个开发者都追求的品质。在使用Go构建Web应用时,“Fiber”作为一个强大且轻量级的框架在众多选择中脱颖而出。在这份全面的指南中…

Contextcapture(iTwin capture)倾斜建模教程

Contextcapture(iTwin capture)倾斜建模教程 前言步骤1.1 准备数据1.2 新建项目1.3 新建Block1.4 空三 Submit Aerotriangulation1.5 查看空三结果1.6 提交三维重建1.6.1 编辑重建(Reconstruction)的空间框架(spatial …

谷歌Gemini模型,碾压GPT-4!

谷歌Gemini 1.0革新,推出Gemini Ultra、Gemini Pro和Gemini Nano模型。Gemini Ultra强大但慢,Gemini Pro通用,Gemini Nano高效。Gemini模型在多领域与ChatGPT竞争,尤其Gemini Pro已应用于Bard。Gemini模型预计将在2024年通过Bard …

【docker】如何编写dockerfile文件,构建docker镜像

如何编写dockerfile文件,构建docker镜像 一、docker 镜像与 dockerfile1.1 什么是Docker镜像1.2 Docker 镜像的结构 二、dockerfile 中常用的构建指令三、dockerfile 内容示例四、构建 docker 镜像 一、docker 镜像与 dockerfile 1.1 什么是Docker镜像 Docker镜像…

Intel SGX -- The Life Cycle of an SGX Enclave

文章目录 前言一、The Life Cycle of an SGX Enclave1.1 Creation1.2 Loading1.3 Initialization1.4 Teardown 二、The Life Cycle of an SGX Thread2.1 Synchronous Enclave Entry2.2 Synchronous Enclave Exit2.3 Asynchronous Enclave Exit (AEX)2.4 Recovering from an Asy…

solidity案例详解(七)复杂众筹合约

自己原创智能合约,有作业需求可加下面的图片中的裙 1、在 Remix 中,以 Account1 完成“众筹项目”合约的编译和部署。(显示合约、函数、状态变量、结构体、事件的命名) 2、在 Remix 中,以 Account2 完成“参与众筹”合…

Python数据分析之pandas的SQL风格

一、select选择 SELECT username, password, secret, login_ip FROM tz_admin LIMIT 5; data[[username, password, secret, login_ip]].head(5) #在SQL中,选择是使用逗号分隔的列(或选择所有列)来完成的 #Pandas中,列的选择是通过传递列名到DataFrame:…

长见识!!!Java中除了消息队列之外,竟然还能这样实现异步任务

今年IT寒冬,大厂都裁员或者准备裁员,作为开猿节流主要目标之一,我们更应该时刻保持竞争力。为了抱团取暖,林老师开通了《知识星球》,并邀请我阿里、快手、腾讯等的朋友加入,分享八股文、项目经验、管理经验…

鸿蒙HarmonyOs学习:如何添页面和路由

1.目录结构 重点我们开发中需要用到地方我都做了简单的说明。 2.我们看看入口页面是如何配置的 在主配置文件module.json5中配置Ability路径已经应用图标和应用名称等信息。 3.配置页面路由 这个路由是由哪儿配置的呢? 想必看完这些,你应该知道一个鸿…

mybatis自动生成代码

以下为真实案例:mybatis自动生成代码 首选准备环境: 开发工具:idea(版本任意) 开发环境:jdk1.8、tomcat8.5、maven3.5 数据库:mysql5.7 数据库驱动:mysql-connector-5.1 方法一:idea搭建环…

MySQL之表的记录操作

前言 存数据不是目的,目的是能够将存起来的数据取出来或者查出来,并且能够对数据进行增删改查操作,本文将详细介绍表中记录的增删改查操作。对记录的操作属于DML数据库操作语言,可以通过SQL实现对数据的操作,包括实现向…

remote: The project you were looking for could not be found异常

今天提交代码的时候突然无法提交了,最后重新编辑电脑的凭据解决的。

nuxt3 env文件、全局变量处理

有两种方向 通过配置nuxt.config.ts Nuxt提供的钩子函数,实现全局变量的获取 runtimeconfig env文件往runtimeconfig放入内容 useAppConfig 通过env文件配置来获取服务端全局变量,客户端通过vite.define实现 nuxt.config.ts Nuxt钩子 1. runtim…

linux(mysql下载以及操作)

下载mysql 查看镜像 docker images 下载MySQL镜像 mysql/mysql-server:8.0 创建文件夹,创建配置文件和放数据文件 mkdir -p /data/mysql/{conf,,data} 创建配置文件 my.cnf 写入配置文件my.cnf的代码 [client] default-character-setutf8[mysql] de…

CMake入门教程【核心篇】安装(install)

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「本文的内容」:CMake入门教程 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1. 概述2. 使用方法2…

竞赛保研 基于机器视觉的手势检测和识别算法

0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的手势检测与识别算法 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng…

【K8S 资源管理】声明式资源管理

目录 一、常用的发布方式 1、蓝绿发布: 2、金丝雀发布(灰度发布): 3、滚动更新(deployment的默认更新方式): 二、声明式管理方法(yaml文件) 1、三种发布命令&#x…

深度学习框架输出可视化中间层特征与类激活热力图

有时候为了分析深度学习框架的中间层特征,我们需要输出中间层特征进行分析,这里提供一个方法。 (1)输出中间特征层名字 导入所需的库并加载模型 import matplotlib.pyplot as plt import torch import torch.nn as nn from torch.nn import functiona…

【快速全面掌握 WAMPServer】06.整明白 PHP

网管小贾 / sysadm.cc 我们今天就要来学习了解一下作为 LAMP 四剑客之一的 PHP 。 PHP 是 Hypertext Preprocessor 即“超文本预处理器”的缩写,是在服务端执行的一种脚本程序语言。 通常它被用于 Web 开发,并可以嵌入 HTML 中,是具有交互功…