1.1.2 准确理解软件架构
1.软件架构的定义
软件架构,就是指从宏观角度说明一套软件系统的组成与特性,这里的关键字是“宏观”。架构设计,与需求分析、概要设计、详细设计最大的差别就在于“宏观”二字,它要求架构师在进行架构设计时,必须具有大局观,首先从全局角度去思考问题。这也是我们从程序员成长为架构师需要突破的最大障碍。
“不识庐山真面目,只缘身在此山中。”我们在山中看到的是庐山的一草一木,只有站在庐山之外眺望,才能看到庐山的雄伟面貌。要从程序员成长为一个合格的架构师,首先要突破的是思维习惯。程序员在思考问题时,很容易落实到如何编码、用什么技术等细节,就看不清楚整个系统的面貌;而合格的架构师在思考问题时应当首先从宏观、从全局角度出发,培养大局观。
2.软件架构包含哪些内容
过去,大家可能狭隘地认为,软件架构就是软件系统的设计骨架,就是软件怎样分层、分模块,采用什么样的技术架构,但这些只是软件架构的一部分。软件架构包含了软件系统方方面面的问题,包括逻辑架构、数据架构、开发架构、运行架构与物理架构5个方面。
1)逻辑架构,就是软件要为哪些用户提供什么样的功能。所有的架构设计都是从需求分析开始的,架构设计中的所有决策都来源于需求,只有需求确定下来了,架构设计才有依据。架构设计最忌讳经验主义,例如选A技术是因为上个项目就选A技术,选B方案是因为上个项目就选B方案。每个项目的特点都是不一样的,特别是在当今技术快速迭代的背景下,每个项目都希望采用一些新技术,解决一些新问题,以增强新项目的生命力。因此,应当依据项目的需求去仔细考量,而不是“炒冷饭”。
2)数据架构,就是软件逻辑中的数据结构。在需求确认的基础上,接下来要开展的是功能性需求的分析设计。对于一个系统而言,功能性需求的分析设计的工作量是非常大的。但是,架构设计与概要设计、详细设计最大的区别就在于抓大放小、提纲挈领。功能性需求的核心是数据,所有业务流程都是围绕着数据进行的,因此,抓住了数据结构以及对这些数据结构的操作,就抓住了功能性需求的核心,这就是数据架构。
3)开发架构,就是软件代码的层次骨架,也就是之前理解的狭隘的架构设计。只有有了系统性的规划,这么多参与项目的人员才知道该怎么设计、怎么开发、怎么相互协作。
4)运行架构,就是软件在运行过程中所体现的非功能需求,是我们以往最容易忽略的部分。过去,系统都运行在局域网中,非功能需求并不是非常强烈。然而,当我们面对互联网高并发及大数据的严苛运营环境时,非功能需求的缺失将给项目带来不可挽回的巨大风险。因此,高质量架构设计的核心在于全面,将要设计的复杂软件系统的方方面面的内容,特别是涉及的风险,在架构设计的阶段都要全面地进行识别与考量。
5)物理架构,就是软件的物理部署以及网络拓扑。软件系统是运行于硬件设备中的,选用什么样的硬件设备,其硬件配置以及相应的软件部署,都是物理架构需要落实的内容。此外,硬件设备相互配合运行需要网络,因而网络拓扑、网络安全、系统可靠性、可扩展性等,也都是物理架构设计需要认真考虑的内容。
可以看到,高质量的架构设计包含的内容很多,每一部分都不能缺失。同时,每一部分都包含各种各样的风险,因此高质量的架构设计就是不断地识别风险并制订设计方案去规避风险。正因为如此,我们必须有一套方法,按照一定的步骤,切实可行地去一步一步设计架构,保证设计的高质量。这一套方法就是本书要详细讲解的“5视图法”。