程序原本(一百零一):系统的基本组织方法与原理——行为的组织及其抽象(大型系统已经逐渐走入细分领域的时代)

阅读数:32 2019 年 10 月 5 日 13:50

程序原本(一百零一):系统的基本组织方法与原理——行为的组织及其抽象(大型系统已经逐渐走入细分领域的时代)

当然,数据量或运算量上的规模依然是系统的一个(外在的、表现上的、实际应用中的)问题。就目前的实践而言,我们事实上也把它们独立为计算机系统开发中的领域,例如分布式计算领域以及分布式存储领域1

1 事实上,业界现在又把这两个学术化的领域统一称为“云”,包括云计算、云存储等具体的解决方案。关于数据或运算的规模也存在许多其他细分的领域和混杂的概念,例如早期的网格(Grid)与现在的大数据(Big Data)。无论如何,这些都只是分布问题在业界的具体表现而已。

分布并不等于并发,这一点我们此前已经讨论过。但分布必然意味着要处理逻辑与数据之间的耦合关系:其一,耦合紧密的逻辑不易拆分,也就不易分布;其二,逻辑与数据紧密耦合,也存有类似的问题。现实中的通用应用开发语言(例如 C、Java 等)是在“算法 + 数据结构 = 程序”这样的结构化理论上发展的,为了增强语言的通用性,其结构化的特性非常明显。这并不利于数据与逻辑的解耦,例如在一个既存的面向对象应用中,想要将对象的数据成员与方法成员解耦并分布,是一件不可想象的事情。但在这个问题上,并不是说具体的语言有多大的问题,而是这个程序设计范式本身的理念与我们讨论的背景并不适配。

在现在的大型通用应用开发语言2中,接口的引入是解决上述问题的一个良好实践。但接口带来的是面向行为的设计理念,例如在这样的环境下,我们讨论的问题通常是:某个对象或某个子系统所具有的哪些行为,是可以被抽象为接口的。而实践过程中的这些具体工作,与对象本身的设计以及与面向对象系统的设计是没有多少关系的。也就是说,接口设计与面向对象设计是两回事,只是实践中把两者综合在一起,并试图解决后者的一些实际问题。

2 就目前来说,通用应用开发语言主要是指面向对象语言或结构化程序设计语言,例如 Java、C#,以及 C 语言等。

这些“实际问题”,具体来说,就是“逻辑如何分布”3

3 因此,在缺乏这样的需求——例如在一个小一些的、跨领域特性并不突出——的系统或应用中,要求实施“面向接口设计”是一件相当多余而又学术化的事情。

另一方面,现实的软件开发中的“数据”,并不总是和对象一样地通过一个实体(instance)与方法绑定起来。我们面临的这些数据4要么是结构化的,例如结构化文本或结构化数据库,要么是非结构化的,例如待索引的文件或者流式数据。这意味着,通用应用开发语言对于处理大数据量几乎毫无帮助。例如在实际工作中,如果这些数据存在于关系型数据库中,我们将使用 SQL 语言来操作;如果它们存在于 NoSQL(非关系型)数据库中,我们就会采用类似于数据流式语言或其他特定的数据处理语言来操作。

4 另外,我们也可能通过静态数据与增量数据、本地数据与远程数据等分类法来区别不同的数据。我在这里采用“结构化”这一分类法只是一种选择,仅为了说明常见的问题,而非一个强制设定。

所以综合来说,即使仅仅观察“数据 + 算法”这样的软件开发本质工作,大型系统也被具体分成多个领域了。而软件开发进入领域细分时代的大背景,才是像“云计算”这样的理念得以提出的基础。

换言之,我们一再讨论的分布问题,本身也可以被理解为领域问题。

评论

发布