康威定律、DevOps 和您的源代码
2024-1-24
| 2024-2-2
0  |  Read Time 0 min
type
status
date
slug
summary
tags
category
icon
password
康威定律,作者:ChatGPT
康威定律,作者:ChatGPT
源代码库的布局会影响公司的组织结构图,如果第一个布局出错,软件交付能力就会受到影响。
康威定律(Conway's Law)指出,软件架构会自然而然地与公司的组织结构图相匹配。我扩展了这一定律,认为你的源代码库结构会自然而然地影响你的组织结构,如果你正在实践 "DevOps",错误的结构将导致混乱。
定义服务基础架构的代码(通常称为 "基础架构即代码")与服务的其他部分属于同一源代码库。

康威定律

让我们快速回顾一下康威定律的内容。梅尔文-康威在他的开创性论文中将该定律总结为
任何组织在设计一个系统(广义上的系统)时,都会产生一个其结构是该组织通信结构的复制品的设计。
马丁-福勒(Martin Fowler)对法律进行了更详细的阐述:
康威定律的本质是观察到软件系统的架构与构建该系统的开发团队的组织结构极为相似。我最初是这样描述它的:如果一个团队编写一个编译器,那么它将是一个单通道编译器,但如果团队分为两个,那么它将是一个双通道编译器。
证明康威定律远远超出了本文的讨论范围,维基百科上的文章列出了一系列支持康威定律的证据,供希望进一步研究的人参考。为了今天的目的,我们假设康威定律是真的。
 
 
马丁-福勒(Martin Fowler)解释了康威定律的三种反应,这与我在实践中看到的情况相吻合。
notion image
notion image

DevOps

notion image
实践 DevOps "你构建,你运行 "的软件开发团队负责服务生命周期的几个不同方面:
  1. 编写构成服务的应用代码
  1. 创建自动测试,包括单元测试和系统/集成测试
  1. 开发构成生产服务的 IaC
  1. 创建观察服务的仪表板和警报。
在许多组织中,前两个存储在一个存储库中,第三个存储在一个单独的存储库中,通常由不同的团队管理,而第四个存储库则是人工事后想到的。
顺便提一下,我所说的 IaC 是指将服务部署到开发、测试环境和生产环境所需的一切。这包括 Docker 文件、Helm 图表、Cloudformation 或 CDK、Terraform、shell 脚本、CI/CD 定义、SQL 脚本等。
让我们深入探讨一下为什么应用程序代码、自动测试代码和 IaC 属于同一个资源库的几个更明确的原因。
  • IaC 是代码。它不属于其他地方的任何特殊、奇怪或怪异的东西。根据我的经验,有些开发人员似乎可以维护复杂的应用程序代码和奇怪的测试结构(你见过 TDD 框架吗?)
  • 没有部署定义的服务是不完整的。我甚至可以说,如果没有 IaC,应用程序代码大多是无用的,它无法真正发挥预期的功能。如果您的服务托管在 AWS 上的 Kubernetes 中,并且有一个 DynamoDB 表,那么如果没有用于打包的 Docker 文件、用于部署的 Helm 图表、用于定义 DynamoDB 表的 CloudFormation 或 Terraform 以及授予权限所需的 IAM 工件,应用程序代码本身就毫无用处。
  • 当所有代码都位于同一个版本库中时,开发人员就更容易对服务进行推理。当 IaC 位于同一个版本库中时,对复杂服务进行更改会更简单,尤其是当这些更改跨越应用和基础架构代码时,例如更改 DynamoDB 定义或添加需要更改 IAM 策略的新 API 调用时。
  • 如果所有工件都在一个版本库中,特别是在从主分支持续部署时,版本控制就会简单得多。
  • 应用 "或 "服务 "代码与 IaC 之间的界限越来越模糊。十年前的传统服务可能是手工部署在虚拟机甚至物理硬件上的单一二进制文件。现代服务可能是一种无服务器应用程序,无法在云执行环境之外运行,IAM 角色允许访问 AWS 的 DynamoDB 或 Google 的 BigTable,其结构在 IaC 中定义。DynamoDB 或 BigTable 的定义实际上与 SQL 数据库的定义没有什么不同,后者通常存在于应用程序代码旁边。或者,服务可以由步骤函数(step functions)组成,其中一些应用工作流现在是在 IaC 中定义的。这些界限的模糊使得将所有代码保存在一个存储库中势在必行。
一战中的演习--伊梅尔曼转弯示意图。来源:维基百科维基百科
一战中的演习--伊梅尔曼转弯示意图。来源:维基百科维基百科
 
将所有代码保存在一个版本库中的最佳理由是,如果不这样做会发生什么。根据 "康威逆向操作法",如果将应用程序代码与部署所需的 IaC 分离开来,最终就会出现拥有 IaC 的独立团队,从而回到拥有独立开发团队和运营团队的旧时代,并带来与之相关的所有功能障碍。康威定律表明,最终出现两个团队是不可避免的。
关于我对 "源代码库 "的定义,我有一个简短的切入点--我实际上是用这个词来代表代码的逻辑分组,并在其周围设置了一系列权限。通常情况下,源代码库是以单个 GitHub 或 GitLab 源代码库的形式实现的,但运气不好的话,也可能是 Perforce 等软件中的一个子目录。
共享服务和类似平台工程小组的情况如何?肯定需要 IaC 来定义共享网络、共享 Kubernetes 集群、安全护栏等服务,这通常由专业团队负责。随着公司的发展,分拆出平台工程和安全团队是一种自然的演变,将共享服务的 IaC 保存在不同的存储库中通常是正确的做法。只要这些团队不成为 DevOps 团队,而且这些专业团队仍能以 DevOps 的方式处理自己的源代码。

结论

在制定架构决策、规划源代码库布局和进行组织变革时,将康威定律放在首位是组织取得成功的关键。忽视或违背康威定律将导致组织和架构功能失调。
2024年最佳Devops工具,平台,服务平台工程不是关于如何建设华丽UI的
Catalog