您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

代码审查是否已经落伍?深入解析最新最佳实践!

时间:2023-09-11 11:16:48  来源:51CTO  作者:

译者 | 刘汪洋

反馈就像一块牛排 - 如果太生,没有人喜欢;但如果过熟,难以下咽。
(ChatGPT)

通过不断审查他人代码,你不仅可以提升自己的技能,对你的职业发展也有很大好处。不仅可以帮助别人成长,也能为你所在的公司创造价值。

在本文中,我们要探讨代码审查的好处,以及一些在审查过程中应遵循的原则,如与同事的互动等。

名词解释

代码审查:对作者代码分支的书面反馈过程。

Pull Request:Github 上用于展示新分支与主分支之间差异的术语,你可以在其中发表评论。

代码审查?是否已经过时?

如果你是一名敏捷开发者,你可能会怀疑代码审查的必要性,可能会有这样的观点:

  • 我们如果一直进行结对编程,就没有必要再做正式的代码审查了。因为这样就不会有一个“陌生人”在你已经完成所有工作并花费了大量时间之后,才来评价你的代码,而他对你的代码的上下文可能一无所知。
  • 代码的正确性已通过 TDD (测试驱动开发)方法进行了验证。
  • 语法和风格可以由 linter 自动检查。

这些考虑无疑是有道理的。

但:

代码审查本质上是一种团队成员之间和不同团队之间的知识共享机制。

代码审查的好处

一旦你不再把代码审查视为负担或者无聊的任务,你会发现,代码审查能带来很多好处。

为了支持这个观点,我提出了一个用于在同事的 pull request 中提供反馈的框架

W3H:即“为什么(why)、做什么(what)、何时(when)以及如何做(how)”

尽管我并非缩写词的狂热爱好者,但我还是创建了一个 W3H 的缩写词,旨在概括我们在接触新的代码时所需要考虑的关键问题。

为什么(why)

代码审查可能是由于你的组织内部的 CI/CD 流程强制推动的,因此,“为什么”的问题可以简单地回答为“因为我被指示要这样做”。

然而,有更有价值的问题值得我们思考:“为什么代码审查如此重要?”或者说,“为什么我应该主动去进行代码审查?”

首先,代码审查对审查者和代码作者来说都是一个提升自我技术水平的好机会。代码作者可以得到有效的反馈和建议,有助于其技术水平的提升。审查者则可以从中学习新的编程技巧和习语。

此外,作为开发者,你还可以:

  1. 更快地理解新的代码库。
  2. 有更多的机会进行团队内交流,尤其在团队成员分布在不同地理位置的情况下。
  3. 发现其他团队工作中可能存在的重复问题。
  4. 在代码库中推动最佳实践的实行。
  5. 提升你在其他工程师和管理者心中的专业形象和知识储备。
  6. 提高你的沟通技巧(我们将在“如何”一节中详细讨论)。
  7. 结识新朋友!

做什么(what)

我们如何定义“优秀的”代码?

在对别人的代码发表任何评价之前,你需要明确好代码的基本标准。

以下是一些通用的原则:

  1. 代码中不应存在 明显的 错误,例如变量名的拼写错误,或者不规范的代码缩进。当我审查一个我并不太熟悉的模块的 PR 时,我通常会从这些基础的检查开始。
  2. 无论代码完成的任务有多复杂,代码本身都应该是 结构清晰 和 易于理解。
  3. 代码中不应存在严重的 性能问题,例如,一个可以通过一次循环读取完成的列表被多次读取。这在移动应用开发中尤其重要,因为这可能导致不必要的电池电量消耗。
  4. PR 只应该修改完成任务(新特性,错误修复,重构)所必需的 文件。这不仅可以减轻审查者的工作压力,而且如果出现了重大的生产问题,也会更容易找到问题并进行回滚。如果代码涉及多个方面,建议作者将其拆分为两个或更多的审查。
  5. 清晰理解更改的目标。PR 的描述应该清晰地说明更改的内容或者链接到包含详细信息的外部文档(例如 Jira 或 Trello 工单)。理解了更改的目标后,再检查更改是否满足了预设的要求。
  6. 如果 PR 是用来修复一个错误,修复方案还应该包含一组测试,这样可以针对特定的场景进行测试,并避免相同的错误在未来再次发生。

何时(when)

你应该在什么时候进行代码审查?

我通常每周安排两次,每次约 30 分钟的时间,审查其他团队的 PR,这些与我自己团队的工作并无直接关联。如果我团队有紧迫的项目截止日期,可能我会减少审查的时间;如果是工作相对清闲,并且有一些评论引发了大量的讨论,我可能会投入更多的时间。

在我刚开始接触 IOS 开发时,我花在代码审查上的时间和学习 Swift 和 iOS 的时间几乎一样多。这使我能够快速地熟悉新的代码库,语言习语,最佳实践,以及了解项目中的关键人物。

我通常在面对学习新的大型代码库时,会立即开始进行代码审查(这是作者有效学习和了解新代码库的一种方法)

如何(how)

编写大量的评论可能会让你感到枯燥乏味,因此你可能在表述上变得过于直白。书面交流与口头交流有所不同,我建议你遵循以下建议:

友善待人

这一点无需多说。通常情况下,当我向我不太熟悉的人写评论时,我会首先用一个简单的 "你好 " 打招呼。如果你发现有什么项目缺失,不要直接用 "这是不完整的" 来表示,你可以询问 "这里为什么会缺失?"

注意细节

尝试在关键的和不那么关键的修改之间找到平衡,这需要你的经验来指导。我们不希望因为一个小的空格问题而阻塞了一个重要功能的实现或者 bug 的解决!

询问作者的意见

如果你提出的改动不显著,或者你提出了重构的建议,那么最好在你的评论结尾处询问一下 "你怎么看?" 或者 "你对此有什么看法?"

有时需要权衡

有些项目比其他项目更为重要。尽量不要因为小的修改而坚持不懈,以免造成发布延迟。你可以与作者达成共识,以后再创建一个"打磨"分支。然而,我常说:

以后 == 永不(later == never)

不要做假设

你正在审查一个 PR 并发现了一个明显的错误,而这段代码的开发者的职称是"初级"。你可能会假设这个错误是由于他们的经验不足,或对一些基本概念的理解不够深入。也可能是他们匆忙完成的,或者在度过了一天的劳累后提交的。或者……可能有一些我们未能看到的、合理的原因在背后。如果有疑问,告诉作者: "可能是我漏掉了什么,但是……"

保持个人偏好的开放性

当你在代码审查中建议更改时,确保这些更改是对代码的实实在在的改进,而非审查者的个人偏好,这些偏好可能并不符合公司或行业的最佳实践。当我提出这样的更改时,我会说: "这是个人偏好的问题,但如果你愿意,可以试试<代码更改>"

赞美作者

“看起来很好(LGTM)” 可能会被解读为“我草率地审查了你的 PR”。对我来说,看到这个还好,但是,如果你真的认为代码写得很好,那就在 PR 中大胆地表扬。以下是值得赞扬的原因:引入了新的炫酷功能,或者进行了复杂但结构良好的重构。

如果 pull request 只包含一个简单的颜色更改或函数参数的添加,那么过度的赞美可能会被误认为是讽刺 。请选择适当的语言表达。

副作用

尽管你持有善意,或者在代码审查过程中为项目贡献良多,有时你的行动可能仍会引发他人的反感。他们可能按照你的建议进行修改,但可能并未对你的审查表示感激。

有些人可能会驳斥你的建议

你的建议可能错误,无效,或者触碰到了作者的自尊心,使他们认为修改代码就等于否定自己。这没有关系。然而,如果你认为某段代码可能会导致严重的问题或性能影响,你应该考虑邀请其他开发者一起讨论,例如在评论中@他们,引导他们参与讨论。更好的做法是,尝试直接通过电话或面对面的方式进行讨论。

不要期待你的付出一定会得到回报

你或许为许多代码审查和批准做出了贡献,帮助审查了他人的代码,但当你自己的代码需要审查的时候,不要期待你的新 pull request 一定会受到关注。

你可能会收获友情

去年,我为了更好地熟悉某个代码库,我对一个新接手的代码库进行了持续的代码审查。我与许多开发者进行了积极的讨论,最终,对仓库中的一些模块进行了改进。这是作者和我——这位新来的代码审查者的共同努力的结果!我结识了一些愿意改进他们代码、并始终对新建议和学习保持开放态度的优秀人才。季度结束时,我向他们请求正式反馈,收到了非常积极的回应。我们可以称这种关系为"联系",甚至我愿意称它为"友谊"。

结语

在这篇文章中,我们探讨了持续进行代码审查的诸多优点。 我推广的 W3H 方法,就是一种给他人的代码提供反馈的流程。

在我所工作的 Expedia Group™,我经常应用这种方法,公司也倡导并正式提出了"有意识的包容"这一价值观。

本文要点总结如下:

  1. 认识到审查他人代码的好处(比如建立联系,熟悉新的代码库,学习新的编码风格等)。
  2. 建立持续审查的习惯。
  3. 提供超越你团队范围的反馈。
  4. 避免过度假设。
  5. 不要期待每个人都会同等地关注你的 pull request。
  6. 保持友善。

你公司的代码审查流程是怎样的?你在工作中是否真正感受到代码审提高了代码质量?欢迎发表你的看法。

译者介绍

刘汪洋,51CTO社区编辑,昵称:明明如月,一个拥有 5 年开发经验的某大厂高级 JAVA 工程师,拥有多个主流技术博客平台博客专家称号。

原文标题:The Importance of Being a Code Reviewer,作者:Carlo Sales



Tags:代码审查   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
代码审查是否已经落伍?深入解析最新最佳实践!
译者 | 刘汪洋反馈就像一块牛排 - 如果太生,没有人喜欢;但如果过熟,难以下咽。(ChatGPT)通过不断审查他人代码,你不仅可以提升自己的技能,对你的职业发展也有很大好处。不仅可以...【详细内容】
2023-09-11  Search: 代码审查  点击:(254)  评论:(0)  加入收藏
代码审查和合并请求:团队合作中的关键
在现代软件开发中,团队合作是不可或缺的一部分。为了确保代码质量、减少错误以及促进知识共享,代码审查和合并请求成为了开发团队中的关键实践。在本文中,我们将深入探讨代码审...【详细内容】
2023-09-09  Search: 代码审查  点击:(298)  评论:(0)  加入收藏
Mac上源代码审查工具
Understand for Mac是应用在Mac上的一款源代码审查工具,Understand非常有效地收集有关代码的度量标准并为您提供不同的查看方式,Understand还为您提供了一种使用已发布的编码...【详细内容】
2019-10-30  Search: 代码审查  点击:(813)  评论:(0)  加入收藏
谷歌分享的代码审查规范
代码审查标准代码审查的主要目的是确保Google代码库的整体代码运行状况随着时间的推移而不断改善。为此目的,设计了所有代码审查的工具和过程。为了实现这一点,必须权衡一系列...【详细内容】
2019-10-14  Search: 代码审查  点击:(736)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(5)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(12)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(8)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(10)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(8)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(6)  评论:(0)  加入收藏
站内最新
站内热门
站内头条