写点什么

谷歌的多代码库开发

  • 2015-05-26
  • 本文字数:1045 字

    阅读完需:约 3 分钟

通常,由于存在外部依赖,复杂的软件项目会跨多个代码库。谷歌 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

2015-05-26 09:282407
用户头像

发布了 1008 篇内容, 共 422.1 次阅读, 收获喜欢 346 次。

关注

评论

发布
暂无评论
发现更多内容

同构+跨端,懂得小程序+kbone+小程序容器就够了!

Geek_99967b

小程序容器

还在被电影中吧爆炸的画面震撼?那你一定不要错过这款Unity的爆炸插件

恬静的小魔龙

Unity

浅谈负载

Damon

7月月更

Idea 连接 MySQL 数据库

攻城狮杰森

MySQL IDEA database 7月月更

Kyligence 出席华为全球智慧金融峰会,加速拓展全球市场

Kyligence

数据湖 数据分析 OLAP

国产统信UOS系统运行小程序的探索

Geek_99967b

小程序

数字藏品系统开发——商城盲盒h5平台搭建

开源直播系统源码

数字藏品 数字藏品系统软件开发 NFT数字藏品系统 数字藏品源码出售 数字藏品交易平台开发

void 0 有什么意义?undefined竟然是可变的?

南极一块修炼千年的大冰块

7月月更

IP地址分类及范围

郑州埃文科技

IP地址 IP地址分类 IP地址范围

K8S多集群管理很难?试试Karmada | K8S Internals系列第3期

BoCloud博云

容器 容器云 K8s 多集群管理

终于有人把操作系统、网络系统、线程进程、IO模型全部总结出来了

程序知音

Java 后端 操作系统 网络 TCP/IP

融云超级群的「新能力」

融云 RongCloud

ios Android;

数字化转型失败的罪魁祸首是什么?

雨果

数字化转型 DaaS数据即服务

这次和GrowingIO工程师一起搞事情 | StartDT Hackathon

奇点云

饿了么为啥给你推荐这个?本地生活搜索算法解密

阿里技术

算法 性能提升

2022年中国第三方支付市场专题分析

易观分析

第三方支付

Spirng之Annotation注解与AOP使用

echoes

带你认识8个软件设计中的谬误

华为云开发者联盟

后端 分层架构 开发

2022亚洲国际物联网展会

AIOTE智博会

物联网展览会

2022长三角工业自动化展会将于10月在南京国际展览中心召开

AIOTE智博会

工业自动化展会 工业机器人展会 江苏工博会

移动研发平台EMAS 3.0全新升级,欢迎登陆阿里云官网搜索EMAS进行体验

移动研发平台EMAS

阿里云 emas 移动测试 移动研发 产品架构

膜拜~ 终于拿到了美团老大哥分享的 Netty 源码剖析与应用 PDF

程序知音

Java 程序员 架构 Netty 后端技术

Python 爬虫 JS 逆向 X-Bogus,signature 加密算法,AST 理论篇

梦想橡皮擦

Python 爬虫 7月月更

想要制作沙盒游戏?那么这一款插件你一定不能错过(Unity3D)

恬静的小魔龙

Unity

运行时,物体移动旋转缩放插件,“RuntimeTransformGizmos插件”使用教程(Unity3D)

恬静的小魔龙

游戏开发 Unity 插件 虚拟仿真 游戏引擎

EMQ映云科技荣登《中国企业家》2022年度“新锐100”榜单

EMQ映云科技

开源 物联网 IoT emq 7月月更

hive数据导入:Python脚本

怀瑾握瑜的嘉与嘉

Python hive 7月月更

同城订单同城送,爆单依旧得心应手!

CRMEB

深入理解完美哈希

C++后台开发

hash 后端开发 C++后台开发 哈希函数 C++开发

还在用Unity开发游戏?那你就out了,试试用Unity做一个答题系统吧

恬静的小魔龙

Unity

用Unity做仿真,这款图表插件我不允许你不知道

恬静的小魔龙

Unity

谷歌的多代码库开发_DevOps & 平台工程_Sergio De Simone_InfoQ精选文章