为Java说句公道话

有些人问我,在现有的语言里面,有什么好的推荐?我说:“Java。” 他们很惊讶:“什么?Java!” 因此我如今来解释一下。程序员

Java超越了全部咒骂它的“动态语言”

也许是由于年轻人的逆反心理,人们都不把本身的入门语言当回事。很早的时候,计算机系的学生用Scheme或者Pascal入门,如今大部分学校用Java。这也许就是为何不少人恨Java,瞧不起用Java的人。提到Java,感受就像是爷爷那辈人用的东西。他们说,Java老气,庞大,复杂,臃肿。golang

某些Python程序员,在论坛里跟初学者讲解Python有什么好,其中一个缘由居然是:“由于Python不是Java!” 他们喜欢这样宣传:“看Python多简单清晰啊,都不须要写类型……” 对于Java的平白无故的恨,盲目的否定,致使了他们看不到Java很重要的优势,以致于迷失本身的方向。虽然气势上占上风,然而其实Python做为一个编程语言,是彻底没法和Java抗衡的。编程

在性能上,Python比Java慢几十倍。因为缺少静态类型等重要设施,Python代码有bug很不容易察觉,察觉了也不容易debug,因此Python没法用于构造大规模的,复杂的系统。你也许发现某些startup公司的主要代码是Python写的,然而这些公司的软件,质量其实至关的低。在成熟的公司里,Python最多只用来写工具性质的东西,或者小型的,不会影响系统可靠性的脚本。框架

 

静态类型的缺少,也致使了Python不可能有很好的IDE支持,你不能彻底可靠地重构(refactor)Python代码。PyCharm对于早期的Python编程环境,是一个很大的改进,然而理论决定了,它不可能彻底可靠地达到“变量换名”等基本的refactor操做。编程语言

在设计上,Python,Ruby比起Java,其实复杂不少。缺乏了不少重要的特性,有毛病的“强大特性”却是多了一堆。因为盲目的推崇所谓“正宗的面向对象”方式,所谓“late-binding”,这些语言里面有太多能够“重载”语义的地方,无论什么均可以被重定义,这致使代码具备很大的不肯定性和复杂性。Python和Ruby代码很容易被滥用,不容易理解,容易写得很乱,容易出问题。编辑器

不少JavaScript程序员也盲目地鄙视Java,而其实JavaScript比Python和Ruby还要差。不但具备它们的全部缺点,并且缺少不少必要的,方便的特性,好比基本的class定义都没有。JavaScript的各类“WEB框架”,层出不穷,彷佛一直在推陈出新,而其实呢,全都是在黑暗里瞎蒙乱撞。JavaScript的社区以幼稚著称。你常常发现一些很是基本的常识,被JavaScript“专家”们当成了不得的发现似的,在大会上宣讲。我看不出来JavaScript社区开那些会议,到底有什么意义,仿佛只是为了拉关系找工做。函数

Python凑合能够用在不重要的地方,Ruby是垃圾,JavaScript是垃圾中的垃圾。缘由很简单,由于Ruby和JavaScript的设计者,其实都只是民科。工具

Java的“继承人”没能超越它

最近一段时间,不少人热衷于Scala,Clojure,Go等新兴的语言,他们觉得这些是比Java更现代,更先进的语言,觉得它们最终会取代Java。然而这些狂热分子们逐渐发现,Scala,Clojure和Go其实并无解决它们声称能解决的问题,反而带来了它们本身的毛病。这些毛病不少是Java没有的。性能

关于Go,我已经评论过不少了,有兴趣的人能够看这里。总之,Go是民科加自大狂的产物,这里我就很少说它了。debug

我认识一些人,开头很推崇Scala,仿佛什么救星似的。我建议他们别去折腾了,老老实实用Java。没听个人,结果到后来,整天都在骂Scala的各类毛病。可是没办法啊,项目上了贼船,不得不继续用下去。我不喜欢进行人身攻击,然而我发现一个语言的好坏,每每取决于它的设计者的水平,人品,和动机。不少时候我看人的直觉是异常的准,以致于依据对语言设计者的第一印象,我就能预测到这个语言未来会怎么发展。在这里,我想谈一下对Scala和Clojure的设计者的见解。

Scala的设计者Martin Odersky,虽然在程序语言领域有所建树,发表了很多看似高深的学术论文( 其实不少是扯淡的),然而他对于语言的“设计”,其实并非特别在行。因此我很惊讶的发现,有些很是基本的东西,Scala都会搞错。因为Odersky是大学教授,名声在外,不少人想找他拿个PhD,因此东拉西扯的,喜欢往Scala里面加入一些不明不白,有潜在问题的“特性”,其目的就是发paper,混毕业。这致使Scala过分繁复,加入的特性不少后来被证实没有多大用处,反而带来了问题。学生把代码实现加入到Scala的编译器,毕业就走人无论了,因此Scala编译器里,就留下一堆堆的历史遗留垃圾和bug。

再来讲一下Clojure。当Clojure最初“横空面世”的时候,有些人热血沸腾地向我推荐。因而我看了一下它的设计者Rich Hickey作的宣传讲座视频。当时我就对他只知其一;不知其二拍胸脯的本事,印象很是的深入。Rich Hickey真的是半路出家,连个CS学位都没有。可他那种气势,仿佛其余的语言设计者什么都不懂,只有他看到了真理似的。不过也只有这样的人,才能创造出“宗教”吧?Clojure大力宣传的“特性”(什么lazy啊,pure啊,transactional memory啊),都是从别的语言道听途说抄过来,却又没能深入理解其精髓。有些“函数式语言”的特性,原本就是有问题的,却不问青红皂白,为了“主义正确”,抄过来。因此最后你发现这语言是挂着羊头卖狗肉,说得头头是道,用起来怎么就那么蹩脚。

Clojure的社区,一直忙着从Scheme和Racket的社区抄袭思想,却又想标榜是本身的发明。好比Typed Clojure,就是原封不动抄袭Typed Racket。有些如出一辙的基本概念,在Scheme里面都几十年了,恁是要改个不同的名字,省得大家发现那是Scheme先有的。甚至有人把SICP,The Little Schemer等名著里的代码,全都用Clojure改写一遍,结果彻底失去了原做的简单性和精华性。最后你发现,Clojure里面好的地方,全都是Scheme已经有的,Clojure里面新的特性,几乎全都有问题。我参加过一些Clojure的meetup,但是后来发现,里面竟是各类喊着大口号的初学者,各类趾高气昂的民科,愚昧之至。

盲目推崇Scala和Clojure的人们,不少最后都发现,这些语言里面的“新特性”,几乎都有毛病。它们里面最重要最有用的特性,其实早就已经在Java里了。有些人跟我说:“你看,Java作不了这件事情!” 后来经我分析,发现他们在潜意识里早已死板的认定,非得用某种最新最酷的语言特性,才能达到目的。Java没有这些特性,他们就觉得Java作不了,非得用另外的语言。其实,若是你换一个角度来看问题,不要钻牛角尖,专一于解决问题,而不是去追求最新最酷的“写法”,你就能用Java解决它,并且解决得干净利落。

若是如今要作一个系统,真的宁肯用Java,也不要浪费时间去折腾什么Scala或者Clojure。错误的人设计了错误的语言,拿出来浪费你们的时间。

Java没有特别讨厌的地方

Java也许缺乏一些方便的特性,然而长久以来用Java进行教学,用Java工做,用Java开发PySonar,RubySonar,Yin语言,…… 我发现Java其实并不像不少人传说的那么可恶。我发现本身想要的95%以上的功能,在Java里面都能找到比较直接的用法。剩下的5%,用稍微笨一点的办法,同样能够解决问题。

不少人讨厌Java,实际上是由于早期的GoF Design Patterns,试图提出千篇一概的模板,给程序带来了没必要要的复杂性。然而Java语言自己,其实跟Design Patterns并非等价的。Java的设计者跟Design Pattern的设计者,彻底是不一样的人。你彻底可使用Java写出很是简单的代码,而不使用Design Patterns。

Java有优秀的IDE支持

我平时都用IntelliJ来写Java代码。我发现IntelliJ里面,有一些很是好的设计思想。其中不少功能,其实超越了全部的文本编辑器(Emacs,VIM……)。IntelliJ让Java如虎添翼,开发起来感受是在飞同样。

用IntelliJ的时候,你不须要为“给变量起名字”之类的事情焦虑。由于IntelliJ有很是强大而友好的refactor功能,你能够很是迅速的换掉变量的名字。因此在第一次创造变量的时候,你不须要花心思去起一个完美的名字。用一个还算凑合的名字,把代码很快写出来,实验成功。而后再返回去看代码,把名字换成一个更合适的就能够。

IntelliJ还能够进行很是迅速的结构变换,这让你就像艺术家在构造一个雕塑做品。最开头我能够大刀阔斧,把代码劈成大体的形状,而后再把它仔细推敲,揉捏成更好,更容易理解,更具魅力的形状。

结论

我实在不忍心看着有些人被Scala和Clojure忽悠。若是没有超级高的性能和资源需求(可能要用C这样的低级语言),目前我建议就老老实实用Java吧。虽然不如一些新的语言炫酷,然而实际的系统,还真没有什么是Java写不出来的。少数地方可能须要绕过一些限制,或者放宽一些要求,然而这样的状况不是不少。

编程使用什么工具是重要的,然而工具终究不如本身的技术重要。不少人花了太多时间,折腾各类新的语言,但愿它们会奇迹通常的改善代码质量,结果最后什么都没作出来。选择语言最重要的条件,应该是“够好用”就能够,由于项目的成功最终是靠人,而不是靠语言。

相关文章
相关标签/搜索