软件架构指标
by Christian Ciceri, Dave Farley, Neal Ford, Andrew Harmel-Law, Michael Keeling, Carola Lilienthal, João Rosa, Alexander von Zitzewitz, Rene Weiss, Eoin Woods
第 3 章 进化架构:用可测试性和可部署性指导架构
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
软件架构既是重要的 ,也是短暂的。它可以决定系统的重要特性,例如可扩展性、性能和弹性。说它短暂,是因为我们对这些特性的判断往往是模糊和主观的。
对于我们建筑师所建造的系统而言,建筑描述和文件的最佳功能就像是旅游地图。它们能让我们浏览空间,而不会对细节过于精确或具体--这些细节很可能会发生变化。更多地了解用户和客户的需求和要求,可以改变我们对系统的建筑属性所处位置的看法。
如果您从事软件架构工作,您可能会有这样的疑问:如果我一开始使用的是一个简单的系统,当需求快速增长时,我该如何应对?如果需求没有增长呢?如何应对不断增长的性能、安全性和广泛的正常运行时间需求?如何将系统维持为一个可居住的空间,使其能够轻松发展,以满足新的或不可预见的需求?如何既能为意外的变化敞开大门,又能避免因过于繁琐的未来准备工作而阻碍开发进程?
本章提出的理由是,答案是一种防御性方法:软件架构师需要设计和学习技术,以管理他们所创建系统的复杂性。
学习和发现的重要性
复杂系统从来都不是从其创造者的头脑中完全形成的 ;它们是一个循序渐进、不断学习的过程的产物。软件开发始终是学习和发现的过程。这就意味着,如果你想把工作做好,就不要再试图想象你应该,甚至可以预见你的系统将如何被使用,以及随着时间的推移将如何发展。
在现实世界中,我们所构建的系统是复杂的自适应系统的一部分,其中包括开发人员、用户和客户,以及他们所处的环境和组织背景。这种现实要求我们在架构和设计时采用一种更加动态的、近乎有机的方法,这种方法可以让你边做边学,使你的软件适应不断变化的对其功能和方式的认识。
即使不知道所有答案,也要能够开始工作。随着学习的深入,你还需要保护和维持自己做出改变的能力。因此,你需要保持选择的开放性。
可持续变革的工具
什么样的架构选择可以让 你保持选择的开放性?软件设计的五个特性有助于实现可持续的进化方法。它们是
- 模块化
- 将系统划分为几个部分,这些部分可以在不影响其他部分变化的情况下发生变化。
- 凝聚力
- 将代码中一起变化的部分保持在代码中靠近的位置。
- 将关注点分开
- 确保代码和系统的每个部分都专注于解决一个问题。
- 抽象/信息隐藏
- 在系统中创建 "接缝",可以让用户在无需了解系统其他部分如何工作的情况下消费行为。
- 耦合
- 系统的不同部分需要共同改变的程度。
这些属性对于一般信息而言是普遍真实的,而不仅仅是软件。它们并不涉及系统如何工作或任何特定技术的性质。
无论一个系统是做什么的,也无论它采用了什么技术,如果它是模块化和内聚的,如果它有效地分离了关注点,如果它使用了良好的抽象来划分系统的一个部分和另一个部分,如果它适当地管理了系统不同部分之间的耦合,那么它就会比在这些属性方面得分不高的类似系统更容易工作、更容易改变、更容易理解、更容易测试。
对设计和架构采取这种渐进的方法,并以这种方式进行构建,意味着当你学到更多知识时,就会更容易使你的系统适应你学到的新东西。
例如,如果您发现您的系统使用图数据库比使用关系数据库更有效率,该怎么办?如果您一开始就选择将领域逻辑的核心与持久化其结果的问题分离开来,这将更容易改变。这样的系统能很好地分离关注点,具有更好的模块性、内聚性和适当的抽象性。您可以想象一下,拔掉 RDBMS 支持的存储库的插头,用 GraphDB 存储库取而代之,会相对容易一些。但是,如果您的核心领域和持久性混为一谈,您甚至很难想到要做这样的改变。 ...