如何进行正确的 CodeReview

软件开发生命周期中至关重要的一步是代码审查。它使开发人员能够显著提升代码质量。它类似于书籍的创作过程。首先,作者写故事,然后经过编辑以确保不会出现诸如混淆“you’re”和“yours”之类的错误。在这个语境中,代码审查指的是检查和评估他人的代码。它基于拉取请求模型,这个模型在开源项目中广受欢迎。

代码审查有不同的好处:

确保设计和实现的一致性,•优化代码以提升性能,•是学习的机会,•知识分享和指导,以及促进团队凝聚力。

代码审查中需要检查的内容

代码审查有不同的好处:

在代码审查中应该查找什么?有许多不同的事项需要检查,从重要性的不同层次自动化的可能性来看:

尝试查找以下内容:

1.功能性和设计 — 这里,我们需要找到答案,比如:这个更改是否遵循我们期望的架构,或者它是否与系统的其他部分集成良好?它的组件之间是否具有高内聚性和低耦合性?它是否遵循了如OO、SOLID、DRY、KISS、YAGNI等健壮的原则?2.实现 — 在这里,我们检查解决方案是否在逻辑上正确(它确实改变了开发人员的意图),如果代码比应有的复杂,等等。这段代码是否必要?我们还要检查是否使用了良好的设计模式。以及关键的内容,例如API入口点。3.测试 — 在这里,我们检查是否所有测试都通过了,我们是否对所有代码路径和行为使用单元测试,并对外部系统(数据库、文件系统等)使用集成测试。我们是否检查了所有边界条件和代码覆盖率在60-80%之间?4.文档 — 我们的PR描述添加了吗?我们的解决方案在存储库的README.md或其他地方是否有文档更新?5.代码风格 — 我们是否遵循了项目的代码风格?您是否知道命名是否良好?开发人员是否为类、方法等选择了确切的名称?代码是否易读?

f61f818808c2167c68734f700f96f144.png
1*pRrZW9PzCcRTWgDuWYOaUQ.png

代码审查金字塔(基于Gunnar Morling的原始作品)

进行代码审查的一些良好实践

以下是进行代码审查时的一些良好实践:

1.尝试首先审查您自己的代码

在将代码发送给同事之前,尝试先阅读和理解它。寻找让您困惑的部分。在IDE之外查看您的代码通常有助于将其视为“新”的东西,从而避免操作性盲点

1.编写更改的简短描述

这应该以高层次解释更改内容以及为何进行这些更改的方式来解释。

1.自动化可以自动化的部分

将所有可以自动化的工作留给系统,例如检查成功构建(CI)、样式更改(代码检查器)、自动化测试和静态代码分析(例如使用SonarQube)。我们已将其集成在PR级别,因此它将在每个PR上运行并为代码合并提供阻碍。这将使我们能够消除不必要的讨论,为更重要的讨论留出空间。

1.为更大的任务与团队成员进行启动会议

如果您开始处理更大的任务,特别是在设计方面,请尝试首先与代码所有者或将成为您的代码审查者的人进行启动会议。这将在实施之前达成共识,并减少在PR审查阶段的工作量,避免出现意外情况。

1.不要着急

您需要了解其周围发生了什么 — 每一行代码。如果需要,逐类多次阅读。应该查看分配给审查的每一行代码。有些代码需要更多的思考,有些则需要更少,但这是我们在审查过程中必须做出的决定。如果需要,为口头讨论保持自己的时间。

1.友善地评论

永远不要提及个人(您),始终将注意力集中在更改上,以问题或建议的形式提出,并留下至少一个积极的评论。用您的话解释“为什么”,并建议如何改进。

1.在足够好时批准PR

不要追求完美,但要保持高标准。不要小题大做。

1.控制审查的规模

我们应该限制一次审查的代码行数。PR应该包含尽可能少的更改文件。我更喜欢更小的增量更改而不是重大的更改。我们的大脑无法一次处理那么多信息。每次审查的核心行数的理想数量是200到400行,通常是60到90分钟。如果任务庞大,请将其细分为可以快速审查的较小子任务。

df4f303abf195fd8b9af72f6c953bca0.png
1*mNzibJnKgyYZcI4SyqkjQw.png

1.使用工具

对于所有代码审查,您应该使用一些工具,例如BitBucket、Azure DevOps、GitHub或GitLab。例如,Microsoft多年来一直使用名为CodeFlow的内部工具,它支持开发人员并指导他们完成所有代码审查步骤。它在代码准备阶段有所帮助,自动通知审阅者,并具有丰富的评论和讨论功能。在后来的几年里,他们转向了GitHub拉取请求。Google也在代码审查方面使用两种解决方案。他们使用Gerrit代码审查工具进行开源代码审查,但在内部代码方面,他们使用名为Critique的内部工具。

代码审查的更好替代方案

除了传统的PR审查之外,还有另一种模型可以帮助您在编码过程中获得更高的效率和速度。它基于一种不同于拉取请求的模型,称为基于主干的开发。在这里,您同步进行代码审查。通过这种方式,所有开发人员都在主线分支上工作,频繁提交更改。这种做法的一个例子是协作编程方法(配对编程和集体编程),是由Kent Beck在90年代作为极限编程技术引入的。

d8e9e9cb48d3a543d6fbb8f0ca319956.jpeg
Image.jpeg

配对编程(来源:Unsplash)

配对编程和集体编程是协作编程方法,涉及两个或多个开发人员共同处理单个任务,共享编写代码时的想法和思路。在这里,一个开发人员充当驱动者(编写代码)的角色,而另一个则充当导航者的角色(确保代码准确性)。在过程中他们会定期交换位置

与传统代码审查相比,这些方法提供了多种好处

实时反馈:配对编程和集体编程使开发人员能够即时获得有关其代码的反馈,从而能够解决问题并改进。这与传统的代码审查不同,后者可能要等到代码审查阶段才会收到反馈。•增强的知识共享:协作编程使开发人员能够从彼此的经验和知识中学习,从而带来更好的代码和技能发展。这在使用新技术或面对新手时特别有用。此外,学习更容易在团队成员之间传播,降低了单个开发人员成为瓶颈的风险。•更快的问题解决鼓励开发人员共同解决问题,从而获得更快、更高效的解决方案。这可以减少开发时间并改善项目结果。•增强的关注和生产力:与另一位开发人员密切合作可以帮助保持专注并减少分心。•提高代码质量:当多个开发人员共同合作时,他们更有可能在开发早期发现错误和设计问题,进而提高代码质量。

这种方法在拥有大部分资深开发人员的团队,必须快速迭代的情况下效果最佳。然而,如果团队主要由初级开发人员组成,或者产品较为复杂需要多人审核代码时,Pull Request 模型更为适用。

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

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

相关文章

GPT应用程序的行业应用

GPT(Generative Pre-trained Transformer)应用程序在各个行业都有广泛的应用潜力,其自然语言生成的能力使其适用于多种场景。以下是一些行业中常见的GPT应用,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件…

【明道云】学习笔记1-了解APaaS

【背景】 APaaS (Application Platform As A Service) ,即应用程序平台即服务,这是基于PaaS(平台即服务)的一种解决方案,支持应用程序在云端的开发、部署和运行,提供软件开发中的基础工具给用户&#xff0…

React Hooks 源码解析:useEffect

React Hooks 源码解析(4):useEffect React 源码版本: v16.11.0源码注释笔记:airingursb/react 1. useEffect 简介 1.1 为什么要有 useEffect 我们在前文中说到 React Hooks 使得 Functional Component 拥有 Class Component 的…

三维重建(4)--三维重建与极几何

目录 一、三维重建基础 1、线性解法 2、非线性解法 3、多视图几何的关键问题 二、极几何 1、极几何关系 2、极几何特例 3、本质矩阵 4、本质矩阵的性质 5、基础矩阵 6、基础矩阵的性质 7、基础矩阵的作用 三、基础矩阵估计 1、八点法 2、归一化的八点法 四…

138.随机链表的复制(附带源码)

目录 一、思路分析 二、如何操作 三、源码 深拷贝:原封不动的拷贝一份 一、思路分析: 这一题,偏向于技巧性。如果是按照工科思维硬推,那会非常头大,脑袋瓜疼。 这一题目的核心难点在于:处理random指针…

BP蓝图映射到C++笔记1

教程链接:示例1:CompleteQuest - 将蓝图转换为C (epicgames.com) 1.常用的引用需要记住,如图所示。 2.蓝图中可以调用C函数,也可以实现C函数 BlueprintImplementableEvent:C只创建,不实现,在蓝图中实现 B…

日常常见应用组件升级记录

一、前言 因近期安全扫描,发现java后端应用涉及多个引用组件版本过低,涉及潜在漏洞利用风险,特记录相关处理升级处理过程,以备后续确认; 二、升级处理过程 2.1、Java类应用内置Spring Boot版本升级 Spring Boot是一…

python实现图片式PDF转可搜索word文档[OCR](已打包exe文件)

目录 1、介绍 1.1、痛点 1.2、程序介绍 2、安装方式 2.1、🔺必要环节 2.2、脚本安装 2.2.1、不太推荐的方式 2.2.2、节约内存的方式 2.3、⭐完整版安装 3、使用 3.1、最终文件目录 3.2、主程序 3.2.1、绝对路径 3.2.2、是否为书籍 3.2.3、⭐截取区域 …

SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务)

文章目录 前言1.痛点2.解决方案3.具体实现3.1搭建热配置服务3.2编写配置文件3.3搭建版本控制仓库3.4Eureka-Client引入以下依赖3.5Eureka-Client微服务编写以下配置bootstrap.yml提前加载3.6分别编写测试Controller3.7测试效果3.8下线场景压测 4.SpringCloudBus优化 前言 在上…

【Kafka】Kafka介绍、架构和概念

目录 Kafka介绍Kafka优势Kafka应用场景Kafka基本架构和概念ProducerConsumer/Consumer GroupBrokerZooKeeperTopicPartitionReplicasOffsetsegment Kafka介绍 Kafka是是一个优秀的分布式消息中间件,关于常用的消息中间件对比可参考文章:消息中间件概述。…

Linux用户空间和内核空间所有15种内存分配方法

在Linux操作系统中,内存管理是一个关键的系统功能。用户空间和内核空间分别使用不同的函数来申请内存。以下是用户空间和内核空间内存申请函数的详细列表: Linux用户空间内存申请函数 1. malloc() 函数: void* malloc(size_t size); 用于…

Android OpenGL EGL使用——自定义相机

如果要使用OpenGl来自定义相机,EGL还是需要了解下的。 可能大多数开发者使用过OpengGL但是不知道EGL是什么?EGL的作用是什么?这其实一点都不奇怪,因为Android中的GlSurfaceView已经将EGL环境都给配置好了,你一直在使用…

100天精通Python(实用脚本篇)——第113天:基于Tesseract-OCR实现OCR图片文字识别实战

文章目录 专栏导读1. OCR技术介绍2. 模块介绍3. 模块安装4. 代码实战4.1 英文图片测试4.2 数字图片测试4.3 中文图片识别 书籍分享 专栏导读 🔥🔥本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准…

Flowable 生成流程图

/*** 生成流程图** param processId 任务ID*/ RequestMapping("/diagram/{processId}") public void genProcessDiagram(HttpServletResponse response,PathVariable("processId") String processId) {InputStream inputStream flowTaskService.diagram(p…

redis优化系列(六)

本期分享redis内存过期策略:过期key的处理 Redis之所以性能强,最主要的原因就是基于内存存储。然而单节点的Redis其内存大小不宜过大,会影响持久化或主从同步性能。 可以通过修改配置文件来设置Redis的最大内存: maxmemory 1gb …

[翻译] Vulkan-Sample-MSAA (Multisample anti-aliasing)

原文 Aliasing是以低于原始信号采样率的采样率进行采样导致的。在图形学中,这个过程可以描述为:基于一个会产生artifacts的分辨率去计算像素值,从而在模型边缘产生锯齿。多重采样抗锯齿(Multisample anti-aliasing,MS…

vivado 接口、端口映射

接口 重要&#xff01;接口只能在“fpga”类型的&#xff1c;component&#xff1e;中定义。接口部分提供了<component>上所有可用物理接口的列表。<interfaces>部分包含嵌套在其中的一个或多个<interface>标记。一个接口是通过使用<port_map>标记由多…

[pytorch入门] 3. torchvision中的transforms

torchvision中的transforms 是transforms.py工具箱&#xff0c;含有totensor、resize等工具 用于将特定格式的图片转换为想要的图片的结果&#xff0c;即用于图片变换 用法 在transforms中选择一个类创建对象&#xff0c;使用这个对象选择相应方法进行处理 能够选择的类 列…

股东出资透明度提升:企业股东出资信息API的应用

前言 在当今商业环境中&#xff0c;股东出资信息的透明度对于投资者、监管机构以及企业自身的健康发展至关重要。随着企业信息公开化的推进&#xff0c;企业股东出资信息API应运而生&#xff0c;为各方提供了一个便捷、高效的信息获取渠道。本文将探讨企业股东出资信息API如何…

【动态规划】【广度优先搜索】【状态压缩】847 访问所有节点的最短路径

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 广度优先搜索 状态压缩 LeetCode847 访问所有节点的最短路径 存在一个由 n 个节点组成的无向连通图&#xff0c;图中的节点按从 0 到 n - 1 编号。 给你一个数组 graph 表示这个图。其中&#xff0c;graph[i] 是一个列…