前言

你是否曾写过一个很简单的需求或者优化?而且你认为不需要审查,就可以直接合并到主分支。可能过了几天或者几周,你突然意识到你犯了一个明显的或是不应该的错误。如果有其他人来审查代码,那这个问题可能就会被发现并及时处理。

CodeReview(代码评审)是一种用来确认方案设计和代码实现的质量保证机制,通过这个机制我们可以对代码、测试过程和注释进行检查,主要用来在软件工程开发过程中改进代码质量。

可能大家会认为必须是领域内的专家或者资深工程师才能审查别人的代码,但是以笔者的经验来看:其实并不是这样的,评审人并不需要完全理解该项目的业务需求或者有多么丰富的编码经验,只需要为本次代码评审提供新的、合理的、符合规范的视角。

下面笔者以自己的实际经验来和大家分享一下,如何做好项目开发中的代码评审。


一、为什么要做

代码评审首要目的就是为我们带来一双新的眼睛,从新的视角去看待那些潜在的问题。

以笔者目前所在的团队来说,代码审查是开发过程中的关键步骤。通过尽早发现和解决问题,不仅能提高产品的质量,还能确保代码的一致性和可靠性,它还能让开发团队对产品的构建方式与产品所需要的标准达成一致。

因此,尽管代码评审可能在当前会比较费时费力,但随着时间的推移,代码审查发挥的作用会越来越明显。


二、有哪些好处

CodeReview 习惯的保持、积极参加团队的 CodeReview,起码能有以下几点显而易见的好处:

  • 提升代码质量:代码评审可以帮助团队成员发现潜在的缺陷、漏洞和性能问题,从而确保代码的稳定性和可维护性。通过评审,团队成员可以互相学习,借鉴他人的优秀实践,提高自己的编码水平。
  • 促进团队协作:代码评审是一种提高团队协作的方式,有助于团队成员更好地了解彼此的工作内容和进度。在评审过程中,团队成员可以互相交流、分享经验,从而提高整个团队的技术水平和解决问题的能力。
  • 保证项目进度:代码评审可以及时发现和解决问题,避免在项目后期出现严重的技术债务。通过评审可以确保项目按计划推进,提高开发效率。
  • 培养团队文化:代码评审有助于培养团队的学习氛围和进取精神。通过互相评审,团队成员可以共同进步,形成积极向上的团队文化。

三、具体怎么做

3.1评审条件

  • 前置条件:代码已通过 Alibaba Java Coding Guidelines(idea 插件)的代码检查;
  • 大型项目:增加/修改超过 10 个文件或超过 200 行代码的,需组织 CodeReview 会议,邀请相关同事及高级/资深开发同事参与;
  • 小型项目:小需求修改如:少于 10 个文件变更或少于 100 行代码的),至少需要 1~2 位同事帮忙 Review 并提出修改建议;
  • 重点逻辑:建议邀请负责过该项目的同事共同 Review 一下,或者在开发的时候结对 Review。

3.2评审重点

  • 完整性检查:功能点、业务日志、异常日志等
  • 一致性检查:代码逻辑是否符合设计文档,代码风格是否统一等
  • 正确性检查:技术选型、注释是否准确、变量的定义和使用等
  • 可修改性检查:如魔法值 123,使用专门的常量类或枚举等
  • 可预测性检查:死循环、无穷递归、数组越界、空指针等
  • 可理解性检查:命名规则、注释是否清晰、git 提交记录描述等
  • 逻辑性检查:实现不过于复杂、代码拆分、可读性、扩展性等
  • 安全性检查:包括防止注入攻击、保护敏感数据、接口鉴权等

3.3评审形式

  • 会议评审:将相关评审人员集中在一起,通过会议讨论的方式进行代码评审,如无其它紧急情况,建议每月一次。此方法适用于中小型团队或重要的代码更改。

    如:

    • 部门负责人组织评审会议,时间可以固定在当月的某一天,大约 15-20 分钟;
    • 地点可以选择一个小的会议室,大约能容纳 10-15 个人,需要有投影设备;
    • 与会人员可以是部门的整个后端团队,拟定一个主评审人,大家都可以参与讨论
  • 随机抽查:随机选择一部分代码进行评审,以验证代码的质量和规范性。这种方法可以作为团队日常工作的一部分。

  • 工具支持:使用代码评审工具来自动化一些评审过程,例如代码静态分析工具和代码规范检查工具。这些工具能够提供一些有关代码质量的重要指标,并帮助识别潜在的问题。


四、还可以怎么做

4.1提出亮点

  • 不仅要提出需要改进的地方,也要提出本次代码评审的亮点,具体可以从以下几点入手:

    • 性能优化:是否有对性能有优化,合理使用数据库连接、时/空间复杂度、内存操作等;
    • 设计模式:是否有抽象出通用的设计模式,显著提高模块的复用率、扩展性等;
    • 工具/插件:是否有能提高效率的工具类,包括可以发布的插件以及自定义注解等。

4.2轮流评审

  • 需要注意的是,主评审人应该是团队里的每一位成员,而不是仅由部门领导或资深工程师来担任,理由如下:

    • 集思广益:每次的代码评审最重要的是引入新的视角来看待潜在的问题,每个人都会有自己的视角,这样有助于团队统一认识;
    • 机会平等:年轻的工程师们虽然可能经验不足,但干劲儿可能比较足,如果能借此机会得到一些锻炼,那么对团队来说会是一件好事。

4.2文档沉淀

  • 有了以上的种种具体做法,那么最终还是要把结果文档化、持久化的,具体可以:

    • 评审会议前由主评审基于模板去拟好一篇文档在会上展示,包括给出代码片段、改进建议、提出亮点等,方便会上大家及时讨论补充;
    • 会后可以上传到团队的文档空间或者工作集当中,方便团队成员随时学习、回顾。

五、文章小结

关于如何做好项目开发中的 CodeReview(代码评审)就和大家分享到这里,希望能对大家有一些帮助。

写在最后,文章如有不足和错误,还请大家指正。或者你有其它想说的,也欢迎大家在评论区交流!

【团队建设】如何做好团队开发中的 CodeReview(代码评审)?的更多相关文章

  1. 完整java开发中JDBC连接数据库代码和步骤[申明:来源于网络]

    完整java开发中JDBC连接数据库代码和步骤[申明:来源于网络] 地址:http://blog.csdn.net/qq_35101189/article/details/53729720?ref=m ...

  2. NC65在日常开发中常用的代码写法

    标题 NC65开发相关代码 版本 1.0.1 作者 walton 说明 收集NC在日常开发中常用的代码写法,示例展示 1.查询 1.1 通过BaseDAO查询结果集并转换 //通过BaseDAO进行查 ...

  3. Java开发中程序和代码性能优化

    现在计算机的处理性能越来越好,加上JDK升级对一些代码的优化,在代码层针对一些细节进行调整可能看不到性能的明显提升, 但是我觉得在开发中注意这些,更多的是可以保持一种性能优先的意识,对一些敲代码时间比 ...

  4. android开发中调用python代码(带参数)

    android开发主要用到的是java代码,但是当开发涉及到一些算法时,往往用python可以提高软件的运行速度,也更加便捷,这里分享自己项目调用python代码的方式,主要有以下几个步骤(个人方法, ...

  5. java开发中JDBC连接数据库代码和步骤

    JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.l ...

  6. 【转】Java开发中JDBC连接数据库代码和步骤总结

    (转自:http://www.cnblogs.com/hongten/archive/2011/03/29/1998311.html) JDBC连接数据库 创建一个以JDBC连接数据库的程序,包含7个 ...

  7. 完整java开发中JDBC连接数据库代码和步骤

    JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.l ...

  8. 完整java开发中JDBC连接数据库代码和步骤 JDBC连接数据库

    JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.l ...

  9. (转)完整java开发中JDBC连接数据库代码和步骤

    JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.l ...

  10. JavaScript开发中常用的代码规范配置文件

    一.jsconfig.json { compilerOptions: { target: 'es6', experimentalDecorators: true, allowSyntheticDefa ...

随机推荐

  1. CLR via C# 笔记 -- 计算限制的异步操作(27)

    1. 线程池基础. 创建和销毁线程是一个昂贵的操作,要耗费大量时间.太多的线程会浪费内存资源.由于操作系统必须调度可运行的线程并执行上下文切换,所以大多的线程还对性能不利.为了改善这个情况,CLR包含 ...

  2. 使用Scrcpy 在电脑显示手机画面并控制安卓设备

    使用Scrcpy 显示手机画面并控制手机 原文(有删改):https://www.iplaysoft.com/scrcpy.html 背景 本文适用于安卓开发人员,不针对普通安卓手机用户. 在安卓开发 ...

  3. 嵌入式编程的 4 种模型:轮询、中断、DMA、通道

    轮询方式 对I/O设备的程序轮询的方式,是早期的计算机系统对I/O设备的一种管理方式.它定时对各种设备轮流询问一遍有无处理要求.轮流询问之后,有要求的,则加以处理.在处理I/O设备的要求之后,处理机返 ...

  4. 算法金 | Transformer,一个神奇的算法模型!!

    大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 抱个拳,送个礼 在现代自然语言处理(NLP)领域,Transformer 模型的出现带 ...

  5. 【论文阅读】Trajectory-guided Control Prediction for End-to-end Autonomous Driving: A Simple yet Strong Baseline

    参考与前言 Summary: leaderboard 现存第一名 TCP,非常simple的设置 取得了很好的效果 论文链接:Trajectory-guided Control Prediction ...

  6. Vue 框架怎么实现对象和数组的监听?

    如果被问到 Vue 怎么实现数据双向绑定,大家肯定都会回答 通过 Object.defineProperty() 对数据进行劫持,但是 Object.defineProperty() 只能对属性进行数 ...

  7. SpringBoot 解决跨域问题

    今天遇到一个很神奇的问题,之前写的项目,后端跨域都处理好的,按部就班使用原来的方式,前后端都开发完之后,部署本地后,跨域没起效,一脸懵逼,然后使用公司另外一个同事的跨域解决方案,具体我也没深入研究到底 ...

  8. JS 延迟加载

    function sleep(numberMillis) { var now = new Date(); var exitTime = now.getTime() + numberMillis; wh ...

  9. CF580C

    说句实话,这道题作为蓝题过于简单了一点 #include<iostream> #include<utility> #include<vector> using na ...

  10. 流式查询1. mybatis的游标Cursor,分页大数据查询

    流式查询流式查询 指的是查询成功后不是返回一个集合而是返回一个迭代器,应用可以通过迭代器每次取一条查询结果.流式查询的好处是能够降低内存使用.例如我们想要从数据库取 1000 万条记录而又没有足够的内 ...