提要: OO 之后, 软件程序架构领域再无大师. 一个看似简单而根本的问题从真正未解决, 那就是软件或计算机的世界与现实世界的关系.
程序架构与软件, 应用架构
最近一直在关注豆瓣上 Zhang3 http://www.douban.com/people/zhangiii/ 关于新型程序语言研究的情况 [1], 及一些相关的讨论. 这里有一个与我的重点领域模型与建模以及架构契合的地方, 即软件程序架构或简单称为 "程序架构"(programming architecture). 这是一个不太常用的提法, 相对于常见的软件(系统) 架构和应用架构, 它更单纯, 狭窄. 在这个范围内, 我们主要关心程序 (programs) 的组织框架与设计原则, 相对忽略更高层次上的东西, 例如组件, 模块, 服务器, 配置与部署等等. 从另一个角度, 这个话题与编程语言的结构和设计紧密相连.
实际上, 当前主流的程序架构就是 "面向对象"(OO). 我一直认为, OO 原本应该是一种有特定适用范围的架构风格. 然而在近几十年的软件开发领域, OO 被主流们推到了一般软件架构这样一个几乎是至高无上的位置, 甚至还进一步被当作一般问题分析与建模的基础, 乃至 "哲学". 例如在 MDE/MDA 领域也是如此. 对此, Zhang3 和我一样, 属于 "不同意见者". 他对这个话题有着相当深入的分析之[2]. 而他的开发计划目标之一, 就是开辟 OO 之外的, 更合理和有力的编程技术空间: 非 OO 的方法学和编程体系(编程语言及集成开发环境 IDE 等).
更经典的程序架构是 Niklaus Wirth 的 "程序 = 数据结构 + 算法"(Algorithms + Data Structures = Programs). 最近, 随着一般模型理论方面的一些进展, 我 "意外" 地发现, 这一在 OO 时代被认为过时的公式, 恰恰揭示了软件程序的根本结构, 应是万变不离之宗. OO 也是建立于其上的; 非 OO 的编程架构, 同样必须建立其上. 但这绝对不是要回到 3GL 时代, 需要通过新的模型与建模理论, 更清楚地揭示其理论基础和作用方式, 建立新的理解和应用准则.
这正对应着现有软件理论最苍白的一环: 在图灵机之上,"数据结构 + 算法"(还可带上 "关系模型")之外, 另一些重要的东西, 无论在理论还是技术上. 这个层次也是决定计算机从序列演算 (图灵机) 变成信息 (数据的意义) 处理机 -- 电脑的关键. OO 是当前公认的主要解决方案, 但实际上它是直觉的, 缺乏理论基础的; 而其它的应用程序实现? 几乎都是更加随意, 纯经验的构造.
可以清楚地看到, 近二十余年国际软件工程主流, 同样将注意力集中到了建模与模型上, 但遗憾的是, 主流们同时也不容置疑地把建模与 OO 划上了等号, 集 OO 方法大成的统一建模语言 UML 成为绝对核心, 以至于在当前几乎所有与软件建模相关的国际学术与技术交流中, 形成了某种谈建模, 就必须基于 UML 这样一种既狭隘, 又霸道的氛围.
另一方面, 还可以看到, 被称为软件发展一贯的主线: 抽象层次升级, 在 CASE, 4GL 等那里开始撞墙. 声明性编程, 函数式编程, 面向方面等, 各有独特, 但未现王者之相. 建模成为软件工程技术及学术界探索的焦点, 其中最有代表性的是随着对象管理组织 (OMG) 的模型驱动架构 (MDA) 浮现出来的模型驱动工程(MDE)[3], 虽然国内对此重视不多, 但这实际是软件工程前沿(其它如云, 各种 web 应用技术, 包括 SOA 等与之相比, 都是更加应用技术层的东西). 然而, 近年对 MDE 的观察让我觉得它在某种意义上, 仍然没有突破 CASE, 4GL 的一些局限, 很可能又在撞墙[4].MDA 刚出炉我就有这种判断, 最近一年的跟踪以及参与到国际 MDE 社区中的直接交流, 让我这种看法更强了.
正因为如此, 我们可以作出这样一个判断: 当前的电脑应用建构技术, 依然没有找到最合理与基本的架构; 在有坚实数学基础的图灵机之上, 还需要一个重要的基础层次, 它同样必须坚实地坐落在数学之上, 它还没有出现[5]. 我认为, OO 目前处在这个不能胜任的位置上, 最终将沦为一场猴子称大王的故事.
逻辑系统如何连接到现实世界
逻辑系统 (即形式系统) 是一个封闭的, 自洽的符号 / 运算 (推理) 系统, 其本身并不包括 (决定) 它的用途. 换言之, 一个完善的逻辑系统内部并不需要包括它与外界世界相连的固定方案. 实际上, 这也可以看作其称为 "形式化的"(formalized)的原因. Zhang3 的基本思路, 就是构造一种完全基于逻辑的非 OO 编程语言, 这这一形式系统, 毫无疑问, 必然地, 基于图灵机, 如他所说[1]:
"真实世界过于复杂, 与语言的纠缠关系难以梳理, 不如先退回到图灵机所构造的确定性世界, 在这个世界中探索语言的奥秘."
这种自底向上的构造策略, 很符合我的建构主义哲学. 事实上, 任何现代计算机编程语言都是在构造一个基于图灵机的形式系统, 但如何构造, 途径很多, 这也就是本文所讨论的程序架构问题. Zhang3 在这个方面提出了独特的想法, 其中一个很重要的方面, 就是抛弃目前似乎是主流的面向对象的架构(OO), 而完全基于逻辑(和关系代数), 遵循分析哲学中的基本原则实现.
然而, 形式化构造只是这个课题一半. 无论形式系统怎样构建, 最终必须以某种方式连接到现实世界, 才能发挥其作用 -- 这就是建立有意义的计算机程序重要的另一半. 换言之, 我们可以策略性地将形式系统建构以及它如何工作 (在现实世界中) 适当分离, 但终究要完善地解决. Zhang3 的工作无可避免地要面对这个问题, 而他最近的两篇日志说明, 对这个问题还没有一个稳定的, 满意答案 [6]. 同时, 虽然出发点不同, 我发现有关模型与建模基本理论的研究, 正包含着对这个问题的基本回答. 我相信, 模型与基于模型的操作是将逻辑系统连接到现实世界最基本的桥梁. 要具体地建构和应用这个桥梁, 就必须充分地运用我们所看到(研究中) 的一般建模理论, 及模型工作机制等基本原理.
Rapaport 等的启示
前面提到, Zhang3 在提出的基本问题之一, 是形式系统如何与现实世界联接. 从另一个角度, 它也就是语言的语义问题, 语法和语义关系的具体实现方式问题. 再广一点, 可以追溯到经典的 "意义问题" 上. 回到与计算机及其语言相关的领域, 这同样是长期被学术界重点研究的基础课题之一. 我发现, W.J. Rapaport 等的一些工作, 可以直接与我在一般建模方面的一些进展联系起来, 形成一个基本完整理论框架, 对于本文讨论的主题, 同样可以起到关键的指导作用.
这些工作包括对 "怎样从语法中产生语义" 这一基本问题的回答 [7].Rapaport 从什么是 "理解" 的角度, 详细地分析了其中的语法, 语义结构及关系问题. 理解就是获得语义, 他认为, 我们总是要基于一个域(domain) 理解 (解释) 另一个域. 而这是一个递归的过程, 最终总会归结到一个域 (称为基域, base), 没有任何域来解释它, 必须基于自身(也就是语法) 做出解释, 这样就形成了一个语义解释的连续统(continuum)[8]. 他指出[7]:
当一个语法域拥有其自己的语义域, 其语义解释函数或者将记号映射到其自身, 或者映射到其它记号. 对前一种情况, 我们通过对语法 "达成习惯" 来理解域. 对后一种情况, 若所有的记号都映射到另一个不同的记号 -- 则此情形相当于在使用一个字典.[...]在任何情况下, 我们都有封闭的意义网络 -- 一种整体性的,"概念性角色语义". 这就是为何语义能由语法中出现的答案.
实际上, 我认为, 从认知主体如何理解语言的意义角度, 他的方案也许还有很多争论, 但反过来, 从构造一个有限 / 实用的形式语言系统, 并关联到问题领域 (现实世界) 角度, 这却给了我们很好的启发. 尤其是针对本文讨论的话题, 如 Zhang3 所明确提出的开发课题: 如何在最简单 / 基本的图灵机 (可将其视为最基本的语法 / 语义域) 的基础上, 建立一个形式体系, 它能够构造出我们期望的各种复杂构造, 来对应到现实世界的各种事物 (语义). 从软件工程领域提倡的 "抽象层次升级" 的角度看, 一种自底向上的, 建构性的 "表达连续统", 可以看作是 "抽象层次" 的内涵, 以此为线索, 再结合我们对于一般模型理论及其工作机制的一系列新认识, 就发现, 不仅对于抽象层次, 我们可以在这个基础上全面地重新审视诸如 4GL/DSL, 或所谓 "声明性" 概念背后的一些东西, 对几乎所有 MDE 的关键理论, 做出更明确的解读或梳理. 由此可能实现一种框架, 将 4GL/DSL 的某些内涵, 数据库, 包括信息科学另一个重要, 活跃的领域, 本体工程方面的东西, 自然地聚和在一起. 在这个体系中, 数据结构 / 模型, 都有特定的含义, 并非(完全) 等同于过去的理解, 甚至对于程序, 算法这样的基本概念也是如此. 其中, 我称之为 "一般建模理论" 的那部分工作, 最重要的贡献之一, 是将这种框架落实到严格的数学基础之上, 这是确保我们的理论与方案坚实, 有效最关键的保障.(初发于此 http://www.ee-forum.org/pub/ty/2011-08-p2910.html )
----
[1] 见 Zhang3: 大纲: 一封关于我的研究的邮件回复 http://www.douban.com/note/147749382/ , 第五重 http://www.douban.com/note/147585386/ 等.
[2] 见其面向对象的解构 http://www.douban.com/note/142604730/ 等文, 以及关系代数与面向对象理论 http://www.douban.com/note/146255104/ 等. 网络上 waterbird (1998) 的 OO,OO 以后, 及其极限 < 1> http://www.aka.org.cn/Magazine/Aka2/oo1.html ,<2> http://www.aka.org.cn/Magazine/Aka2/oo2.html , 是我较早读到的极具启发性的早期讨论.
[3] 初步概念参见企业工程论坛模型驱动工程(MDE): 一个初步简介 http://www.ee-forum.org/pub/ty/2010-12-p2374.html 等.
[4] 在 Models: Execution or More 及讨论中, 我略带隐晦指出了这一点. 大家看来在有意无意地回避或无视, 而我在其它地方看见过他们对这个问题颇强烈的否认.
[5] 这个问题本质上还与计算机架构关联, 例如可以直接联系到到冯. 诺依曼体系结构的瓶颈及操作系统的功能等问题, 但也完全有必要和可能在当前的计算机体系结构之下找到对应的解决方案.
[6] Zhang3 的相关讨论如柏拉图的理念世界 http://www.douban.com/note/154099218/ 等, 最近的两篇是 一个关于形式系统的问题 http://www.douban.com/note/167670527/ , 实现方法的重大变化 - 备忘 http://www.douban.com/note/167282871/ . 我对此的一个初步意见, 也是本文的前身, 见我的豆瓣日志: 关于软件程序架构的一些基本想法 http://www.douban.com/note/167743955/ .
[7] Rapaport, W.J., "Understanding Understanding: Syntactic Semantics and Computational Cognition", Philosophical Perspectives, Vol. 9 (1995)
[8] 这里的连续统 (continuum) 概念, 应该出自 B. C. Smith (1987). 他从知识表达的角度研究语义问题, 提出了表达系统 (这里可粗略理解为语义系统) 中的对应连续统 (correspondence continuum) 的主张.
※ Zhang3: 与 TY 讨论语义解释连续统的问题 http://www.douban.com/note/168145957/ , 本文发出后所做的一次很有意思的讨论.
原始发表: 企业工程论坛, 2011-08-19,
http://www.ee-forum.org/pub/ty/2011-08-p2910.html
作者印记: c8cc97
文中提及 (链接到) 企业工程论坛的文章收录在两本文集中, 其中部分在此站有重发(文中链接已修改). 文集下载地址:
《企业工程论坛合集(一): 企业工程, 企业架构, 信息化与管理 》
《企业工程论坛合集(二): 企业应用, 信息系统与模型 》
来源: http://www.jianshu.com/p/48ef96d2d797