最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

谷歌的多代码库开发

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

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

关注

评论

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

联邦查询引擎Presto源码编译与调试

小舰

源码剖析 presto 4月日更

starforce源码解读一:关键字partial

风翱

C# 源码阅读 4月日更 游戏框架

Rust从0到1-所有权-切片类型

rust slices 切片

极速精简 Go 版 Logstash

万俊峰Kevin

Logstash go-zero Go 语言

硬核图解红黑树并手写实现

Silently9527

Java 数据结构与算法 红黑色

编程好习惯之理清函数参数

顿晓

编程好习惯 4月日更

架构训练

return

模块一:课后作业

菲尼克斯

架构实战营

Vite 2 + React 实践

清秋

less vite antd React 4月日更

架构实战营模块1作业

白发青年

架构实战营

每日总结-2021-04-05

cyningchen

千万不要轻易尝试“熊猫烧香”,这不,我后悔了!

冰河

互联网 网络安全 信息安全 渗透 蠕虫

关于微信架构

俞嘉彬

学生管理系统方案架构设计

俞嘉彬

文字变图片——GitHub 热点速览 v.21.14

HelloGitHub

GitHub 开源

说人话

ES_her0

4月日更

零基础学Tableau系列 | 05—(进阶)数据集合并、符号地图、智能显示、插入自定义形状、仪表板

不温卜火

数据可视化 数据清洗 4月日更

模块1作业

段吉贵

架构实战营

#架构训练营作业一

吴猛

“学生管理系统”毕设架构设计

Vincent

架构实战营

Ansible 教程

码语者

DevOps ansible

《基于实践,设计一个百万级别的高可用&高可靠的IM消息系统》

后台技术汇

后端 消息系统 签约计划 引航计划 内容合集

让大家喘口气休息一下吧,工作中事情众多烦心时,让我们与工作独处一会儿。

叶小鍵

设计模式-六大设计原则

U2647

设计模式 设计原则 4月日更

支持向量机实现光学字符识别

不脱发的程序猿

人工智能 机器学习 4月日更 支持向量机 实现光学字符识别

如何帮助一个新人快速融入团队

码猿外

团队协作 敏捷精益

Python基础之:Python中的内部对象

程序那些事

Python Python3 程序那些事

Kubernetes中的CI/CD

倪朋飞

Kubernetes DevOps CI/CD

Python OpenCV 美女换装,图像处理取经之旅第 19 天

梦想橡皮擦

Python OpenCV 4月日更

你朋友牛逼跟你有什么关系?

小天同学

自我思考 个人感悟 人生修炼 4月日更

MongoDB的几个常见问题

程序员架构进阶

mongodb 集群 28天写作 4月日更 实战问题

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