Skip to content

康威定律与微服务拆分原则

1967 年,计算机科学家 Melvin Conway 发表了一篇论文,里面有一句话:

「设计系统的组织,其产生的设计等价于组织间的沟通结构。」

这句话后来被称为康威定律(Conway's Law)

当时 IBM 正在开发 COBOL 编译器,Conway 预测:如果有 3 个团队开发编译器,最后会得到 3 个编译器模块。结果他对了。

这不是巧合,这是规律。


康威定律的四个推论

推论一:组织沟通方式决定系统设计

如果两个功能需要频繁沟通,它们的代码就会放在一起,或者通过同步调用连接。

如果两个团队之间没有沟通渠道,他们的代码就会各自为政,越来越难集成。

现实中的例子:财务模块和业务模块总是集成不好?因为财务团队和业务团队之间没有建立有效的沟通机制。

推论二:孤立的团队产生孤立的系统

每个团队只关心自己的 KPI,系统之间的集成就成了「二等公民」。

API 文档不更新、接口契约不遵守、集成测试不跑——这些问题不是技术问题,是组织问题。

推论三:跨团队协作需要协议而非强制

与其强制某个团队「必须用这个 API」,不如先建立协议(API 规范、数据格式、版本策略),让团队自愿遵守。

微服务的 API Gateway 就是这个思路:不强制服务怎么实现,只强制服务怎么对外暴露。

推论四:系统的边界应该匹配团队边界

这是康威定律最直接的应用:如果你的团队结构是「前端团队 + 后端团队 + DBA 团队」,你的系统就会变成「前端 + API 层 + 数据库层」。

这不是你设计的,是组织结构「设计」出来的。


康威定律的逆向应用:「Inverse Conway Maneuver」

康威定律说「组织结构决定系统结构」。

那反过来想:如果我想要某个系统结构,能不能先改变组织结构?

这就是 Inverse Conway Maneuver(逆康威策略)。

传统做法:
组织结构 → 系统结构

逆康威策略:
目标系统结构 ← 目标组织结构

实践案例

假设你想要的系统结构是:订单服务、库存服务、支付服务三个微服务。

传统做法:先拆代码,然后调整团队配合。结果:代码拆了,但团队配合模式没变,还是乱。

逆康威策略

  1. 先建立三个团队,每个团队完全拥有自己的服务
  2. 规定团队之间的接口协议(API 规范)
  3. 允许每个团队独立演进自己的服务

结果是:系统结构自然形成了,因为团队结构就是按这个设计的。


实践建议:两个披萨原则

Amazon CEO 贝索斯有一个著名的「两个披萨原则」:

「如果两个披萨不够喂饱一个团队,那这个团队太大了。」

两个披萨原则的隐含意思是:团队越小越好,每个团队都应该能够独立完成工作。

小团队的好处:

  • 沟通成本低
  • 决策速度快
  • 团队成员归属感强
  • 容易建立共享文化

微服务的理想团队规模:6-10 人。


团队拓扑(Team Topologies)

Matthew Skelton 和 Manuel Pais 在 2019 年提出了「团队拓扑」概念,总结了四种团队模式:

1. 流式团队(Stream-aligned Team)

这是核心团队类型。它端到端负责一个业务领域,从需求到上线到运维。

微服务最好由流式团队拥有。

2. 赋能团队(Enabling Team)

帮助流式团队掌握新技术。比如云原生赋能团队、数据平台赋能团队。

3. 平台团队(Platform Team)

构建内部平台,让流式团队可以自助使用。比如 CI/CD 平台、监控平台、基础设施。

4. 复杂子系统团队(Complicated Subsystem Team)

处理需要专业技能的部分,比如算法团队、机器学习团队。


康威定律与微服务拆分的对应关系

根据康威定律,微服务拆分应该遵循以下原则:

原则一:按业务边界(Bounded Context)拆分

每个微服务对应一个业务领域,由一个团队完全负责。

业务领域之间应该是「低耦合、高内聚」的。

原则二:团队边界 = 服务边界

如果两个服务需要同一个团队维护,说明拆分粒度太细了。

如果一个服务需要 5 个团队维护,说明业务边界定义有问题。

原则三:服务之间的依赖要清晰

服务 A 调用服务 B,这种依赖关系应该和团队之间的沟通关系一致。

如果服务 A 属于团队 1,服务 B 属于团队 2,那么团队 1 和团队 2 之间必须有沟通渠道。

原则四:独立部署意味着独立团队

如果服务不能独立部署(需要协调其他团队),那它就不是微服务,是「分布式巨石」。


面试追问方向

康威定律在实践中怎么应用?

核心是「先组织后系统」:先设计期望的团队结构,再根据团队结构推导系统架构。

如果业务需要跨多个微服务怎么办?

  • API Gateway 做统一入口
  • 事件驱动做最终一致
  • 跨服务的分布式事务(Saga 模式)

但更好的做法是:重新审视业务边界,看看能否把相关功能聚合到一个服务里。

团队太小(< 3 人)怎么实施微服务?

不建议做微服务。微服务带来的运维复杂度会吃掉你的开发效率。先用模块化的单体,保持独立部署能力,等团队大了再拆分。


留给你的问题

康威定律告诉我们:系统架构和组织结构是镜像关系。

但现实是:大多数公司的组织结构是历史遗留的,不是按照「理想的系统架构」设计的。

如果你是技术负责人,面对「组织结构和系统结构不匹配」的问题,你会怎么做?

是「改变组织结构来适应系统」?还是「改变系统来适应组织结构」?

这是一个没有标准答案的问题,取决于你的权力、时机和优先级。

基于 VitePress 构建