开发团队之所以选择将某些功能块作为微服务来实现是有很多原因的。我认为最重要的原因有:
代码重用:多个团队可以利用你所构建的内容。例如,检索(search)、文件存储(file storage)或pub/sub。
使用微服务可以独立于应用程序对功能进行扩展
可以自由地进行技术选择
本文重点讨论以上三点。
这是属于微服务架构的一个非常重要的属性。微服务意味着每个服务都很小。至于有多小通常取决于公司或团队,但我听说有些微服务的代码不超过100行,还有些微服务有几千行代码(如果是Java代码,我仍然认为它很小)
既然微服务意味着每个服务都很小,所以鼓励开发人员可以使用他们认为的最好技术。如果事实证明那是很糟糕的选择,也没关系-我们就当学习了,并且会考虑将这些新知识用于未来的项目。既然微服务的代码多半只有几百行,所以有时开发团队甚至有可能决定用另一种更合适的语言重写微服务。
这都很好。但是既然可以完全自由地进行技术选择,那么为什么不选择Clojure呢?
"Lisp是用秘密的外星人技术开发的语言。" — lisperati.com
Clojure是运行在Java虚拟机上的现代Lisp语言。基于JVM有很多优点:
经过数十年的人力投入,JVM的运行速度很快。
在一个广泛的问题域中有非常多的功能强大的库。你只需集中精力去解决问题而无需一切从头开始。
JVM被广泛应用于一些小型和大型企业;应用JVM意味着开发的产品会被更多用户采用。
所以说,JVM很好,并且我们也在使用着Java。那为什么还要转换语言呢?
是这样, Java具有它自己的一些折衷方式。但它缺少其它平台认为理所当然应该具有的功能 -比如lambdas,尽管Java 8已经对此进行了修正。Java的类型系统限制过多,并且其类型推断也不够理想。Java也没有数据结构形式,使其代码过度繁琐。
另外Java一般的开发反馈周期太长。为了运行、测试程序,在一天内可能需要多次重启JVM - 哪怕你只是修改一行代码 (HotSwap热部署补丁对此有所缓解)。由于所需的结构数量也仅仅是开始,因此实验变得很难。最后,交互式开发环境的缺乏也让人受不了。
"Lisp不是一门语言,它是一种构建素材。" — Alan Kay
作为Lisp ,它非常灵活,采用一种固执的数据驱动编程方法,通过宏功能提供了最大的延展性。必须指出的是Lisp宏和其它的宏非常不同,比如说,C宏。C宏是通过宏定义和C预处理器的处理以一种简单的方式在将源代码中找到的名字替换掉。
然而Clojure宏采用的方式是操作Clojure代码本身 - 是的,你可以转换 AST(抽象语法树)! - 包括有能力控制事情得以完全评估的时间和条件。
“学习Lisp几周后,我发现用其它任何一种语言编程都有难以忍受的约束。” — Paul Graham, Road to Lisp
如果我们还必须经历这种传统的开发周期的话,那么我们所有的能力将被耗尽: 改变源码->重新编译/重新开始运行时(runtime)-> 运行代码以查看结果/进行测试-> 清除, 重复。
我之所以要成为一名软件开发人员,主要的原因之一就是创造的快感。 编写代码并且能立刻看到自己劳动成果是一种很奇妙的体验! 我认为我们应当尽我们所能减少看到刚刚创建的东西的结果所花费的时间。Clojure - 确实很大程度上就像Lisp - 配置了一个高级的REPL (Read-Eval-Print-Loop) 环境,并且和许多编辑器亲密集成,例如Emacs、 Vim、IntelliJ和Eclipse。
但是对于每天都要进行开发,这意味着什么呢?
我正常的Clojure工作流主要是在Emacs中启动一个REPL会话-不过这也同样适用于IntelliJ、Vim和Eclipse-并且无论我做什么任务,期间,我都会让它自己运行着。让某个REPL会话运行几天甚至几周也很正常。我可以在编辑器中修改代码,并且使用某个简单的快捷键就能在运行着的REPL中立刻对结果进行重新评估,因此这就完全消除了JVM启动时间方面的缺点。
这使得使用Clojure进行开发更多地属于实验驱动。探索的成本最低,因此最终通过REPL提高了程序质量。这也适用于测试,对于运行它们同样也是成本低效果佳。
"选择不可变性(immutability),看看它的效果。" — Rich Hickey, Clojure creator
Clojure和其它的Lisp“方言”不同之处在于它的独特的函数式编程方法。正如很多其它的语言一样,Clojure 也支持高阶函数。这意思是说函数是第一等公民,函数可以用作参数也可以作为其它函数的返回值。
但是在默认情况下Clojure中的数据是不可修改的。如果你创建了一个map、一个list、一个vector等等,根据定义都是不可修改的,一旦创建就无法改变。
这有许多好处:
不可修改的数据结构在默认情况下是线程安全的,这使得开发并发软件变得更简单;
你可以很容易地查看历史记录;
没必要担心其它的代码路径会修改你的数据。这根本不可能发生;
另外Clojure附带了很多并发实用工具,例如引用类型和软件事务内存STM和core.async, core.async是CSP(可以认为是通道)的库实现。
Clojure是一个功能强大的开发环境,但是当我们开发web程序时,最有可能仍然实用JavaScript,而JavaScrit作为一门语言存在很大的局限性。Clojurescript是用于浏览器中的Clojure编译器,它将Clojure的全部功能带到了前端web开发环境中。(但可以肯定的是,你也可以在Node.js中运行它)
许多公司已经在产品中采用了Clojurescript,包括我们的here at Atlassian。我们获得的最主要的一个好处是能够轻松地在服务器和浏览器之间共享我们的核心算法。我认为 Clojurescript可能是当前可以使用的最成熟的JavaScript替代品。
这是一篇令我手抖的文章,说实话,到目前为止很难用语言把所有的优点都列出来。因此我强烈建议你观看由 Bruce Hauman所录制的 programs the Flappy Bird game interactively with Clojurescript 视频——它是对本文所描述内容做了一个非常好的流程梳理的一个例子。
如果你有兴趣学习更多的关于 Clojure内容,我强烈建议你加入Sydney Clojure User Group。我们是很友善的一个群组,并且欢迎不同水平的人参加。
如果你不在悉尼,你也可以在Clojure官网上从user groups listing 里找到你当地的用户组。
评论删除后,数据将无法恢复
评论(31)
引用来自“jQer”的评论
O,函数式,O,lambda,... 我想当 Lisp 大神,我只用 Lisp 方言,...当你处于这个模式,说明你还是个刚入门的函数式菜鸟。函数式对于编程的贡献,就是对于循环算法提供一个单一接口,比如 map(callback)。剩下的就是语法树的设计,但是这个只能作为科研学习,对工程没有任何帮助。
结构化编程 + 循环回调 === 现代编程语言
能实现这种特性的语言多的是,而且性能、生态库都很丰富:Node.js、Scala、Erlang、Rust、Nim。Clojure 在里边就是一坨,无论是性能,还是可读,还是生态库,还是开发效率。
引用来自“下里巴人_770728”的评论
只用过js/java/clojure/ruby,性能方面,clojure确实比node好,开发效率应该稳超过node(主要是缺乏一个杀手级框架,象rails那样的,花在前期拼框架的时间太多了,真开发起来其实很快的)。生态方面本身基于jdk,大量java库可用。 重点讨论一下关于clojure的可读性: 1. 在较短的代码里,Java可读性最好。但一旦代码复杂化,对象之间的相互影响,让代码可读但难懂。所以我们分析一段java开源项目时,往往需要打开ide进行单步调试。 2. node的可读性实在太差,这应该没有争议。每一句话都能读明白,就是不清楚为什么会写成这样,不清楚将会变成什么 3. 最开始用clojure,确实被一堆括号吓倒了,感觉可读性差。现在上手三个多月,慢慢地发现感觉是错误的:clojure在这三种语言中,可读性是最好的: 3.1 短小,无废话,无干扰,一个功能块往往无需翻页就看完了。与java相比简直差距太明显。 3.2 括号借助ide的缩进,功能块非常清晰,这一点,我在将react-bootstrap里的一些组件转译为clojurescript的组件时,感受特别深。js的代码太绕了,而clojurescript的非常直接,可读性上差别是明显的(所以现在变成 喜欢clojure的括号了) 3.3 函数的输出不可变,看代码时特别聚焦。而看懂一段js代码太不容易了,不清楚哪个地方改了某个变量,经常使用全文搜索。clojure不需要借助ide的单步调试就能看懂一个功能块在做什么事。看得越多,感受越深 现在大家对clojurer 的误解,个人认为主要还是社区太小,大家不了解。在国内缺乏应用场景,基本上是个人项目,资料也基本全英文,对我初中级别的英语能力是极大考验。 熟悉与优雅正交。希望大家能多关注下clojure,在对比中去发现它的美好。引用来自“jQer”的评论
首先,你用 clojure 写什么? 写文件系统?数据库引擎?它根本不是那个领域的。Rust、Nim 要好的多得多,而且语法也更加简单。 写服务器?写路由器?CPU 计算就是忽略的,这时候,jvm 对 node 没有什么性能优势,因为这个层面的职责就是转发,不对消息做计算。 可读,你用 C 风格写出来的 js, 我不明白其哪边不可读?哪边绕?当然,如果你用 Java 风格来写,我只能说,写代码的人不行。 另一方面,一旦你牵扯到了 Web 端,用 clojure 就意味着你的团队要掌握 Java (Android)、Swift/ObjC (IOS)、HTML + CSS + JavaScript (Browser)、Sql、Mongodb (JavaScript)。甚至你们可能还需要 Shell、Python 或者 Lua 构建自动化部署脚本。看看你们的开发成本,学习成本。引用来自“moose123”的评论
什么情况,写Clojure还要掌握这么多?呵呵,我们团队用clojure做东南亚电商平台,整个后台都是clojure来写,虽然我们是JAVA出生,在JAVA领域也有10年经验了,写了clj后,请相信我再也回不去了,如此的行云流水,clj的风格我觉得没什么问题,看段时间就习惯了,前缀表达式非常的统一,来团队的新人问我如何学,语法啥啥的,我告诉他没有语法,只有几个规则而已,然后在repl中试着写几行就明白怎么玩了,比起java这个开发效率真的是杠杠的,需要java的jar直接拿来用就行了,现在网站后台就是angularjs+clojure,不过JS部分不是cljs来写的,至于性能除了比JAVA更消耗内存一些外,其他的基本上比java差点点吧,clojure1.8 在内存方面又改善了很多,性能上当然随便吊打node了,已有大神测试过了。最后希望clojure越来越普及:)引用来自“jQer”的评论
你就纯粹是个菜鸟,先把 io 模型学会再来扯淡。还写商城,你们一共多少台节点服务器? 每秒请求数能到多少? 做过压测吗? java 也分 tomcat 和 netty 至少两种 io。还调打 node,我看看你调打的 benchmark。引用来自“odoo365”的评论
牛头不对马嘴,别人就没提过IO。引用来自“jQer”的评论
O,函数式,O,lambda,... 我想当 Lisp 大神,我只用 Lisp 方言,...当你处于这个模式,说明你还是个刚入门的函数式菜鸟。函数式对于编程的贡献,就是对于循环算法提供一个单一接口,比如 map(callback)。剩下的就是语法树的设计,但是这个只能作为科研学习,对工程没有任何帮助。
结构化编程 + 循环回调 === 现代编程语言
能实现这种特性的语言多的是,而且性能、生态库都很丰富:Node.js、Scala、Erlang、Rust、Nim。Clojure 在里边就是一坨,无论是性能,还是可读,还是生态库,还是开发效率。
引用来自“下里巴人_770728”的评论
只用过js/java/clojure/ruby,性能方面,clojure确实比node好,开发效率应该稳超过node(主要是缺乏一个杀手级框架,象rails那样的,花在前期拼框架的时间太多了,真开发起来其实很快的)。生态方面本身基于jdk,大量java库可用。 重点讨论一下关于clojure的可读性: 1. 在较短的代码里,Java可读性最好。但一旦代码复杂化,对象之间的相互影响,让代码可读但难懂。所以我们分析一段java开源项目时,往往需要打开ide进行单步调试。 2. node的可读性实在太差,这应该没有争议。每一句话都能读明白,就是不清楚为什么会写成这样,不清楚将会变成什么 3. 最开始用clojure,确实被一堆括号吓倒了,感觉可读性差。现在上手三个多月,慢慢地发现感觉是错误的:clojure在这三种语言中,可读性是最好的: 3.1 短小,无废话,无干扰,一个功能块往往无需翻页就看完了。与java相比简直差距太明显。 3.2 括号借助ide的缩进,功能块非常清晰,这一点,我在将react-bootstrap里的一些组件转译为clojurescript的组件时,感受特别深。js的代码太绕了,而clojurescript的非常直接,可读性上差别是明显的(所以现在变成 喜欢clojure的括号了) 3.3 函数的输出不可变,看代码时特别聚焦。而看懂一段js代码太不容易了,不清楚哪个地方改了某个变量,经常使用全文搜索。clojure不需要借助ide的单步调试就能看懂一个功能块在做什么事。看得越多,感受越深 现在大家对clojurer 的误解,个人认为主要还是社区太小,大家不了解。在国内缺乏应用场景,基本上是个人项目,资料也基本全英文,对我初中级别的英语能力是极大考验。 熟悉与优雅正交。希望大家能多关注下clojure,在对比中去发现它的美好。引用来自“jQer”的评论
首先,你用 clojure 写什么? 写文件系统?数据库引擎?它根本不是那个领域的。Rust、Nim 要好的多得多,而且语法也更加简单。 写服务器?写路由器?CPU 计算就是忽略的,这时候,jvm 对 node 没有什么性能优势,因为这个层面的职责就是转发,不对消息做计算。 可读,你用 C 风格写出来的 js, 我不明白其哪边不可读?哪边绕?当然,如果你用 Java 风格来写,我只能说,写代码的人不行。 另一方面,一旦你牵扯到了 Web 端,用 clojure 就意味着你的团队要掌握 Java (Android)、Swift/ObjC (IOS)、HTML + CSS + JavaScript (Browser)、Sql、Mongodb (JavaScript)。甚至你们可能还需要 Shell、Python 或者 Lua 构建自动化部署脚本。看看你们的开发成本,学习成本。引用来自“moose123”的评论
什么情况,写Clojure还要掌握这么多?呵呵,我们团队用clojure做东南亚电商平台,整个后台都是clojure来写,虽然我们是JAVA出生,在JAVA领域也有10年经验了,写了clj后,请相信我再也回不去了,如此的行云流水,clj的风格我觉得没什么问题,看段时间就习惯了,前缀表达式非常的统一,来团队的新人问我如何学,语法啥啥的,我告诉他没有语法,只有几个规则而已,然后在repl中试着写几行就明白怎么玩了,比起java这个开发效率真的是杠杠的,需要java的jar直接拿来用就行了,现在网站后台就是angularjs+clojure,不过JS部分不是cljs来写的,至于性能除了比JAVA更消耗内存一些外,其他的基本上比java差点点吧,clojure1.8 在内存方面又改善了很多,性能上当然随便吊打node了,已有大神测试过了。最后希望clojure越来越普及:)引用来自“jQer”的评论
你就纯粹是个菜鸟,先把 io 模型学会再来扯淡。还写商城,你们一共多少台节点服务器? 每秒请求数能到多少? 做过压测吗? java 也分 tomcat 和 netty 至少两种 io。还调打 node,我看看你调打的 benchmark。引用来自“jQer”的评论
O,函数式,O,lambda,... 我想当 Lisp 大神,我只用 Lisp 方言,...当你处于这个模式,说明你还是个刚入门的函数式菜鸟。函数式对于编程的贡献,就是对于循环算法提供一个单一接口,比如 map(callback)。剩下的就是语法树的设计,但是这个只能作为科研学习,对工程没有任何帮助。
结构化编程 + 循环回调 === 现代编程语言
能实现这种特性的语言多的是,而且性能、生态库都很丰富:Node.js、Scala、Erlang、Rust、Nim。Clojure 在里边就是一坨,无论是性能,还是可读,还是生态库,还是开发效率。
引用来自“下里巴人_770728”的评论
只用过js/java/clojure/ruby,性能方面,clojure确实比node好,开发效率应该稳超过node(主要是缺乏一个杀手级框架,象rails那样的,花在前期拼框架的时间太多了,真开发起来其实很快的)。生态方面本身基于jdk,大量java库可用。 重点讨论一下关于clojure的可读性: 1. 在较短的代码里,Java可读性最好。但一旦代码复杂化,对象之间的相互影响,让代码可读但难懂。所以我们分析一段java开源项目时,往往需要打开ide进行单步调试。 2. node的可读性实在太差,这应该没有争议。每一句话都能读明白,就是不清楚为什么会写成这样,不清楚将会变成什么 3. 最开始用clojure,确实被一堆括号吓倒了,感觉可读性差。现在上手三个多月,慢慢地发现感觉是错误的:clojure在这三种语言中,可读性是最好的: 3.1 短小,无废话,无干扰,一个功能块往往无需翻页就看完了。与java相比简直差距太明显。 3.2 括号借助ide的缩进,功能块非常清晰,这一点,我在将react-bootstrap里的一些组件转译为clojurescript的组件时,感受特别深。js的代码太绕了,而clojurescript的非常直接,可读性上差别是明显的(所以现在变成 喜欢clojure的括号了) 3.3 函数的输出不可变,看代码时特别聚焦。而看懂一段js代码太不容易了,不清楚哪个地方改了某个变量,经常使用全文搜索。clojure不需要借助ide的单步调试就能看懂一个功能块在做什么事。看得越多,感受越深 现在大家对clojurer 的误解,个人认为主要还是社区太小,大家不了解。在国内缺乏应用场景,基本上是个人项目,资料也基本全英文,对我初中级别的英语能力是极大考验。 熟悉与优雅正交。希望大家能多关注下clojure,在对比中去发现它的美好。引用来自“jQer”的评论
首先,你用 clojure 写什么? 写文件系统?数据库引擎?它根本不是那个领域的。Rust、Nim 要好的多得多,而且语法也更加简单。 写服务器?写路由器?CPU 计算就是忽略的,这时候,jvm 对 node 没有什么性能优势,因为这个层面的职责就是转发,不对消息做计算。 可读,你用 C 风格写出来的 js, 我不明白其哪边不可读?哪边绕?当然,如果你用 Java 风格来写,我只能说,写代码的人不行。 另一方面,一旦你牵扯到了 Web 端,用 clojure 就意味着你的团队要掌握 Java (Android)、Swift/ObjC (IOS)、HTML + CSS + JavaScript (Browser)、Sql、Mongodb (JavaScript)。甚至你们可能还需要 Shell、Python 或者 Lua 构建自动化部署脚本。看看你们的开发成本,学习成本。引用来自“moose123”的评论
什么情况,写Clojure还要掌握这么多?呵呵,我们团队用clojure做东南亚电商平台,整个后台都是clojure来写,虽然我们是JAVA出生,在JAVA领域也有10年经验了,写了clj后,请相信我再也回不去了,如此的行云流水,clj的风格我觉得没什么问题,看段时间就习惯了,前缀表达式非常的统一,来团队的新人问我如何学,语法啥啥的,我告诉他没有语法,只有几个规则而已,然后在repl中试着写几行就明白怎么玩了,比起java这个开发效率真的是杠杠的,需要java的jar直接拿来用就行了,现在网站后台就是angularjs+clojure,不过JS部分不是cljs来写的,至于性能除了比JAVA更消耗内存一些外,其他的基本上比java差点点吧,clojure1.8 在内存方面又改善了很多,性能上当然随便吊打node了,已有大神测试过了。最后希望clojure越来越普及:)引用来自“jQer”的评论
你就纯粹是个菜鸟,先把 io 模型学会再来扯淡。还写商城,你们一共多少台节点服务器? 每秒请求数能到多少? 做过压测吗? java 也分 tomcat 和 netty 至少两种 io。还调打 node,我看看你调打的 benchmark。引用来自“moose123”的评论
看来你是没真正用过clj,估计JAVA也不怎么样吧,根本就没跟你讨论IO,就扯IO来了,什么叫JAVA也分TOMCAT和NETTY,语无伦次。。。引用来自“jQer”的评论
O,函数式,O,lambda,... 我想当 Lisp 大神,我只用 Lisp 方言,...当你处于这个模式,说明你还是个刚入门的函数式菜鸟。函数式对于编程的贡献,就是对于循环算法提供一个单一接口,比如 map(callback)。剩下的就是语法树的设计,但是这个只能作为科研学习,对工程没有任何帮助。
结构化编程 + 循环回调 === 现代编程语言
能实现这种特性的语言多的是,而且性能、生态库都很丰富:Node.js、Scala、Erlang、Rust、Nim。Clojure 在里边就是一坨,无论是性能,还是可读,还是生态库,还是开发效率。
引用来自“下里巴人_770728”的评论
只用过js/java/clojure/ruby,性能方面,clojure确实比node好,开发效率应该稳超过node(主要是缺乏一个杀手级框架,象rails那样的,花在前期拼框架的时间太多了,真开发起来其实很快的)。生态方面本身基于jdk,大量java库可用。 重点讨论一下关于clojure的可读性: 1. 在较短的代码里,Java可读性最好。但一旦代码复杂化,对象之间的相互影响,让代码可读但难懂。所以我们分析一段java开源项目时,往往需要打开ide进行单步调试。 2. node的可读性实在太差,这应该没有争议。每一句话都能读明白,就是不清楚为什么会写成这样,不清楚将会变成什么 3. 最开始用clojure,确实被一堆括号吓倒了,感觉可读性差。现在上手三个多月,慢慢地发现感觉是错误的:clojure在这三种语言中,可读性是最好的: 3.1 短小,无废话,无干扰,一个功能块往往无需翻页就看完了。与java相比简直差距太明显。 3.2 括号借助ide的缩进,功能块非常清晰,这一点,我在将react-bootstrap里的一些组件转译为clojurescript的组件时,感受特别深。js的代码太绕了,而clojurescript的非常直接,可读性上差别是明显的(所以现在变成 喜欢clojure的括号了) 3.3 函数的输出不可变,看代码时特别聚焦。而看懂一段js代码太不容易了,不清楚哪个地方改了某个变量,经常使用全文搜索。clojure不需要借助ide的单步调试就能看懂一个功能块在做什么事。看得越多,感受越深 现在大家对clojurer 的误解,个人认为主要还是社区太小,大家不了解。在国内缺乏应用场景,基本上是个人项目,资料也基本全英文,对我初中级别的英语能力是极大考验。 熟悉与优雅正交。希望大家能多关注下clojure,在对比中去发现它的美好。引用来自“jQer”的评论
首先,你用 clojure 写什么? 写文件系统?数据库引擎?它根本不是那个领域的。Rust、Nim 要好的多得多,而且语法也更加简单。 写服务器?写路由器?CPU 计算就是忽略的,这时候,jvm 对 node 没有什么性能优势,因为这个层面的职责就是转发,不对消息做计算。 可读,你用 C 风格写出来的 js, 我不明白其哪边不可读?哪边绕?当然,如果你用 Java 风格来写,我只能说,写代码的人不行。 另一方面,一旦你牵扯到了 Web 端,用 clojure 就意味着你的团队要掌握 Java (Android)、Swift/ObjC (IOS)、HTML + CSS + JavaScript (Browser)、Sql、Mongodb (JavaScript)。甚至你们可能还需要 Shell、Python 或者 Lua 构建自动化部署脚本。看看你们的开发成本,学习成本。引用来自“moose123”的评论
什么情况,写Clojure还要掌握这么多?呵呵,我们团队用clojure做东南亚电商平台,整个后台都是clojure来写,虽然我们是JAVA出生,在JAVA领域也有10年经验了,写了clj后,请相信我再也回不去了,如此的行云流水,clj的风格我觉得没什么问题,看段时间就习惯了,前缀表达式非常的统一,来团队的新人问我如何学,语法啥啥的,我告诉他没有语法,只有几个规则而已,然后在repl中试着写几行就明白怎么玩了,比起java这个开发效率真的是杠杠的,需要java的jar直接拿来用就行了,现在网站后台就是angularjs+clojure,不过JS部分不是cljs来写的,至于性能除了比JAVA更消耗内存一些外,其他的基本上比java差点点吧,clojure1.8 在内存方面又改善了很多,性能上当然随便吊打node了,已有大神测试过了。最后希望clojure越来越普及:)引用来自“jQer”的评论
你就纯粹是个菜鸟,先把 io 模型学会再来扯淡。还写商城,你们一共多少台节点服务器? 每秒请求数能到多少? 做过压测吗? java 也分 tomcat 和 netty 至少两种 io。还调打 node,我看看你调打的 benchmark。引用来自“jQer”的评论
O,函数式,O,lambda,... 我想当 Lisp 大神,我只用 Lisp 方言,...当你处于这个模式,说明你还是个刚入门的函数式菜鸟。函数式对于编程的贡献,就是对于循环算法提供一个单一接口,比如 map(callback)。剩下的就是语法树的设计,但是这个只能作为科研学习,对工程没有任何帮助。
结构化编程 + 循环回调 === 现代编程语言
能实现这种特性的语言多的是,而且性能、生态库都很丰富:Node.js、Scala、Erlang、Rust、Nim。Clojure 在里边就是一坨,无论是性能,还是可读,还是生态库,还是开发效率。
引用来自“下里巴人_770728”的评论
只用过js/java/clojure/ruby,性能方面,clojure确实比node好,开发效率应该稳超过node(主要是缺乏一个杀手级框架,象rails那样的,花在前期拼框架的时间太多了,真开发起来其实很快的)。生态方面本身基于jdk,大量java库可用。 重点讨论一下关于clojure的可读性: 1. 在较短的代码里,Java可读性最好。但一旦代码复杂化,对象之间的相互影响,让代码可读但难懂。所以我们分析一段java开源项目时,往往需要打开ide进行单步调试。 2. node的可读性实在太差,这应该没有争议。每一句话都能读明白,就是不清楚为什么会写成这样,不清楚将会变成什么 3. 最开始用clojure,确实被一堆括号吓倒了,感觉可读性差。现在上手三个多月,慢慢地发现感觉是错误的:clojure在这三种语言中,可读性是最好的: 3.1 短小,无废话,无干扰,一个功能块往往无需翻页就看完了。与java相比简直差距太明显。 3.2 括号借助ide的缩进,功能块非常清晰,这一点,我在将react-bootstrap里的一些组件转译为clojurescript的组件时,感受特别深。js的代码太绕了,而clojurescript的非常直接,可读性上差别是明显的(所以现在变成 喜欢clojure的括号了) 3.3 函数的输出不可变,看代码时特别聚焦。而看懂一段js代码太不容易了,不清楚哪个地方改了某个变量,经常使用全文搜索。clojure不需要借助ide的单步调试就能看懂一个功能块在做什么事。看得越多,感受越深 现在大家对clojurer 的误解,个人认为主要还是社区太小,大家不了解。在国内缺乏应用场景,基本上是个人项目,资料也基本全英文,对我初中级别的英语能力是极大考验。 熟悉与优雅正交。希望大家能多关注下clojure,在对比中去发现它的美好。引用来自“jQer”的评论
首先,你用 clojure 写什么? 写文件系统?数据库引擎?它根本不是那个领域的。Rust、Nim 要好的多得多,而且语法也更加简单。 写服务器?写路由器?CPU 计算就是忽略的,这时候,jvm 对 node 没有什么性能优势,因为这个层面的职责就是转发,不对消息做计算。 可读,你用 C 风格写出来的 js, 我不明白其哪边不可读?哪边绕?当然,如果你用 Java 风格来写,我只能说,写代码的人不行。 另一方面,一旦你牵扯到了 Web 端,用 clojure 就意味着你的团队要掌握 Java (Android)、Swift/ObjC (IOS)、HTML + CSS + JavaScript (Browser)、Sql、Mongodb (JavaScript)。甚至你们可能还需要 Shell、Python 或者 Lua 构建自动化部署脚本。看看你们的开发成本,学习成本。引用来自“moose123”的评论
什么情况,写Clojure还要掌握这么多?呵呵,我们团队用clojure做东南亚电商平台,整个后台都是clojure来写,虽然我们是JAVA出生,在JAVA领域也有10年经验了,写了clj后,请相信我再也回不去了,如此的行云流水,clj的风格我觉得没什么问题,看段时间就习惯了,前缀表达式非常的统一,来团队的新人问我如何学,语法啥啥的,我告诉他没有语法,只有几个规则而已,然后在repl中试着写几行就明白怎么玩了,比起java这个开发效率真的是杠杠的,需要java的jar直接拿来用就行了,现在网站后台就是angularjs+clojure,不过JS部分不是cljs来写的,至于性能除了比JAVA更消耗内存一些外,其他的基本上比java差点点吧,clojure1.8 在内存方面又改善了很多,性能上当然随便吊打node了,已有大神测试过了。最后希望clojure越来越普及:)引用来自“jQer”的评论
O,函数式,O,lambda,... 我想当 Lisp 大神,我只用 Lisp 方言,...当你处于这个模式,说明你还是个刚入门的函数式菜鸟。函数式对于编程的贡献,就是对于循环算法提供一个单一接口,比如 map(callback)。剩下的就是语法树的设计,但是这个只能作为科研学习,对工程没有任何帮助。
结构化编程 + 循环回调 === 现代编程语言
能实现这种特性的语言多的是,而且性能、生态库都很丰富:Node.js、Scala、Erlang、Rust、Nim。Clojure 在里边就是一坨,无论是性能,还是可读,还是生态库,还是开发效率。
引用来自“下里巴人_770728”的评论
只用过js/java/clojure/ruby,性能方面,clojure确实比node好,开发效率应该稳超过node(主要是缺乏一个杀手级框架,象rails那样的,花在前期拼框架的时间太多了,真开发起来其实很快的)。生态方面本身基于jdk,大量java库可用。 重点讨论一下关于clojure的可读性: 1. 在较短的代码里,Java可读性最好。但一旦代码复杂化,对象之间的相互影响,让代码可读但难懂。所以我们分析一段java开源项目时,往往需要打开ide进行单步调试。 2. node的可读性实在太差,这应该没有争议。每一句话都能读明白,就是不清楚为什么会写成这样,不清楚将会变成什么 3. 最开始用clojure,确实被一堆括号吓倒了,感觉可读性差。现在上手三个多月,慢慢地发现感觉是错误的:clojure在这三种语言中,可读性是最好的: 3.1 短小,无废话,无干扰,一个功能块往往无需翻页就看完了。与java相比简直差距太明显。 3.2 括号借助ide的缩进,功能块非常清晰,这一点,我在将react-bootstrap里的一些组件转译为clojurescript的组件时,感受特别深。js的代码太绕了,而clojurescript的非常直接,可读性上差别是明显的(所以现在变成 喜欢clojure的括号了) 3.3 函数的输出不可变,看代码时特别聚焦。而看懂一段js代码太不容易了,不清楚哪个地方改了某个变量,经常使用全文搜索。clojure不需要借助ide的单步调试就能看懂一个功能块在做什么事。看得越多,感受越深 现在大家对clojurer 的误解,个人认为主要还是社区太小,大家不了解。在国内缺乏应用场景,基本上是个人项目,资料也基本全英文,对我初中级别的英语能力是极大考验。 熟悉与优雅正交。希望大家能多关注下clojure,在对比中去发现它的美好。引用来自“jQer”的评论
首先,你用 clojure 写什么? 写文件系统?数据库引擎?它根本不是那个领域的。Rust、Nim 要好的多得多,而且语法也更加简单。 写服务器?写路由器?CPU 计算就是忽略的,这时候,jvm 对 node 没有什么性能优势,因为这个层面的职责就是转发,不对消息做计算。 可读,你用 C 风格写出来的 js, 我不明白其哪边不可读?哪边绕?当然,如果你用 Java 风格来写,我只能说,写代码的人不行。 另一方面,一旦你牵扯到了 Web 端,用 clojure 就意味着你的团队要掌握 Java (Android)、Swift/ObjC (IOS)、HTML + CSS + JavaScript (Browser)、Sql、Mongodb (JavaScript)。甚至你们可能还需要 Shell、Python 或者 Lua 构建自动化部署脚本。看看你们的开发成本,学习成本。引用来自“jQer”的评论
O,函数式,O,lambda,... 我想当 Lisp 大神,我只用 Lisp 方言,...当你处于这个模式,说明你还是个刚入门的函数式菜鸟。函数式对于编程的贡献,就是对于循环算法提供一个单一接口,比如 map(callback)。剩下的就是语法树的设计,但是这个只能作为科研学习,对工程没有任何帮助。
结构化编程 + 循环回调 === 现代编程语言
能实现这种特性的语言多的是,而且性能、生态库都很丰富:Node.js、Scala、Erlang、Rust、Nim。Clojure 在里边就是一坨,无论是性能,还是可读,还是生态库,还是开发效率。
引用来自“下里巴人_770728”的评论
只用过js/java/clojure/ruby,性能方面,clojure确实比node好,开发效率应该稳超过node(主要是缺乏一个杀手级框架,象rails那样的,花在前期拼框架的时间太多了,真开发起来其实很快的)。生态方面本身基于jdk,大量java库可用。 重点讨论一下关于clojure的可读性: 1. 在较短的代码里,Java可读性最好。但一旦代码复杂化,对象之间的相互影响,让代码可读但难懂。所以我们分析一段java开源项目时,往往需要打开ide进行单步调试。 2. node的可读性实在太差,这应该没有争议。每一句话都能读明白,就是不清楚为什么会写成这样,不清楚将会变成什么 3. 最开始用clojure,确实被一堆括号吓倒了,感觉可读性差。现在上手三个多月,慢慢地发现感觉是错误的:clojure在这三种语言中,可读性是最好的: 3.1 短小,无废话,无干扰,一个功能块往往无需翻页就看完了。与java相比简直差距太明显。 3.2 括号借助ide的缩进,功能块非常清晰,这一点,我在将react-bootstrap里的一些组件转译为clojurescript的组件时,感受特别深。js的代码太绕了,而clojurescript的非常直接,可读性上差别是明显的(所以现在变成 喜欢clojure的括号了) 3.3 函数的输出不可变,看代码时特别聚焦。而看懂一段js代码太不容易了,不清楚哪个地方改了某个变量,经常使用全文搜索。clojure不需要借助ide的单步调试就能看懂一个功能块在做什么事。看得越多,感受越深 现在大家对clojurer 的误解,个人认为主要还是社区太小,大家不了解。在国内缺乏应用场景,基本上是个人项目,资料也基本全英文,对我初中级别的英语能力是极大考验。 熟悉与优雅正交。希望大家能多关注下clojure,在对比中去发现它的美好。引用来自“jQer”的评论
首先,你用 clojure 写什么? 写文件系统?数据库引擎?它根本不是那个领域的。Rust、Nim 要好的多得多,而且语法也更加简单。 写服务器?写路由器?CPU 计算就是忽略的,这时候,jvm 对 node 没有什么性能优势,因为这个层面的职责就是转发,不对消息做计算。 可读,你用 C 风格写出来的 js, 我不明白其哪边不可读?哪边绕?当然,如果你用 Java 风格来写,我只能说,写代码的人不行。 另一方面,一旦你牵扯到了 Web 端,用 clojure 就意味着你的团队要掌握 Java (Android)、Swift/ObjC (IOS)、HTML + CSS + JavaScript (Browser)、Sql、Mongodb (JavaScript)。甚至你们可能还需要 Shell、Python 或者 Lua 构建自动化部署脚本。看看你们的开发成本,学习成本。