公理:被认为已经成立、被采纳或不证自明的真理的陈述或命题。
数学家在公理(即对事物无可争议的假设)的基础上建立理论。软件架构师也将理论建立在公理之上,但是软件世界比数学世界要更加“软性”:基础的事物持续快速变化,甚至包括我们的理论所基于的公理。
软件开发生态系统处于一个恒定的动态平衡状态:尽管在任何给定的时间点都处于平衡状态,但在长期内表现出动态行为。当下容器化的提升及其产生的变化能够很好地说明生态系统的这一特质:像Kubernetes这样的工具在十年前还不存在,但是现在甚至有了Kubernetes用户大会。软件生态系统的变化是混沌的:一个小变化引起另一个小变化,如此重复数百次就会产生一个新的生态系统。
架构师有一个重要的责任,即质疑从过去的年代遗留下来的假设和公理。许多关于软件架构的书籍都是在一个与当今世界几乎没有什么相似之处的年代写成的。事实上,作者认为,我们必须经常质疑基本公理:从改进的工程实践、可操作的生态系统、软件开发过程的角度—在架构师和开发人员日常工作中产生混乱、动态平衡的方方面面。
随着时间的推移,细心观察软件架构的人见证了其能力的演变。从极限编程的工程实践开始,继之以持续交付、DevOps革命、微服务、容器化,现在则是云资源,所有这些创新都带来了新的能力和权衡。随着能力的变化,架构师对行业的看法也发生了变化。多年来,软件架构的半开玩笑的定义是“以后很难改变的东西”。后来出现了微服务架构风格,变化则是最重要的设计考虑因素。
每个新时代都需要新的实践、工具、度量、模式和一系列其他变化。本书从现代的角度看待软件架构,综合了过去十年的所有创新,以及一些适用于当下的新结构和视角的新的度量标准和方法。
长期以来,开发人员一直希望将软件开发从手工活(熟练的工匠只能产生一次性的工作)转变为工程学科,这意味着可重复性、严谨性和有效的分析。尽管软件工程相比其他类型的工程学科仍然落后许多个数量级(公平地说,与大多数其他类型的工程相比,软件工程是一个非常年轻的学科),架构师已经做出了巨大的改进,我们将对此进行讨论。特别是,现代敏捷工程实践在系统类型方面的架构设计上取得了很大进展。
我们还讨论了至关重要的权衡分析问题。软件开发人员很容易迷恋某种特定的技术或方法。但是,架构师必须总是冷静地评估每一个选择的好与坏、美与丑,实际上,在现实世界中没有什么东西能提供完美的二元选择—一切都是权衡。鉴于这种实用主义的观点,我们努力消除对技术的价值判断,专注于分析权衡,让读者带着审视的眼光进行技术选择。
本书不会让人一夜之间成为一个软件架构师—软件架构是一个包括很多方面的微妙领域。我们希望为现有的和新兴的架构(从结构到软技能等方面)提供一个良好的现代化软件架构概览。虽然本书涵盖了众所周知的模式,但依靠所获得的经验教训、工具、工程实践和其他输入,我们采用了一种新的方法。我们将现代化的轮廓考虑在内,借鉴了软件架构中的许多现有公理,根据当前的生态系统重新思考它们,并设计架构。