【ArchSummit】如何通过AIOps推动可量化的业务价值增长和效率提升?>>> 了解详情
写点什么

谷歌的多代码库开发

  • 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:282060
用户头像

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

关注

评论

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

我是咖啡师,在软件公司上班|ONES 人物

万事ONES

开源一夏 | React对于生命周期的深入研究

恒山其若陋兮

开源 8月月更

隐私公链Findora生态布局,隐私赛道发展急先锋

EOSdreamer111

Hash算法详细介绍与实现(一)

迷彩

hash算法 8月月更

MySQL常见面试题

浅羽技术

MySQL 数据库 面试 后端 8月月更

实时数仓Workshop · 广州站 9.15 邀您参加!

Apache Flink

大数据 flink 流计算 实时计算 实时数仓

当满世界喧嚣“All in Web3”,但你可以慢慢来

One Block Community

区块链 程序员 开发者 就业 黑客马拉松

StarRocks 与奥威软件完成产品兼容认证,共同打造数据驱动的智慧企业

StarRocks

数据库

J-Tech Talk | 编写Dockerfile的最佳实践

Jina AI

Docker J-Tech Talk

一文读懂隐私公链Findora生态布局

BlockChain先知

盘点:阿里云效平台的5大替代解决方案

PingCode

阿里云实时计算 Flink 版 x Hologres: 构建企业级一站式实时数仓

Apache Flink

大数据 flink 流计算 实时计算 实时数仓

页面切换转场动画,英雄救场更有趣!

岛上码农

flutter ios 前端 移动端开发 8月月更

[JS入门到进阶] 哎,被vite小坑了一波,大家记得配置build.cssTarget为'chrome61'

HullQin

CSS JavaScript html 前端 8月月更

一文读懂隐私公链Findora生态布局

股市老人

一文读懂隐私公链Findora生态布局

鳄鱼视界

vim设置go语法高亮

程序员欣宸

vim 8月月更

什么是数据结构

乌龟哥哥

8月月更

索信达控股上半年成绩出炉:核心业务收入大幅增长75.3%

索信达控股

购物体验值急转直下?消费体验的症结和解药在这里!

创意时空

SMTP协议详解

工程师日月

8月月更

每日一R「16」实践课之 kv-server(二)

Samson

学习笔记 8月月更 ​Rust

后端面试必备知识点

浅羽技术

Java 面试 后端 8月月更

1个理念4个步骤,快速上手客户体验管理

创意时空

拆解实体门店转型升级中的体验思维

创意时空

开源一夏 |为什么线程池不允许使用Executors去创建?

六月的雨在InfoQ

开源 OOM Executors ThreadPoolExecutor 8月月更

leetcode 205. Isomorphic Strings 同构字符串(简单)

okokabcd

LeetCode 算法与数据结构

头脑风暴:二叉搜索树中的众数

HelloWorld杰少

算法 LeetCode 8月月更

如何快速地学习东西(上篇)

宇宙之一粟

学习 成长 8月月更

乐观锁和悲观锁各自应用场景

浅羽技术

Java 乐观锁 悲观锁 8月月更

客户案例|雅森帮携手观测云,保障海量在线用户服务体验

观测云

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