京东云开发者|代码评审的价值和规范

京东,开发者,代码,评审,价值,规范 · 浏览次数 : 94

小编点评

## 代码评审目的及评价标准 **目的:** * 保持公司整体代码的健康状况,始终保持一个较高的水平。 * 确保所有在评审中使用的工具和流程是为此目的而设计的。 * 建立持续改进的代码评审流程,发现问题、解决问题、避免问题。 **评价标准:** 1. **功能:** * 是否达到了预期目标? * 复杂性新增的复杂性是否值得的? * 命名命名是否符合规范且具有良好可读性? 2. **代码风格:** * 是否遵守开发规范优先设计原则? * 是否采用面对面的形式进行代码评审? * 是否保持代码格式一致性? * 是否进行代码风格评审? 3. **代码质量:** * 单元测试是否有单元测试? * 单元测试是否具有良好的可读性? * 是否能覆盖尽可能多的逻辑分支? 4. **代码逻辑与需求:** * 是否能清晰地表达代码的用途? * 是否能有效地进行测试? * 是否能解决问题? 5. **注释质量:** * 是否全面表述代码的意义? * 是否表达代码的用处,而不是解释代码在干什么? * 是否进行代码评审时进行分析? 6. **文档质量:** * 是否同步建立了相关文档? * 是否保持文档格式一致性? * 是否能有效地引导开发者进行代码维护? 7. **评审意见冲突:** * 如何解决研发人员认为评审结果有问题,评审人员如何进行处理? * 如何解决研发人员最常见的拒绝原因? **注意:** * 评审尺度不要为了提高评审速度而牺牲代码评审的标准。 * 代码评审是一个持续改进的过程,发现问题、解决问题、避免问题。

正文

评审目的

代码评审的目的就是为了保证公司整体代码的健康状况随着不断迭代,始终保持一个较高的水平,所有在评审中使用的工具和流程都应是为此目的而设计的。

评审原则

  • 鼓励质疑

  • 保持代码风格,遵守开发规范

  • 优先设计原则,尊重个人偏好

  • 重视每一行代码

  • 尽可能采用面对面的形式

评审时机

研发流程应该是严密的、有节奏的,而个体的代码质量会影响整体交付进度,所以请第一时间启动代码评审,最晚不要超过早期测试阶段。

如果是异步评审的机制,评审过程最好不要超过一个工作日,如果评审时间较长,请在开始评审时进行初步反馈。

评审范围

1. 功能

这个Change List是否达到了预期目标?

并发、数据权限、性能、竞态条件等一系列边缘异常是否合理规避?

2. 复杂性

新增的复杂是否是值得的?

复杂设计的实现是否是可读的?

抽象定义是否是优雅整洁的?

鼓励通过设计提高可扩展性,但不可“面向未来做设计”,二者之间的界限应该是:是否能够看到明确的演进方向(actual shape)和需求

3. 单元测试

是否有单元测试?

单元测试是否具有良好的可读性?

每一个测试是否有断言?

是否能覆盖尽可能多的逻辑分支?

4. 命名

命名是否符合规范,且具有良好可读性?

命名是否能充分表达一个项是什么、用来做什么?

5. 注释

注释内容是否是必须的?

注释信息是否全面表述对应代码的意义?如果发现注释难以解释这段代码,那么很大概率上这段代码应该简化或者重构。

注释信息应表达代码的用处,而不是解释代码在干什么

6. 代码风格

鼓励对代码风格提出改进建议,但请提及这是一项锦上添花的建议,切不可作为评审通过与否的判定条件。

如果使用评审工具,请在评论前标注Nit:,以标识这是一项Nitpick(吹毛求疵)的建议。

7. 文档

是否同时建立了或修改了相关文档?

文档格式是否与原项目保持一致?

8. 上下文

修改的内容是否影响原业务逻辑的上下游依赖?

修改的内容是否导致代码质量下降,甚至系统架构腐化?

9. 优秀的代码设计

请不要忽略change list中你觉得不错的部分,肯定优秀设计比指出错误更有价值。

评审尺度

不要为了提高评审速度而牺牲代码评审的标准,团队内的代码评审应该是一个持续改进的过程,发现问题、解决问题、避免问题,这种正向循环会为研发流程的每一步都带来收益。

problem-circle

如果因为各种原因确实需要加速评审环节,可以按照重要程度降低一部分评审标准。但请在合适的时间,对这部分代码进行重新评审,项目进度紧张不应成为降低代码质量的理由。

如何解决评审意见冲突

评审是对他人工作进行评判,难以避免意见相左的情况发生,通常研发人员会有非常多的理由拒绝评审建议。

1. 谁是对的

如果研发人员认为评审结果有问题,评审人员请优先思考开发者是不是对的,毕竟他们“离代码更近”。

如果评审人员认为评审结果是正确的,合理、适当、礼貌的讨论,会让真相更清晰。

研发人员的反感情绪通常是因为提出问题的方式,而不是对代码质量的坚持。

2. 稍后再解决

研发人员最常见的拒绝原因,就是进度紧张,希望能够先做妥协,承诺后续修正。

但通常之后不会再去做这件事,这并非完全是责任心的问题,而是因为研发人员通常非常繁忙,修复这件事就容易被遗忘。

所以最好将评审建议尽快修复。

3. 评审过于严格

如果评审尺度严格导致研发人员抱怨,那么礼貌的坚持非常有必要,严格的代码评审有助于产出优秀的代码。

可能过了很长时间后研发人员才能看到这部分代码评审的价值,经过论证后的价值观一致更容易建立彼此的认同感。

总结

代码评审是一项具有长期价值的工作,并且对评审双方都具备价值。不要惧怕提出问题,这更容易提高你对问题的认知,如果最终发现你提出的问题是错误的,这对你也是一项难得的提高。更不要拒绝修改问题,即使这些问题在你看来微不足道,反复的正向行为形成惯性,更容易提高工作质量。

作者:康志兴


参考:

  1. https://google.github.io/eng-practices/review

与京东云开发者|代码评审的价值和规范相似的内容:

京东云开发者|代码评审的价值和规范

评审目的 代码评审的目的就是为了保证公司整体代码的健康状况随着不断迭代,始终保持一个较高的水平,所有在评审中使用的工具和流程都应是为此目的而设计的。 评审原则 鼓励质疑 保持代码风格,遵守开发规范 优先设计原则,尊重个人偏好 重视每一行代码 尽可能采用面对面的形式 评审时机 研发流程应该是严密的、有

前端精准测试实践

作者:京东云质量部 背景 随着前端技术发展,已经转变为数据绑定为主流的框架方式,与后端服务一样,前端代码实现也会涉及相互依赖,引用这些场景,那么应该如何准确的评估前端代码改动的影响范围?依赖开发评估?依靠经验评估?或者直接前端自动化全回归?手工测试全回归?显然以上的策略都不是最优策略,本文叙述了通过

Mybatis-SQL分析组件

大促备战,最大的隐患项之一就是慢sql,带来的破坏性最大,也是日常工作中经常带来整个应用抖动的最大隐患,而且对sql好坏的评估有一定的技术要求,有一些缺乏经验或者因为不够仔细造成一个坏的sql成功走到了线上,等发现的时候要么是造成了线上影响、报警、或者后置的慢sql采集发现,这时候一般无法快速止损,需要修改代码上线、或者调整数据库索引。

代码影响范围工具探索

作者:京东零售 田创新、耿蕾 一、背景 1.祖传代码不敢随意改动,影响范围无法评估。并且组内时常有因为修改了某块代码,导致其他业务受到影响,产生bug,影响生产。 2.研发提测完成后,测试进入测试后经常会向研发询问本次需求改动影响范围,以此来确定测试用例,以达到精准测试,提升整个需求的质量,缩短交付

京东云开发者|深入JDK中的Optional

Optional最早是Google公司Guava中的概念,代表的是可选值。Optional类从Java8版本开始加入豪华套餐,主要为了解决程序中的NPE问题,从而使得更少的显式判空,防止代码污染,另一方面,也使得领域模型中所隐藏的知识,得以显式体现在代码中。Optional类位于java.util包下,对链式编程风格有一定的支持。实际上,Optional更像是一个容器,其中存放的成员变量是一个T类

SPI在Java中的实现与应用 | 京东物流技术团队

1 SPI的概念 API API在我们日常开发工作中是比较直观可以看到的,比如在 Spring 项目中,我们通常习惯在写 service 层代码前,添加一个接口层,对于 service 的调用一般也都是基于接口操作,通过依赖注入,可以使用接口实现类的实例。 简单形容就是这样的: 图1:API 如上图

一分钟学会、三分钟上手、五分钟应用,快速上手责任链框架详解 | 京东云技术团队

责任链模式是开发过程中常用的一种设计模式,在SpringMVC、Netty等许多框架中均有实现。我们日常的开发中如果要使用责任链模式,通常需要自己来实现,但自己临时实现的责任链既不通用,也很容易产生框架与业务代码耦合不清的问题,增加Code Review 的成本。

一台不容错过的Java单元测试代码“永动机”

如何将失误降到最低?我们期望能打造一台生产Java单元测试代码的“永动机”,源源不断地为开发者生产代码,辅助大家高效地做好单元测试,节省精力能投入到更多的业务创新中去。

遗留代码处理技巧与案例演示

1 什么是遗留代码 本质是一种技术债务,产生原因一方面是业务原因:如业务本身场景繁多、流程复杂等;另一方面是技术原因:如代码不规范、设计不合理、祖传代码文档注释缺失等。它会影响我们的程序很多方面:如可读性、可修改性、可复用性、可维护性、可测试性等。 2 遗留代码处理过程拆解 划分为梳理->重构/重写

如何有效的解决代码的圈复杂度

不管小型公司还是大型互联网公司,很多项目债台高筑,新功能开发困难。其中一个很大的原因就是代码复杂,可读性差。那复杂度有没有一个明确的衡量标准,我们又如何去解决代码的圈复杂度呢?本篇文章将详细讲解圈复杂度的计算方式以及常用的解决方法。