0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么diff审查的速度总是那么慢?

jf_WZTOguxH 来源:AI前线 作者:AI前线 2022-11-18 14:12 次阅读

代码审查是软件开发过程中最重要的环节之一。如果这项工作做得好,代码审查能够切实帮助我们发现 bug,普及最佳实践并保障代码质量。

近日,Meta 技术团队宣布采用了几款工具和相应流程,很大程度提高了代码审查速率。

Meta 技术团队将针对代码库做出的一组独立变更称为“diff”。虽然 Meta 非常重视开发效率,但每条 diff 也必须经受严格审查,绝无例外。代码审查团队深知审查周期越长,留给开发者们完成工作的时间就会越短。

为此,Meta 技术团队研究了多项指标,希望更多了解哪些代码审查瓶颈最令开发者们感到不满,并积极利用这些结论探寻在不牺牲审查质量的前提下加快审查速度的办法。通过研究发现,缓慢的 diff 审查速度跟工程师们的不满情绪间存在相关性。另外,新研发的工具能够在审查周期的各个关键节点向相应审查人员展示 diff,由此显著改善审查体验。

为什么 diff 审查的速度总是那么慢?

为了回答这个问题,首先需要查看自己的数据。在跟踪了一项名为“审查时间”的指标后,Meta 技术团队发现,需要衡量的是 diff 在单一审查周期内等待审查的时长。这里只计算 diff 等待审查者操作的时间。

f2d3e92e-6702-11ed-8abf-dac502259ad0.png

审查时间(Time In Review)指标,计算的就是图中各蓝色部分(即无意义等待部分)耗费的时间总和。

最终的发现令人惊讶。回顾 2021 年初的数据,研发人员发现 diff 审查时间的中位数(第 50 百分位)只有几个小时,这样的结果还算不错。但如果把目光投向第 75 百分位(即最慢的那四分之一审查),就会发现diff 的审查时间延长到了一整天。

研发人员分析了审查时间跟用户满意度(通过全公司范围内的量化调查)之间的相关性。结果非常明确:速度最慢的那 25% diff 审查,才是决定人们实际体验的核心;这部分耗时越长,大家对代码审查过程的满意度就越低。于是也就得出了最值得关注的改进指标:第 75 百分位(P75)审查时间。

缩短审查时间不单能让人们对整个代码审查过程的满意度更高,也会提高每一位 Meta 工程师的工作效率。缩短 diff 审查时间,意味着工程师耗费在审查上的时间将大大减少、提升工作效率、改善审查体验。

在速度与质量间求取平衡

然而,简单粗暴地加快审查速度绝不是明智之举,甚至会将审查变成毫无意义的走过场。因此需要设置一项护栏指标,防止过快审查带来的负面后果。在这里,研究人员选择了“注视时间”,即审查者花在查看 diff 上的总时长。查看时间过短,即代表审查者很可能是在敷衍了事。

现在已经有了核心指标“审查时间”,也有了护栏指标“注视时间”,接下来要怎么办?

构建、试验和迭代

在 Meta,几乎每个产品团队都会使用试验加数据驱动的流程推进功能发布和迭代。但对于这些内部辅助团队,这样的流程仍然比较新鲜。因此人们需要克服一系列产品团队根本不需要考虑的挑战(样本量、随机化、网络效应等)。研发人员通过运行网络实验积累起数据基准,并利用技术减少方差、增加样本量。事实证明,这些努力都是值得的——通过奠定坚实的试验基础,使得研发团队最终拿出了具有积极影响且行之有效的新一代代码审查方案。

f2e6c1c0-6702-11ed-8abf-dac502259ad0.png

试验过程:根据对代码审查意义和体验设计的假设,选择了目标指标和护栏指标。此外还制定了一套选择不同实验单元以实现随机化抽样的机制,包括用户集群的随机化。

建立“下一可审查 diff”的概念

Meta 技术研发团队表示,关于这个概念的灵感,来自视频流服务。由于每集视频之间会无缝过渡,所以流媒体服务平台上的观看体验总是丝滑顺畅。那能不能把同样的体验引入代码审查当中?通过 diff 队列,他们建立起了类似的 diff 审查流体系,鼓励审查者们充分利用自己的时间和精力。

f31b3996-6702-11ed-8abf-dac502259ad0.png

于是乎,“下一可审查 diff”的概念由此诞生。研发团队使用机器学习识别出审查者当前最可能想要审查的 diff,并在其完成当前代码审查之后,立即把感兴趣的下一 diff 呈现出来。通过这种方式,我们就能轻松把 diff 审查循环起来,同时避免审查者接触到与其不相干的 diff。

新方案上线之后,研发团队发现,日均审查操作(包括 diff 接纳量、提交量等)总体增长了 17%,而使用此流程的工程师们执行的审查操作比未使用的审查员多出 44%!

改进审查者匹配效果

可以看到,新方案的关键在于为 diff 选择适当的审查者。提交者当然希望审查者能够更好、更快地审查自己的代码,特别是要得熟悉相关 diff 的内容和作用。从以往的情况看,Meta 的审查者推荐器会根据一组有限数据给出匹配建议,但这往往无法适应新 diff 的需要,而且在工程师们轮换岗位后又得重新适配。

为此,研发团队建立了新的审查者推荐系统,将工作时间感知和文件归属信息结合起来,这就让有空审查 diff、擅长审查特定 diff 的审查者更可能被选中。我们重写了建议支持模型,添加了回溯测试和自动再训练等功能。

f32b41f6-6702-11ed-8abf-dac502259ad0.png

结果就是,一天之内 diff 审查量增加了 1.5%,而且前三条推荐的准确率(即实际审查者来自前三条推荐)的概率也从不到 60% 增长至近 75%。除此之外,新模型还将推荐速度(第 90 百分位延迟)提升了 14 倍!

用 Nudgebot 解决 Diff 积压问题

我们知道工程师们最不喜欢的就是 diff 积压问题。这不仅让人不爽,而且审查速度过慢还会令代码过时,导致开发者在不同上下文间来回切换、影响整体生产力。为了解决这个问题,Meta 研发团队构建了 Nudgebot,其灵感来自微软所做的相关研究。

对于需要额外长时间审查的 diff,Nudgebot 会首先确定最适合的审查者子集,然后向他们发送一条聊天 ping,其中包含 diff 的部分上下文和快速跳转至审查流程的操作选项。

Nudgebnot 试验也取得了不错的效果。所有 diff 的平均审查时间缩短了 7%(不含周末时段),审查周期超过 3 天的 diff 比例也下降了 12%。

目前此功能已经单独发布:

https://users.encs.concordia.ca/~pcr/paper/NudgeBot2022FSE-preprint.pdf

f339cdd4-6702-11ed-8abf-dac502259ad0.png

这里就是审查者在屏幕上看到的积压 diff 通知,下方还有“稍后提醒我”按钮。

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据驱动
    +关注

    关注

    0

    文章

    118

    浏览量

    12272
  • 代码
    +关注

    关注

    30

    文章

    4596

    浏览量

    67328
  • Meta
    +关注

    关注

    0

    文章

    196

    浏览量

    11200

原文标题:Meta 提出代码审查新方案:杜绝代码 Bug,日均代码审查总量增长 17%

文章出处:【微信号:AI前线,微信公众号:AI前线】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    ESP32-S2的循环运行速度比ESP32很多是怎么回事?

    我想测试一下ESP32-S2的sqrtf的运算速度, 结果发现运行速度特别,sqrtf()需要3微秒以上,占用了接近1000个时钟周期. 然后又写了一个循环的测试.发现也很慢. 1000次循环
    发表于 06-21 17:11

    ESP32外挂FLASH下载速度慢怎么解决?

    ESP32 外挂FLASH 下载速度慢,小于500K的固件能下载,但下载速度只有100kbits/s1.5M 固件下载失败 Flash型号为P25Q32H,有办法让此Flash 工作在QIO模式吗。
    发表于 06-21 15:01

    板子上的TVS管为什么总是坏?

    板子上的TVS管为什么总是坏?
    的头像 发表于 06-08 08:10 97次阅读
    板子上的TVS管为什么<b class='flag-5'>总是</b>坏?

    iOS和Android蓝牙传输速度都非常的,有没有提高的方法?

    iOS和Android蓝牙传输速度都非常的,有没有提高的方法?
    发表于 06-05 06:53

    IAR使用ST-LINKV2调试STM8的时候,通过printf打印到Terminal IO上的信息显示速度特别是怎么回事?

    IAR使用ST-LINKV2调试STM8的时候,通过printf打印到Terminal IO上的信息显示速度特别是怎么回事?
    发表于 05-06 08:35

    用foc2.0的库做电机的闭环控制,测出速度总是跳动为什么?

    用foc2.0的库做电机的闭环控制 用编码器做位置速度测量,使用foc2.0自带的速度检测程序,发现测出速度总是跳动,什么原因呢
    发表于 04-26 08:15

    STM32F429做的PIL仿真速度非常的原因?

    ,但是速度非常。不知道是否STM32F429的参数设定有问题。有没有哪位大神做过相关的仿真。补充下:仿真中控制器开关频率是5000khz,采样时间为5e^-5s。 先谢谢了!
    发表于 04-11 07:28

    使用主控IIC读取MPU9250的磁力计数据,速度特别怎么解决?

    使用iic对mpu9250进行读取数据,读取磁力计数据时采用的是主控iic方式,但是读取的速度特别,几秒一次,网上说磁力计数据输出的速率最快是100hz,几秒一次也太慢了;另外在初始化函数中开启了延时,但是一次读取6个字节的数据,只能读到前两个字节,后四个字节全为0,请
    发表于 04-11 07:02

    STM32H743 IO速度慢是什么原因造成的?

    STM32H743 IO速度慢,实际能到多少.IO翻转速度只有16M,读一个IO要很多个时钟周期,是都这样的吗。
    发表于 03-21 07:16

    一直在调pmsm无速度的仿真,但是波形总是不对是为什么?

    一直在调pmsm无速度的仿真,但是波形总是不对,转速甚至是负的。。。用的反电势积分法。就是目前能正转了。但是仅限于空载情况下某个特性参数下才会出现正转,速度一直是且封顶900(可能是电机参数关系
    发表于 02-06 06:49

    在modus3.0.0开发Psoc4如何获取sensor raw diff的数据?

    我在用modus3.0.0开发psoc4时,想要获取sensor的数据,比如:raw、diff、status,我查到有个结构体包含这些数据cy_stc_capsense_sensor_context_t,但是没有找到对应的API,请问下如何获取这个结构体的数据,有没有参考示例?谢谢。
    发表于 02-02 06:17

    M481系列KEIL选择ARM5编译器 ,编译速度非常怎么解决?

    M481系列,如果KEIL选择ARM5编译器 ,编译速度非常
    发表于 01-16 06:51

    arduino驱动舵机速度能否一些?

    arduino驱动舵机速度太快,能不能一些,就是占空比调节的指定宽度有个时间设置的函数有吗?比如0度到90度我需要转动3秒完成,但是直接驱动到90度速度太快了半秒就到90度了
    发表于 11-08 06:03

    什么是工艺审查?板级电路装焊的工艺性审查

    工艺审查是电气互联工艺设计的关键部分,工艺审查就是对电路设计、结构设计的工艺性、规范性、继承性、合理性和生产可行性等相关工艺问题进行分析与评价,并提出意见或建议,最后进行修改与签字。同时可根据在制品的工艺执行具体情况对生产工艺的正确性、合理性和可靠性进行
    的头像 发表于 09-01 12:45 756次阅读
    什么是工艺<b class='flag-5'>审查</b>?板级电路装焊的工艺性<b class='flag-5'>审查</b>

    M481系列如果KEIL选择ARM5编译器 ,编译速度非常怎么解决?

    M481系列,如果KEIL选择ARM5编译器 ,编译速度非常
    发表于 08-25 06:00