
Carlos Arguelles 在旧金山QCon大会上谈到了亚马逊在工程生产力方面的拐点,他解释说,将测试左移有助于及早发现问题。他建议使用诸如代码审查和覆盖率检查之类的护栏。你的代码库策略,是单体仓库还是多体仓库(monorepo 或 multirepo),将影响需要设置的护栏。
当一家公司是新成立的,它必须快速行动,所以设置的护栏非常少。Arguelles 说,它通常也足够小,以至于你认识所有接触代码库的人。随着你的客户群不断增长,越来越多的人依赖你的产品,采纳最佳实践并确保每个人都遵守变得越来越重要,他补充说。这些护栏不是免费的:它们增加了摩擦,降低了你在某些地方快速行动的能力,所以这里通常有一个权衡。
随着公司的发展,对定制开发工具进行投资可能是必要的,正如 Arguelles 在《工程生产力的拐点》一文中所解释的那样:
最初,标准工具就足够了,但是随着公司在工程师、成熟度和复杂性方面的扩展,行业工具可能不再满足需求。拐点,如危机、高速增长或进入新市场,通常会触发这些投资,为提高生产力和卓越运营提供机会。
亚马逊的软件开发生命周期始于一个内部开发人员循环,工程师在自己的工作空间中对代码片段进行迭代。默认情况下,工程师在每次创建构建时运行单元测试,收集代码覆盖率并执行各种检查,Arguelles 说。当他们提交代码审查时,代码审查工具会对该代码运行一些额外的测试。
当这些验证通过,并且工程师从他们的审查者那里得到认可后,代码就会被推送到代码库,CI/CD 将代码通过各种测试阶段并对更改进行越来越全面的测试,包括负载和性能测试,最后才会推送到生产环境。Arguelles 解释说:
我们期望大多数代码更改在提交后几小时内就能进入生产环境,因为所有的护栏应该是自动化的。一旦它们进入生产环境,金丝雀会进一步验证这些更改。
Arguelles 提到,越早发现问题越好。随着你的代码库的增长,将测试左移,以便在内部开发循环(提交前)而不是外部开发循环(提交后)发现问题变得越来越重要:
这是因为如果提交并合并了一段糟糕的代码,它现在会阻塞你周围的 N 个开发人员,直到它回滚或修复,并且随着系统的增长,N 也会增长。
这是因为如果提交并合并了一段糟糕的代码,它现在会阻塞你周围的 N 个开发者,直到它被回滚或修复,随着你的系统的增长,N 也会增长。
Arguelles 说,将测试左移并不简单,因为为了有效地、可靠地对未发布代码运行端到端集成测试,你需要投资于临时的、隔离的测试环境。
亚马逊做出的一个关键决定是,他们在一个多仓库世界中运营,这意味着每个团队都有自己的微仓库。这与其他公司选择整个公司的单体仓库(如谷歌)形成鲜明的对比。
谷歌使用单体仓库(monorepo),大约有 100,000 名工程师使用一个没有分支的单一存储库。每个人都必须致力于存储库的健康,因为糟糕的代码提交的影响范围是巨大的;你真的可以阻止成千上万的人,Arguelles 说。提交前的端到端测试不仅仅是“锦上添花”,而是对业务至关重要。
另一方面,Arguelles 提到,亚马逊选择走多仓库的路线,每个团队基本上都有自己的仓库。这作为一种自然的爆炸半径减少机制:糟糕的提交可能会破坏单个微仓库,但有更多的护栏来防止它蔓延到其他团队的微仓库。
Arguelles 提到,在大型系统中存在着不可避免的复杂性。你选择的开发方式决定了你需要在软件开发生命周期的哪个阶段来处理这种复杂性。这两家公司都无法避免这个问题,但他们要么在提交前,要么在提交后解决这个问题,他总结道。
InfoQ 采访了Carlos Arguelles,讨论了护栏以及微仓库与单体仓库的问题。
InfoQ:亚马逊的护栏是什么样的?
Carlos Arguelles:例如,当亚马逊在 2009 年还是一家较小的公司时,你可以快速 ssh 到生产主机上调查问题,查看日志等。任何手动交互本质上都是一件危险的事情——想象你输入了错误的命令或不小心多按了一个“0”,导致主机崩溃或数据丢失。所以我们设置了护栏,如果你想在生产主机上运行命令,它需要经过代码审查,并且有一个可审计的操作记录。
另一个例子是,你不能在没有经过代码审查并获得另一个人的认可的情况下直接将代码提交到仓库。或者我们现在根据代码覆盖率下降来设置门禁,以确保所有进入生产环境的代码都满足最低测试覆盖率标准。这样的工具提供了可扩展的方式来编码和执行最佳实践。
InfoQ:与单体仓库相比,使用微仓库工作有哪些影响?
Arguelles:亚马逊和谷歌是我工作过的两个地方,由于两家公司几十年前做出的基本决策而存在显著的不同:谷歌使用单体仓库,而亚马逊使用微仓库。
这个决策影响了需要建立的护栏。对于亚马逊来说,端到端的预提交测试是“锦上添花”,但它不是业务的关键。
然而,亚马逊决定使用微仓库并不是没有代价的。在单体仓库中,每个服务自然集成,而在多仓库的世界中,你需要协调变化如何安全地从一个仓库级联到另一个仓库。
原文链接:
https://www.infoq.com/news/2025/07/guardrails-software-development/
评论