资料介绍
一、目的是什么
做任何事情都要有一个目的,那么我们做code review的目的是什么呢?本来开发工期就非常紧了,特别是身处中国这个大环境下的互联网公司,老板恨不得要你二十四小时连轴转,为什么还要花那么多时间去做code review呢?我认为code review的目的在于提升代码质量。
前几天看了篇文章,里面有这么一段对我触动很大:
在这种业务需求紧张的模式下,Facebook一些开源技术方案是如何产出的,是非业务团队专门做的么?
我想说的是即使业务需求紧张,也一样把代码好好写好,另外有牛逼的tech lead和严格的code review,总的质量也不是很差。国内有一点很不好:经常没有code review;而且技术人员观念不好,把要写的代码当差事,只要能完成能用就好。所以就越来越操。
(Code review一直是硅谷一线互联网公司的质量控制法宝,从Apple到Google,从Facebook到现在的Airbnb和Uber。可悲的是,国内的人都太聪明,觉得这东西没用繁琐,而且减慢开发速度。有时,我们就是太过聪明。)
所以我们不要总是拿没时间来当做借口,如果对代码质量没有一定的追求,给再多时间也是没用的。业务需求紧张需要通过提高工作效率来解决,而不是不花精力提高代码质量。另外,站在一个项目的生命周期来看,写烂代码真的会比写好代码花的时间更少么?
二、好代码最重要的特征是什么?
既然做code review的目的是提高代码质量了,那么什么样的代码才能算是好的代码呢?最开始这个标题我写的是「什么样的代码才是好代码?」,后来我想了下这个问题太大,我无法对「好代码」简单的下一个定义,真正讨论起来估计得单独写一篇文章了,所以先按住这个话题,换成简单的「好代码的最重要的特征是什么?」。
我觉着好代码最重要的特征是可读性强,这样才能让和你协作的同学以及未来的你自己能够不用想太多就能看得懂,毕竟花在维护代码上的时间要远远超过写这段代码花的时间。每新增一行代码就会多增加一份维护成本,而可读性强的代码可以把维护成本降到最低。
那么我们怎样来定义这个可读性强呢?每个人都有自己的标准,怎样才能在团队里让大家都认可呢?微博的一位工程师在他写的《关于烂代码的那些事》这样写到:
在很多跟代码质量有关的书里都强调了一个观点:程序首先是给人看的,其次才是能被机器执行,我也比较认同这个观点。在评价一段代码能不能让人看懂的时候,我习惯让作者把这段代码逐字翻译成中文,试着组成句子,之后把中文句子读给另一个人没有看过这段代码的人听,如果另一个人能听懂,那么这段代码的可读性基本就合格了。
用这种判断方式的原因很简单:其他人在理解一段代码的时候就是这么做的。阅读代码的人会一个词一个词的阅读,推断这句话的意思,如果仅靠句子无法理解,那么就需要联系上下文理解这句代码,如果简单的联系上下文也理解不了,可能还要掌握更多其它部分的细节来帮助推断。大部分情况下,理解一句代码在做什么需要联系的上下文越多,意味着代码的质量越差。
逐字翻译的好处是能让作者能轻易的发现那些只有自己知道的、没有体现在代码里的假设和可读性陷阱。无法从字面意义上翻译出原本意思的代码大多都是烂代码,比如“ms代表messageService“,或者“ms.proc()是发消息“,或者“tmp代表当前的文件”。
我很认可这个说法,在这个基础上,我一直坚持认为虽然一个能把一件事情描述清楚的人写的代码不一定可读性强,但是一个无法将一件事情描述清楚的人写出来的代码可读性肯定很差。
三、那么,该怎样做呢?
说了那么多了,具体怎样落地到现实工作中呢?即使按照前文所说的把代码逐字翻译成中文讲给其他同学听,也一样可能由于认知问题导致对方听不懂,比如你认为很基础的概念可能别人并不了解。所以我认为大家要遵循一些基本原则,这样才能有效的沟通。
3.1 SOLID原则
这是面向对象的五条基本原则,我列在下面,在这里就不展开来说了
Single responsibility principle
Open/closed principle
Interface segregation principle
Dependency inversion principle
3.2 Don’t Repeat Yourself
一般对这条原则的理解是对于同样的功能不要直接copy原来的代码,而是要抽象出一个公用的方法。但是实际上对同样的功能用不同的思路或者代码去实现也是一种浪费。比如常见的日志处理、异常处理逻辑。
3.3 Prefer Composition to Inheritance
这条原则跟前面提到的OOP的SOLID原则里面的Interface segregation principle有点重合之处。随着业务需求的不断迭代,小的组件逐渐会演变成大的组件,在这个过程中驾驭的难度会逐步提升,而如果在不断迭代的过程中不断抽象出小的组件,则可以在业务功能复杂的同时保持代码的简洁。比如不管是飞机还是汽车火车都是会移动的,而我在使用时只需知道这个对象是可移动的即可,至于这个对象是飞机还是汽车我并不关心。
3.4 编码规范
这个不多说了,可以采用一些行业里优秀的编码规范。但是要注意的一点是规范的作用是保持项目编码风格的统一,不要在规范上做无意义的争论。
3.5 如果不具备抽象的能力,那就重复吧
这是一个比较残酷的也比较常见的现实,看了一大摞的书废了老大的劲终于抽象出了一个组件,但是最后的结果却是加大了维护成本。所以如果你觉着无法很好的去抽象,就直接用最粗鲁的重复代码吧,毕竟这样别人还能看得懂,比抽象出来后还要再写一大堆的if else好多了。
四、技术之外的tips
在技术之外还有一些要注意的点,首先最重要的就是要有一个开放的心态,review的是代码,而不是具体的人,不要因为对方的review而感觉羞耻,当然也不要进行人身攻击。
其次,要把握review的粒度,不要一下发起一个非常大的PR,这样会给review的同学特别大的压力。比如一个PR里最好不要同时既有重构又有新特性的开发,或者憋到最后这个版本都要开发完了才一起提交一个PR。review应该是在平时的工作中持续进行的,而不是类似里程碑的总结之类的东西。
第三,code review不应该承担发现业务逻辑错误的责任,也就是平常我们所说的bug,bug应该由单元测试、功能测试、性能测试等方法来保证,不要赋予code review太多的责任。
- 关于蓝桥杯单片机开发板矩阵键盘的一些坑
- 一些关于射频板PCB的布局、布线原则资料下载
- 学习单片机的一些心得体会
- 使用16位单片机C语言实现PID调速的一些心得体会
- 关于单片机的一些按键问题和代码详细资料总结
- 如何生成简单脉宽调制所需的基本步骤带你了解一些基本nhet模块的操作 17次下载
- Code Composer Studio入门指南(修订版) 36次下载
- PIC单片机的一些学习心得与总结 12次下载
- 关于信息治理与云的一些事实 0次下载
- 关于PID一些常用知识 2次下载
- 关于画高频PCB板的一点心得 0次下载
- 关于续流二极管的一些问题 23次下载
- 关于红外通信的一些问题知识点 4次下载
- C++面向对象关于MFC的一些简单应用和总结 1次下载
- 关于单形体积的一些不等式
- 如何使用Polyspace Code Prover来统计堆栈 243次阅读
- 分享一些SystemVerilog的coding guideline 558次阅读
- 谈一谈开发团队代码质量如何管控与提升 455次阅读
- 通过RealSense代码说明一些C语言问题 604次阅读
- INCA的一些用法 7959次阅读
- 一些对OpenMP进行优化的方法 1575次阅读
- get与post的请求一些区别 1281次阅读
- 写Java代码的一些技巧分享 1249次阅读
- usb通信的一些基础知识 4326次阅读
- 一些在文本数据量不够大的时候可用的一些实用方法 6578次阅读
- 一些能够解决生活中一些具体问题的常用算法的整理集合 1.7w次阅读
- 关于二叉树一些数据结构和算法相关的题目 3112次阅读
- 根据研发经历谈谈无人驾驶的一些实践与心得 1.8w次阅读
- 学习管理 docker 容器的一些命令 4216次阅读
- 设计达人分享干货:LED驱动设计心得 1611次阅读
下载排行
本周
- 1电子威廉希尔官方网站 原理第七版PDF电子教材免费下载
- 0.00 MB | 1490次下载 | 免费
- 2单片机典型实例介绍
- 18.19 MB | 92次下载 | 1 积分
- 3S7-200PLC编程实例详细资料
- 1.17 MB | 27次下载 | 1 积分
- 4笔记本电脑主板的元件识别和讲解说明
- 4.28 MB | 18次下载 | 4 积分
- 5开关电源原理及各功能威廉希尔官方网站 详解
- 0.38 MB | 10次下载 | 免费
- 6基于AT89C2051/4051单片机编程器的实验
- 0.11 MB | 4次下载 | 免费
- 7蓝牙设备在嵌入式领域的广泛应用
- 0.63 MB | 3次下载 | 免费
- 89天练会电子威廉希尔官方网站 识图
- 5.91 MB | 3次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234313次下载 | 免费
- 2PADS 9.0 2009最新版 -下载
- 0.00 MB | 66304次下载 | 免费
- 3protel99下载protel99软件下载(中文版)
- 0.00 MB | 51209次下载 | 免费
- 4LabView 8.0 专业版下载 (3CD完整版)
- 0.00 MB | 51043次下载 | 免费
- 5555集成威廉希尔官方网站 应用800例(新编版)
- 0.00 MB | 33562次下载 | 免费
- 6接口威廉希尔官方网站 图大全
- 未知 | 30320次下载 | 免费
- 7Multisim 10下载Multisim 10 中文版
- 0.00 MB | 28588次下载 | 免费
- 8开关电源设计实例指南
- 未知 | 21539次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935053次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537791次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234313次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233045次下载 | 免费
- 6威廉希尔官方网站 仿真软件multisim 10.0免费下载
- 340992 | 191183次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183277次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138039次下载 | 免费
评论
查看更多