Architecture(架构/体系结构)与营造法式:一个简单的理解

2023-10-09 20:40

本文主要是介绍Architecture(架构/体系结构)与营造法式:一个简单的理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者: 余彤鹰,  来源:  企业工程论坛,  发表时间: 2011-01-18
 

引言营造法式卷三十一插图

在企业应用(信息系统或软件)和企业工程领域,术语“architecture”越来越常见,但这个词的使用也常常显暧昧或矛盾。在多数情况下,我们会尽量使用其它简明而常见的词语,例如:涉及系统本身有“结构、构造、组成”(structure, construct, component)或“结构框架”(structural framework)、“结构类型”(structure type),以及系统的“类型、分类”(type, catagory)等,涉及建构/实现有“方法、过程、程序、方法学”(method/approache, process, procedure, methodology),涉及系统描述或规定有“建模、模型、参考模型、元模型”(modeling, model, reference model, metamodel),还有系统的“规划”(plan),“设计”(design), “工程”(engineering),等等。这些,加上些诸如“结构规范/标准”、“设计规范/标准”、“实施规范/标准”、“参考模型/框架”等等,似乎足以说明关于某种复杂人造系统的各种事情。那么,为什么我们需要“architecture”这个词?它为什么愈发流行?我们是否可以用奥卡姆剃刀[1]将其剔除?

理解要点

Architecture一词本源于建筑领域,它与建造有关,同时又涉及建造的方法,以及建造的设计方法及设计结果——目标系统的结构或风格。虽然在具体的使用中,有时会侧重于其中的某个方面,例如建筑的风格,软件的结构特征,企业的规划与治理等,但显然architecture并不是单纯指风格、结构或规划、建造(实现)的方法学等——当我们需要明确地谈论这些单纯的方面,不必放弃简明的词汇,去使用一个暧昧、多义的词。

理解的要点,正是在于这些要素的关联——而其中的关键,是系统的结构或结构特征、风格与其规划设计、建造、改造或演化方法之间的关系。更明确地说,复杂的系统的设计(指结果)与设计、建造方法与手段之间具有密切的关系。在涉及具体系统建造(实现)的语境中,单纯地讨论复杂系统的结构、结构特征通常是不切实际的,我们必须知道它们能否实现、怎样实现,甚至包括是否能够有效地维持其运作及根据需要作出改变。同时实现(及维护治理与改变)的手段、方法本身也制约着设计者对于结构或风格等的选择。例如,我们似乎可以按照自己的想象,把一栋大楼建设成任何样子,唯一的约束是物理学定理——但实际的情形并不是这样:要想设计一幢能够可靠地建成的建筑,除了物理学定理之外,我们还要受到许多限制,例如来自我们所拥有或可行的方法、手段或工具、材料等的限制,当然也包括某种式样或风格的限制。而且,目标系统越复杂,限制越多,也越有必要性。

另一方面,假如我们每一次都从零开始,仅仅根据力学原理来设计一栋大厦,那么,我们面临的是,一方面我们需要从最基础的要素——每一块砖的结构开始设计,将导致每一次的设计都异常繁琐而且是不可靠的,而另一方面,更重要的是,最终我们也许得到一个非常独特、完全符合物理学定理的设计方案,但没有人能够有效、可靠地实现。在设计和实现复杂系统时,人们必然地要大量地采用已有的、逐步积累的结构或部件。

在稍微成熟的、复杂系统营造的领域,人们会不断地总结、积累各种结构或结构风格,以及关联的设计、建构或实现的准则、方法与手段。对于复杂系统的营造,这些方面必然地关联在一起,构成一些不同的体系。这就是为什么有必要用architecture而不只是用structure或structure style/type和approaches/methods等的理由。

进一步,我们可以归纳出有效地营造复杂系统的两项基本原理(two basic architectural principles for complex systems),它们也是理解architecture概念独特性与重要性的关键:

1)  设计与实现关联原则:复杂系统的设计方案,如结构或结构特征的选择必须受可行的实现方法与手段的约束。

2)  部件或构造通用原则:复杂系统的设计与实现,应尽可能基于具有通用性、适用条件已知、可靠性经过验证的通用部件或构造。

这样,就得到在诸如软件、企业工程等领域使用architecture概念的基本理解:它的基本语境是“复杂人造系统”,涉及一系列相互关联的设计和建造(有时还包括维护/治理和演化/转变)相互关联的(系统性的)方法、手段和准则。

另一方面,我们还可以理解到,在诸如软件等领域,architecture越来越多地使用,正是人们对它的建造与实现规律日益加深,迈向成熟之的一种标志。

在这些理解的基础上,再回头看软件、企业工程等领域五花八门的定义,就比较容易解读了(包括一些较为偏颇的解释)。

例如ISO/IEC 42010:2007与ANSI/IEEE 1471-2000所给的定义:

“指系统的基础性组织,体现于其构件及它们的相互关系、与环境的关系、和它们的设计与演化的治理原则。”

因为它的基本语境是软件,因此使用了“构件”(components),对于一般系统,也可称为构成、构成部分、成分。而之所以强调“构件及其相互关系”而不是简单地用“结构”(structure)这样的表述,也顺应了前述“部件或构造通用原则”。同时,从“设计与实现的关联原则”,我们就可以更好地理解这个定义的后一部分——它与前面部分并不只是简单并举的关系。尤其是,它不应只是包含基本构成要素及其关系、结构或构造,还应当包括这些要素的运用、实现甚至治理的准则。

又如,来自欧洲的企业工程系统研究者简·迪茨这样界定企业工程中的architecture:

“Enterprise Architecture是设计自由度的规范性约束;实际上,它是一个协调一致的准则集合,用以指导企业的设计、工程和实施。只有应用Enterprise Architecture,才能将企业高层次的方针(使命、战略)一贯地实施于该企业的运作。”

在他的讨论中,也曾特别指出这一概念常见的引起混淆的不恰当用法,例如将EA仅仅理解为一种结构框架或蓝图。同样,结合上述理解要点,就能更好地理解他所说的“规范性约束”,以及为什么要在设计、工程和实施上一贯地加以运用。对于企业工程而言,由于它大部分时间是处于演变/改进过程之中,EA的运用基本上是在一个已经存在的企业运作过程中进行的。

汉语中的对应概念

南宋绍定重刊绍兴十五年平江府刊本《营造法式》在前面的文字中,我们有意识地使用了architecture,因为在软件和企业工程这两个基本语境中,architecture这个概念是外来的,而且不幸的是,已经流行的“架构”、“体系结构”等译法[2],恰恰是非常“不靠谱”的译法。它是最不好的那种翻译:没有找到对应词语,选择了一个与原概念既不等而又部分相关的词语来指代,这样最容易造成误导和混淆。理解了上述要点,就容易体会到为什么这样说——它们的字面意思都是错误的。

实际上,我们可以从architecture的本源——建筑领域找到答案。首先,对architecture较广义的用法,可以指学科(领域)或某种营造知识体系,现代汉语中已经形成的对应词汇是“建筑学”。但将“建筑学”直接借用到其它系统领域,似乎不是很理想(或许是因为中文“建筑”这个基本名词的存在),因而,我认为“建构学”或许是一种比较中肯的选择。例如在企业工程领域,我建议可以采用“企业建构学”(或参照后面,用“营造学”)。

事实上,目前在诸如软件、企业工程领域,architecture并不经常使用在类似“建筑学”的层面上(这可能与领域的成熟性有关),而是指向更具体的设计与建造体系。前面已经提到,目前流行的翻译,是“架构”和“体系结构”(及构架等)。事实上,我在《企业工程的内容与企业架构的定位》已初次指出,在建筑领域,古汉语已经有与architecture对应的说法,即“营造法式”(可参见维基百科营造法式条目)。将这四个字的意义展开来看,它的确精准地体现了我们前面讨论的方面。如果需要一个简称的话,我推荐“法式”——“法”提示了方法、准则;“式”提示了风格、样式,包含着构造/结构,它很好地点明了architecture这个概念的关键的方面,甚至有同样的来源(建筑领域)。事实上,不是我们想要将architecture“翻译”成“营造法式”,而是古汉语中本来就已经有了这个概念的词语,它与英文中的architecture具有相似的本意。(插图:宋建筑学著作《营造法式》页面,取自维基共享资源)

小结

对于复杂系统的设计与实现(包括维护/治理及演化/改变),Architecture是一个重要的概念。可以看到,对于复杂系统的营造,它是一个重要的概念,有独特的含义,并不能用其它常见的关联概念简单取代。我们归纳出了这一概念涉及的两个最基本的原理,即设计与实现关联原则、部件或构造通用原则,它们是有效地营造复杂系统的两项基本原理。

可以从以下方面理解architecture存在的重要性:

  • 结合设计与建造方法与手段;
  • 使复杂系统的设计与实现可靠、可控、经济;
  • 为系统的维护——尤其是改造或演化提供基础,保持系统的策略或目标的连续性、一贯性。

在现代汉语中,“架构”或“体系结构”都是字面错误、误导极强的译法,古代汉语中早已有对应的概念,即“营造法式”,如需简称,我们建议采用“法式”,它比流行的翻译要好得多。


[1] 一种表述为“若无必要,勿增实体”,可参考维基百科奥卡姆剃刀条目。 [2] 有人刻意地颠倒使用“构架”,也许是想以此避免“架构”的强烈误导,但我认为这没什么两样。

 

转载自:http://www.ee-forum.org/pub/ty/2011-01-p2398.html(读取于 2011-07-09 11:29)

这篇关于Architecture(架构/体系结构)与营造法式:一个简单的理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/175433

相关文章

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h