朱赟的技术管理课
朱赟
计算机博士,前 Airbnb 技术经理
48935 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 39 讲
时长 13:23
时长 13:31
朱赟的技术管理课
15
15
1.0x
00:00/00:00
登录|注册

32 | 硅谷人如何做 Code Review

制定统一的编程规范和代码风格
鼓励员工帮助别人审核代码
统一的代码提交和审核流程与工具
审核的内容
审核的粒度
确保所有改动都经过测试
找谁审核
尽量保持PR的单一性
PR中写明改动的目的
从彼此那里学到很多编程的小技巧和好习惯
多几双眼睛一起帮你看一遍
工程师们很难保证万无一失
公司层面的支持
代码审核者的注意事项
代码提交者的注意事项
新系统和新功能
系统迁移
代码优化
Bug修复
代码审核人的学习和成长过程
帮助别人成长的重要性
不是帮他写代码
工程师在GitHub页面上给出评论
特别关键代码需要相关人员确认
PR必须得到认可才能合并
PR (Pull Request)
Commit
总结
Code Review的注意事项
提交代码的类型
帮助别人成长
代码合并规则
两个概念
硅谷人如何做 Code Review
参考文章

该思维导图由 AI 生成,仅供参考

今天技术管理课的主题是: Code Review,也就是我们常说的代码评审。Code Review 主要是在软件开发的过程中,对源代码进行同级评审,其目的是找出并修正软件开发过程中出现的错误,保证软件质量,提高开发者自身水平。
和国内的工程师聊天,发现国内公司做代码评审的比例并不算高,这可能和各公司的工程师文化有关系。不过硅谷稍具规模的公司,代码评审的流程都是比较规范的,模式也差不多。

首先是两个概念

在进入正题之前,先介绍两个概念,一个是 Commit,一个 PR。硅谷大部分公司都使用 GitHub 企业版管理自己的代码仓库,GitHub 里的 Commit 和 PR 的概念在代码审核中非常重要。
1 Commit。就是 GitHub 上的一次“ Commit ”行为,这是可以单独保存的源代码的最小改动单位。
2 PR。也就是 Pull Request,是一次代码提交请求。一个 PR 可以包含一次 Commit,也可以是多个。提交请求后 GitHub 会在相关页面上显示这次提交请求的代码和原代码的所有不同之处,这就是本次 PR 的所有改动。
请求提交后,其他工程师可以在 PR 的页面上提出意见和建议,也可以针对某一些代码的改动进行讨论,也可以给整体评价。代码的作者也可以回复这些意见和建议,或者按照建议进行改动,新的改动将为本次 PR 中提交新 Commit(也可以覆盖之前的 Commit)。
关于 GitHub 和 Pull Request,池老师最近在他的公众号里写了一篇“
GitHub 为编程世界带来了什么改变 ”,这篇文章中有比较详细的描述,你可以参考学习。

其次,我来谈谈代码合并规则

一般情况下,所有的 PR 都必须有至少一个人认可,才能进行合并。如果改动的内容涉及多个项目,则需要每个项目都有相关人员认可才能合并。还有一些特别关键的代码,比如支付相关的,通常也会需要支付组的人确认才行。
在代码合并之前,进行 Code Reivew 的工程师们会在 GitHub 的相关页上给出各种评论,页面是共享的,这些信息大家都能看到。
有些评论是询问,代码的作者直接回复或解释就行,有些是指出代码的问题,代码作者可能会据此改动,也可能不会同意,那就需要回复评论,阐述观点,你来我往。有时候一个实现细节,讨论的主题可以多达十几条或几十条,最终需要达成一致才能进行合并。

再次,帮助别人成长,而不是帮他写代码

以前有朋友会说:“看到代码写得太差,觉得来回评论效率太低,干脆自己冲上去搞定” 。曾经我也有过类似的想法,不过我慢慢意识到这并不是一个合适的想法。
首先,从对方的角度来说,代码写不好,可能是对业务不熟悉,对编程语言不熟悉,也可能是对公司代码的整体架构不熟悉。如果你帮他 “写” ,而不是耐心指出哪里有问题,那么下一次他可能还是不知道怎么做。这样不仅无益于别人成长,有的时候甚至会让别人有挫败感。
并且,帮别人写代码的方式可扩展性很差。即使 Code Review 会花掉十倍于你自己写的时间和精力,但它会让人明白代码应该怎么写,从长远来看,这其实是在一定程度上 “复制” 你的生产力。
你不能什么都自己写,尤其是开始带项目、带新人以后。每天 Review 五个人的代码和写五个人的代码,长期而言哪个更合算呢?答案显然是前者。
写代码是一个学习过程,怎么做一个好的代码审核人更是一个学习和成长的过程。自己绕过一个坑不难,难的是看到别人那么走,远远地你就能告诉他那里有个坑,而他在你的指导下,以后也会帮忙指出别人的类似问题。
我在这一点上最近感触尤为深刻。随着团队越来越大,新人也越来越多,有一段时间我每天工作的一半时间都在 Review 别人的代码,写评论。
这样做的初期确实比较辛苦,不过效果也随之慢慢显现,大部分时间工程师们已经可以进行相互 Reivew 代码了,于是我可以腾出很多时间来做别的工作,代码质量也得到了保障。

提交代码的类型

在进行 Code Review 之前,要搞清楚提交的代码到底是干嘛的,然后进行针对性的审核。我们一般把提交的代码分成四类。
Bug 修复。一般公司都有独立的 Bug 追踪和管理系统,每个 Bug 都有一个票据。代码提交的 PR,一般和票据是关联的。
代码优化。比如文件的移动和拆分,部分函数的重构等。
系统迁移。包括代码库拆分,用另一种语言重写等。
新系统和新功能。新功能在实现之前都需要进行设计审核,最终版本的设计文档会包括数据库的 Schema、API 的签名( Signature )、代码的流程和模块等内容;相关代码的提交,也就是 PR,一般是和设计文档挂钩的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

硅谷代码评审流程与规则 硅谷公司的代码评审流程和规则是软件开发中不可或缺的环节。本文介绍了代码评审的重要概念、代码合并规则、帮助他人评审代码的重要性以及提交代码的类型。在代码审核中,提交者需要清晰说明PR的目的和详细改动内容,尤其对于前端代码,提供改动前后的截屏。审核者需要关注代码格式、可读性、业务边界、错误处理、测试用例覆盖、代码质量和规范以及代码架构等方面。此外,公司应提供统一的代码提交和审核流程与工具,鼓励员工相互帮助进行代码审核,并制定统一的编程规范和代码风格。代码评审不仅有助于减少错误,还能促进技术交流和学习。通过相互审核,工程师们可以学到许多编程技巧和好习惯。总之,代码评审在软件开发中具有重要意义,有助于提高代码质量和团队合作。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《朱赟的技术管理课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(22)

  • 最新
  • 精选
  • songyy
    写蛮棒的,我比较喜欢文中的观点: 1) 代码审查可以让工作可扩展; 2) 审查边界情况; 3) 代码回滚的例子; 4) 那段Ruby代码的考虑点问题; 5)有ui改动相关的,要给改动前和改动后的对比图(这点我一直在做,也在要求别人做 😁) 此外,从我经验上,还有这么几点: 1) 持续集成环境可以跑测试,测试结果可以自动加到PR上面(我觉得你们肯定是有在这么做的 😁)。这样子让review的人有个更好的信心 2) 代码在build的过程中,可以加上linter,进行code style的检查(我觉得这个你们肯定也在做 😁)。持续集成环境可以把检查结果加在PR上面。我们公司在用code climate的Chrome plugin,这样子做code review的人就不需要提style相关的改动了:能让机器做的事,就没必要让人来做 3) 如果希望强制互相的代码审查,可以在github里面设置,比如master branch,是protected branch,只有在ci通过,有人approve了这个pull request之后才允许merge 4) 在pull request本身要给足context信息,从而让进行review的人很容易搞清楚这个pr在做什么;在之后希望溯源什么改动的时候,在定位到这个pr时,也可以更好地了解当时做这个改动的原因。

    池建强回复: 这回复写的真是专业,赞

    2018-01-25
    55
  • archmageforac
    我是做Android开发的,负责的是公司Android APP内的一个模块,整个APP是插件化的架构,即APP本身所在项目是一个空壳,通过配置来决定哪些模块会集成进APP。我们这边的做法是: Step 0. Push检查:在每次push之前,检查提交者是否已经自测过了自己修改代码相关的全部分支,并会生成一个自测覆盖率,提交到commit信息中。如果自测覆盖率过低,reviewee需要给出合理原因解释。 Step 1. Merge检查:在提交PR前,先进行代码静态检查,比如lint检查、组里资深工程师根据业务制定的“坏味道”检查等,这样可以避免绝大部分低级错误和常见的共性错误。 Step 2. 人工review,reviewer会指定一个资深同学和一个新人,资深同学把关,新人学习和了解其他同学coding的思路。同时也鼓励新人提出自己的见解,进行思想碰撞。reviewee是新人的话,reviewer会更加注重实现细节,会讨论和比较其他的实现方式;是资深同学的话,会更加侧重在整体架构设计上。 Step 3. 代码合入后,会走一个自动化的打包和集成工作。打包后会集成进APP,这个过程会在APP范围内进行全局检查,确保没有底层项目接口变更导致上层项目接口调用失败的问题。 Step 4. 集成后形成一个apk,然后跑自己业务以及整个APP核心路径的单元测试。这一步其实目前我们还没有,但我觉得是有必要的,正在计划推动落地。

    作者回复: 赞!

    2019-04-20
    13
  • 杨石坡
    我们也有代码审核,但是我认为很失败,主要表现在形同虚设。 原因如下: 1.领导分配任务时,没有给评审分配时间。在相同的时间内,在原有工作量之上在加入代码评审,评审就是负担,应付了事;再说代码评审有没有奖惩。不看代码,接先approval然后merge就成了最常见的做法。 2.pr看不懂 a.pr说明描述不清或者没有描述。 b.pr里面包含很多东西。 3.pr不给留时间,或者留时间了也没有人看。
    2018-01-25
    8
  • self-discipline
    首先是招聘到合适的人;其次如果人不行,怎么推进点东西都费劲的;我们这我推进的代码审核,好似把他们打劫了一番,好比老牛不喝水推上刑场一般
    2018-07-30
    1
    6
  • H
    很庆幸之前的团队就是这么做的,开始觉得太苛刻,后面慢慢觉得这样对大家(特别是对自己)的成长挺大的。后面我在review别人的代码的时候也“苛刻”了些😬
    2018-02-23
    4
  • nigel
    我想有人来review我的代码,但大哥们都忙。
    2018-01-24
    4
  • 杨少侠
    工作时间没时间做review
    2018-01-24
    3
  • 木头疙瘩
    真的挺希望能加入一家有这样环境的公司,然而我呆过的大小厂都没有这个
    2018-04-24
    2
  • luming
    在国内公司,Code review如何能不流于形式还是个挺有挑战性的问题
    2020-03-22
    1
  • mikejiang
    代码review不太好执行,国人比较爱面子,我一般的做法是,线下反馈review建议。
    2019-12-02
    1
收起评论
大纲
固定大纲
首先是两个概念
其次,我来谈谈代码合并规则
再次,帮助别人成长,而不是帮他写代码
提交代码的类型
显示
设置
留言
22
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部