11. 细化架构的故事

如果一个项目的系统架构(包括理论基础)尚未定义,就不应该进行此系统的全面开发。 -- Barry Boehm, 《Software Engineering》

如果选择视图的工作没做好,或者以牺牲气体视图为代价,只注重一个视图,就会掩盖问题以及延误解决问题。 -- Grady Booch, 《UML用户指南》

从概念架构到细化架构,先设计概念架构,构思关键问题的解决策略;再进行细化架构的设计,以保证为开发提供足够的指导和限制...这符合人类解决问题的规律,因此被广泛采用。

但在实际中,细化架构设计还存在很多差强人意之处,甚至经常被忽视。

11.1. 骄傲的架构师,郁闷的程序员

11.1.1. 故事:《方案书》确定之后

公司在谈一个项目,但还没有得到客户的认可。后来,除了老李这个项目经理之外,小张作为架构师、小王作为需求分析师也都参与了进来。他们几个在和客户沟通的基础上,通力合作,最后成功提交了《方案书》,并获得客户的认可。《方案书》是老李、小张、小王各负责一部分来写的,其中架构师小张负责总体设计部分。

小张认为:《方案书》被认可说明架构已经很明确,无须“再”架构设计了。

最后,苦了程序员,因为他们在实际开发过程中没有得到足够的指导和限制。

11.1.2. 探究:“方案”与“架构”的关系

究其原因,这是因为概念架构难以支持并行开发。要支持开发组相对独立进行工作,需要提供指导和限制作用更明确的“规约”一级的设计。

具体而言,细化架构和概念架构之间存在如下典型差异:

  • 接口 :在细化架构中接口占据非常核心的地位,而概念架构并不明确接口定义(只有抽象的组件和抽象的交互机制)。
  • 子系统 :细化架构重视通过子系统和模块来分割整个系统,并且子系统往往有明确的接口;而概念架构中只有抽象的组件,这些组件没有接口,只有职责,一般是处理组件、数据组件胡哦哦连接组件中的一种。当然,概念架构中也有“大组件分解成小组件”的设计决策,但并非子系统的含义。
  • 交互机制 :细化架构中的交互机制应是“实在”的,如基于接口编程、消息机制或远程方法调用等;而概念架构中的交互机制是“概念化”的。例如“A层使用B层的服务”就是典型的例子,这里的“使用”到了细化架构中可能基于接口编程、消息机制或远程方法调用等其中的一种。

当然,概念架构和细化架构都满足软件架构的定义--无论是“架构 = 组件 + 交互”,还是“架构 = 重要决策”。

方案的设定,为什么需要项目负责人、需求人员、架构师等功能参与呢?因为方案涉及的工作内容不仅仅是架构,还涉及项目管理和需求工作。“方案”和“架构”的联系与区别如下:

  • 方案包含一定的架构内容
  • 方案涉及的架构基本在概念架构一级
  • 架构设计的工作还远未完成

所以,架构师应记住:

  • 方案 = “项目 + 需求 + 架构”的总览
  • 方案 ≠ 架构的全部

11.2. 办公室里的争论

11.2.1. 故事:办公室里,争论正酣

办公室里,关于什么是软件架构,争论正酣。程序员说,软件架构就要决定要编写哪些类,使用哪些现成框架(Framework)。程序经理说,软件架构就是模块的划分和接口的定义。系统分析员说,软件架构就是为业务领域对象的关键建模。配置管理员说,软件架构就是开发出来的及编译后的软件到底是啥结构。数据库工程师说,软件架构规定了持久化数据的结构,其他一切不过是对数据的操作而已。部署工程师说,软件架构规定了软件部署到硬件的策略。用户说,软件架构就是决定一个个功能子系统如何划分。大家想了想说,这些架构视图好像我们都需要啊,软件架构师哭了。

11.2.2. 探究:优秀的多视图方法,应贴近实践

上述争论可以总结为一句话:不同涉众看待软件架构的视角是不同的 。但是,实际工作中架构师的工作范围如此广泛,多视图方法能系统的涵盖吗?例如:

  • 进程、线程的相关设计
  • 接口的定义
  • 子系统的划分
  • 服务器的选型
  • (若你用C)结构化方法的模块设计“放”哪里?
  • 考虑Layer(逻辑层)
  • 考虑Tier(物理层)
  • (基于并行开发的需要)源程序目录结构的定义
  • 数据分布与数据库Schema
  • (若没选RDBMS而选了文件方式)文件格式的定义
  • (嵌入式系统常将数据保存到FlashFlash存储结构的定义
  • ......

答案是:贴近实践的多视图方法,应将各项工作涵盖其中

  • 运行架构
    • 进程、线程的相关设计
  • 逻辑架构
    • 接口的定义
    • 子系统的划分
    • (若你用C)结构化方法的模块设计“放”哪里?
    • 考虑Layer(逻辑层)
  • 物理架构
    • 服务器的选型
    • 考虑Tier(物理层)
  • 开发架构
    • (基于并行开发的需要)源程序目录结构的定义
  • 数据架构
    • 数据分布与数据库Schema
    • (若没选RDBMS而选了文件方式)文件格式的定义
    • (嵌入式系统常将数据保存到FlashFlash存储结构的定义

11.3. 展望细化架构阶段

总结一下。首先,架构设计仅进行到概念架构层面,对团队的并行开发而言是远远不够的;常见的错误就是把《方案书》中的概念架构设计部分直接作为《架构设计文档》提交。另外,业界早已存在一些有影响力的多视图方法(例如RUP4+1视图方法),但是作为一线架构师,要有意识的调整、扩充、改进经典方法以符合实践的真正需要。

下一节:假设有一座漂亮的大房子,一个人站在房子的前面,一个人站在房子的后面,另外两个人分别站在房子的左右两侧。四个人看房子都有不同的视角,四个人都在争论自己看到的那一面是正确的一面,如果运用水平思考,那么这四个人就会绕房子一圈,分别看到房子前后左右四个面。 -- 爱德华.德.博诺,《六顶思考帽》

总的来说,“架构”一词涵盖了软件架构的所有方面,这些方面紧紧的缠绕在一起,决定如何将之分割成部分和主题显得相当主观。既然如此,就必须引入“架构视点”作为讨论、归纳和理解大型系统架构的手段 -- Peter Herzum, 《Business Component Factory》

架构设计是一门解决复杂问题的实践艺术。于是,以分而治之为思想核心的多视图方法必不可少。

接下来主要介绍支持细化架构设计的整体思路--多视图方法。