随手翻了一下压在桌子底下的《人月神话》,发现 Brooks Law 在人月神话中提到了「康威定律」,虽然随着云原生的发展微服务架构已经乏善可陈,但是还是想借助这篇文章来研究一下康威定律给程序员个体带来的思考和启发。
Organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations. - Melvin Conway(1967)
康威定律(Conway's Law)—— 系统设计出来的结构总是会模仿组织沟通结构的形态。它是由梅尔文·康威(Melvin E. Conway)提出的一种观察结果,表述了组织结构对系统设计的影响。
这句话的核心意义在于,一个组织中的沟通模式、团队结构、以及个体间的协作方式等都会直接或间接地反映在它所设计和构建的软件或系统的架构上。换句话说,如果一个公司的结构是分散的,那么它生产的软件也可能会是由许多相对独立的模块组成;如果一个公司的结构是高度集中的,它生产的软件可能会有一个统一的核心,周围是一些紧密相关的组件。结合下面这张图以及平时接触到的各家公司的产品,是不是能感受到这其中的不同:
康威定律的影响和应用主要体现在以下几个方面:
Communication dictates design
组织沟通方式会通过系统设计表达出来
沟通的问题,会带来系统设计的问题,进而影响整个系统的开发效率和最终产品结果。
There is never enough time to do something right, but there is always enough time to do it over
时间再多一件事情也不可能做得完美,但总有时间做完一件事情
一口气吃不成胖子,先搞定能搞定的。
There is a homomorphism from the linear graph of a system to the linear graph of its design organization
线型系统和线型组织架构间潜在的异质同态特性
将沟通的成本维持在系统内部,每个子系统就会更加内聚,彼此的依赖耦合变弱,跨系统的沟通成本也就能减低。
The structures of large systems tend to disintegrate during development, qualitatively more so than with small systems
大的系统组织总是比小系统更倾向于分解
当我们面对复杂系统时往往只能通过增加人力来解决,这时一般的解决方法是分而治之(Divide and conquer),所以一个大的组织因为沟通成本/管理问题,总为被拆分成一个个小团队,一个复杂的系统也同样适用。
康威定律并不是真正的「定律」,而是提出者根据其观察提炼的经验法则,这些经验法则恰好能够解释系统结构和组织之间关系,并且能够帮助程序员和管理者进行优化:
程序员应意识到其所在组织的结构和沟通方式会直接影响软件的设计和最终形态。理解这一点有助于程序员在编码前更全面地考虑如何设计模块和接口,以适应组织的沟通模式。
康威定律提醒程序员在设计软件时应考虑团队的结构和沟通路径。程序员进行架构设计时需要设计更加模块化和解耦的系统以反映和支持组织的高效运作。
除此之外,还有一个运用康威定律的方法 —— 逆康威定律:根据想得到的软件架构来设计团队结构而不是盲从一个被设计好的团队结构。
康威定律鼓励程序员在团队内部建立有效的沟通机制。良好的内部沟通可以促进信息的流动,降低因误解或信息滞后造成的错误,从而提高项目的整体质量和效率。
从康威定律中吸取的洞见可以帮助程序员优化个人及团队的工作流程,通过改善沟通结构降低冗余和提升协作效率。