进入3月,天气逐渐变得暖和。
趁现在,出门走走,感受一下清风与阳光,给心灵一段轻松的休憩。
Go技巧 - 我是如何做Code Review的?
如何做Code Review,这个话题过大,容易出现很多争议性的内容。为了缩小讨论的范围,我今天分享的内容主要源于个人的经验,适用于多种后端语言。
CR的最终目标是什么?
我先抛出自己的观点,CR的最终目标分两个方向:
- 技术上,保证代码的可维护性
- 业务上,保证系统功能的正确性
第一点相对容易做到,毕竟代码风格很容易直接看出来。不过代码是否能保证可维护性,还是很考验团队技术负责人的水平,这里就不展开了。
不少人对第二点会存在争议:CR的reviewer往往不了解这个需求的背景与技术实现,在有限的时间里,如何保证系统功能的正确性?诚然,系统功能的正确性是极难解决的问题,别说CR,连单测、联调、验收、甚至上线后都可能频繁出现问题,靠一个“纸上谈兵”的CR能解决什么?
功能的正确性很难保障是编程圈的常态,导致CR不断被人诟病 - 麻烦又没小姑偶。但是,我们也可以观察到有很多追求技术的团队与个人分享了各自的实践,或多或少带来了帮助。
下面,我来谈谈个人的三个实践,简单来说就是 总 - 分 - 总。
以下的内容不适用于部分维护遗留系统的团队,投入与产出不成比例。
但从个人来说,可以按照下面的思路CR自己提交的代码,是一个提升个人能力的有效手段。
梳理功能:从出入口串联逻辑
做一个功能的开发,出入口是最好把控整体的方法。以一个微服务程序为例,主要出入口分为3种:
- 服务本身的接口
- 数据库层的定义
- 调用第三方服务的接口
如果能结合分层,将1放在最上层,2、3放在最下层,整体的代码就清晰很多。这时,Reviewer的重心可以分这三步:
- 先看最上层接口的数据定义:根据出入的数据定义,可快速了解接口要做什么
- 再看业务层的技术方案:业务层为分两种情况
- CRUD类,没有什么复杂业务逻辑,可不写方案,直接读代码就能看懂
- 复杂业务类,重点看技术方案中的核心设计(缺少技术方案时,就要求把核心业务逻辑写在一个或几个重点函数中,注释详尽)
- 最后看下层的数据库与RPC调用:通过了解系统怎么与外部交互的,完善对整个功能的理解
细节打磨:从分层特性打磨代码
串联了整个逻辑,只代表了我们大致了解了逻辑,距离技术上的代码可维护性和业务上的功能正确性都还有相当一段路。接下来,我会从分层的维度去打磨代码。
接口层的代码是整个服务的门面,我重点关注两块。首先是数据定义适宜 - 既不缺失关键字段导致无法使用,又没有冗余字段来提升调用方的理解成本,这点比较考验经验,是一个不断优化的过程;其次,我非常重视接口文档的正确性 - 让代码实现与接口文档保证一致,这部分往往会结合框架进行自动化。
业务层相关的代码是服务的核心,风格因团队、框架而异,但我建议以一个实践为核心:可测试性。业务变化很快,可测试性是重要保障的一个门槛。为了提升可测试性,我们应先考虑对相关代码进行优化,例如抽象、拆分、mock等手段,再去写相关的单元测试。
最下层的数据库与RPC调用相关的代码一般都有ORM或SDK的封装,功能上复杂度不高,但仍是CR的重点之一:优先关注边界问题,即通过数据库或第三服务是不是一个最优解,毕竟一旦涉及到第三方系统,后续排查的复杂度就会越来越大;其次要关注性能,如数据库的索引字段,外部服务的接口性能等。
掌控全局:再次俯瞰整个功能
打磨完了细节,这时再从整体功能的角度来看这部分代码,往往能找到很多更重要的优化项,例如:
- 优化命名
- 抽象合理
- 日志齐全
- 超时处理
这一阶段是保障功能正确的最重要机会,是对以上两个阶段的“厚积薄发”。我个人尤其注重这一阶段。
编程思考 - 珍惜工作中的决策机会
最近有同学在工作一段时间后,发现个人的能力遇到了瓶颈,找我聊了聊。在我看来,他们的瓶颈往往是由于个人的认知非常受限,突破瓶颈的一个有效手段就是有足够的决策机会。
举个例子,如果你是维护某个模块的工程师,对这部分的功能已经了如指掌,这时你需要有一个机会:如果让你重新设计这个模块、或者规划更大的系统,这就能让你的能力有一次突破。
决策小到一个技术方案,大到一个系统设计,这里面需要关注两方面:
- 自身能力的不断提高
- 在团队中树立足够的信誉
不少同学往往忽略了第二点,工作中总抱着一种怀才不遇的心态,而团队领导则认为他好高骛远。理论与实践总是存在偏差,我们要从每个小的机会入手,逐步证明自己,才能在更大的舞台上展现自己。
工作生活 - 10公里慢跑
近一个月,我已经养成了每周一次10公里慢跑的习惯。
奔跑的过程中,最困难的是3~5公里,我会不断产生各种念头劝自己放弃;最后几公里反而是最顺畅的,因为我的目标很明确、只要再坚持跑几步就能达到。
一次长跑,也是一个对心性磨炼的过程。
Github: https://github.com/Junedayday/code_reading
Blog: http://junes.tech/
Bilibili: https://space.bilibili.com/293775192
公众号: golangcoding