`
OneAPM_Official
  • 浏览: 22633 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

论代码审查的重要性

阅读更多

【编者按】本文作者为 Hugo Giraudel,主要从各个角度论证了代码审查的重要性以及实现方法。文章系国内 ITOM 管理平台 OneAPM 编译呈现。以下为正文。

最近,笔者在Twitter上看到这样一句话:

可悲的是,对于很多学生、自由职业者以及机构来说,代码审查似乎相当陌生。

很明显,代码审查的重要性并不为每个人所熟知。你可以说我很天真,但是笔者确实认为所有的IT公司都离不开该过程。显然实际并非如此,真是让我大吃一惊。

在本文中,笔者想给出关于代码审查的想法,以及为什么我认为这是代码迁移过程中非常重要的组成部分,怎样进行审查等。如果你目前不进行代码审查,或者想要做得更好,希望本文能有助于你!

 

什么是代码审查?

我们生活在维基百科的时代,所以开始之前,先引用一下其中关于代码审查的定义:

代码审查是计算机源代码的系统性检验(有时被称为同行评审)。其目的在于找到开发初期所忽略的错误,从而提高软件的整体质量。审查的形式多种多样,如结对编程,非正式走查,正式检查等。

顾名思义,代码审查就是审查一些代码,以确保其能够正常工作,并尽可能改善其性能。

 

代码审查的方法

正如维基百科中的定义,代码审查有多种方法。然而,目前太多的代码都存在于GitHub上,代码审查也就经常伴随着所谓的“pull request”出现。

Pull request是一个请求,使用分布式版本控制系统(Git、SVN、Mercurial等)对代码库作出修改。它通过“牵引”原代码、写入更改,然后提交请求以便将更改合并。

得益于GitHub友好的用户界面,这个过程变得非常简单高效,GitHub也概括了大部分Git知识需求。

论代码审查的重要性

 

为什么代码审查非常重要

那么,既然我们可以不经过任何审查与监督,直接进行代码迁移,为什么代码审查还这么重要呢?毕竟,我们都能胜任该工作。

从理论上说是这样。但在实践中,有很多原因可以表明代码审查的重要性。让我们来看看其中的几个。

 

降低风险

这可能是最重要的原因。有专人复核我们的工作并不是无关痛痒的,这能降低被忽视的错误所带来的风险。毕竟即使再好的开发人员也有可能一时失察。

并且,确保没有忘记任何事情总是有必要的。举例来说,前端开发中经常会忽略适当的键盘导航,屏幕阅读器的可用性,适应国际化的灵活性,以及友好的非JavaScript行为等问题,在这里仅列出这四项。

 

显著提高代码质量

清楚点说,这不是单纯的代码标准和代码检查(至少不全是),而是使代码更高效。

在一个团队里,每个人都有自己的背景和特长,而团队始终需要进步。因此总有人可能提出更聪明的解决方案,更合适的设计模式,或者能降低复杂性或提高性能的方法。

 

使每个人都得到提高

通过合作,每个人都可以相互学习并取得进步。提交代码者很有可能从该工作中得到反馈,并意识到可能存在的问题和需要改进的部分;而审查者也可以通过阅读他人代码学到新的东西,并找出适用于他们自己的工作方案。

 

有助于熟悉项目

当一个团队在做一个项目时,想要每个开发人员致力于应用的每个部分,这是极不可能的。有时候,会出现这种情况:在某一段时间,一个开发人员正为项目的大部分模块辛苦地工作,而另一个人则完全在做别的东西。

因此,代码审查有助于人们了解其他人所写,但以后可能会需要自己来维护的那部分代码。它促进了代码库知识在团队中的传播,也有可能加快未来的发展。

 

怎样适当地进行代码审查

再次强调,有固定的代码审查过程非常有用,非常重要。不管用什么方法,每个团队创造的代码都应该进行代码审查。

话虽这么说,但进行有意义的代码审查并不像看上去那么简单明了。不过,别担心,即使做得不好也不会有什么坏处,就是浪费点时间。

最近,我的团队回顾了之前进行的代码审查。当我们意识到12个开发人员中,只有3个在做代码审查时,我们就明白有些地方出了问题。

为了改变这种状况,我们的一位 Scrum 专家组织了一次回顾分析,以确定还可能改进的空间,以及我们将怎样改变。

 

提前规划

代码审查做得不够,为了自圆其说,最常用的借口就是,它需要时间——其他人不能或不愿意在这上面花费时间。

我必须说,笔者并不太理解这种说法,因为我的观点是:如果一个同事直接来找我,让我帮他的忙,我就不会说“我没有时间,也不感兴趣”。反而,我会抽空来帮忙,可能不是现在,是一个小时之后——但是显然,我会花时间帮助他们。为什么呢? 因为:

  • 这就是团队的意义;

  • 他们询问我,这是因为他们看重我的意见,这就值得我去帮助他们。

“为什么你不做代码审查呢?” 
“我没有时间。”

对笔者而言,“pull request”和同事向我寻求帮助没什么不同。有时候说你没时间是可以接受的,但系统性地拒绝帮助别人,就表明你正在积极地让自己脱离团队。这种行为不友好,也不积极。所以要肯花时间提供帮助。

为了让开发人员抽出时间,我们就开始考虑让每个程序员每天花一点时间(也许30分钟)审查代码。我们完成每天半小时的代码审查时也不会发现什么意外惊喜:这只是一天中的一部分。

我们以前还试着大幅度降低 “pull request”包含的代码量。因为曾经的“pull request”非常多——几十个文件中有数以千计的改动。

我们现在尽量不那么做了。通过创建较小的“pull request”,审查代码变得更加容易,反馈也更加中肯,开发人员也更愿意参与这个过程。“代码迁移量更小也更频繁”。

 

结合语境

我们发现的第二大问题是,我们通常缺乏对代码背景的理解,如果你想要提供有用的反馈,这就很有必要。离开了代码背景,我们通常也只能进行语法检查——这虽然在一定程度上也有用,但远远不够。这时候你就变成了我们所说的“人工审查器”。

幸好,这个问题比较好解决:给pull request添加一个描述以解释你的目的,如何达到目的。这不需要一大段文字,通常短短几行足矣。将链接添加到and/or也会起作用。Liv Madsen是我们的一位开发者,她甚至增加了截屏——或者相关的截屏视频——来解释她做的东西,这令人称奇。

论代码审查的重要性

 

实际询问

第三个问题就是我们有时干脆没有意识到需要审查什么。的确,我们每天都充斥着无数的电子邮件和通知 ——邮件太多了,因此很难保存。毕竟我们只是普通的人。

同样,解决办法很简单:直接向别人询问需要审查的代码。这有很多方法,比如在办公室问一声,或者直接在Slack上给你团队的同事发消息。

我们基于自己的活动在GitHub上创建了群组,当提交pull request时,总是ping一个群组。群组的成员都会收到通知,并且只要有时间就可以自由地选择如何解决。有时候,当请求特别针对某一个(或几个)人的工作时,我们就直接ping相应的开发人员。

然后,收到ping消息的人就可以审查代码并发表评论。即使没有什么具体的事需要报告,我们也会留言——表明代码可以合并了。

因为我们可能会不考虑已有的评论,盲目合并一些pull request,所以就建立了严格的“回复或解决”制度。当收到反馈时,要么你把问题解决,要么在回复中解释为什么不能解决。无论如何都不能留下悬而未决的评论,也当然不能将其与pull request合并。

 

总结

进行定期和高效的代码审查对于保持高质量的代码标准来说必不可少,还有利于开发者之间的知识共享,以及团队的发展。

要求代码审查并不意味着能力弱,请求他人的帮助也并不值得尴尬,代码审查当然也没什么好羞愧的。另一方面,接受你获得的反馈,并给提交pull request的人提供建设性的(理想情况下,积极的)的评论。

找到适合你的工作。审查代码应该在代码迁移过程中占很大比重,所以你应该在团队中适时调整,以保证对每个人都有益。

最后祝各位能够愉快地审查代码!

本文系 OneAPM 工程师整理呈现。OneAPM 能为您提供端到端的应用性能解决方案,我们支持所有常见的框架及应用服务器,助您快速发现系统瓶颈,定位异常根本原因。分钟级部署,即刻体验,性能监控从来没有如此简单。想阅读更多技术文章,请访问 OneAPM 官方技术博客

本文转自 OneAPM 官方博客

原文链接:https://www.sitepoint.com/the-importance-of-code-reviews/

+

 

分享到:
评论

相关推荐

    美赛论文和论文的源代码还有论文模板记录我数学建模美赛的学习过程

    在参加美赛数学建模比赛的学习过程中,我深刻体会到了论文、源代码和论文模板的重要性。论文是展示团队分析和解决问题能力的重要方式,它不仅要清晰地展示问题的分析过程和结论,还要具有逻辑性和条理性。在撰写论文...

    论文研究 - 戈尔韦河流量预报和建模系统(GFFMS)在埃塞俄比亚塔纳湖盆地的适用性

    对洪水特别感兴趣的实时流量预测是水文学在水资源决策中最重要的应用之一。 为了满足洪水和流量预报,可以使用水文模型,然后根据残差进行更新。 因此,在这项研究中,使用埃塞俄比亚上尼罗河上游塔纳湖盆地的...

    代码阅读方法与实践(Part1)

    本书首次将阅读代码作为一项独立课题,系统性地加以论 述。本书引用的代码均取材于开放源码项目--所有程序员都应该珍视的宝库。本书围绕代码阅读,详细论述了相关的知识与技能。"他山之石、可以攻玉",通过 仔细阅读...

    代码阅读方法与实践(part2)

    本书首次将阅读代码作为一项独立课题,系统性地加以论 述。本书引用的代码均取材于开放源码项目--所有程序员都应该珍视的宝库。本书围绕代码阅读,详细论述了相关的知识与技能。"他山之石、可以攻玉",通过 仔细阅读...

    论文研究 - 中国传统能源化工行业VOC排放自我检查和管理的泄漏检测和修复(LDAR)标准审查

    传统能源化学工业的排放量占中国人造VOC排放总量的20%,其中煤化工和石化厂是最重要的VOC排放源之一。 VOC排放源主要包括炼油装置和设备,管道和阀门的泄漏,各种储罐的呼吸和泄漏,装卸过程中油的渗出,污水处理...

    审查离岸软件开发项目的关键成功因素-研究论文

    离岸项目的成功对客户和供应商都非常重要。 基于全球总体软件项目的成功率非常低,离岸... CSF类别按重要性顺序排列优先级。 发现的离岸项目的重要CSF类别是组织因素(客户和卖方),项目因素,文化因素和环境因素。

    论文研究 - 经验验证的软件效率评估模型:产品运营视角

    程序的复杂性和冗长的代码严重影响了几种质量度量,尤其是最终交付软件的效率。 本文对面向对象软件的效率进行了适当的回顾,并提出了有关类设计级别效率的一些相关信息。 程序效率是影响软件质量的重要因素。 而且...

    matlab代码保密-endogenous-mobility-replication:用于“在收入确定中建模内生流动性”的复制存档

    本文的研究先前在两篇工作论文中进行了传播:“内生性流动性”和“内生性流动性对衡量雇主和员工异质性的重要性”。 Abowd感谢NSF Grants SES-0339191,CNS-0627680,SES-0922005,TC-1012593和SES-1131848的直接...

    对爱沙尼亚互联网投票系统程序组成部分的独立评估-研究论文

    问题包括面对面的选举观察、代码审查和对系统组件的对抗性测试。 由于这些担忧,一些政党得出结论,内部威胁和复杂的外部攻击可能会以多种方式破坏系统的完整性,从而破坏投票过程。 本文研究了 I-Voting 系统的...

    隐私危害以及通知和选择框架的有效性-研究论文

    这种对现实世界中诉讼错误的关注揭示了消费者所经历的最重要的伤害,并提供了对通知和选择框架有效性的更好理解。 为支持该文章的研究而编制的数据集包括所有联邦集体诉讼投诉,指控在过去十年中提出的在线隐私侵犯...

    隐含波动率指数 – 回顾-研究论文

    此外,我们发现隐含波动率变化与潜在回报之间存在显着的同期关系,但同时,我们表明,与股票相比,商品、债券、货币和波动性的隐含波动率对潜在价格变化的React不同。 因此,我们的发现对资产配置、风险管理和资产...

    大学文献检索资料 DOC

    德温特专利文献检索工具的符号体系及名词解释:专利权人代码后的“-”号,表示小公司。“/”号,表示个人。 “=”号,表示俄罗斯(或前苏联)的机构。无符号,表示大公司。 专利号前的“★ ”号,表示基本专利。 “=...

    最小角回归matlab代码-MGSEE:在高光谱解混文献中,端元提取主要使用三种方法进行处理,即统计、稀疏回归和几何。大多数端元提取算法仅基于

    误差,从而表明其在分离问题中提取纯材料的重要性。 将这篇论文引用为 D. Shah 和 T. Zaveri,“用于高光谱端元提取的改进 GSEE 算法”,2020 年 IEEE 第 5 届计算通信与自动化国际会议 (ICCCA),印度大诺伊达,2020...

    批判性地查看MIS季度中PLS-SEM的使用-研究论文

    在这种背景下,严格的研究具有长期的传统,即严格审查报告标准和研究方法的使用方法(例如,Boudreau等,2001)。 尽管跨学科的基于协方差的SEM(CB-SEM)技术的使用已得到很好的记录(例如Medsker等,1994; Shook...

    负责任的算法-研究论文

    源代码的公开通常既不需要(由于计算机科学的替代技术),也没有必要(由于代码的复杂性)来证明过程的公平性。 此外,透明度可能是不希望有的,例如当它允许税务欺诈或恐怖分子玩弄确定审计或安全检查的系统时。 ...

    华为编程开发规范与案例

    六、可测试性代码问题 第59页 1、调试信息/打印信息的正确性 第59页 【案例6.1.1】 第59页 一、逻辑类代码问题 1、变量/指针在使用前就必须初始化 【案例1.1.1】 C语言中最大的特色就是指针。指针的使用具有...

    Reversing:逆向工程揭密

    第7章 审查程序的二进制码 243 7.1 定义问题 243 7.2 漏洞 245 7.2.1 堆栈溢出 245 7.2.2 堆溢出 255 7.2.3 字符串过滤程序 256 7.2.4 整数溢出 256 7.2.5 类型转换错误 260 7.3 案例研究:IIS索引服务漏洞 262 ...

    基于Android计算器开题报告.doc

    最后便 " "是对小学频道功能的介绍了,包括它的整体的设计思路,功能实现的关键步 " "骤以及实现功能的逻辑代码。 " "5.进度安排(包括文献查阅、方案设计与实现、实验与计算、论文书写等)" "及其可行性分析 " ...

Global site tag (gtag.js) - Google Analytics