谈谈代码评审(code review)
什么是代码评审(code review)? 根据维基百科的定义,代码评审是一种通过若干人员检阅源代码方式来进行的软件质量保证活动。根据软件工程的经典理论,代码评审应该是收益很高的活动,因其产生在Coding阶段(属于开发生命周期的早期),在开发生命周期越早发现问题,解决问题的成本越低。工程实践也能印证这个结论。 代码评审有以下目标:
- 提高代码质量和可维护性(可读性,一致性)
- 发现代码缺陷
- 知识经验传承
- 发现更好的解决方案
- 满足QA指导方针
本人根据针对网络上某代码评审最佳实践的公开文章谈谈自己的想法。
原则1:每次只评审小于200~400行的代码。
--》 我的观点:这个只要是考虑到一次评审的代码过多,评审者发现问题的能力将大量缩小。如果一次评审过多代码,会对评审者带来智力和心理两方面的挑战。从智力上来说,抛开极少数智力超群者不谈,对普通人来说,一次评审更少量的代码更容易理解代码的意图(同时减少了与代码作者的沟通成本,提高效率)。这也是符合分而治之的解决问题方法论的。从心理上来说,一次评审过多代码会对评审者产生倦怠感,评审者主观上通常会降低评审的细致度。根据我的经验,如果某项软件开发任务代码量比较大,可将此任务分解为若干子任务。子任务的划分粒度尽量做到一周的代码提交量(提交的代码需要测试通过)。当然,子任务的划分是建立在良好的设计文档基础上,否则子任务划分的随意度比较高且工作量评估容易不准确。
原则2:代码评审速度应小于每小时300~500行。
--》 我的观点:这条主要是考虑评审的细致度,细致度越高越能发现更多问题。换算一下,一个20行的函数,评审时间应不少于2~4分钟。
原则3:检查清单(checklist)可以大幅改善评审结果
--》 我的观点:检查清单对代码作者和评审者都有作用。对代码作者来说,可以在编码的时候就犯止犯类似的错误。对评审者来说,可以帮助评审得更全面,特别是找出遗漏的问题。检查清单可以定期更新,在评审过程中发现的问题都可以对照检查清单,看看是否需要添加新的条目。最新的检查清单需要在团队内公布,最好是放在一个固定的位置方便随时查看。这个检查清单可以考虑和编码规范放在一个文档,互为对照补充。
原则4:团队领导者应建立一种正面的评审文化,即应正面看待评审中发现的问题
--》 我的观点:为什么需要完全正面的看待在评审中发现的问题?如前文所述,在代码评审中发现问题的修复成本非常低,所以发现越多问题越是好事。只有完全正面看待代码评审发现的问题,评审者才会有更大的动机会发现更多的问题。对于代码作者来说,在代码评审中发现问题,可以帮助自己修正错误的编码习惯和提高自身的编码能力。同时,完全正面看待评审发现的问题,能使得评审者和代码作者建立更为和谐的关系,更有利于发现更多问题。为了建立正面评审文化,领导者需要在团队中宣贯在评审中发现问题表明代码作者和评审者通过成功的团队合作提高了代码质量,领导者绝对不应将评审中发现的问题列入任何针对个人的考核因子。
原则5:轻量级的代码评审是有效率的和现实的
--》 我的观点:软件工程理论中非常正式的代码评审一般要召集不同角色的工程师,通过召开会议来逐行审查代码并进行讨论。但是这种方式成本比较昂贵,较少有公司能够负担起这种人力成本。所以现今大部分公司都倾向于实施非正式的代码评审,一般是基于工具。最简单的非正式代码评审可以是基于邮件列表,缺点是无法很好的记录评审过程中的修改历史和沟通信息。幸运的是,现在有很多可以用于做代码评审的工具,包括商业的和免费的。
另外,我想再做一些补充。对设计的评审应该基于设计文档,在代码评审阶段去评审设计将会是低效的并且需要花费巨大的沟通成本。当然如果在代码评审阶段发现了设计的问题,需要回过头去重新修改&评审设计文档。
综上所述,轻量级的代码评审对于业界大部分的软件开发组织都是一个很好的选择。是否在内部建立起正面的评审文化常常起决定性的作用。根据我的观察,是否进行有效的代码评审也基本上是区分二流软件开发组织和三流软件开发组织的一个明显标志:)
谈谈代码评审(code review)的更多相关文章
- 自动提交Git branch代码评审到Review Board系统
背景 敏捷软件开发中,越小的反馈环,意味着软件质量越容易得到保证. 作为组件团队,我们的开发任务中,往往存在一些特性涉及到几十个功能点,开发周期持续数周或数月的情况.如何在开发过程中保证软件质量,是个 ...
- 如何在python脚本开发做code review
在软件项目开发中,我们经常提到一个词“code review”.code review中文翻译过来就是代码评审或复查,简而言之就是编码完成后由其他人通过阅读代码来检查代码的质量(可编译.可运行.可读. ...
- 高效code review指南
大多数程序员都知道并且相信code review(代码审查)的重要性,但并一定都能很好的执行这一过程,做好code review也需要遵循一定的原则.流程和规范. 我们团队的code review实践 ...
- Code Review 五问五答
Code Review 是什么? Code Review即代码审查,程序猿相互审核对方的代码. Code Review能获得什么好处? 提高代码可维护性 你写的代码不再只有编译器看了,你得写出审核人能 ...
- 漫谈Code Review的错误实践
从刚开始工作时到现在,已经写了7年的代码,大部分代码都被人review过,自己也review了很多人的代码.在上一家公司的时候,我负责的一轮面试是专门进行Code Review的练习和经验谈. 通过在 ...
- 【转载】 漫谈Code Review的错误实践
原文地址: https://www.cnblogs.com/chaosyang/p/code-review-wrong-practices.html ------------------------- ...
- 后端code review finished 12-28
今天只有天赋和士杰有相应的后端代码的code review工作,因为并没有召开daily scrum.只是天赋和士杰对后端所有的代码进行了review,对代码进行了整理并删除了一些残留的0 refre ...
- Code Review 从失败中总结出来的几个经验
资深的程序员都知道 Code Review 可以对代码质量,代码规范,团队代码能力提升带来很大的提升,还有著名的技术专家"左耳朵耗子"也说过: 我认为没有 Code Review ...
- 15个最佳的代码评审(Code Review)工具
代码评审可以被看作是计算机源代码的测试,它的目的是查找和修复引入到开发阶段的应用程序的错误,提高软件的整体素质和开发者的技能.代码审查程序以各种形式,如结对编程,代码抽查等.在这个列表中,我们编制了1 ...
随机推荐
- 【软件安装】CentOS7安装MariaDb(mysql_替代品安装)
1.背景 Maria Db是流行的跨平台MySQL数据库管理系统的分支,被认为是MySQL 的完全替代品.Maria Db是由Sun在Sun Micro systems合并期间被Oracle收购后,于 ...
- 老司机带你玩转面试(5):Redis 集群模式 Redis Cluster
前文回顾 建议前面文章没看过的同学先看下前面的文章: 「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」 「老司机带你玩转面试(2):Redis 过期策略以及缓存雪崩.击穿. ...
- 发布一个自己做的图片转Base64的软件,Markdown写文章时能用到
markdownpic 介绍 Markdown编辑时图片生成base64 软件架构 使用了.netcore winform框架 安装教程 直接运行即可 使用说明 拖拽图片文件 双击选择文件 复制粘贴图 ...
- ajax异步上传图片&SpringMVC后台代码
function uploadPic(){ var options = { url : "/upload/updatePic.action", type : "post& ...
- CAS实现SSO 单点登录
结构 CAS分为两部分,CAS Server和CAS Client CAS Server用来负责用户的认证工作,就像是把第一次登录用户的一个标识存在这里,以便此用户在其他系统登录时验证其需不需要再次登 ...
- Java基础之NIO
NIO简介: Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API.NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同 ...
- springboot(八)内置SpringMvc静态文件地址修改
参考:作者:恒宇少年链接:https://www.jianshu.com/p/c6ab1081fd5f 介绍: SpringMVC大家都不陌生,而被SpringBoot集成的SpringMVC除了 ...
- 前端学习(五):body标签(三)
进击のpython ***** 前端学习--body标签 接下来的内容就比较多了,各位看官且听我慢慢道来... ... 使用a标签,链接到另一个页面 网页中<a>标签,全称:anchor. ...
- seaborn分类数据可视化:散点图|箱型图|小提琴图|lv图|柱状图|折线图
一.散点图stripplot( ) 与swarmplot() 1.分类散点图stripplot( ) 用法stripplot(x=None, y=None, hue=None, data=None, ...
- JS 原生ajax写法
<script> //step1.创建XMLHTTPRequest对象,对于低版本的IE,需要换一个ActiveXObject对象 var xhr; if (window.XMLHttpR ...