BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

谷歌的多代码库开发

| 作者 Sergio De Simone 关注 17 他的粉丝 ,译者 谢丽 关注 11 他的粉丝 发布于 2015年5月27日. 估计阅读时间: 3 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

通常,由于存在外部依赖,复杂的软件项目会跨多个代码库。谷歌WebRTC项目的工程师Patrik Höglund解释说,这本身就是一项挑战。他还描述了谷歌在开发像Chrome那样使用了若干第三方库的软件时采用的方法。

管理多代码库的复杂性源于跟踪外部依赖变化的必要性,尤其当它们的代码库快速变化的时候。在这种情况下,不能只是简单地跳过外部依赖更新,因为这会错过重要的补丁和新特性。另一方面,如果不经常更新外部库,那么就会面临这样的风险,累积的变化破坏了应用程序,需要很大的代价才能跟上所有的变化。

在谷歌,引入新的依赖版本称为“滚动(rolling)”。滚动是一个过程,需要修改Chrome的代码来适应任何新的API,而这反过来会破坏Chrome的测试套件。当然,这种破坏直到运行整个测试套件时才能知道,那太晚了。为了避免破坏Chrome测试套件,开发人员使用专用的“机器人(bots)”(持续构建/测试机器)来检测滚动依赖可能引发的任何问题。

这样的机器人称为“FYI机器人”。它们不会使用特定依赖的固定版本,即WebRTC,而是使用WebRTC HEAD来代替。运行机器人可以得出下面任意一种结果:

  • 机器人运行成功(绿色):这意味着新的滚动很可能可以顺利进行。
  • 机器人编译失败:这意味着必须修改Chrome的代码来适应一些新的API。
  • 机器人测试失败(红色):这意味着存在一些语义变化或者新发现的Bug需要处理。

为了使这个过程运转的更顺畅,谷歌开发人员新增了一种策略,用于减少FYI机器人构件遭破坏的机会。机器人遭破坏会产生意想不到的结果,直到Chrome的代码修改完成,可以适应新的API了,那些机器人才会返回有意义的信息,而这要持续几天的时间。为了解决这个问题,开发人员开始遵循“API基本指令(API Prime Directive)”原则,确保在改进组件时不破坏现有的客户端。一种实现方式是,不删除任何现有的API,而只是简单地增加所需的新API。比如,我们有一个方法签名:

   
class WebRtcAmplifier {
  ...
  int SetOutputVolume(float volume);
}

让我们考虑代码需要变成下面这样情况:

   
class WebRtcAmplifier {
  ...
  int SetOutputVolume(float volume, bool allow_eleven1);
}

为了不破坏任何客户端,我们使用下面的API:

   
class WebRtcAmplifier {
  ...
  int SetOutputVolume(float volume);
  int SetOutputVolume(float volume, bool allow_eleven);
}

借助这种策略,谷歌开发人员可以确保他们的机器人总是绿色的,如果它们在任何时候变成红色的,那么他们就知道更新应该回滚。

查看英文原文:Multi-repository Development at Google

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT