代码审查机制

helloworld_64777253
• 阅读 1799

代码审查机制

[TOC]

什么是代码审查

Code Review已经是很多公司的常规实践,初看上去好像是浪费时间,降低工作效率,其实反之,好处大家有目共睹。它能检查代码的正确性,合理性,安全性,发现隐秘的bugs,让系统更可靠的运行。它能保证代码能有两个或以上的人熟悉,促进知识共享。它能让团队成员互为备份,互相支持,不会有SPOF。它能威慑埋雷的任何想法,杜绝邪念。它能互相学习好的代码,提高编程技能。等等。

代码审查应该是集体行为而不是个人行为,它是一个过程,多个开发人员审查或筛选另一位开发者(作者)编写的代码,以确保

  • 代码没有任何错误或问题。
  • 符合所有质量要求和标准。
  • 代码执行了预期的测试。
  • 合并后,它将使代码库的运行状况保持更好。

审查标准

  1. 该代码改善了系统的整体运行状况

    每个更改列表(Pull Request)都会改善系统的整体运行状况。想法是,由于进行了如此小的改进,每次合并后,软件或代码库的运行状况都会得到改善。

  2. 快速的代码审查,响应和反馈

    首先,不要延迟推送(合并)更好的代码。不要指望代码是完美的。如果它的状况可以改善系统的整体运行状况,则请推送。

    这里的关键是没有'完美'的代码,只有更好的代码。

    好的代码是初级工程师可以理解的代码。伟大的代码可以被第一年的计算机专业的新生理解。代码要追究简单

    如果不在一项重点任务的中间,那么请在代码完成后立即进行检查。但是一个工作日是响应拉取请求所需的最长时间。预计变更列表将在一天之内获得多轮的部分/完整代码审查。

  3. 在代码审查期间进行教育和启发

    通过尽可能共享知识和经验,在代码审查期间提供指导。

  4. 在代码审查中要谨慎,尊重,友善和清晰

    至关重要的是,在代码审阅期间,要善良,清晰,礼貌和尊重,同时也要对作者非常清楚和乐于助人。查看代码时,请确保对代码而不是开发人员做出评论。

  5. 每个 Review 至少给一条正面评价

    Code Review 本意是改善代码质量,增强团队成员之间的沟通,但是我一提交代码就有人说我写的垃圾,这很打击自信心啊,也不利于团队成员和平相处。代码有问题,指出问题是必须的,要实事求是,但是有的时候也需要给队友一点鼓励,例如简单的 或者“赞一个”我都很开心了。

  6. 用工具进行基础问题的自动化检查。

    用 Tab 还是空格,用两个空格还是四个空格,函数后面怎么换行等基础问题检查,可以使用 eslintRubocop 等类似的工具进行,团队成员应该把更多精力放在代码规范,代码性能优化等地方。

  7. 全员参加 Code Review,并设定各部分负责人。

    扩大 Code Review 参与面,参与不是说一定去审核别人的代码,可以是代码被审核,也可以是看别人审核意见,这都是学习的过程。并且每部分设定负责人,该负责人对这部分代码质量负责,负责人需要是资深工程师。全员参与 Code Review 可以让团队成员更快的成长,新人在看大佬 Review 代码的过程就能学到很多。

  8. 每个代码 PR 内容一定要少

    Code Review 效果和质量与 PR 代码量成反比

  9. 在写新代码之前,先 Review 掉需要评审的代码

    你让我去 Review 一周前的代码?我还得把思维和项目进度切换到一周前?大家肯定不愿意,所以要形成规定,写新代码之前先 把旧的 Review 掉,提交 PR 的时候也保证代码量小,这样 Review 起来不需要大块时间,改起来也快。不能因为 Code Review 大幅耽误项目进度,进度是全团队的事,不是某个人的事。

  10. 如果你有更好的方案,尽管提出来

    在 Code Review 中经常会发现写的不好的地方,如果你有更好的方法,欢迎提出来!首先能改进这个 PR 的代码,其次能体现你的能力,团队应该定期对这种提出好的解决方案的同事进行奖励。

例子

在下面的例子中,代码块中的建议性审查注释以 //R: ... 的形式标出:

  1. 不一致的命名
    class MyClass {
      private int countTotalPageVisits; //R: 变量命名要统一
      private int uniqueUsersCount;
    }
    
  2. 不一致的方法签名
    interface MyInterface {
      /** 当 s 无法被提取时,返回 {@link Optional#empty}  */
      public Optional<String> extractString(String s);
      /** 当 {@code s} 不能被重写时,返回 null */
      //R: 应该统一返回值:都用 Optional<> 
      public String rewriteString(String s);
    }
  3. Bugs
    //R: 这里执行了 numIterations+1 迭代, 是故意的吗?
    //   如果是的话,考虑改变 numIterations 的含义吧?
    for (int i = 0; i <= numIterations; ++i) {
      ...
    }
  4. 架构上的关注点架构上的关注点
    otherService.call(); //R: 我觉着我们应该避免对 OtherService 的依赖。我们当面聊一下如何?

审查时机

每次代码提交,向主仓库提交Merge Request 进行代码的 Review

Code Review 工具

  • CrucibleAtlassian 内部代码审查工具;
  • getcodeflow:微软代码评审工具
  • GerritGoogle 开源的 git 代码审查工具;
  • GitHub程序员应该很熟悉了,上面的 "Pull Request" 在代码审查这里很好用;
  • LGTM可用于 GitHub 和 Bitbucket 的 PR 代码安全漏洞和代码质量审查辅助工具;
  • PhabricatorFacebook 开源的 git/mercurial/svn 代码审查工具;
  • PullRequestGitHub pull requests 代码审查辅助工具;
  • Pull RemindersGitHub 上有 PR 需要你审核,该插件自动通过 Slack 提醒你;
  • Reviewable基于 GitHub pull requests 的代码审查辅助工具;
  • SiderGitHub 自动代码审查辅助工具;
  • UpsourceJetBrain 内部部署的 git/mercurial/perforce/svn 代码审查工具。

参考

https://juejin.cn/post/6869024508796207111#heading-13

https://juejin.cn/post/6844903733797584909#heading-7

https://blog.csdn.net/weixin_33975951/article/details/90334884

https://www.zhihu.com/question/20046020

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
雷厉风行 雷厉风行
11个月前
mac软件-Understand for Mac(优秀的源代码审查工具) 完美激活版
UnderstandforMac(优秀的源代码审查工具),这是一款空前强大的代码编程审阅软件,尤其是对于从事大型多个MSLOC项目的人员来说,Understand已经是他们不可或缺的工具之一,它可以帮助程序员快速理解,衡量,维护和记录他们的源代码。
Stella981 Stella981
2年前
ReviewBoard代码评审实践总结
代码评审代码评审(CodeReview),顾名思义是对代码进行评审,是软件工程的活动之一。通过代码评审可以保证代码质量,促进团队知识共享……好处多多。版本控制与代码评审软件工程的各个活动总是离不开工具的支持。代码评审工具首先必须和版本控制工具相结合的。现在主流的两种版本控制工具:SVN和GIT。GI
Wesley13 Wesley13
2年前
Unity横屏
Android下发现Unity里面的Player设置,并不能完全有效,比如打开了自动旋转,启动的时候还是会横屏,修改XML添加以下代码<applicationandroid:icon"@drawable/ic\_launcher"                    android:label"@string/app\_name"
Stella981 Stella981
2年前
Code Review最佳实践
  我一直认为CodeReview(代码审查)是软件开发中的最佳实践之一,可以有效提高整体代码质量,及时发现代码中可能存在的问题。包括像Google、微软这些公司,CodeReview都是基本要求,代码合并之前必须要有人审查通过才行。  然而对于我观察到的大部分软件开发团队来说,认真做CodeReview的很少,有的流于形式,有的可能根本就没有Co
Stella981 Stella981
2年前
Parasoft cpptestcli 指令行参数配置
ParasoftCtest  是款功能非常强大的自动化测试工具,能有效提高软件开发效率和代码质量。功能特点如下:    静态代码分析和编码策略实施;  自动代码审查的图形界面和进度跟踪;  自动化的单元测试和回归测试;  代码覆盖率分析,集成通过应用层覆盖跟踪从单元级测试;  结合静态分析、单元测试、代码评审和其他
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
2个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
helloworld_64777253
helloworld_64777253
Lv1
多情只有春庭月,犹为离人照落花。
文章
1
粉丝
0
获赞
0
热门文章

暂无数据