代码审查总结

2023-11-11

       近期所带项目,由于人员素养良莠不齐,写出的代码质量不一,为了保证项目质量。不得不正确代码一行行进行审查。同一时候,为了对代码审查有个更深的了解及借鉴其他同行实践成果,在网上搜集了不少项目知识,以下是对这些知识做出的整理。

第1章前提

       在 Wikipedia 上,对代码审查的定义是:代码审查(英语:Code Review)是指对计算机源码系统化地审查。经常使用软件同行评审的方式进行,其目的是在找出及修正在软件开发初期未发现的错误,提升软件质量及开发人员的技术。代码审查常以不同的形式进行,比如结对编程、非正式的看过整个代码,或是正式的软件检查。

1.1代码审查首先要求团队有良好的文化

      团队须要认识到代码审查是为了提高整个团队的能力,而不是针对个体设置的检查“关卡”。

“A的代码有个bug被B发现,所以A能力不行。B能力更好”,这一类的陷阱非常easy被扩散从而影响团队内部的协作,因此须要避免。另外,代码审查本身能够提高开发人员的能力,让其从自身犯过的错误中学习。从他人的思路中学习。

假设开发人员对这个流程有抵触或者反感,这个目的就达不到。

1.2慎重的使用审查中问题的发现率作为考评标准

      在代码审查中假设发现问题。对于问题的发现者来说这是好事。应该予以鼓舞。

但对于被发现者,我们不主张使用这个方式予以惩处。软件开发中bug在所 难免,过度苛求本身有悖常理。

更糟的是,假设造成參与者怕承担责任,不愿意在审查中指出问题,代码审查就没有不论什么的价值和意义。

第2章代码质量的属性

  • 可理解性:代码须要在各个层面上可以被easy地理解。

    理想情况下。软件应该很简单,并没有很明显的缺陷。

  • 可測试性:代码须要被编写的很easy被測试。
  • 正确性:代码须要满足功能和非功能性的需求。代码的行为是否与预期一致,其逻辑是否是正确无误的?被审查的代码是否与其它代码拥有类似的结构和功能?
  • 有效性:代码须要有效的使用系统资源(内存,CPU。网络连接。等)。

第3章做代码审查的优点

  • 更easy发现和架构以及时序相关等较难发现的问题。

  • 帮助团队成员提高编程技能
  • 统一编程风格

第4章代码质量低下的症状

  • 全部事情都非常艰难
  • 进度慢
  • 測试套件执行缓慢
  • 无法避免的缺陷
  • 你的团队是消极的
  • 知识缺乏共享
  • 新开发者成长周期太长

第5章怎么审查

  • 1Review流程:先Review设计实现思路,然后Review设计模式,接着Review成形的骨干代码,最后 Review完毕的代码,如果程序复杂的话。须要拆成几个单元或模块分别Review
  • 尽可能的让不同的人Reivew你的代码:不要总是仅仅找一个人来Review你的代码。不同的人有不同的思考方式,有不同的见解。所以。不同的人能够全面的从各个方面评论你的代码,有的从实现的角度,有的从需求的角度。有的从用户使用的角度,有的从算法的角度,有的从性能效率的角度,有的从易读的角度,有的从扩展性的角度……这样以后会有很多其它的人帮你在日后维护你的代码。
  • 保持积极的正面的态度:程序最大的问题就是自负,尤其当我们Reivew别人的代码的时候。所以,不管是代码作者,还是评审者。都须要一种积极向上的正面的态度。作者须要能够虚心接受别人的建议。由于别人的建议是为了让你做得更好;评审者也须要以一种积极的正面的态度向作者提意见。由于那是和你在一个战壕里的战友。
  • 控制每次审查的代码规模:依据smartbear在思科所作的调查,每次审查200-400行的代码效果最好。每次试图审查的代码过多,发现问题的能力就会下降。
  • 要带着问题去做:我们在每次代码审查中,要求审查者利用自身的经验先思考可能会碰到的问题,然后通过审查工作验证这些问题是否已经解决。

    一个窍门是,从用户可见的功能出发,如果一个比較复杂的使用场景,在代码阅读中验证这个使用场景能否够正确工作。使用这个技巧。能够让审查者有代入感,真正的沉浸入代码中。提高效率。

  • 尽量使用静态代码分析工具以提高审查效率
  • 二八定律处理高风险代码:审查全部的代码并没有太大的意义,应该把审查的重点放在高风险的代码和easy引起高风险的改动或者重构的代码上。

    旧而复杂、处理敏感数据、处理重要业务逻辑和流程、大规模重构以及刚增加团队的开发人员实现的代码都是审查的重点。

  • 让原作者对发现的问题进行确认:这样做有两个目的,确认问题确实存在,保证问题被解决;让原作者了解问题和不足。帮助其成长。
  • 自我审查:全部团队成员在提交代码给其它成员审查前,必须先进行一次审查。这次自我修正形式的审查除了检查代码的正确性以外,还能够完毕例如以下的工作:
    •  对代码加入凝视,说明本次改动背后的原因,方便其它人进行审查。

    •  修正编码风格。尤其是一些重要数据结构和方法的命名,提高代码的可读性。
    • 从全局审视设计,是否完整的考虑了全部情景。在实现之前做的设计假设存在考虑不周的情况,这个阶段能够非常好的进行补救。

  • 代码审查结束后的回想总结:成员在编码的时候应做随手记录。包含在代码中用凝视的方式表示,或者记录简单的个人文档。这样做有几个优点:
    •  避免遗漏。在编码时将考虑到的不论什么问题都记录下来,在审查阶段再次检查这些问题都确认解决。

    • 根据研究,每一个人都习惯犯一些重复性的错误。这类问题在编码是记录下来,能够在审查的时候用作检查的根据。
    • 在重复记录笔记并在审查中发现类似的问题后,该类问题出现率会显著下降。

第6章实践要素

人员结构

      在你的团队中有多少同事拥有足够的专业技能来担当合格的代码审查者?作者以前和多个开发团队沟通过。这些团队都声称本身仅仅有一个资深的开发者。假设让他来负责全部的代码审查工作,那么团队的核心开发就无法开展了。作者也遇到过类似的情况。在一个小规模团队里。资深的同事总是忙只是来,由于核心的工作都在等着他做。

地理位置

     你的团队成员是怎样分布的?他们是否是分散在世界各地还是坐在同一个敞亮的办公室里? 代码审查须要精力的专注和反馈。假设开发者可以面对面的沟通,那么审查工作会便于实施。而物理隔离的远程团队非常难达到代码审查的惬意结果。

所在领域

     你所在的IT领域须要遵守如何的规则和约束呢?假设你在一个受到严格监管的行业,那么你必须遵循有关审计和报告的规则,这意味着你必须想办法跟踪代码审查的频率和质量。假设所在的领域把安全性作为重点。那么可能在代码审查过程中要引入安全审计。

复杂性

     你的代码复杂性怎样?在代码审查时,须要多个不同专业技能的审查者吗?比如,游戏开发可能会引入很复杂的业务逻辑来处理文字交互和场景跟踪,同一时候还须要特定的动画处理和内存管理技术。在审查如此复杂的代码时,应该引入多个审查者从不同角度来检阅代码的质量。

第7章一个时间安排的样例

      Eric Landes在一篇名为《敏捷技巧:什么时候以什么方式来进行代码评审》的文章中。提供了一个时间安排的样例:

  1. 概览本次代码评审的故事(10分钟)
  2. 讨论团队指标(10分钟)
  3. 强调评审的特别关注点(5分钟)
  4. 深入地评审代码(55分钟)
    1. 代码覆盖率
    2. 架构
    3. 深入的分析报告
  5. 总结并记录行动事项(10分钟)


第8章代码检查工具

第9章參考资料

敏捷开发下平衡质量和进度

坚果云开发团队分享高效代码审查经验

Code Review中的几个提示

简单有用的Code Review工具

从Code Review 谈怎样做技术

代码整洁之所以重要的七个理由

揭秘Google是怎样做代码审查的

让代码审查成为你的团队习惯

关于代码审查的几点建议

我们怎样进行代码审查



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

代码审查总结 的相关文章

  • 每日一问:你想如何破坏单例模式?

    前言 1 单例是什么 单例模式 是一种创建型设计模式 目的是保证全局一个类只有一个实例对象 分为懒汉式和饿汉式 所谓懒汉式 类似于懒加载 需要的时候才会触发初始化实例对象 而饿汉式正好相反 项目启动 类加载的时候 就会创建初始化单例对象 1
  • JavaScript系列——数组元素左右移动N位算法实现

    引言 在自己刚刚毕业不久的时候 去了一家公司面试 面试官现场考了我这道题 我记忆深刻 当时没有想到思路 毫无疑问被面试官当成菜鸟了 最近刚好在研究数组的各种算法实现 就想到这道题 可以拿来实现一下 纪念自己逝去的青春 需求 假设有这样一个数
  • 数据结构——计算节点个数和二叉树高度(C语言版)

    摘自 数据结构 计算节点个数和二叉树高度 C语言版 作者 正弦定理 发布时间 2020 12 12 23 27 09 网址 https blog csdn net chinesekobe article details 111086664
  • 堆栈01--用两个栈实现队列

    堆栈01 用两个栈实现队列 jz05 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 用两个栈来实现一个队列 完成队列的Push和Pop操作 队列中的元素为int类型 测试用例 队列先进先出 输入 1 2 输出 1 2 解析
  • 人工智能概念

    人工智能概念 人工智能就是用人工方法在机器 计算机 上实现的智能 或称机器智能 即是研究如何用计算机来表示和执行人类的智能活动 以模拟人脑所从事的推理 学习 思考和规划等思维活动 并解决需要人类的智力才能处理的复杂问题 如医疗诊断 管理决策
  • CRC校验(二)

    CRC校验 二 参考 https blog csdn net liyuanbhu article details 7882789 https www cnblogs com esestt archive 2007 08 09 848856
  • [设计模式]模板方法模式(Template Method)

    1 意图 定义一个操作中的算法的骨架 而将一些步骤延迟到子类中 TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 2 动机 其实就是如意图所描述的 算法的骨架是一样的 就是有些特殊步骤不一样 就可以
  • Java设计模式之装饰者设计模式Decorator Pattern

    目录 一 基本概念 二 结构 1 图示 三 案例演示 被装饰对象的基类 一个接口 有cost 和description 两个抽象方法 具体被装饰的对象 实现上面这个接口 装饰者抽象类 基类 实现drink接口 具体的装饰者类 糖 具体装饰者
  • 时间复杂度+常见复杂度解释

    前言 算法的效率 虽然计算机能快速的完成运算处理 但实际上 它也需要根据输入数据的大小和算法效率来消耗一定的处理器资源 要想编写出能高效运行的程序 我们就需要考虑到算法的效率 算法的效率主要由以下两个复杂度来评估 时间复杂度 评估执行程序所
  • 组合型模式

    概述 对于这个图片肯定会非常熟悉 上图我们可以看做是一个文件系统 对于这样的结构我们称之为树形结构 在树形结构中可以通过调用某个方法来遍历整个树 当我们找到某个叶子节点后 就可以对叶子节点进行相关的操作 可以将这颗树理解成一个大的容器 容器
  • 【设计模式】工厂模式(Factory Pattern)

    1 概述 工厂模式 Factory Pattern 是最常用的设计模式之一 它属于创建类型的设计模式 它提供了一种创建对象的最佳方式 在工厂模式中 我们在创建对象时不会对客户端暴露创建逻辑 并且是通过一个共同的接口来指向新创建的对象 工厂模
  • Linux下进程退出的几种形式

    进程退出 Linux 下进程的退出分为正常退出和异常退出两种 1 正常退出 a 在main 函数中执行return b 调用exit 函数 c 调用 exit 函数 2 异常退出 a 调用about函数 b 进程收到某个信号 而该信号使程序
  • 区块链中的哈希算法

    区块链中的密码学 密码学在区块链中的应用主要有两个 哈希算法与非对称加密算法 这次主要对哈希算法进行详细的说明 哈希算法 哈希算法的特点有 1 输入可以为任意大小的字符串 2 产生固定大小的输出 3 可以在合理的时间内算出输出值 若要满足密
  • 用两个栈实现队列

    目录 一 栈的基本结构及其接口 二 我的队列结构定义 三 我的队列创建及其初始化 四 我的队列入队 五 我的队列出队 六 我的队列取队头元素 七 我的队列判空 八 我的队列销毁 一 栈的基本结构及其接口 栈的结构定义 typedef int
  • 牛客剑指offer刷题其他算法篇

    文章目录 构建乘积数组 题目 思路 代码实现 第一个只出现一次的字符
  • 数组实现循环队列(增设队列大小size)

    目录 一 前言 1 如何实现循环 2 如何判断队列为空 3 如何判断队列为满 二 循环队列的结构定义 三 循环队列的创建及其初始化 四 入队 五 出队 六 取队头元素 七 取队尾元素 八 循环队列判空 九 循环队列判满 十 循环队列销毁 一
  • Java监听器与观察者模式

    Java监听器与观察者模式 Java中的监听器 Listener 和观察者模式 Observer Pattern 都是用于处理对象间的事件通知和响应的设计模式 它们的目的是在对象之间建立一种松散的耦合 使得一个对象的状态变化可以通知到其他对
  • 在AI技术的无情侵袭下,学学Java的23种设计模式还是非常有必要的

    目前国内80 程序员的主要工作是调用组合api实现各种业务需求 在顶层架构师设定好的框架下 做着重复且无聊的编码工作 如果未来ai被广泛应用 那么被替代的风险是很高的 比较扎心的是 其实目前用ai生成片段代码已经是各个公司比较普遍的做法了
  • C++设计模式 #3策略模式(Strategy Method)

    动机 在软件构建过程中 某些对象使用的的算法可能多种多样 经常改变 如果将这些算法都写在类中 会使得类变得异常复杂 而且有时候支持不频繁使用的算法也是性能负担 如何在运行时根据需求透明地更改对象的算法 将算法和对象本身解耦 从而避免上述问题
  • 【设计模式之美】理论一:怎么才算是单一原则、如何取舍单一原则

    文章目录 一 如何判断类的职责是否足够单一 二 类的职责是否设计得越单一越好 开始学习一些经典的设计原则 其中包括 SOLID KISS YAGNI DRY LOD 等 本文主要学习单一职责原则的相关内容 单一职责原则的定义 一个类只负责完

随机推荐

  • 《银行法律法规》二、银行业务——6、银行卡业务

    第六章 银行卡业务 第一节 银行卡业务概述 考点1 银行卡定义和分类 定义 银行卡是由商业银行 或者发卡机构 发行的具有消费信用 转账结算 存取现金等全部或部分功能的信用支付工具 银行卡功能包括 支付结算 汇兑转账 储蓄 循环信贷 个人信用
  • DTO、VO、Entity、Condition使用习惯,以及对于多映射关系字段的处理

    POJO 的定义是无规则简单的对象 在日常的代码分层中 pojo 会被分为VO BO PO DTO 一 定义和使用情景 Entity 对象实体类 一般就是和数据库表字段一一对应的那个类 DTO Data Transfer Object 数据
  • 基于D11的教程一个向量缩放、旋转、位移示例

    D11学习心得第二章 一个向量缩放 旋转 位移示例 xnamath h原本是位于DirectX SDK的一个数学库 但是现在Windows SDK包含的数学库已经抛弃掉原来的xnamath h 并演变成了现在的DirectXMath h 其
  • 三相三线制逆变器的dq解耦控制

    1 三相三线制逆变器拓扑 三相三线制逆变器的拓扑如下图所示 其中开关变换器的端口线电压是 U A B U AB UAB
  • 二进制之补码与小数

    牛逼的二进制 1 前言 计算机使用二进制来表示所有形式的数据 颜色 文字 图像等 当前辈们想方设法要造一台计算机时都会遇到一个问题 怎么用电来表示数 显然他们发现开关的开和关正好对应二进制的0和1 然后计算机就使用二进制直到如今 那计算机怎
  • php实例——用户注册与登录

    这周做了个php的简单实例 算是学了这么久php语法的一次综合应用吧 感觉前面学的东西都不知道怎么用 不看教程还真做不出来 本来想把它写在网页弹出层上的 这样看起来更像是一个用户登录框 但是看了弹出层的代码后发现太麻烦了 所有的登录框代码都
  • Ubuntu安装Nvidia Container Toolkit

    文章目录 前言 一 基本概念 二 操作步骤 1 添加源 2 安装重启 总结 前言 NVIDIA Container Toolkit 可用于各种 Linux 发行版并支持不同的容器引擎 在开始之前 请确保您已经为您的 Linux 发行版安装了
  • 【微信小程序】 tabs切换时自动定位到点击的元素

    重点是设置 scroll into view 值为点击时元素的ID id不能以数字开头
  • 使用 MVC 架构构建 Flask CRUD 应用程序

    转自 Felipe Silveira 的 Build a Flask CRUD Application with MVC Architecture 翻译 如何用 Flask 的 Blueprint 实现一个 CRUD 的应用 我多年来一直在
  • 项目前端技术总结

    设计目标 在前端的设计阶段引入prototype prototype用于允许用户评估开发人员提案 并在实施之前尝试它们 它还有助于了解用户特定的要求 并且可能在开发商在产品设计期间可能没有考虑到这些要求 在数据处理之前需要用户填写表单或浏览
  • C#中的三种参数传递

    在 C 中 有三种向方法传递参数的方式 1 值参数 调用方法时 会为每个值参数创建一个新的存储位置 复制参数的实际值给函数的形参 按值传递 传递实参变量存储的内容 作用 传递信息 2 引用参数 引用参数是一个对变量的内存位置的引用 复制参数
  • 自己制作npy数据集,数据格式类似于mnist数据(16)---《深度学习》

    代码 import tensorflow as tf import numpy as np import os from PIL import Image dir home jobs Pictures test def getFileArr
  • GPT和GPT2

    https blog csdn net weixin 48185819 article details 106533850 https zhuanlan zhihu com p 174782647 https wmathor com ind
  • Flutter 隐藏组件的多种方法

    链接 https blog csdn net haha223545 article details 102796137
  • VUE 本地和内网(远程)访问配置

    本机电脑由于开启Hyper V 所以默认得到的内网是虚拟网卡的IP 所以需要特殊的方法来得到内网IP 一 package json 原代码 scripts dev webpack dev server inline progress con
  • java用Swing编写简单计算器

    先写个用来处理计算的类Calculate import java util public class Calculate public static Stack
  • 二叉堆

    二叉堆 在学习二叉堆之前 我们得理解堆是什么 定义 堆通常可以看作成一个树 它有任意节点的值都不大于 不小于 其子节点的值 二叉堆的意思就是 它有两个子节点 可分为最大堆和最小堆 最大堆 父节点的值总是大于或等于任何一个子节点的值 最小堆
  • Fourth season fifteenth episode,is Ross man enough to play rugby?

    Scene A beauty parlour Rachel is getting a manicure while Chandler yes Chandler is getting a petticure Does that scare y
  • org.springframework.beans.factory.BeanCreationExce

    org springframework beans factory BeanCreationException Error creating bean with name u Injection of resource methods fa
  • 代码审查总结

    近期所带项目 由于人员素养良莠不齐 写出的代码质量不一 为了保证项目质量 不得不正确代码一行行进行审查 同一时候 为了对代码审查有个更深的了解及借鉴其他同行实践成果 在网上搜集了不少项目知识 以下是对这些知识做出的整理 第1章前提 在 Wi