The Language of the System

这个talk找不到slides, 在 github 上有个transcripts. youtube 链接地址在 这里.

这个talk讨论的是,程序语言和系统设计,两者之间的关系,相互可以如何借鉴以及改进。这个topic有点high-level, 很多东西不是特别明白。但是明白的地方觉得的确很有启发意义。

看完之后还可以看看 Clojure Made Simple,虽然这个talk主要是介绍clojure的一些特性的,但是里面还谈到了为什么clojure的设计是好的。

因为这个topic本身就比较大,而且很多东西不太明白,只能是把一些觉得弄明白或者是有点启发的东西写下来。Rich Hickey好几个talks其实都值得反复观看。


language of system是什么意思?language有这么几个层面:

Pasted-Image-20231225105352.png

那么programming language和system language之间的类比是怎么样的呢?

Pasted-Image-20231225105059.png

如果在设计系统的时候我们参考PL领域的话,那么可以看到需要解决两个问题:

  1. protocol and formats
  2. simple services

Rich Hickey非常强调Data的重要性,包括表示,流动,处理等等。认为Objects其实是非常糟糕的东西,将数据表示变得非常复杂难以管理。所以在设计Clojure的时候,设计了 edn (extensive data notation)这种数据表示(我觉得可以认为是在lisp ()这种比较原始的数据表示形式上的改进)

Pasted-Image-20231225104707.png Pasted-Image-20231225104706.png Pasted-Image-20231225104602.png Pasted-Image-20231225104603.png Pasted-Image-20231225104802.png


protocol and formats

回过头来看看数据格式。这个方面有很多考虑,比如传输效率,是否可以压缩等等。但是这些都不是最主要的,最主要的有下面这几点:

Pasted-Image-20231225105254.png

每个数据格式都有不同的特点,适合在不用的场景下面使用。设想一下如果世界上所有的网页不是使用HTML而是Protocol Buffers来表示的话,虽然PB是很有效率的数据格式,但是却会对互联网的信息共享带来灾难。


simple services

现在已经有很多非常成熟的simple services了,你可以认为这些simple service充当了pl里面的runtime and core libs这些概念,甚至包括Names(zookeeper)/Values(storage, memory)这些可以说是primitive的概念。

Pasted-Image-20231225105019.png

这些simple services有些什么问题呢?最重要的问题就是接口不匹配,在这个层面上语言不通。甚至很多service使用自定义的协议比如Redis是用human-readable的基于ascii的协议。这样一个问题就是当将这些simple services链接起来的时候,需要做适配工作并且不利于升级。

Rick Hickey在talk里面鼓励这些simple service尽可能地使用jcloud这类lib来规范接口,可是我觉得这个很难而且没有必要,当然如果这些simple service如果使用统一的lib来规范接口很好,可是这样会限制这些系统的本身的设计,或者是当你使用jcloud这类接口访问并不是best practices.


Approaches

按照上面这些方式来实现systems有两种方式,第一种统一方式。这种统一方式是从语言级别就开始规范,设计出来的系统。比如Erlang,在语言层面上实现了protocol, formats, RPC, actors, channels这些概念。

Pasted-Image-20231225105046.png

另外一种方式则是异构方式,这个比较常见。每个services可能是不同的语言写出来的,但是我们在上层进行规范。

Pasted-Image-20231225105115.png