Clojure China

Clojure 作为未来虚拟世界的坚实材料

#1

Lisp isn’t a language, it’s a building material. – Alan Kay

跟历史做类比, 编程语言的在整个世界当中充当着什么样的角色? 编程语言的提升, 能够为世界带来什么样的改变?

我听了很多王煜全关于产业的分析之后, 越发对编程语言存在于这个世界上是怎样的位置感到好奇. 然后渐渐想起来 Alan Kay 这句话, 很赞.

首先 Lisp 和业界主流的编程语言作对比, 最显著的区别在于, Lisp 通过 S-Expressions 和 Macro 系统暴露了太多的功能给编程语言开发者. 优点是开发者能通过增强自身的能力不断获得各种灵活甚至有时强大的能力, 缺点在于这样就太依赖程序员的素质了. 业界主流语言通常较为局限, 然而好处在于有强大的标准化和与之而来完善的教程和文档.

灵活性和强大是有好处的, 我们已经看到 JavaScript 社区在不断学习很多功能, 相当多功能来自函数式编程语言社区的小众语言, 而且随着 FP 语言某些特性在小众语言试验达到成熟, 也会逐渐进入到主流视野, 成为主流的工具. 同时我们也看到标准化和大厂推广带来的威力, 因而期待 FP 语言能被大厂推广.

基于推测, 我理解大厂对语言有很多顾虑, 来自我对 React 和 ReasonML 的一些了解, 首先需要足够清晰的方案, React 明确的设计获得了众多程序员的认可, 而且贡献了大量风格一致的组件, 并且这套组件方案也得到了其他框架的效仿. 而 Redux 由于概念不够清晰, 至今 Twitter 上还能看到吐槽, 更不用说我们 cljs 社区了.

其次, 必须照顾大众程序员的心态, 把门槛压到足够低. JSX 虽然听起来玄乎, 但是懂模板引擎和 JavaScript 的人基本能看懂, 即便有设计缺陷, 大家都开始用了. Immutable-js 在我们看到是更重要的进步, 但是使用门槛非常高, 我推测有些人会用 API, 但是很难形成那种基于不可变数据做纯函数的高阶函数抽象的习惯, 而且基于很多原因, 对于不可变数据的抵触依然存在, 现在 Facebook 都想推广一个新的语言内置不可变数据了, 从语言和编译器层面压低门槛.

历史经验告诉我们, 不是所有人都是像我们这些搞 FP 的人那样对编程很执着的. 他们不是不够聪明, 但是死磕编程的那种和机器天天对着干的生活不是他们想要的, 不管是对家人好, 还是喜欢旅游, 还是做一个风趣幽默拥有各种技能各种爱好的人, 那种现充的生活都会占用大量的时间和大量的脑细胞. 最终我们会看到整个行业有大量的人, 只能分配一部分资源到编程当中, 而且, 业务本身具有复杂性, 会需要分心去做大量沟通/交互/测试等等工作, 正真花在编程语言坑的时间会很少.

所以放弃那种期待所有人把编程语言玩到滚瓜烂熟的幻想的, 这个世界永远是大家分工的, 还会过上并不一样的生活.

有点跑题, 回到主线, 基于这样的理解, 由于编程行业输入人力和电力等资源, 输出虚拟的但真实地对人类精神世界产生影响的产品. 某些程度上可以类比农业时代那种只能靠加工自然资源得到物资的年代之后, 人类进入工业时代, 基于石油基于化学合成制造产品的场景. 所以编程也像是共用生产线一样, 有工人, 有机器, 有流水线, 有管理规划, 最终输出产品.

目前编程很大程度依靠手工, 同时我们看到一些趋势, 比如用编译器和类型检查的来提升品质, 用图形化的建站工具来降低门槛和节省重复劳动, 甚至用机器学习探索写代码. 我尝试做一个对应关系:

  • 机器学习类比成无人工厂, 制定好需求就能生产
  • 编译器类比成机床, 输入简短的代码就能得到多次加工甚至经过优化的代码
  • 程序员还是对比成工人, 可以操作各种机器, 同时提供多种机器目前无法完成的功能
  • 代码就相当于材料了, 就像家居需要材料, 汽车需要材料, 大厦需要材料, 只不过代码是可以基于信息无限生成的

现在编程当中还有很多机器无法直接完成的工作, 因而需要大量的人力. 但是可以推想, 当机器可以做更多事情的时候. 回到材料的事情上, 我们有机器可以承担更多工作时, 材料本身的特性也变得越来越重要. 材料可以有更精致的特性, 人类难以直接操作但是机器某些方面超过人类, 那么就能发挥出原来达不到的价值. 同时, 材料应该更利于被机器探测和理解, 这样机器自然能做更多.

当我们吐槽 Lisp 的时候, 括号太多, 高阶函数太抽象, 某种程度上开始反人类了, 但是对于机器来说挺好, 括号无所谓, 高阶函数通过引入类型系统照样解决. 而且从 Clojure 的角度看到不可变数据和 Atom 这个事情, 对于数据和状态的更准确的定义, 其实更有利于机器对代码有更深层的理解, 最终在机器功能强大之后, 带来更多的可靠性和更精确的处理.

同样, 我们可以重新省时 Macros 的存在, 这种有害的功能实际上就是编译器做的事情, JavaScript 社区正在越来越多地做这样的事情. 但是, JavaScript 控制得比较好, 普通用户不会受到太多编译器执行代码的影响, 他只要知道取悦编译器就好了. 至少对于机器来说, Macro 复杂一点不会太难理解. 尽管里边是还有我不熟悉的因素难以确认.

作为 Lisp 社区目前算是在 Web 圈子最热门的方言, 我对 Clojure 的未来保持乐观, 但也意识到需要投入大量的工作. 因为软件开发在一定程度上还是从手工业时代在往前发展, 现在局部正在机械化自动化, Clojure 想要长期发展下去, 不能被别的短板拖累了, 所以就需要大量的工作填补短板. 就像说碳纳米管黑科技还不成熟, 没人投入大量基础研究怎么行. 不能规模化, 悄悄死掉也说不准的… 总之是这样的想法.

3赞
#2

貌似 clojure 已经很长时间没有更新了

#3

语言是一门好语言,但是门槛稍微高了点。现在正在爬坡阶段,现在的语言太多,脱颖而出难度有点大。还是希望有成熟产品,成熟开发人员来证明这门语言是可行的。

#4

最近还是 ClojureScript 刷新的节奏比较疯. https://github.com/clojure

#5

让社区一起加油!!!:heart_eyes:

#6

http://blog.chinaunix.net/uid-7780295-id-2558735.html
Lisp是软件的麦 克斯韦方程,其中的许多想法是软件工程和计算机科学的一部分。

#7

clojure 的优点有很多,我谈一下clojure 的缺点:
(1) 慢 . 无论lighttable 还是nightcode , 只有在terminal 下,不加库,会快一点。写common lisp的人,这点最不能忍。
(2)太过于纠结于 Functional , 想更改数据,只能在全局变量上想办法。 真的有必要要这么纠结于Functional, 我为啥不去整Haskell 。 另一个Functional 的lisp 实现 : LFE (Erlang-in-Lisp), 也挺好的, 缺点是文档相当不全,但是并发做的有意思。
(3) 如果哪天 Rich Hickey不打算维护 clojure了,就麻烦了。其他语言有比较多的实现,这点clojure 还不足,windows上的那个实现怎么样了?

1赞