庄周梦蝶

生活、程序、未来

声明:本博客所有文章,未经允许,禁止转载。谢谢。

我的编程语言选择

| Comments

最近修改了我的个人简介,说到我最主要的编程语言是Clojure/Java/Ruby。这不是假话,最近我经常用的就是这三门语言。从使用上,我想谈谈他们的区别。

对于Clojure,我们公司已经用它开发了不少产品,比如过去的美味集的后端Web Service就是用Clojure写的,最近才放出来让大家看见的美味爱读和新的美味书签,更是从零开始的Clojure项目。Clojure的优点我就不多费唇舌了,它的高生产力有目共睹;使用好了是一把锋利的瑞士军刀,用不好也伤人伤己。我对它的定位介于Ruby和Java之间,说它轻量级吧,语言非常轻量级,核心小,写出来的代码少,但是却跑在重量级的JVM上,一个启动时间就能让你吐血。说它重量级吧,人家写出来的代码确实精炼优雅,Java跟它比起来太累赘繁琐。我在微博上看到,假设真有一天一行代码一块切糕的话,我估计Java程序员是最早发达的。Clojure语言轻量级,平台重量级,那么作为Java语言的补充甚至替代,完全胜任。特别是在最常见的90%的开发任务上,用Clojure都绝对比Java开发效率更高,同时能维持住性能上的需求。

那么剩下的10%是些什么样的任务呢? 我总结下,主要是这么几类。首先是网络通讯,跟IO打交道的这一块,用Clojure去写一个Netty或者Mina,不是不可能,但是很难做到高性能和简洁之间的平衡。原因在于IO本身是一种副作用,而Clojure将副作用隔离的方式(Ref,Agent,Atom,Binding etc.) 很难——如果不是不能,做到高效处理。而且在表达上,与命令式的IO操作不匹配。IO上的操作,都很适合用命令式语言的方式来表达,包括协议解析这一块用clojure写也相当痛苦,不过这块更多是我想讲的第二点。第二,算法型的应用,因为大多数算法的描述和衡量都是基于冯.诺伊曼模型的,时间复杂度和空间复杂度的表述也都是命令式的,用Clojure实现不是完全不可能,但是仍然是相当困难的,你需要转换思维并仔细衡量不可变模型带来的代价。因此我通常会比较建议将算法的核心用Java写,然后Clojure调用之。第三,部分并发应用。首先是STM模型,虽然它可以让你避免死锁、活锁等并发编程的常见陷阱,但是同时它需要保存历史记录,需要重试,这个代价在事务冲突严重的时候会凸显出来。其次,仍然有一些场景我们仍然需要锁来保证一致性,特别是一些涉及到外部资源访问的时候,这些资源如果不支持重试,那只有利用锁来做同步。最后,java.util.concurrent的包实在太优秀,你不能忽略它。这样的并发应用,也许你可以仍然使用clojure来调用java API,但是这跟Clojure的哲学不完全一致,有时候仍然是用Java写的比较方便。其实上面谈到的,更本质上的应该是函数式编程的问题,而非仅仅是Clojure的问题。

我什么时候用Ruby呢?写脚本的时候,比如干一些数据库导入导出、solr索引更新的时候,我就想到了Ruby。因为写这类程序,基本上是写一段,跑一下,看看是否ok,结果正确就再前进一步,最终来搞定整个事情。在这个过程中,Ruby丰富的类库和友好的API,可以帮助我快速的试验试错,并且Ruby 1.9的启动实在是比JVM好太多了。写这种脚本程序,启动速度是一个很关键的考量,因为你要不断地启动、运行、查看结果。也许你会说Clojure REPL也可以啊,但是REPL还是不适合这种增长式的编程,也不是一个舒适的编程环境。Ruby可以写的非常性感,Rails就是一个证明,不过因为我写的都些一次写就就抛弃的程序,对这块倒没有什么讲究。有一个我很尊敬的同事,他写的Ruby脚本就比我更有DSL的感觉。强烈感觉我应该去更新下我的Ruby技能。

最后是老本行Java了,除了美国那边的项目和我的一些开源项目(如MetaQxmemcached)外,我几乎都不碰Java了。虽然有IDE帮忙,但是Java的整个生态圈都太重量级了,过去号称轻量级的Spring在我看来都太重量级了,还有maven这样怪兽级的构建工具(需要整整一本书来讲解,看看leiningen吧)。回头看,Java整个生态圈过度工程化的倾向太严重了,什么东西都是正儿八经、正襟危坐着,从来没有一种轻松编程的氛围,每个人搞的都是牛B的庞大项目。而其实,我想要的是只是一个CRUD网站。我想这套东西都是因为Java一开始替代的的是COBOL这样的语言,更多地想在企业级应用上发力,导致整个社群的文化都是严肃方正的。

那么未来呢?列了个编程语言学习计划,挑选的出发点都是从开拓不同的思维出发,如果一门语言没有带来新的启迪甚至范式,那是完全不值得学习的。从个人角度讲,我比较看好Go和R,前者语言上中规中矩,但是能吸引传统写C/CPP的系统程序员,以及想向底层发展的Java码农的目光;后者是因为data mining的需求热潮,会有相当长期和稳定的需求,但是需要很牢固的统计和数学基础。而另一个有趣的现象是Node.js社群的活跃程度,前端们通过node.js找到了写后端鄙视后端码农们的黄金机会,创作能量都可以将世界末日推迟。

声明:本博客所有文章,未经允许,禁止转载。谢谢。

Uncategorized, 编程

« Compojure的辅助宏 Compojure的辅助宏(续) »