代码审查时,发现功能实现的原因,而不仅仅是挑毛病(转)

  对于很多公司来说,代码审查是开发人员日常工作中的重要环节。通过代码审查,可以及早发现项目中存在的问题、促进同事之间的沟通与交流,并且可以在讨论中迸发出智慧的火花。但要想成功实施代码审查却并不是一件轻松的事情,为什么要进行代码审查、何时做、如何做,这是摆在我们面前的3个重要问题。针对于这3个问题,开发者Lisa Tjapkes撰文谈到了自己的经验与教训。

在我最近的项目经历中,我们进行了广泛且正式的代码审查。这个过程极大地改进了项目的代码质量,降低了项目中新特性开发的等待时间,同时还促进了知识在整个团队间的传播与共享。我还发现代码审查并不会延误项目开发的时间,反而会提升开发人员的生产力。

  代码审查的好处

  我们发现代码审查对于项目的各个阶段都会带来很多好处:

  • 在项目起始阶段进行代码审查会帮助我们更好地使用已经建立起来的代码基,因为如果我们没有使用过某些现有代码,那么可以从当前的开发者中获得反馈信息。
  • 在项目进行过程中,我们会时不时地向团队增加新的开发人员,代码审查可以极大地降低这些新加入人员的熟悉时间。特别地,我们可以让新加入的开发人员很有信心地开发新特性,因为我们可以在合并前审查代码并且对于他们所编写的任何代码提供有价值的反馈信息。
  • 对于我们这个分布式团队来说,代码审查更加具有实际意义。团队协同在构建协作环境上会带来很大的帮助作用,我们可以即时提出想法,然后讨论,再进行开发。虽然由于不在同一地点我们会失去一些东西,不过我们却可以在代码审查过程中通过深入的讨论来获得好处。

  高效代码审查的技巧

  代码审查的方式如果处理不当可能会导致项目延期。使用正确的工具与技术可以防止在审查上浪费大量的时间,提升代码的品质。

  使用特性分支

  这个实践的好处就不用多说了,不过它对代码审查提供了更加具体的好处。特性分支意味着你可以将需要审查的代码隔离到只与某个具体的特性相关。在代码已经准备好了审查时,特性分支还考虑到了快速的上下文切换。在当前的代码进行审查时,你可以切换到新的特性上来,如果需要对审查特性的反馈进行讨论时还可以快速切换回来。

  将审查隔离为小的修改

  相对于大的修改来说,小修改的审查时间会更少。在审查大的修改时,你不仅要看很多行代码,还要查看大量的依赖代码才能真正理解,结果就是花在审查代码上的时间与修改的代码量之间并不是呈线性关系。将待审查的代码隔离为小的修改可以降低审查者的精神负担并让审查过程更加顺畅。

  使用专门为代码审查而设计的工具

  这看起来似乎很简单,但却非常重要。一些重要的特性需要包含差异比较、能够逐行注释修改,并且在审查的代码发生改变时通知大家。我所在的团队使用GitHub来管理项目代码,并且使用GitHub的pull request特性来管理代码审查。

  检查清单

  可能没必要使用非常复杂或是过于结构化的东西,如果突然出现了某些问题,使用检查清单或许是个不错的主意。

  有建设性的输入

  类似于“多加点注释”这样的话显得太没意义了,帮助也不大。假如某个接口没有注释,但也许有专门的文档用来说明呢。如果发现了某些不合理的地方,那就要明确指出来,判断设计上是否能改进或是逻辑上是否存在着错误。

  要把精力放在真正理解代码的行为上,确保当其他人需要维护它时也能够快速理解代码。

  人人参与

  即便是最有经验的架构师或是明星开发者也会犯错。因此,最好每个人都能参与到代码审查的过程中来。特别地,对于很多初级开发者或是新加入项目的开发者来说,这也是个很不错的学习机会。

  要有审查流程

  一开始,我们的项目并没有正规的审查流程。我们只是开启一个pull request,等待有人来审查,最后会有人合并修改。这种工作方式效率非常差,有时好几天都没人审查一个pull request,有时一个人给出反馈前其他人却合并了请求。此外,有些开发者审查的代码量要比其他人多不少。总而言之,没有流程导致我们的效率极低。

  最后我们认识到了这一点,创建了一个正式的结构来指导该如何进行代码审查,这加速了审查的效率。一个审查过程至少应该涵盖如下几点:

  • 如何将审查任务分派给不同的人
  • 期待审查者给出反馈的最迟时间
  • 如何标识某个审查已经完成
  • 谁负责合并已经完成审查的代码

  我在项目中是否应该进行代码审查?

  我认为代码审查对于很多项目来说都是一件好事,不过它也并非通用的解决方案。代码审查适合于如下这些项目:

  • 至少有5名开发人员
  • 在向团队增加新的开发人员时
  • 团队是分布式的
  • 项目有各种不同的组件构成,这些组件是由不同团队开发的
  • 当还处在为代码基设定约定以及最佳实践的阶段
  • 团队中有些成员对于当前所使用的技术栈还不太熟悉时

  相反,代码审查在如下的情形中并不会为项目带来更多的附加值:

  • 处理的是维护代码而不是添加新的特性
  • 团队很小且亲密无间

http://kb.cnblogs.com/page/192748/

时间: 2024-10-11 08:28:18

代码审查时,发现功能实现的原因,而不仅仅是挑毛病(转)的相关文章

解决git Push时请求username和password,而不是ssh-key验证

转载自:https://blog.lowstz.org/posts/2011/11/23/why-git-push-require-username-password-github/ 之前开始用github时是在ubuntu下按着官方的新手指南搞定的.但最近一直在用fedora,所以也想在fedora下用github,配置的时候很顺利,就是在git push的每次都需要输入username和password,而我是配置好公钥登陆的.用ssh -T [email protected] 也是成功用公

青蛙学Linux—Zabbix Web使用之Zabbix发现功能①自动网络发现

Zabbix的发现功能用于自动发现主机或者监控数据,包括以下三种发现类型: 自动网络发现(Network discovery) 主动客户端自动注册(Active agent auto-registration) 低级别发现(low-level discovery) 1.自动网络发现 Zabbix提供了非常强有力和灵活的自动网络发现功能.通过自动网络发现,可以加速Zabbix的部署,在不断变化的环境中使用Zabbix而不需要过多的管理.Zabbix可以通过以下几种方式自动发现主机并对发现的主机执行

zabbix专题:第九章 zabbix自动发现功能详解

zabbix自动发现功能详解 对Linux有兴趣的朋友加入QQ群:476794643 在线交流 本文防盗链:http://zhang789.blog.51cto.co zabbix自动发现功能详解 网络发现简介 有100台服务器,不想一台台主机去添加,能不能让zabbix自动添加主机呢,当然可以,网络发现便是这个功能,当然前提条件是所有服务器都已经安装了agent或者snmp(其实也可以不用,鉴于我们大部分功能都用agent,所以请安装上agent),server扫描配置好的ip段,自动添加ho

Eclipse 打开时“发现了以元素'd:skin'”开头的无效内容。此处不应含有子元素

今天打开 Eclipse 时遇到了这个提示,如图所示: 虽然不影响使用,但感觉不爽,好在找到了解决办法: 把有问题的 devices.xml 文件删除,再把 sdk 里面 tools\lib 下的这个文件拷贝到你删除的那个文件夹里,重启 eclipse 就 OK 啦! 参考:http://blog.csdn.net/yueqinglkong/article/details/46340571 Eclipse 打开时"发现了以元素'd:skin'"开头的无效内容.此处不应含有子元素

zabbix通过自动发现功能实现自动识别网络设备接口

由于之前网络设备不是很多,监控网络设备接口就直接使用模版中的item来实现了,可是现在公司上线了一大批网络设备,如果要每个网络设备都做模板,添加item......那就该废了,于是迫于压力今天来测试使用zabbix的自动发现功能实现自动发现网络设备接口,并且自动获取接口的流量值,生成流量图等功能. 这样的话就能节省大量时间,时间就是生命啊,把时间浪费在枯燥的添加网络接口的工作上就是在浪费生命!好了,废话不多说,进入正题: 首先,在交换机上面配置好snmp协议,为了简单,这里目前使用的是snmp

使用Sublime编写HTML页面时发现,虽然已经设置好了UTF-8的编码格式,但却发现HTML页面的汉字仍然是乱码。

相信有些同学在使用Sublime编写HTML页面时发现,虽然已经设置好了UTF-8的编码格式,但却发现HTML页面的汉字仍然是乱码吧.我今天就遇到了这样的问题. 第一步:重新设置一下你的meta,设置方法:菜单——>以···编码保存——>utf-8. 第二步:如果仍然有乱码出现,小伙伴,你得检查一下你写的css代码里是否有错误了,尤其是有不容易发现错误的符号的,比如:""  ,  ;   ()这四个符号.检查一下是否是英语的,乱码的出现跟这些符号被用错有关. 第三:还有一个

installshield制作的安装包卸载时提示重启动的原因以及解决办法

原文:installshield制作的安装包卸载时提示重启动的原因以及解决办法 有时候卸载installshield制作的安装包程序,卸载完会提示是否重启电脑以完成所有卸载,产生这个提示的常见原因有如下几种:1. 卸载时,程序正处于运行状态2. 卸载时,程序文件夹处于打开状态3. 卸载时,有文件被别的进程调用,或者在进程中,常见情况如dll在进程中 一般来说解决办法是针对第三种情况的,解决办法是卸载时强制杀进程,比如在OnMaintUIBefore或者OnUninstall里写上强制杀进程的代码

[Python] - 使用chardet检查网页编码格式时发现的问题

最近在使用chardet检查网页编码格式时发现如下问题: 用urllib打开网页再检查编码格式和用urllib2打开网页检查编码格式结果不一样,所以urllib2打开可能导致问题,需要注意. 使用urllib2打开网页,检查编码格式: 结果如下,结果中出现了新浪网的字符编码格式为None的情况: 但如果使用urllib打开url,则不会出现检查不到编码格式的问题: 运行的结果中,所有URL的字符编码都侦测到了,结果如下:

Code First迁移数据库时发现在的问题“由于一个或多个对象访问此列”

在执行Update-Database 提示 ClientConnectionId:f7a284b8-411c-406c-98aa-abaacd37eb88 对象'DF__BaiKe_Tit__IsDel__7720AD13' 依赖于 列'IsDelete'. 由于一个或多个对象访问此列,ALTER TABLE ALTER COLUMN IsDelete 失败. 解决方法有两种 第一种:在MSSMS里面找到该表直接删除约束即可 第二种: alter table TableName drop con