作为开发人员,这四类Code Review方法你都知道吗?
本文翻译自:https://dzone.com/articles/4-types-of-code-reviews-any-professional-developer
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。
没有人能保证他产出的代码一定是完美的。下文阐述了4种主流的代码审查(code review)类型,相信作为专业的开发人员,你应该都了解它们!
每个专业的软件开发者都知道,代码审查是任何正式开发过程中的必要环节。但大多数开发者不知道的是,代码审查分为很多种类型。根据你项目和团队架构的不同,每一种代码审查类型都有它特有的优缺点。
我将在本文列出几种代码的审查的类型,并详细解释它们各自是如何工作的。并且,我也将对你在何时做出哪种选择给出一些建议。
好了,让我们开始吧。
首先,在一个很高的层面,你可以将代码审查归为两大类:正式的代码审查(formal code review),和轻量级的代码审查(light weight code review)。
正式的代码审查
正式的代码审查是基于正式的开发流程。其中最流行的实践是范根检查法(Fagan inspection)。
它为试图寻找代码的缺陷提供了一种非常结构化的流程,并且,它还可以用于发现规范(specifications)中的或者设计中的缺陷。
范根检查法由6个步骤组成:计划(Planning),概述(Overview),准备(Preparation),召开检查会议(Inspection Meeting),重做(Rework),和追查(Follow-up)。基本的思想是:预先制定好每一个步骤所需要达到的输出要求。接下来,当进行到某个过程时,你检查其现在的输出,并与之前制定的理想输出要求做比较。然后,你由此来决定,是否进入下一个步骤,或者仍需在当前步骤继续工作。
这种结构化的流程用的并不多。事实上,在我的职业生涯中,我从没遇到过哪一个团队使用这种方法,而且我也不认为我能在将来看到这种情况。
我认为其原因是,这种流程带来很大的开销,并没有多少团队用到它。
然而,如果你开发的软件生死攸关,会因为有缺陷而让人丧命,那么以这种结构化的方式去查找软件缺陷就显得很合理了。
例如,你是为核电站开发软件。你可能需要一个非常正式的流程去保证最终交出去的代码是没有问题的。
但像我所说,我们大部分开发者所做的软件都不是危及生命的,因此我们使用一种更加轻量的代码审查方法作为正式流程的替代。
所以,让我们来看看这种轻量级的方法。
轻量级的代码审查
如今,轻量级的代码审查在开发团队中很常用。
你可以将轻量级的代码审查细分为不同的子类:
- 瞬时的代码审查,也称为结对编程(pair programming);
- 同步的代码审查,也称为即时(over-the-shoulder)代码审查;
- 异步的代码审查,也称为有工具支持的(tool-assisted)代码审查;
- 偶尔的代码审查,也称为基于会议的(meeting-based)的代码审查。
类型1:瞬时的代码审查
第一种类型是瞬时代码审查,它发生在结对编程的情景中。当一个开发者在敲键盘写代码的同时,另一个开发者盯着代码,注意着代码中潜在的问题,并在此过程中给出提升代码质量的建议。
复杂的业务问题
当你需要解决一个复杂问题时,这种代码审查的方法很适用。在仔细寻找解决方案的过程中,把两个人的脑力聚集起来,会增加成功的几率。让两个头脑思考同一个问题,并相互讨论可行的方案,这样你会更可能覆盖到问题的一些边界情况。
在遇到需要很多复杂业务逻辑的任务时,我喜欢使用结对编程。这样,有助于两个人彻底理清流程中的所有不同的可能性,保证所有情况都在代码中得到了适当的处理。
与复杂的业务逻辑不同,有时,你也会需要去解决一个复杂的技术问题。例如,你在使用一个新的框架,或者在探索之前你没用过的一些新技术。在那种情况下,最好还是单独行动,因为你可以根据自己的情况作出快速调整。为了弄清新技术是如何工作的,你需要上网搜索大量资料,或者阅读文档。
这时,结对编程的帮助就不大了,因为你们会成为各自获取这些知识的阻碍。
然而,当你被问题卡住之后,与你的同事交流一下解决方案,往往会帮你获得看问题的不同视角。
相同的专业水平
考虑进行结对编程的另一个重要方面,是一起工作时,两个开发者的专业水平。两个开发者最好是处于同一水平,因为这样他们才能以相同的速度一起工作。
让一个初级开发者和一个高级开发者进行结对编程,效果并不好。在初级开发者负责写代码的时候,坐在旁边的高级程序员可能会因为他写得太慢了而感到烦恼。如此设定,这个高级程序员的能力就被限制住了,从而浪费了时间。
而当键盘在高级程序员手上时,他又敲得太快,初级程序员跟不上高级程序员的思路。几分钟后,初级程序员就迷失在代码上下文里了。
只有当高级程序员慢下来,向初级程序员解释清楚他的做法,这种设定才合理。然而,这就不是我们所说的结对编程了,而是一种学习的环节,其中高级程序员在教初级程序员如何解决特定问题。
但是,如果两个开发者都在同一水平,在这种设定下,他们所能取得的进展是令人惊讶的。其中有一个很大的好处是,两个开发者能相互激励,当其中一位失去注意力时,另一位开发者能把他拉回正轨。
总结一下:结对编程适用于两个有相似经验水平的开发者处理复杂的业务问题的情况。
类型2:同步的代码审查
第二种类型是同步的代码审查。这种是,一个开发者独自编写代码,当她写完代码后,立即找代码审查者进行审查。
审查者来到开发者的桌前,看着同一块屏幕,一起审查、讨论和改进代码。
审查者不清楚代码的目标
当审查者不清楚这个任务的目标时,这种代码审查类型会很有效果。它会在这种情况下发生:团队里没有优化会议(refinement sessions),或者sprint计划会议(sprint planning sessions),来预先讨论每一项任务。
此做法通常会导致一个结果:只有特定的开发人员才知道某项任务的需求。
这样的情况下,在代码审查之前,向审查者介绍一下任务的目标是很有帮助的。
期待大量的代码改进
如果代码编写者缺乏经验,写出的代码需要很大的改进,那么同步代码审查也会很有效。
如果一个经验丰富的高级开发者将要对一个很初级的程序员写出的一段代码进行审查,那么,当初级程序员写完代码后就和高级开发者一起改进这段代码,效率是远远高于初级程序员自己一个人看的。
强行切换思路的缺点
但是同步审查有一大缺点,就是它强行切换了审查者的思路。它不仅让审查者感到沮丧,也拖慢了整个团队的效率。
类型3:异步代码审查
然后我们有了第三种类型,异步代码审查。这一类型的审查不是在同一时间、同一块屏幕上完成的,而是异步的。开发者在写完代码后,让这些代码对审查者可见,然后开始她的下一个任务。
当审查者有时间了,他会在自己的桌子上按自己的时间表进行代码审查。他而不需要当面和开发者沟通,而是用工具写一些评论。在完成审查后,那些工具会把评论和需要的改动通知给开发者。开发者就会根据评论改进代码,同样的,是以自己的时间表来做这些事情。
这个循环,会以代码改动再次被提交到审查者这里而又重新开始。开发者修改代码,直到没有评论说需要改进。最后,改动得到同意,并提交到主分支(master branch)。
你可以看到,同步的代码审查和异步的代码审查相比有很大的不同。
没有直接的依赖
异步代码审查的一大好处, 就是它是异步发生的。开发者不需要直接依赖于审查者,并且他们都可以按自己的时间表去做各自的工作。
多次审查循环的缺点
这里的缺点就是,你可能会有许多次循环的审查,它们可能会持续好几天,直到最终被接受。
当开发者完成代码后,通常需要几个小时,审查者才开始做代码审查。很多时候,审查者给出的建议只有在第二天才能被开发者修复。
这样,第一次审查周期就至少用掉了一天。如果你又多次这样的循环,审查的时间就延续至一整周了——这还不算写代码和测试的时间。
但这里有一些做法,可以避免这样的长时间间隔导致的失控。例如,在我的团队里,我们规定,每天上午,每个开发者在开始做其他工作之前,都要先处理积压的代码审查任务。同样的,在中午午休结束后也需要这样做。
因为在较长的休息时间后,开发者已经不处在他的代码思路中了。这时进行代码审查,你并没有强制它们进行不自然的思路切换,并且能够让代码在合适的时间得到审查。
对比这种代码审查类型的优缺点,我认为,异步的代码审查应该作为每一个专业开发团队的默认选项。
但在我告诉你为什么我是这么想的之前,让我看看第四种代码审查类型。
类型4:偶尔的代码审查
很久以前,我曾经每个月会和整个团队开一次代码审查会议。我们坐在会议室,一个开发者展示并解释着他最近写的一段困难的代码。
其他开发者尝试寻找着潜在的缺陷,发表评论,给出如何改进代码的建议。
我不认为任何团队和长期地使用偶尔代码审查的方式。我只想到这个类型适用于的一种情况:当整个团队都没有代码审查的经验时,让把每个人聚起来,一起做代码审查,这样弄几次之后,可能会帮助每个人理解代码审查的目标和意义。
然而,从长远来看,这第四种类型并不是一个合适的技术,因为让全组成员审查一段代码是很低效率的做法。
我应该选择哪种代码审查类型呢?
好了,现在你可能会想,该选哪种类型。
我们讨论了正式的类型,它显然不太流行,并且较难用于实践。
然后,我们讨论了轻量级的代码审查这一大类,然后是其中著名的4个子类型。
类型1,瞬时的代码审查,用于结对编程。当两个开发者有相似的技术组合,并且处理一些复杂的业务问题时,这种方式工作得很好。
类型2,同步的代码审查,用于审查者不清楚任务的目标时,需要开发者向其进行解释的这种情况。当开发者经验不足,写出的代码需要大量改进时,这种代码审查模式也工作得很好。
但是它的缺点是需要强行切换思路,会让审查者沮丧,以及拖慢团队开发速度。
类型3,异步的代码审查,避免了强行切换思路带来的问题,对大多数用例都工作得很好。
类型4,偶尔的代码审查,对于专业团队来说不是一个长期的选择。可以只在团队刚刚开始代码审查时被使用。
使用异步代码审查作为默认选择
我认为,专业的团队应该把异步的代码审查作为默认的选择。因为它避免了同步代码审查的缺陷。
当审查者不能理解开发者做出一项代码修改的原因时,可以使用同步的代码审查。但在那种情况下,审查者将会去询问开发者,以获得额外的信息和说明。如果你在一个团队中工作,这样的情况应该很少发生。
如果你不在一个真正的团队中,而是和一群人一起工作,那么同步的代码审查就有意义了。如果审查者对你过去这几天的工作内容毫不知情,那么在开始一起做代码审查之前,向审查者给出一个合适的说明是很合理的。
如果你有两个开发者,他们具备相似的技能组合,并且在攻克一个复杂的业务问题,那么也有理由切换到结对编程的模式。但是,一个团队往往由许多经验水平不同的成员组成,并且不会一直都在处理复杂的业务问题。大多数时间,你手上是复杂度在平均水平的常规任务。
因此,专业团队的最佳选择是:使用异步的代码审查作为默认选择,然后当需要时切换到同步的代码审查或者结对编程。
好了,这就是今天的内容。
你的团队使用什么代码审查的类型呢?你知道其他的、我这里漏掉的代码审查类型吗?请在评论里让我知道吧。
下次再聊。保重。
作为开发人员,这四类Code Review方法你都知道吗?的更多相关文章
- python 全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)
昨日内容回顾 线程什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的 一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的在当 ...
- 如何用vs2013开发人员命令提示工具执行一个方法(一个简单的demo)
在任何一个编辑器中编写一个静态的Main方法,必须是静态且名为Main的方法,并将Main方法所在的类文件命名为yang.cs(这个名字随便命名),如图-1. 图-1 打开你的vs2013开发人员命令 ...
- 360安全浏览器右击不显示审查元素 或按F12不弹出开发人员工具的原因和解决方法:设为极速模式
IE兼容模式 会显示 IE的开发人员工具 极速模式 才会显示谷歌的那种方式 IE调试模式不怎么习惯,如下图 正常调试模式如下图
- day20-Python运维开发基础(装饰器 / 类中的方法 / 类的方法变属性)
1. 装饰器 / 类中的方法 / 类的方法变属性 # ### 装饰器 """ 定义:装饰器用于拓展原来函数功能的一种语法,返回新函数替换旧函数 优点:在不更改原函数代码的 ...
- 常用的16个Java实用工具类,Java开发人员请收藏!
在Java中,实用程序类是一个定义一组执行常用功能的方法的类.这篇文章展示了最常用的Java实用程序类及其最常用的方法.类列表及其方法列表都按流行度排序.该数据基于GitHub随机选择的50,000个 ...
- 我们是怎么做Code Review的
前几天看了<Code Review 程序员的寄望与哀伤>,想到我们团队开展Code Review也有2年了,结果还算比较满意,有些经验应该可以和大家一起分享.探讨.我们为什么要推行Code ...
- 什么是Code Review(转)
Code Review是一种通过复查代码提高代码质量的过程,在XP方法中占有极为重要的地位,也已经成为软件工程中一个不可缺少的环节.本文通过对Code Review的一些概念和经验的探讨,就如何进行C ...
- Code Review(转)
Code Review是一种通过复查代码提高代码质量的过程,在XP方法中占有极为重要的地位,也已经成为软件工程中一个不可缺少的环节.本文通过对Code Review的一些概念和经验的探讨,就如何进行C ...
- 转:我们是怎么做Code Review的
我们是怎么做Code Review的 前几天看了<Code Review 程序员的寄望与哀伤>,想到我们团队开展Code Review也有2年了,结果还算比较满意,有些经验应该可以和大 ...
随机推荐
- 【二代示波器教程】第12章 示波器设计—DAC信号发生器的实现
第12章 示波器设计—DAC信号发生器的实现 本章节为大家讲解二代示波器中信号发生器的实现.这个功能还是比较实用的,方便为二代示波器提供测试信号.实现了正弦波,方波和三角波的频率,幅度以及占 ...
- [Swift]LeetCode636. 函数的独占时间 | Exclusive Time of Functions
Given the running logs of n functions that are executed in a nonpreemptive single threaded CPU, find ...
- [Swift]LeetCode762. 二进制表示中质数个计算置位 | Prime Number of Set Bits in Binary Representation
Given two integers L and R, find the count of numbers in the range [L, R] (inclusive) having a prime ...
- .NET Core实战项目之CMS 第六章 入门篇-Vue的快速入门及其使用
写在前面 上面文章我给大家介绍了Dapper这个ORM框架的简单使用,大伙会用了嘛!本来今天这篇文章是要讲Vue的快速入门的,原因是想在后面的文章中使用Vue进行这个CMS系统的后台管理界面的实现.但 ...
- CORS(跨域)请求总结和测试
一.简单请求与非简单请求 跨域请求分为简单与非简单请求,同时满足以下两种条件的可以确定为简单请求. 简单请求的请求方法 请求方法 说明 head 发送头部信息 get post 简单请求的HT ...
- Python爬虫入门教程 11-100 行行网电子书多线程爬取
行行网电子书多线程爬取-写在前面 最近想找几本电子书看看,就翻啊翻,然后呢,找到了一个 叫做 周读的网站 ,网站特别好,简单清爽,书籍很多,而且打开都是百度网盘可以直接下载,更新速度也还可以,于是乎, ...
- Android客户端与服务器交互方式-小结
最近的Android项目开发过程中一个问题困扰自己很长时间,Android客户端与服务器交互有几种方式,最常见的就是webservices和json.要在Android手机客户端与pc服务器交互,需要 ...
- Android 发送多个不同的快捷方式(shortcut)到桌面并向其启动的Activity传参
需求: 对于创建快捷方式到桌面,网上能查到不少资料,但一般都是针对应用程序本身的. 前阵子在做项目时,遇到了一个类似于百度贴吧里面的一个需求:对于每个具体的贴吧,都可以将其发送到桌面(HomeScre ...
- Java多线程概念简介 多线程中篇(一)
Java的线程与操作系统的线程 在线程的相关介绍中,有讲到“线程的实现”分为三种:内核支持,用户级以及两者混合.(这只是一种简要的分类) Java线程在JDK1.2之前,是用户线程实现的 而在JD ...
- 图解ARP协议(三)ARP防御篇-如何揪出“内鬼”并“优雅的还手”
一.ARP防御概述 通过之前的文章,我们已经了解了ARP攻击的危害,黑客采用ARP软件进行扫描并发送欺骗应答,同处一个局域网的普通用户就可能遭受断网攻击.流量被限.账号被窃的危险.由于攻击门槛非常低, ...