软件架构基础概念详解从思维到组件、框架本文系统梳理软件架构领域的基础概念架构师的核心思维、系统与子系统、模块与组件、框架与架构的区别以及银弹背后的软件工程本质。一、架构师的思维与能力1.1 判断和取舍 vs 逻辑和实现架构设计与程序设计的思维侧重点截然不同架构设计的关键思维是判断和取舍程序设计的关键思维是逻辑和实现1.2 快速迭代与长期可扩展的平衡互联网公司要更快交付产品就必须平衡快速迭代的压力与维护产品长期可扩展、可伸缩之间的矛盾。架构师需要在先跑起来和为未来留余地之间找到平衡点。1.3 安全、合规与隐私泄露安全、合规、隐私泄露是业界近些年新暴露出来的痛点。架构师如何在这些方面思考和取舍是一个相当开放的问题——没有标准答案只能结合业务与风险不断权衡。1.4 架构设计的本质场景、工具、取舍架构设计就是迎合某个场景选择合适的工具。要做到这点需要明确自己对工具的优缺点有清晰认知始终带着取舍的思想去设计理解不同阶段解决问题的不同方式——架构不是一成不变的1.5 优秀架构师的基因决定架构师是否优秀的两大基因当面沟通、澄清、表达的能力——能把复杂问题讲清楚、对齐各方对新技术知识归门别类的同化能力——能把新知识快速纳入自己的知识体系二、系统与子系统2.1 系统System系统泛指由一群有关联的个体组成、根据某种规则运作、能完成个别元件单独无法完成的工作的群体。其含义是总体“整体或联盟”。系统包含四个要素① 关联 系统由一群有关联的个体组成没有关联的个体堆在一起不能成为系统。例把一个发动机和一台 PC 放在一起不能称之为系统把发动机、底盘、轮胎、车架组合起来才成为一台汽车。② 规则 系统内的个体需要按照指定规则运作而不是各自为政。规则规定了系统内个体分工和协作的方式。例汽车发动机负责产生动力通过变速器和传动轴将动力输出到车轮从而驱动汽车前进。③ 能力 系统能力与个体能力有本质差别——它不是个体能力之和而是产生了新的能力。例汽车能够载重前进而发动机、变速器、传动轴、车轮本身都不具备这种能力。2.2 子系统Subsystem子系统也是由一群有关联的个体组成的系统多半是更大系统中的一部分一个系统可能是另一个更大系统的子系统层层嵌套小结系统 关联 规则 新能力。整体大于部分之和这是系统思想的精髓。三、软件模块Module模块是一套一致而互相有紧密关联的软件组织包含程序和数据结构两部分。现代软件开发往往利用模块作为合成的单位模块的接口表达了该模块提供的功能 调用它时所需的元素模块是可能分开被编写的单位——这使得模块可再用并允许人员同时协作、编写及研究不同的模块一句话模块是可独立编写、可复用、可协作开发的软件组织单元。四、软件组件Component组件定义为自包含、可编程、可重用、与语言无关的软件单元可以很容易被用于组装应用程序。一句话组件是即插即用、语言无关的软件单元强调组装与复用。五、关系模块 vs 组件划分模块的主要目的是职责分离划分组件的主要目的是单元复用。维度 模块Module 组件Component划分目的 职责分离 单元复用视角 业务/逻辑维度 技术/组装维度侧重点 内部组织、高内聚低耦合 可重用、可组装、语言无关六、软件框架Framework软件框架通常指为了实现某个业界标准或完成特定基本任务的软件组件规范实现该规范时提供规范所要求的基础功能的软件产品框架是组件规范例MVC 是最常见的开发规范类似的还有 MVP、MVVM、J2EE 等框架。框架提供基础功能的产品例Spring MVC 是 MVC 的开发框架。除了满足 MVC 规范Spring 还提供注解Controller 等、Spring Security、Spring JPA 等大量基础功能来帮助我们实现功能。七、软件架构Architecture软件架构指软件系统的基础结构、创造这些基础结构的准则以及对这些结构的描述。一句话架构回答的是系统怎么搭——结构是什么、按什么准则搭、怎么描述它。八、框架 vs 架构核心区别框架关注的是规范架构关注的是结构。再结合前面所有概念可以得出完整的定位对比概念 定位架构 顶层设计框架 面向编程或配置的半成品组件 从技术维度上的复用模块 从业务维度上职责的划分系统 相互协同、可运行的实体一句话记忆 架构是顶层设计怎么搭框架是半成品拿来就用组件是技术复用即插即用模块是业务分工各司其职系统是可运行的整体协同运转。九、架构的起源为什么需要架构因为只有大公司开发的软件系统才具备较大规模而只有规模较大的软件系统才会面临软件架构相关的问题例如系统规模庞大内部耦合严重开发效率低系统耦合严重牵一发动全身后续修改和扩展困难系统逻辑复杂容易出问题出问题后很难排查和修复当系统小的时候单打独斗也能维护当系统大了没有架构约束就会陷入上述泥潭。架构是为了应对大规模、高耦合、高复杂度而生的顶层设计。十、模块、对象、组件的本质拆分的粒度“模块”“对象”组件本质上都是对达到一定规模的软件进行拆分差别只是在于随着软件的复杂度不断增加拆分的粒度越来越粗拆分的层次越来越高。对象(最细) → 模块(中等) → 组件(较粗) → 系统(最粗)复杂度递增、粒度递增、层次递增 →十一、银弹的由来在软件开发活动中“银弹特指人们渴望找到的、用于制服软件项目这头难缠怪兽的万能钥匙”。这是软件工程领域著名的没有银弹问题的由来它提醒我们软件工程不存在一劳永逸的万能解决方案架构与开发永远需要结合场景判断和取舍总结软件架构的基础概念可以串成一条主线思维层架构是判断与取舍程序是逻辑与实现优秀架构师靠沟通表达和知识归化两大基因。结构层系统关联规则新能力模块管职责分离业务维度组件管单元复用技术维度。规范层框架是规范半成品架构是结构顶层设计。演进层对象→模块→组件→系统本质是按复杂度递增的拆分粒度越来越粗、层次越来越高。警示层没有银弹任何方案都要结合场景不断取舍。