架构设计(Architecture Design)是将产品从整体到局部的规划。与其说它是一种设计,不如将其描述为一种划分产品结构的理念。
实现一个产品其实就是满足客户需求、实现这些需求所承载的设计信息的过程。一个系统通常由很多不同组件构成,而这些组件如何形成、相互之间如何发生作用,是实现产品之前需要定义的重要信息。架构设计被赋予这个使命,成为向开发团队解释该产品未来可能呈现出的结构形式。
架构设计源于建筑领域,自古以来人们一直在研究建筑和人类的关系。人类构建建筑物,同时这些建筑物也会影响人类。这好比人类的生长取决于骨骼的发育,而发育的骨骼又决定了人的最终形态。很多产品如果在前期不进行架构设计,那么在完成具体的细节设计之后,会发现这些细节设计在开发后期几乎无法改变。而良好的架构设计可以指导产品未来的细节设计,并避免出现这种情况。
简单产品可能不需要架构设计,但凡是达到一定复杂程度的产品都需要架构设计。不同功能分类的设计可能还需要按系统层级划分成系统架构设计、机械架构设计、软件架构设计等。
架构设计没有统一的表现形式,不一定需要一张具体的图。它可能是一张粗糙的手绘草图,可能是简单拼凑的几何图形,可能是高度简练的相关性描述,也可能是具有树状结构的关系图。不同功能分类的架构设计图存在显著差异,例如,机械架构设计常常以产品高阶爆炸图为主,电子硬件架构设计常以拓扑图为主,而软件架构设计常以服务流或数据流的结构图为主等。几乎所有架构设计都多多少少具备树状分支架构的部分特征,因为这是显示系统与组件之间关系的最佳表现形式。
图3-5显示了一部传统手机的机械架构设计,左侧是高阶爆炸图(无细节),右侧为粗略的树状结构描述(图仅显示分解两层,是否需要继续分解,取决于团队的决定)。如果配以充分的解释说明,那这两侧都可以分别作为架构设计的表现形式。机械或物理系统的架构设计是产品物料清单(Bill of Materials,BOM)的原始输入,但两者不能等同,因为架构设计是粗糙的,不涉及产品的细节。
图3-5 机械架构设计示例(手机产品)
软件架构设计与机械架构设计有显著不同,这是因为软件产品(内在构造)的不可见性。图3-6显示了典型的软件架构设计理念。虽然软件产品千变万化,但其基本架构逻辑的差异性并不大。绝大多数软件都是由主程序向下分解成若干子模块,这些子模块分别对应一群服务组合(服务子模块之间可以相互组合),这些服务组合需对原始数据进行分析或处理,由服务器完成后台访问或计算后将数据返回服务组合,并经由子模块传递回主程序。工具组合实现了这些服务组合以及子模块的构建,并与数据库产生数据交互。
图3-6 软件架构设计理念
撇开产品战略和路线图等上层建筑,在具体的产品开发过程中,开发活动自上而下的一般顺序为概念设计、架构设计、细节设计等。其中,概念设计将从第8章开始介绍,原则上架构设计应在概念设计之后。但之所以在本章就提前导入架构设计的理念,是因为产品的架构设计对产品平台的构建有重大影响。通常,架构设计至少要完成这样几项任务:完成系统的初级分解,考虑产品的模块化设计,规划产品平台,研究产品的可拓展性,规划产品的可靠性等。这几项任务不仅对单个产品开发项目有效,也会极大地影响企业的产品路线规划。
1. 完成系统的初级分解
架构设计将作为系统与子系统之间的桥梁,这是梳理产品结构层次的过程。开发团队无法武断地决定初级分解到什么层次是合适的,但该分解可以让开发团队洞悉产品的内在逻辑关系,这不仅为后续详细设计指明了方向,也可以判断该产品是否和企业产品平台规划相一致。
2. 考虑产品的模块化设计
合理的架构设计可以将产品的功能或特征分解到最小可实现、可测试的模块。如果将这些模块标准化,那么企业就可以实现产品平台化,并实现模块化设计。模块化设计可以使用当前标准化的模块来迅速满足客户需求,大幅度减少后续产品的开发。以软件行业为例,今天已经很少有软件工程师从基础代码开始构建原始代码,而大量引用既有成熟模块已经是这个行业的典型做法。
3. 觃划产品平台
产品被模块化分解之后,企业就可以通过这些(标准)模块的各种组合来构建自己的产品平台或优化现有平台。在同一平台内的多个产品可能具有不完全相同的功能,但其架构设计几乎完全相同。
所以优秀的产品架构设计促进了企业产品平台的构成,并使产品实现模块化设计。根据企业的大量实操经验,架构设计活动是实现产品持续开发和改进的最佳实践之一,其输出也是重要的组织过程资产。