设计空间与设计规则 — 软件架构系统研究方法

来源:Thomas G. Lane, CMU/SEI-90-TR-18 / CMU-CS-90-175, November 1990
原文标题:Studying Software Architecture Through Design Spaces and Rules
作者:Thomas G. Lane, CMU School of Computer Science, Software Architecture Design Principles Project
页数:38页(约1.1万字符)
类型:文字版英文技术报告 / 博士论文摘要版
目录位置:田浩然上传的资料/0B105-SoftwareArchitecture/Lecture-5/tr18.90.pdf
处理日期:2026-08-28


核心论点

软件系统的整体结构(“软件架构”)可以通过**构建设计空间(design space)来有效研究。设计空间识别创建设计时做出的关键功能和结构选择,并分类每个选择的可用备选方案。可以在设计空间中制定设计规则(design rules)**来关联不同维度的选择。规则集合是有价值的设计辅助工具,并为自动结构设计提供了有前景的途径。

本报告以用户界面软件架构为具体案例,构建了一个设计空间和相关规则,并通过实验验证了这些规则的预测与真实系统设计的一致性。


1. 知识编码化(Codified Knowledge)的价值

1.1 为什么需要设计空间?

软件工程正处于从”每个系统从零发明”到”基于已有模式做常规设计”的转折点。设计空间和设计规则的目标是将软件设计知识组织成可用的形式——就像20年前控制结构的编码化(结构化编程革命)一样。

1.2 三大收益

如果设计词汇被广泛采用,有三大好处:

  1. 辅助创建设计:提供心智构建块(mental building blocks)
  2. 辅助理解/预测设计属性:为知识的创建和应用提供上下文
  3. 降低理解他人设计的成本:减少需要学习的新概念数量

1.3 工程设计手册类比

传统工程领域早已区分创新设计(innovative design)和常规设计(routine design):

  • 创新设计依赖原始发明或从抽象原理推导
  • 常规设计使用标准化方法解决与以前相似的问题

常规设计方法更便宜、更可能产出可接受的设计(虽然不一定最优)。设计手册的主要目的就是支持常规设计。算法和数据结构已有手册(Knuth, Sedgewick),但更高层次的软件设计尚未有手册。


2. 设计空间的核心概念

2.1 什么是设计空间?

一个多维设计空间对系统架构进行分类:

  • 每个维度描述系统的一个特征或设计选择的变化
  • 维度上的值对应备选的需求或设计选择
  • 一个具体系统设计对应设计空间中的一个点

设计空间的维度通常不是连续的,也不一定有度量(距离测度)。结构选择维度通常是离散的,可能有意义排序也可能没有。即使原则上连续的维度(如性能数值),在设计早期也常聚合为少数离散值(低/中/高)。

2.2 功能性 vs 结构性设计空间

类型反映在瀑布模型中对应
功能设计空间需求或评估标准(功能/性能)需求分析和总体功能设计的结果
结构设计空间结构或其他设计选择初始系统分解的结果

两者可视为独立空间,也可视为一个大设计空间的子空间。关键洞见:发现功能维度与结构维度之间的相关性,就能提供直接的设计指导——哪些设计选择最可能满足功能需求。

2.3 粒度问题

构建设计空间的关键问题之一是找到最有用的分类粒度。例如,用户界面行为规约方法包括状态转移图、上下文无关文法、菜单树等,每种还有许多小变化。

2.4 相关工作

  • Bell & Newell (1971):计算机硬件结构分类法(功能、IPS、内存大小、硬件支持的数据类型等维度)——设计空间概念的经典来源
  • Wegner (1987):面向对象语言的设计空间
  • Prieto-Díaz & Freeman (1987):软件复用中的 faceted 分类方案
  • 用户界面领域:以往多关注控制流模式(Hayes 85, Tanner 83)或外观/行为表示法分类(Green 86, Myers 89),而内部结构问题被普遍忽视

3. 用户界面软件的三层结构模型

任何完整的用户界面系统都可分为三个组件组:

  1. 应用特定组件(Application-specific component)

    • 针对特定应用、不复用于其他应用的代码
    • 包括应用的功能核心,也可能包括应用特定的用户界面代码
  2. 共享用户界面组件(Shared user interface component)

    • 旨在支持多个应用程序用户界面的代码
    • 仅适用于所有设备类型的代码
  3. 设备相关组件(Device-dependent component)

    • 特定于某类I/O设备的代码(非应用特定)

两个关键接口:

  • 应用接口(application interface):应用特定代码 vs 共享用户界面代码的分界
  • 设备接口(device interface):设备特定代码 vs 共享用户界面代码的分界

灵活性:真实系统的划分有一定灵活性——可以通过采用不同标记来分析系统的不同层次。例如分析X Window System时,可以把服务器外一切视为应用特定,然后再把服务器内部划分为共享和设备相关层。


4. 功能设计空间维度

功能维度识别对结构影响最大的用户界面系统需求,分三组:

4.1 外部需求

维度选项/级别说明
外部事件处理无 / 等待输入时处理 / 抢占用户命令应用是否需要响应非用户界面来源的事件,以及响应时间尺度
用户可定制性低 / 中 / 高终端用户可定制界面的程度:仅细节修改→命令重定义/宏语言
跨设备适应性无 / 局部行为变化 / 全局行为变化 / 应用语义变化更换I/O设备时界面行为需要变化的程度
计算机系统组织单处理 / 多处理 / 分布式处理运行环境的基本性质

4.2 基本交互行为

基本界面类(Basic interface class)——基于Shneiderman分类:

  • 菜单选择(Menu selection)
  • 表单填充(Form filling)
  • 命令语言(Command language)
  • 自然语言(Natural language)
  • 直接操纵(Direct manipulation)

菜单选择和表单填充可由类似系统结构支持;其他每类都有独特需求。

4.3 实际考量

跨界面风格的应用可移植性:

  • 高:应用应能跨显著不同的风格移植(如命令语言 vs 菜单驱动)
  • 中:应用应独立于较小的风格变化(如菜单外观)
  • 低:界面可变性不重要

5. 结构设计空间维度

结构维度代表决定用户界面系统整体结构的决策,分三大组:

5.1 功能与知识的模块划分

应用接口抽象级别(Application interface abstraction level)——核心结构维度,共六级:

级别特点典型例子
1. 单体程序(Monolithic)应用与共享代码无分离电子游戏等小型专用系统
2. 抽象设备(Abstract device)共享代码只是设备驱动,提供物理操作原语”画线”而非”呈现菜单”
3. 工具包(Toolkit)共享代码提供交互技术库(菜单/滚动条等)应用负责选择和组合元素
4. 固定数据类型的交互管理器共享代码控制局部和全局交互序列,通信使用标准数据类型”获取命令”/“呈现结果”
5. 可扩展数据类型的交互管理器同上,但数据类型集可由应用扩展-
6. 完全独立的应用语义(报告中未详述完整第六级)-

关键洞见:抽象级别是用户界面软件的最关键结构属性。这个分类最早可追溯到Hayes et al. 1985。

抽象设备可变性(Abstract device variability)——设备接口的关键维度:

  • 设备独立代码放弃对界面细节的控制越多,直接操纵就越难得到好的支持

5.2 表示问题

用户界面定义表示法(Notation for user interface definition):

  • 隐式(Implicit):表示法存在于代码结构中,无独立规格说明
  • 内部过程式(Internal procedural):通过调用库例程定义界面
  • 内部声明式(Internal declarative):通过数据结构参数定义
  • 外部声明式(External declarative):独立的规格说明文件,如菜单树、UI描述语言
  • 外部过程式(External procedural):外部语言/宏定义

5.3 控制流、通信与同步

通信基础(Basis of communication):

  • 基于共享状态(state-based)
  • 基于事件(event-based)
  • 混合(状态+提示 / 状态+事件)

控制线程机制(Control thread mechanisms):

  • 单线程(事件处理器 / 中断服务例程)
  • 非抢占式进程
  • 标准进程(抢占式)
  • 轻量级进程
  • 中断服务例程

6. 设计规则

6.1 规则的本质

在这个设计层次上,很少有绝对的硬性规则。大多数维度间的关系是:一个维度的某个选择倾向于或不倾向于另一维度的特定选择;这种相关性的强度因情况而异。

设计规则的自然表示法是与两个(或多个)维度的特定备选组合关联的正负权重。给定设计的评估就是对所有适用规则的权重求和。

6.2 两类规则

规则类型作用难度
功能→结构规则让系统需求驱动结构设计直接
结构间互连规则确保设计的内部一致性更复杂(不同维度选择互相影响,需要组合搜索)

6.3 规则示例(精选)

功能→结构规则:

  1. 如果外部事件处理需要抢占用户命令 → 强烈倾向抢占式控制线程机制(标准进程/轻量级进程/中断服务例程)
  2. 高用户可定制性需求 → 倾向外部表示法
  3. 强跨设备适应性需求 → 倾向更高的应用接口抽象级别(解耦应用与界面细节)
  4. 分布式系统组织 → 倾向基于事件的通信(基于状态需要共享内存,分布式环境中代价高)
  5. 基本界面类影响抽象级别选择:菜单/表单适合工具包和不可扩展交互管理器;直接操纵需要可扩展交互管理器或工具包
  6. 高应用可移植性需求 → 倾向更高级别的应用接口抽象,以及事件型或纯状态型通信(而非混合型)

结构间规则示例:

  • 应用接口抽象级别选择影响界面表示法选择:
    • 单体/抽象设备 → 隐式表示通常足够
    • 工具包 → 隐式+内部声明式
    • 交互管理器 → 外部和/或内部声明式
    • 可扩展交互管理器 → 大量依赖过程式表示法

7. 验证实验

7.1 实验设计

用6个未参与设计空间构建的系统来测试规则:

  • 2个截然不同的UIMS
  • 1个面向新手程序员的集成编程环境
  • cT教育编程语言环境
  • 1个图形数据库显示自动生成系统
  • 1个飞行模拟器控制程序

方法:

  1. 让每个系统的设计者用设计空间术语描述其系统
  2. 把功能描述输入程序,由规则集推荐最优结构
  3. 比较推荐结果与实际设计

7.2 实验结果

  • 使用 kappa统计量 衡量,规则预测与实际设计中度到实质性一致(moderate to substantial agreement)
  • 大部分差异可归类为:合理的设计意见分歧 / 规则中的小错误或疏忽
  • 表现最差的领域:表示法选择(用户界面定义表示法和应用语义信息表示)——可能因为当前设计空间主要关注运行时结构,对设计过程维度覆盖不足

7.3 结论意义

这些结果非常出色,因为规则中的信息量很有限(3.1节的例子只占完整规则集的约10%)。这表明设计空间本身提供了巨大杠杆——即设计空间所做的分类使选择正确的设计类型变得更容易。

两个核心发现:

  1. 专家用户界面系统设计者之间在结构选择上存在显著的共识
  2. 设计空间和规则捕捉了(至少部分)这种共识

8. 设计空间的构建方法论

8.1 自下而上的归纳法

设计空间和规则基于对现有用户界面系统的广泛调查:

  • 通过寻找分类方式将具有相似属性的系统归在一起 → 形成设计空间
  • 基于观察到的相关性制定规则

类比:生物分类学的自然史研究——生物学家也是先调查和分类现有形态,再寻找解释性理论。

8.2 两个主要问题

1. 可能遗漏重要维度

  • 很难证明一个设计空间覆盖了所有可能相关的内容
  • 实验结果表明,可能需要增加与设计方法相关的维度

2. 去除多余维度同样重要和困难

  • 最初定义的25个功能维度中,只有约10-12个有显著影响
  • 结构维度中,许多选择因与保留选择高度相关而可以省略
  • 例如:应用接口抽象级别的分类足以预测该接口的许多属性(如跨接口交换的数据类型性质)

8.3 一个发人深省的观察

前十大功能维度强烈偏向系统灵活性的度量——用户可定制性、跨设备适应性、跨风格可移植性分别衡量灵活性的不同方面。灵活性的重要性远超任何特定系统属性(如I/O设备的性质或速度)。

也许某一天,灵活性会被认为是许多软件结构的基本决定因素。


9. 总结与展望

9.1 核心贡献

  1. 提出设计空间+设计规则作为组织软件设计知识的通用方法
  2. 以用户界面软件为具体领域,构建了一个完整的设计空间
  3. 通过实验验证了方法的有效性——规则预测与专家设计有显著一致性

9.2 实用价值梯度

  • 设计空间本身(即使没有规则)就是有用的:作为不同设计方法的紧凑总结,帮助设计者避免忽视好的解决方案
  • 非正式规则/指南:帮助设计者快速排除低劣选择,把时间留给在合理备选方案中选择
  • 形式化规则集:可作为自动设计助手甚至全自动系统构建的基础

9.3 未来方向

作者希望其他研究者为其他领域构建设计空间和规则:

  • 其他类型的系统
  • 设计过程中其他抽象级别的设计空间

最终目标:发现软件设计的通用原则——例如某些类型的设计维度可能是普适的。


关键概念速查

概念英文原文一句话定义
设计空间Design Space多维分类空间,每维描述一个系统特征或设计选择
设计规则Design Rules维度间的相关性/权重,指导从需求到结构的选择
功能设计空间Functional Design Space描述需求和评估标准的维度集合
结构设计空间Structural Design Space描述结构选择的维度集合
应用接口Application Interface应用特定代码与共享用户界面代码的分界
设备接口Device Interface设备特定代码与共享用户界面代码的分界
抽象级别Abstraction Level应用接口的关键属性:从单体到可扩展交互管理器的六级
常规设计Routine Design使用标准化方法解决已知问题,便宜且可靠
创新设计Innovative Design从原始发明或抽象原理出发的全新设计

关联

本报告是软件架构设计空间方法的奠基性文献之一,开创了将架构选择系统化、量化的研究路径,对后来的架构评估方法(ATAM等)和软件产品线工程有深远影响。