谈谈我们公司如何做Code Review

2023-11-13

研发中心团队越来越庞大了,开发人员越来越多了。和他们聊天过程中,发现开发人员对代码技能的提升很迷茫,诉求越来越浓厚。只不过一个接一个的项目交付没有给他们太多停留的时间,在这种情况下如何给团队营造浓厚的工程师交流氛围呢?

    方法有多种,最近进行了《代码分支管理》和《代码的好味道和坏味道之22种坏味道》培训,大家兴趣很高。但是最被认可的还是Code Review活动。

    那么 Code Review到底能给团队带来什么?什么样的团队需要进行Code Review活动?如何有效开展Code Review活动?用哪种方式会比较好呢?
一、Code Review到底能给团队带来什么?

    通过参与实战和团队成员讨论思考,我认为Code Review最大的作用促进工程师日常代码交流和技术成长,与此同时对产品质量进行把关。

    很多团队在Code Review前期重点会是找问题(代码规范、潜在缺陷、BUG,代码设计等等),越到后期它更大的意义将演变成工程师交流土壤的培育和人员成长的促进。
二、什么样的团队需要进行Code Review活动?

    Code Review作为业界公认的最佳实践,如果每个团队都能运用起来,固然是最好的,但是由于这项活动跟“人”这个因素密切挂钩,所以,它是否能有效运作跟团队状态、技术信仰和领导者诉求等都有莫大关系。

    从代码质量提升的角度上看,以下类型的团队可以把CodeReview活动有效运作起来:

  1. 技术驱动型团队:一般涉及系统底层逻辑较多,功能路径难以被测试覆盖,而质量问题很多时候是致命的,所以这样的团队更多需要开发编码的严谨性和相关代码质量的保证活动。
  2. 公共服务型团队:一般服务于多个团队,一旦出现质量问题影响范围会比较广,所以除了在测试方面加以把关外,通过CodeReview活动来提升开发质量是非常有必要的。
  3. 测试缺失型团队:这样的团队由于缺乏测试环节,质量问题带到线上的风险会很高,强烈建议在开发环节做好自检工作。
  4. 新人密集型团队:新人的代码可读性往往是比较差的,特别需要组织能及时给予纠正,帮助新人养成良好的编码习惯。同时如果团队产出的代码可读性较高时,新人也可以更快上手工作。
  5. 任何有主观意愿的团队:这样的团队或领导者认同Code Review的意义,或团队成员对代码质量提升有追求。

    Code Review活动跟人这个因素密切相关,以下类型的团队暂时不适合开展CodeReview活动:

  1. 不认同型团队:即领导和团队骨干都不认同CodeReview意义的团队,这样的团队无论从推动还是坚持上都有很大挑战。
  2. 疲于应付型团队:这种团队一般没有建立必要的持续提升机制,每天淹没在各种需求沟通实现变更和优化中,代码质量提升活动也很难被列入backlog。
  3. 创新型团队:这种团队的重要任务是要把产品快速推向市场进行价值验证,所以在代码编写上要求足够敏捷,代码暂时的混乱完全可以接受。

    大家在考虑自身团队是否要推行Code Review时,可结合团队实际状态进行综合考虑。但一般来说,如团队主观意愿没有问题,就可以大胆推行开展。
三、如何有效开展CodeReview活动?

    要想在团队内部有效运作CodeReview活动,必备四要素。

1、代码规范:明确Coding规则

    如果不定义好Coding标准,那在检视过程中就会存在两种情况:一种是各种不同的意见很难快速达成一致,影响review效率,另外一种是团队根本就不会重视代码规范的检视。
2、检视指南:消除困惑和迷茫

    一个团队并不是所有人都是老司机,有很多同学是没有代码review经验的,他们往往不知道应该重点 check哪些点。这个时候结合自身业务特点和团队之前踩过的坑,制定一个checklist是非常必要的:

  • 什么写法可能导致性能低下?
  • 哪个接口要慎用?
  • 哪些设计方式需要规避?
  • 什么习惯容易引发内存泄漏?

    这样可以让经验不足者在不知道要review什么时,能有的放矢,过程中逐步积累起经验。
3、总结优化:透明问题,持续优化(非常重要)

    很多团队的CodeReview活动坚持不下来或逐步流于形式,其实最主要原因是过程中缺乏定期回顾和总结,从而不知道如何有效促进和帮助团队更好运作。
4、激励机制:激发主观能动性

    激励机制的设立有很多种,都是在定期回顾的基础上根据CodeReview的实际情况对表现积极的同学进行一定的礼品奖励(选择什么礼品,要看组织的经济状况,哈哈)。
四、Code Review方式很多,用哪种会比较好呢?

    目前业界运作Code Review的方式有多种方式,目前每种形态都有各自的市场,被不同的团队运用着。

接下来笔者个人角度分析下各种形态的优缺点,供大家参考:

  1. 强制&非强制: 按照经验,Code Review启动前期建议采用强制要求,否则很难有效开展起来。
  2. 小片段&大模块:如果想要让问题暴露更充分或降低review的难度,建议采用细粒度方式进行,即小片段review。如果更关注全局设计和逻辑思路的学习和找茬,那么可以用模块方式统一review。但很多时候这两种方式是可以结合运作的。
  3. 线上交流&线下会议: 如果想提高效率,建议采用线上方式进行交流,这里需要公司提供Code Review工具。如果更喜欢全员一起找茬的那种快感,那么可以采用线下会议方式开展,但采用开会的方式,一般成本较高,可看团队接受度。
  4. 事前&事后:这里指的是发布前还是发布后。版本发布后统一进行Code Review的方式更多是一种代码交流活动, 起不到代码质量把关的作用。反之,如果在版本发布前就对代码进行Code Review,就可以对质量问题起到很好的把关作用。这里是时间和质量之间的权衡。
  5. 高频率&低频率:建议把代码交流放在每一天,所以频率越高越好。具体根据团队实际情况进行安排即可。
  6. 此外,也有团队采用模块Owner把关质量的Code Review方式,这种更多是从质量风险规避角度上考虑,在代码提交前Owner检查是否有质量问题,确认没有问题后方能发布,有这方面需要的团队也可以考虑这种方式。

   个人推荐的Code Review方式是强制+事前+小片段+线上交流+高频率,但是,团队状态不一样,选择方式允许有差异,所以具体选用哪种方式组合,还是要由团队自己作主。
五、总结四类Code Review方法

1、 正式的代码审查

    正式的代码审查是基于正式的开发流程。其中最流行的实践是范根检查法(Fagan inspection)。它为试图寻找代码的缺陷提供了一种非常结构化的流程,并且,它还可以用于发现规范(specifications)中的或者设计中的缺陷。范根检查法由6个步骤组成:计划(Planning),概述(Overview),准备(Preparation),召开检查会议(Inspection Meeting),重做(Rework),和追查(Follow-up)。基本的思想是:预先制定好每一个步骤所需要达到的输出要求。接下来,当进行到某个过程时,你检查其现在的输出,并与之前制定的理想输出要求做比较。然后,你由此来决定,是否进入下一个步骤,或者仍需在当前步骤继续工作。

    这种结构化的流程用的并不多。其原因是,这种流程带来很大的开销,并没有多少团队用到它。

2、轻量级的代码审查

  • 瞬时的代码审查,也称为结对编程(pair programming)。

    发生在结对编程的情景中。当一个开发者在敲键盘写代码的同时,另一个开发者盯着代码,注意着代码中潜在的问题,并在此过程中给出提升代码质量的建议。结对编程适用于两个有相似经验水平的开发者处理复杂的业务问题的情况。

  • 同步的代码审查,也称为即时(over-the-shoulder)代码审查

    一个开发者独自编写代码,当她写完代码后,立即找代码审查者进行审查。审查者来到开发者的桌前,看着同一块屏幕,一起审查、讨论和改进代码。当审查者不清楚这个任务的目标时,这种代码审查类型会很有效果。

  • 异步的代码审查,也称为有工具支持的(tool-assisted)代码审查

    开发者在写完代码后,让这些代码对审查者可见,然后开始她的下一个任务。当审查者有时间了,他会在自己的桌子上按自己的时间表进行代码审查。他而不需要当面和开发者沟通,而是用工具写一些评论。在完成审查后,那些工具会把评论和需要的改动通知给开发者。开发者就会根据评论改进代码。异步的代码审查应该作为每一个专业开发团队的默认选项。

  • 基于会议的(meeting-based)的代码审查

    目前我们的大部分团队采用的方式就是每个迭代会和整个团队开一次代码审查会议。我们坐在会议室,每一个开发者展示并解释着他最近写的一段困难的代码。其他开发者尝试寻找着潜在的缺陷,发表评论,给出如何改进代码的建议。我感觉这种做法适用于的一种情况:当整个团队都没有代码审查的经验时,让把每个人聚起来,一起做代码审查,这样弄几次之后,可能会帮助每个人理解代码审查的目标和意义。然而,从长远来看,这类型并不是一个合适的技术,因为让全组成员审查一段代码是很低效率的做法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

谈谈我们公司如何做Code Review 的相关文章

  • 在职场中哪些人不会被企业团队选用?在企业团队中哪些人不能用?

    企业团队离不开员工的打拼 那么现在人才济济的社会 企业团队中那些人是不能用的 小人不能用 当今社会我们评论一个人的好坏 首先看到的是他的道德品质 当一个人的道德品质不行 道德品行很差时 我们统称这类人为小人 都说远小人 在职场中也一样 小人
  • 谈谈我们公司如何做Code Review

    研发中心团队越来越庞大了 开发人员越来越多了 和他们聊天过程中 发现开发人员对代码技能的提升很迷茫 诉求越来越浓厚 只不过一个接一个的项目交付没有给他们太多停留的时间 在这种情况下如何给团队营造浓厚的工程师交流氛围呢 方法有多种 最近进行了
  • 概要设计的必要性及写法

    1 1 文档的重要性 很多小伙伴在需求 开发 测试阶段不注重文档 认为这耽误时间 画蛇添足 实际上文档对于软件行业是十分重要的 软件的定义 软件是包括程序 数据及其相关文档的完整集合 从这个定义中我们能够体会到文档的重要性 很多小伙伴常说要
  • 设计模式之桥接模式

    文章目录 一 手机操作问题 1 传统方案解决手机操作问题 2 传统方案解决手机操作问题分析 二 桥接模式 1 基本介绍 2 原理类图 三 桥接模式解决手机操作的问题 1 类图 2 代码 2 抽象类 抽象类子类 行为类接口 接口实现类 客户端
  • 项目资源管理

    目录 申明 1 核心概念 2 虚拟团队 分布式团队 3 规划质量管理 3 1 1 输入 3 1 2 工具和技术 3 1 2 1 责任分配矩阵 3 1 3 输出 4 估算活动资源 4 1 1 输入 4 1 2 工具与技术 4 1 3 输出 4
  • IT项目管理第6次作业

    IT项目管理第6次作业 一 教材练习6 a 画出该项目的双代号网络图 把节点的号码标在一个圆圈内 画出节点之间的箭线 在每一条箭线上标注代表活动的字母和活动工期 b 按照图6 8表示每条路径的方法 找出网络图中的所有路径并标出它们的长度 路
  • [项目管理-30]:项目成员成熟度以及采取的不同的策略

    目录 前言 一 管理的误区 二 帮助部属的四种层次 2 1 四种类型 层次 2 2 四象限法差别化帮助 三 项目经理自身可以使用的权力 资源 3 1 专家权力 3 2 奖励权力 3 3 正式权力 3 4 参照性权力 3 5 惩罚性 强制性权
  • 四段论提问让ChatGPT更懂你心!

    用户故事是描述客户需求的方法 通常记为四段论的格式 角色 功能 目的 验收标准 如 作为一个家庭主妇 我需要一个30平方米的餐厅 用以招待10位客人聚餐 我希望这个餐厅 1 四四方方 2 距离厨房不超过10步 3 光线充足 白天可以不开灯打
  • 小白如何做好项目管理?看这里

    作为项目管理新手 你刚被安排负责一个重要的新项目 这是你的第一个项目 是一个重大的挑战 以下这些方法可以帮你有个好的开始 成功管理你的第一个项目 一 学习和培养能力 能力发展首先要突破不知道没有能力 认识项目管理是一个职业方向 通过了解项目
  • 架构师--IT策略灵魂的创造者

    http blog csdn net aspop archive 2006 01 21 585823 aspx 在比尔 盖茨的众多称谓中 据说他更偏爱 首席软件架构师 同样 在网易创始人丁磊名字前 也有 首席架构师 这样的称谓 对于企业来说
  • xmind使用学习

    1 Background 这年头不画个思维导图都不好意思搬砖了 闲暇之余学习了下用xmind来画图 记录于此 2 Concept 主题 有中心主题和分支主题 子主题 一个主题的下一级主题叫子主题 自由主题 独立于中心主题 分支主题外的主题
  • maven学习总结系列

    maven学习总结系列 最近工作中需要一些maven的知识 也是想正规的学习下maven的知识点 所以才有了这次的总结 希望自己的总结能够帮助到大家 另外 我只会根据我工作中需要到的知识点进行总结 不需要的 或者我觉得没啥用的 我就不写了
  • 预警:传统的QA岗位将被DevOps淘汰

    导读 在大多数机构或公司里 软件开发过程主要遵循一个或多个开发模型 例如瀑布模型或敏捷模型 在瀑布模型中 测试活动一般都在后期进行 软件开发完成后 缺陷被QA团队找出 然后再被修复 后两个活动不断循环和重复 指导管理者认为软件可以被公开发布
  • 软件项目管理与开发流程管理 课程

    软件项目管理与开发流程管理 课程背景 以 IT领域典型的软件开发项目管理为主线 结合业界公认最成功的Rational软件开发统一流程架构 Rational Unified Process 和奉为项目管理圣经的美国项目管理协会 PMI 项目管
  • RK3568 IDB烧录失败解决方法

    1 简介 公司有个RK3568的项目使用了三星的8GB eMMC5 1 KLM8G1GETF B041 但在硬件回板的时候 发现个别单板程序烧不进去 会报下载IDB失败 部分串口打印日志如下 DDR Version V1 09 202106
  • 开发工具链-DevOps_阿里云云效

    简介 阿里云效官网 DevOps Development和Operations的组合词 是一组过程 方法与系统的统称 用于促进开发 应用程序 软件工程 技术运营和质量保障 QA 部门之间的沟通 协作与整合 百度百科 快速开始 1 云效首页
  • [需求管理-4]:需求分析全过程:需求分析+资源评估+项目计划

    前言 需求收集后 需要经过漫长的需求分析和所需要评估过程 才能正式在某个软件版本中实现需求 在软件开发人员通过编程实现需求前 中间经过了多种角色的辛苦劳动 最终才会生成需要规格说明书 需求规格说明书是逐步由粗到细的分解过程 一个需求 要进入
  • Scrum

    产品列表梳理会 Backlog Refinement Meeting 会议目的 Refinement 这个词是加工 提炼的意思 在scrum里 其实就是对下阶段的需求做一个讨论 澄清 细化的一个活动 希望通过这个活动 使得团队能对后续阶段的
  • [项目管理-25]:高效沟通的利器,结构思考力与树形结构化表达

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 前言 第1章 结构化思考力概述 1 1 非结构化思考力的问题与结构化思路力的好处 1 2 什么是结构化思路力 1 3 三大沟通层次 层
  • 【神器】wakatime代码时间追踪工具

    文章目录 wakatime简介 支持的IDE 安装步骤 API文档 插件费用 写在最后 wakatime简介 wakatime就是一个IDE插件 一个代码时间追踪工具 可自动获取码编码时长和度量指标 以产

随机推荐

  • 【深度学习——点云】DGCNN(EdgeConv)

    这篇文章提出一种边卷积 EdgeConv 操作 来完成点云中点与点之间关系的建模 使得网络能够更好地学习局部和全局特征 论文地址 Dynamic Graph CNN For Learning On Point Clouds 1 Motiva
  • rustup 慢_Rust 慢更贴[持续更新Rust学习的点点滴滴]

    入门篇 Rust入门系列 这个帖子会一直更新 欢迎大家回复 首先从安装来写把 rust安装 在写这篇文章的时候 rust最新版本是1 35 安装的步骤大家可以直接上rust官网 https www rust lang org curl ht
  • 招银网络科技电话面试

    1 关于项目的负责内容 还是非常有必要熟悉应急 天基的基础传输模块的 基本面试中都会觉得只界面模块很单薄 应急 基础传输模块 无人机网络协议 速率控制模块 界面模块 天基 基础传输模块 MRUDP 界面模块 2 TCP长连接 问 如何在TC
  • 每日一面系列之volatile 的理解

    volatile 是 Java 虚拟机提供的轻量级的同步机制 有三大特点 保证可见性 不保证原子性 禁止指令重排 保证可见性 当多个线程操作共享数据时 彼此是不可见的 由此提出 JMM java 内存模型 JMM java 内存模型 是一种
  • Words Seven

    2019独角兽企业重金招聘Python工程师标准 gt gt gt bar 棍子 酒吧 栅栏stick lip stickbarrier bar r er 障碍 hurdlebarrel bar rel 木桶barren bar ren 贫
  • 数二考纲新增内容-比较审敛法

    总的来说 为了避免出现2010年数一数二选择题的超纲嫌疑 命题组明确了会考察反常积分的比较审敛法 其实之前在做题中都已经涉及 主要多了一个反常积分的极限形式 这里给出一个总结 关于反常积分敛散性的原理 还有一个解题技巧就是利用对数 指数 幂
  • java数据类型转换,基本数据类型和String数据类型之间的转换

    6月16日学习打卡 自动类型转换 强制转换 基本数据类型和String转换 3 8类型转换 3 8 1自动类型转换 1 低精度向高精度赋值可以自动转换类型 char gt int gt long gt float gt double byt
  • 探索TiDB数据库

    一 TiDB介绍 TiDB是一款定位于在线事务处理 在线分析处理的融合型数据库产品 实现了一键水平伸缩 分布式事务与基于Raft协议保证强一致的多副本数据安全 具有实时OLAP等重要特性 同时兼容MYSQL协议和生态 迁移便捷 运维成本低
  • 老表,教你一招啊!!!如何用python实现将csv文件快速导入数据库,建议收藏!!!

    直接上代码 import pandas as pd from sqlalchemy import create engine MySQL的用户 root 密码 147369 端口 3306 数据库 date engine create en
  • 一行代码下载优酷、腾讯、B站等公开视屏

    安装you get工具包 pip install you get 下载命令解析 you get o e 123 o后面接本地地址 https v youku com v show id XOTQ3NjI1ODc2 html 为视屏页地址
  • RabbitMQ MQTT集群方案官方说明

    RabbitMQ MQTT 官方网说明 官方地址 https www rabbitmq com mqtt html 从3 8开始 该MQTT插件要求存在一定数量的群集节点 这意味着三分之二 五分之三 依此类推 该插件也可以在单个节点上使用
  • mysql除法函数_理解MySQL运算符和常用内置函数_MySQL

    一 MySQL中的运算符 注意事项 1 在除法运算和模数运算中 如果除数是0 将是非法除数 结果返回NULL 取模运算中 也可以用MOD a b 函数或者a b mysql gt select 1 0 100 0 1 0 100 0 NUL
  • 码上行动:利用Python与ChatGPT高效搞定Excel数据分析

    AI时代Excel数据分析提升之道 知识精进 学习答疑 上机实训 综合实战 ChatGPT应用 零基础入门 极速提升数据分析效率 亮点 1 零基础入门宝典 由浅入深讲解 无须额外的背景知识即可学习掌握 2 内容系统全面 可帮助读者快速了解使
  • C0177 [2004普及组-A]不高兴的津津(C语言写)

    题目描述 津津上初中了 妈妈认为津津应该更加用功学习 所以津津除了上学之外 还要参加妈妈为她报名的各科复习班 另外每周妈妈还会送她去学习朗诵 舞蹈和钢琴 但是津津如果一天上课超过八个小时就会不高兴 而且上得越久就会越不高兴 假设津津不会因为
  • 音频PCM数据的单声道、双声道之间的转换

    在使用tinyalsa处理PCM音频数据时发现该设备只能以双声道形式打开设备 tinypcminfo工具可以查看设备信息 out和in里面channels 最大和最小值都是2 但是实际使用中有时候又需要声卡采集和播放单声道数据怎么办 那就只
  • 入门级题解3. 无重复字符的最长子串

    题目 给定一个字符串 s 请你找出其中不含有重复字符的最长子串的长度 思路 这样一来 我们就可以使用 滑动窗口 来解决这个问题了 我们使用两个指针表示字符串中的某个子串 或窗口 的左右边界 其中左指针代表着上文中 枚举子串的起始位置 而右指
  • Niagara官方示例笔记 - 盘点自带重要模块

    Emitter State life cycle生命周期控制 发射器选择system 所有发射器都在system的state里设置生命周期 选择self 发射器独立控制 可以给发射器创建不同类型变量 使用set parameter模块计算
  • 【Vegas原创】ORA-16040 standby destination archive log file is locked解决

    ORA 16040 standby destination archive log file is locked Cause The target standby destination archive log file is curren
  • serverless与容器优缺点

    容器优势 1 可移植性 使用容器 开发人员可以确保他们的应用程序可以在任何云平台或本地服务器上运行 2 轻量化 容器镜像以层叠加 在本地拥有镜像层缓存 计算资源使用方面 容器也比虚拟机更高效 3 快速启动 容器启动在镜像只读层上叠加一层读写
  • 谈谈我们公司如何做Code Review

    研发中心团队越来越庞大了 开发人员越来越多了 和他们聊天过程中 发现开发人员对代码技能的提升很迷茫 诉求越来越浓厚 只不过一个接一个的项目交付没有给他们太多停留的时间 在这种情况下如何给团队营造浓厚的工程师交流氛围呢 方法有多种 最近进行了