代码走读

本文转载自:http://blog.csdn.net/marchbirdcode/article/details/4801978

如需看原文,请看上面的链接。

从种种渠道可以知道,Google的代码之所以优秀,原因很简单,他们非常重视代码审查。这个方法不是Google独有的,它被公认是一个提高代码质量的手段。在Google,任何产品或者项目代码在捡入仓库之前,都需要进行有效的审查。

每个人,如果有意愿的话,都要参加代码审查,它是软件开发环节中非常重要而且通用的规则。审查代码,不需要投入很多精力,但是,与不做审查相比,产生的效果却是天壤之别。

不要把别人的检查,看成是对代码风格的苛求。

对个人来说,经常检查你的代码并且自问“我怎样才能写的更好?”这会加速你的成长。

你能从代码审查中收获什么?
  事实显而易见,有另外一个人检查即将提交的代码,能够帮助找到bug。这是代码审查众所周知且经常被提及的好处。但依据我的经验,这是最没有价值的一个好处。人们确实可以在代码审查中找到bug。然而坦率地说,在代码审查中找到的bug绝大多数都是一些代码作者花上几分钟就能找到的小bug。那些真正需要花时间才能找到的bug在代码审查中是检查不到的。

自己的看法:在审查前,自己肯定是检查过一次,显而易见的Bug是不出现在审查代码中。鉴于审查时间的长短,被审查者收获什么,别人对自己思路的认同?别人对自己代码的看法?我觉的,应该由被审查者先讲述自己这段代码要解决什么问题,采用了什么样的方法,然后再给别人看流程图,最后结合流程图看代码。
  代码审查最大的好处在于它是一种社交的途径。如果你编程的时候就知道会有同事检查你的代码,那么你的程序会有所不同。你写的代码会更加整洁,有着较好的注释,结构也组织的不错——因为你知道会有人来检查你的代码,而且你很在意他们的意见。如果没有代码审查,你知道代码会在最后才会审查。因为不是马上就要检查,所以对你而言并不紧迫,因而你不会想着先自检一遍。

自己的看法:代码审查的时机?是解决完一个问题就审查还是在入库时才审查?我觉的应该是在入库时来审查,鉴于部门人数众多,一一审查是不可能的,可以采取每周抽查两个人,在整个部门中,由他们来讲解自己代码中的一部分,感兴趣的人都来听。其余的入库,只需要和自己的上司提交审查请求就可以了,每周至少保持一次。
  代码审查还有一个更大的好处,就是可以分享知识。在很多的开发团队中,每个人都会负责并且专注于一个核心模块。除非别的同事负责的模块出现问题导致自己的代码不能运行,否则他们是不会去关注别人的工作。这样产生的结果是,每一个模块的代码只有一个人比较熟悉。假如事不凑巧,那位程序员正好休假或者离开了公司,那么没有人了解那些代码了。如果有代码审查的环节,那么至少会有两个人熟悉代码——代码的作者和审阅者。审阅者虽然没有作者对代码那么了解——但是他同样熟悉代码的设计和结构,这些信息是无价之宝。
  当然,没有什么事情是那么简单的。以我的的经验看来,要做好代码审查需要一段时间练习。我注意到经验不足的审阅者通常会落入一些代码审查的陷阱,这些陷阱往往会造成很多的麻烦,给那些希望尝试代码审查的人们留下了坏印象,成为了他们采纳代码审查的一个主要障碍。
  代码审查最重要规则是对即将提交的代码中查找问题——你需要做的就是确认代码是正确的。而通常会犯的一个错误,即审阅者会判断这段代码是否按照自己思路来实现。
  当有一个问题需要解决时,通常会有几十种的办法。当选定一个解决方法时,会有百万种代码实现。因此,作为一个审阅者,你的工作不是确保代码是按照你的方式来编写的——因为这是不可能的事情。审阅者的工作是确保原作者编写的代码是正确的。如果你没有遵守这个规则,你可能会到处碰壁,审查结束时你的心情很糟糕,对你来说肯定不是一件好事情。
  问题在于这是不自觉就会犯的一个错误。假定你是一个程序员,当你在看一个问题的时候,你会得到一个自己的解决方案——并且你认为你看到的就是这个问题(应该采用的)解决办法。如果想要成为一名好的审查者,你需要知道这是不对的。
  第二个误区就是人们感觉一定要说点什么(才算是做了代码审查)

代码的作者花了很多的时间和精力来编写代码——你难道不应该说点什么吗?
  答案是:你不应该。
  如果只是说“哦,这看起来这不错!”,这永远没错。反之,如果你不断地去查找一些“问题”并加以指责,那么我肯定你的信誉会荡然无存。如果你不断地去制造一些事情来说些什么,那么代码的作者会认为,当你的言论只是为了避免冷场。从此,你的意见不会受到重视。

自己的看法:在审查过程中,多提问题,不要把自己想的那一套强加在别人身上,以提问的方式,来了解别人的设计思路和策略,这就像,一人一个想法,相互交换了,每个人就有了两个想法,思路也是一样的,尊重别人的思维成果,即使它还不完善,还有漏洞。
  第三个误区就是速度。

你不应该匆忙完成一次代码审查——但是也不要拖延。

你的同事在那里等着你的审查结果。如果你和同事不愿意抽出时间来做代码审查或者一直拖延,大家会对这次的审查感到厌烦,也会认为以后的代码审查也只会带来麻烦。看起来好像代码审查会打断你的工作,其实不必如此。你不必要在别人要求你审查的时候马上丢掉手头上的事情。但是在几个小时之内,当你工作中间休息的时候——喝杯茶,去一下洗手间或者聊聊天,散散步。当你再回来工作的时候,你可以开始并完成这个代码审查。如果你这么做了,没有人会站在你身边一直等着你给出审查结果。

自己的看法:在部门的代码审查上,建议时间保持在30分钟左右,第一,不要浪费大家的时间.第二,30分钟,10分钟讲思路和流程图,10分钟介绍代码,还有10分钟接收提问。这样的时间分配,应该还是比较合理的。在个人的代码审查上,时间因人而定,能够疏通逻辑、答疑解惑一两个点就可以了。

时间: 2024-11-03 21:06:17

代码走读的相关文章

Qt Creator插件工作流程代码走读

Qt Creator有个很风骚的插件管理器PluginManager,还有个很骚包的插件说明PluginSpec.基本上,所有的Qt程序的入口都是传统的C程序一样,代码流程从main()函数开始.  在main()中,先初始化用于国际化的translator,然后获取程序配置settings,接着就在栈上创建了PluginManager对象,之后为PluginManager设置搜索用的文件扩展名pluginspec,设置配置,再设置插件搜索路径.  设置好插件搜索路径后,PluginManage

开源ext2read代码走读之--“\\\\.\\PhysicalDrive0”意义?

在ext2read中读取ext4文件系统的代码中,读取硬盘中的信息时,定义了以下的宏,那么这个宏是什么意思呢? #define DEVICE    "\\\\.\\PhysicalDrive0"是什么意思? 由于"\"是C/C+中转义符, "\\\\.\\"就相当于\\.\,那么以上的宏定义中的"\\\.\\PhysicalDrive0"就等价于"\\.\PhysicalDrive0" 在Windows中

WebRTCDemo.apk代码走读(三):音频接收流程

收到音频包 UdpSocketManagerPosixImpl::Run UdpSocketManagerPosixImpl::Process UdpSocketPosix::HasIncoming(recvfrom) UdpTransportImpl::IncomingRTPCallback UdpTransportImpl::IncomingRTPFunction VoiceChannelTransport::IncomingRTPPacket VoENetworkImpl::Receive

WebRTC代码走读(八):代码文件夹结构

转载注明出处http://blog.csdn.net/wanghorse ├── ./base //基础平台库,包含线程.锁.socket等 ├── ./build //编译脚本.gyp ├── ./common_audio //基础公共的音频处理 │ ├── ./common_audio/include //就一个类型转换头文件 │ ├── ./common_audio/resampler //音频重採样代码 │ ├── ./common_audio/signal_processing //音

开源ext2read代码走读之-如何读取MBR分区的内容

主引导记录(Master Boot Record,缩写:MBR),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的三维地址为(柱面,磁头,扇区)=(0,0,1).在深入讨论主引导扇区内部结构的时候,有时也将其开头的446字节内容特指为"主引导记录"(MBR),其后是4个16字节的"磁盘分区表"(DPT),以及2字节的结束标志(55AA).因此,在使用"主引导记录"(MBR)这个术语的时候,需要根据具体情况判断其到底是

EventBus框架库代码走读

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 本篇继续接上一篇,阅读上一篇EventBus使用之基础 背景 开始分析EventBus前可以下看下EventBus开源框架的工程目录结构: 从上图可以发现,其实EventBus的代码量不是很大,还是很方便入手分析的. 开始分析 通过上一篇基础使用可以发现,使用EventBus框架第一步是得到

WebRTCDemo.apk代码走读(八):代码目录结构

转载注明出处http://blog.csdn.net/wanghorse ├── ./base //基础平台库,包括线程.锁.socket等 ├── ./build //编译脚本,gyp ├── ./common_audio //基础公共的音频处理 │ ├── ./common_audio/include //就一个类型转换头文件 │ ├── ./common_audio/resampler //音频重采样代码 │ ├── ./common_audio/signal_processing //音

开源ext2read代码走读之-在windows下如何判断有几个硬盘设备?

int get_ndisks() { HANDLE hDevice;               // handle to the drive to be examined int ndisks = 0; char path[20] = {"\\\\.\\PhysicalDrive0"}; do { //TRACE("NDISKS %s", path); hDevice = CreateFileA(path, // drive to open GENERIC_REA

Exphp代码走读(二)

App.class.php 1 <?php 2 namespace System\Core; 3 use System\Driver; 4 5 class App{ 6 public $DB; 7 public $Cache; 8 public $Session; 9 public $Controller; 10 11 public function __construct(){ 12 DBUG ? set_error_handler(array($this,'errorHandler')) :