软件架构是软件构成的主旨结构,以及采纳该主旨结构的人(架构师)在设计时对问题域所持有的主要观点和看法,以及他们坚持的原则。软件架构由人(架构师)主观创造,解决客观的问题。是的,任何一个软件架构无论优劣,都是相对于其所特定的问题独一无二的解。
从架构师决定软件架构的角度来看,可以分为主观判断、客观选择两部分。主观判断包括了架构师(以及团队)对问题域理解,以及由此产生的软件设计要素,诸如架构分层、模块划分、API设计、数据模型设计,也就是通常所说的应用架构、信息架构和开放架构;甚至架构方法的选择,如是否采用DDD来建模,交流、描述整个软件的架构设计;主观设计是架构师(团队)根据个人经验以及对问题域的理解做出的一系列架构的决策。这部分架构设计对软件产生深远的决定性的影响,也是架构师(团队)的核心能力、价值体现。它产生的过程依赖人,是主观的,但是结果却是客观的,影响是决定性的。包括依据Conway定律,决定了研发团队的组织结构。依据开放能力水平,决定了软件产品的可持续发展演进能力和对变化的适应能力(如Linux已经演进了近30年还在持续)。主观判断关注点是设计,核心任务是根据实际需求构思出抽象的概念结构(人月神话语),特征是想象出最佳解决方案;从需求到设计的约束来自于需求,弹性较大,可把握的难易程度较大,来自于软件本身的使用价值。这一部分把软件视作解决问题的目的载体,考验的是架构师对问题领域的分析能力以及抽象思维逻辑能力。
客观选择是架构师(团队)根据对现有技术的把控和理解,选择一系列技术栈来实现主观判断产生出来的软件要素,诸如采用Spring Cloud来构建应用,选择MySQL作为数据库平台,选择AWS抑或阿里云作为部署平台等等,也就是通常所说的技术架构。这一部分还包括一些特殊的看似主观的判断,主要指一系列设计模式的应用,如采用Circuit Breaker来做服务的容错设计等等;因为模式本身是固定存在的,一旦使用,就遵循固定的范式。所以也是技术架构。对性能优化、部署、运维效率提升而采用的一些技术措施也属于技术架构的范畴。架构设计客观选择部分的特点是,利用已有技术能力来确定软件的实现路径,包括软件功能性和非功能性能力(性能、体验、运维效率等)的实现。这部分对软件质量的好坏、研发团队的工具链&效率、产品构建周期长短、软件维护的代价、软件的开发&使用成本等有直接的影响。客观选择的关注点是实现,核心任务是根据设计选择恰当的技术来实际开发、部署软件,使软件能够真正运行、被使用。特征是完成设计到实现的具体映射;从设计到实现的约束来自于需求和技术两个方面,表现为取得技术和需求共同约束的平衡,比较具体,弹性相对小,可把握的难易程度较小。这一部分把软件视作待加工的产品构件,考验的从架构设计到工程的实践能力。
需要特别说明的是,以上主客观的划分是可以解耦来看的,但划分不是绝对的,只是根据架构任务的主要目标不同进行的分类。架构本身是一个系统化的抽象复杂概念结构,是一个整体。相互制约,比如技术架构的约束可能影响主观判断的变化,如从字段到整表数据冗余场景可以轻易的破坏掉第三范式的设计,性能的要求带入大规模缓存使用让我们不得不放弃完美的一致性追求,广为人知的CAP定理只能提供三选二的选择等等。