让代码审查扮演更好的角色
【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》
代码审查(Code Review)是很多大公司里面都有的一个流程。它指的是一个人编码,另有几个人负责审查,并提出修改意见。代码审查在大多数情况下对公司整体的工程质量是有提高的,但是如果使用不当的话,很可能反倒会降低工程质量。代码审查究竟在一个组织里面是有正面效应或者是负面效应取决于很多因素,而我认为其中最重要的是代码审查在开发过程中扮演的角色。
首先,我们先看看在代码审查中所需要找出的问题类型。它们可以是:
- 语法及代码风格问题:一般有静态检查工具可以解决,但难免有疏漏。
- 效率问题:需要有一定经验的人来辨别低效的部分。
- 命名问题:这其实是一个很经常出现也很重要的问题。对于一个人来讲说得通的命名不见得对于团队而言说得通,所以很多时候较难的命名要由团队通过代码审查协同解决。
- 设计问题:小到接口的设计,大到服务间通信的协议,都属于设计问题,根据情况可以由小部分人或者整个团队解决。设计问题是代码审查中最常见的问题。
对于前三种问题,相对来讲都很好解决。其中相对棘手的莫过效率问题,但实际上基本上知道效率问题的人都知道优化方案。然而,如果一个审查的人突然提出一个很合理的设计问题,需要你重新修改源代码,你会发现你需要花大量地时间重新编写。
例如,在编写一个JavaScript库packageA的时候,你提交了代码审查。有人可能会提醒你:packageA是用于桌面端网站的库,相对应的还有一个移动端的库packageB。为了保持工程上的一致性,建议把packageA改成盒packageB一样的API。一致性一直以来是一个让人无法反驳的设计追求,所以你只好把辛辛苦苦自己设计好的API全部重改…
所以,若你的代码里面被提出存在设计问题,消耗的工程时间会增加。而工程时间对公司来讲就是金钱。
造成存在需要大改的设计问题的原因其实无非三个:
- 设计能力不足
- 对开发的系统不熟悉,缺乏上下文(Context)
- 过晚提交代码审查
前两个原因都很直白,但是第三个原因有点匪夷所思。什么叫做过晚提交代码审查?
我想是代码审查英文单词中的”Review”给予人的误导,很多人是在代码几乎完成或者已经完成后才提交代码审查的。就好像在做一盘菜,做到***一步的时候才想起来要尝一小口看看味道对不对,结果发现没加盐。
在***一步进行代码审查,还会因为审查者一下子接收太多信息,而造成他可能无法发现一些应该发现的问题。
显然“审查”扮演的角色在这里出现了问题,它不应该是传统意义上的到***一步进行把关,而应该是贯穿整个编码过程的一个辅助过程。用比较老式的软件工程“土话”说,它应该是一个Umbrella Activity(雨伞活动),全程保护编码过程的质量。
现在,我的代码审查流程是这样的:首先完成一个基本的设计,加上基本的注释,达到一个完成度——最可能出现大设计问题的完成度。接着 commit,并推入到代码审查中,邀请其他人来审查。这基本上就是对他们说,“看,这是我写的,很简单,可能烂得跟一坨屎一样,麻烦你们帮我看看有没有什么大问题”。
稍微有点开发经验的人,都可以大概估计出自己手头的工作进行到哪一步可能出现大的设计问题。例如,当你在设计一个新的模块,那么可能出现大的设计问题的时候可能就是设计API的时候。再紧接着,下一个可能出现大的设计问题的就是类之间的抽象关系,等等。
我甚至还会自己给自己的代码进行审查。这并不是在做验算,而是在通过代码审查告诉团队自己的疑问,提出自己的想法,这样大家就能更好地与你沟通。相信我,把有疑问、犹豫不决的地方提出来;有自己独特想法的地方,也要指出来,因为你的独特想法有时候对团队来讲就是不好的想法。
每当遇到心里觉得可能出现大的设计问题的时候,尽量利用代码审查,让团队和你一起解决。对于工程经验少的人来说(比如我),更应该多做一点这样的事。一开始这样做可能反倒会开销更多人的时间,但是过一阵子之后,你就更有把握做好的设计决策。换句话说,发生大设计问题的概率就会降低。因为你总能在和别人沟通的时候学到新东西。
然而,如果每次都在编码完成之后再进行代码审查,虽说***经过代码审查可能也会产出高质量的代码,可你将花大部分时间在烦闷上,而花很少的时间真正体会他人提出的意见的真正价值。
长此以往,整个工程团队的工程时间可以得到显著的下降。首先是因为每个人的经验都能通过代码审查增长得更快,因此总体工程效率会提高;第二是因为全程保护的代码审查很好地解决(或缓解)各种层面的设计问题,让工程无论从短期还是长期来讲,需要花费的工程时间降低,并且技术债务(technical debt)也会减少。
幸运的是,虽说这里提到的是比较宏观的流程问题,却是一件落实到每个工程师自身的事情。也就是说,代码审查如何执行最终还是归结于编码的工程师个人。整个流程的转换无需有新的工具加入,也不需要有很多复杂的文档。所需要的只不过是对团队的一次培训——这篇文章或许就是一个不错的素材。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
微服务和容器对企业带来什么样的影响?
【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》 IT经理、架构师和开发者都尝试妥协于微服务和容器对企业IT方式的改变。在某一个层面来说这是一件好事,但是事实上,一些更深层次的东西在驱动着技术和IT。 要理解微服务和容器,可以从抓住它的价值定义开始,然后将IT和数据中心的性能与这个变革的驱动者进行匹配。***,为了敏捷性来构建架构,而不是为了追随下一个大热点来构建架构。 IT策划者和经理们一定要了解到应用程序和工作者之间基本关系的变化——特别是事件驱动型、移动的工作者——他们是使用容器和微服务的驱动者。IT方向的转变会让昂贵、长期存在的基础架构向动态的市场进行靠齐。这意味着不仅仅是更多高效的云服务或者更低的操作复杂性,还能更好地对他们IT的需求进行响应。 现代的工作者 应用软件从记录业务活动进化到促进业务活动。应用程序创建了一条企业可以跟随的创建运营计划的最小阻力路径。企业架构师已经通过数十年的努力想把应用程序与业务的目标达成契合,但是他们通常会被现在用来经营业务所使用的可用的IT工具所阻碍。 智能手机设备的出现加速了这个现象。手机app的工作者需要得到对他们工作...
- 下一篇
优化SQL查询:如何写出高性能SQL语句
【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》 1、 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条记录,那查询优化器会选择“索引查找”方式,如果该表进行了归档,当前只剩下5000条记录了,那查询优化器就会改变方案,采用 “全表扫描”方式。 可见,执行计划并不是固定的,它是“个性化的”。产生一个正确的“执行计划”有两点很重要: (1) SQL语句是否清晰地告诉查询优化器它想干什么? (2) 查询优化器得到的数据库统计信息是否是***的、正确的? 2、 统一SQL语句的写法 对于以下两句SQL语句,程序员认为是相同的,数据库查询优化器认为是不同的。 select*from dual select*From dual 其实就是大小写不同,查询分析器就认为是两句不同的SQL语句,必须进行两次解析。生成2个执行计划。所以作为程序员,应该保证相同的查询语句在任何地方都一致,多一个空格都不行! 3、 不要把SQL语句写得太复杂...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- 设置Eclipse缩进为4个空格,增强代码规范
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8编译安装MySQL8.0.19
- Docker安装Oracle12C,快速搭建Oracle学习环境