淮职移动互联网学院吧 关注:20贴子:160
  • 0回复贴,共1

大神为java说“公道话”,最后一段亮了。。。

只看楼主收藏回复

有些人问我,在现有的语言里面,有什么好的推荐?我告诉他们:用Java。有些人很惊讶,想不到像我这样的人也会推荐Java,所以现在我来解释一下。
Java超越了所有咒骂它的“动态语言”
很多人恨Java,瞧不起用Java的人。他们说,Java庞大,复杂,臃肿。然而他们所谓的“复杂”之处,其实大部分都是有用处的。特别是像静态类型系统,generics等特性,对于大型的工程项目很重要的。Python代码一般不会写很大的工程,所以很多Python程序员误以为静态类型是臃肿的累赘。
某些Python程序员,在论坛里跟初学者讲解Python有什么好,其中一个原因,竟然是:“因为Python不是Java!” 我对这种说法相当的无语。这些Python程序员对于Java的无缘无故的恨,高人一等的态度,导致了他们看不到Java很重要的优点,以至于迷失自己的方向。
虽然气势上占上风,然而其实Python作为一个编程语言,是完全无法和Java抗衡的。在性能上,Python比Java慢几十倍。而且由于缺乏静态类型等重要的设施,Python无法用于构造大规模的,复杂的系统。静态类型的缺乏,同时也导致了Python不可能有很好的IDE支持,你不能完全可靠地refactor Python代码。PyCharm对于早期的Python编程环境是一个很大的改进,然而理论已经决定了,它不可能完全可靠地达到IntelliJ对于Java能做的“变量换名”等refactor操作。
在设计上,Python,Ruby比起Java,其实复杂很多。缺少了很多重要的特性,有毛病特性倒是多了一大堆。由于盲目的推崇所谓“真正的面向对象”方式,有太多可以“重载”的语义特性,Python和Ruby的代码往往带有很大的复杂性和不确定性。其结果是Python和Ruby代码都不会很可靠,不容易理解。
很多JavaScript程序员也盲目地鄙视Java,然而其实JavaScript比Python和Ruby都要差。不但有它们的所有缺点,而且缺乏很多必要的,方便的特性。JavaScript的各种“WEB框架”,层出不穷,似乎一直在推陈出新,而其实呢,全都是在黑暗里瞎蒙乱撞。
Java的“继承人”没能超越它
最近一段时间,很多人热衷于Scala,Clojure等新兴的语言,他们以为这些是对Java的改进,是比Java更现代,更先进的语言。然而最后这些狂热分子们逐渐发现,Scala和Clojure其实并没有解决它们声称能解决的问题,反而带来了它们自己的毛病。这些毛病都是Java没有的。
我不喜欢进行人身攻击,然而我很想告诉你们,我对Scala和Clojure的设计者的看法。Scala的设计者Martin Odersky,虽然在程序语言领域有所建树,发表了不少学术论文,然而他对于语言的“设计”,其实并不是特别在行。所以我很惊讶的发现,有些非常基本的问题,Scala都会搞错。由于Odersky是大学教授,名声在外,很多人想找他拿个PhD,所以东拉西扯的,喜欢往Scala里面加入一些无需有的“特性”,这样好发paper。这导致Scala过度繁复,加入的特性很多在后来被证明没有用处,反而带来一些问题。学生把代码实现加入到Scala编译器,然后毕业走人不管了,所以Scala编译器里就留下一堆堆的历史遗留垃圾。
再来说一下Clojure。当Clojure最初面世的时候,我就看了一下Clojure的作者Rich Hickey做的宣传讲座。我当时就对他一知半解拍胸脯的本事,印象非常的深刻。那种气势,仿佛其他的语言设计者都不懂,只有他看到了真理似的。也只有这样的人,才能创造一个“宗教”吧?然而,Clojure大力宣传的“特性”(什么lazy啊,pure啊,transactional memory啊),大部分是从别的语言抄过来,却又没能深入理解,所以最后你发现都是半壶水,根本不能很有效的起作用。Clojure的社区,一直忙着从Scheme和Racket的社区抄袭思想,却又想标榜是自己的发明。比如Typed Clojure,就是原封不动抄袭Typed Racket。甚至有人把SICP,The Little Schemer等名著都改写成用Clojure来写,结果完全失去了原作的简单性和精华性。
盲目推崇Scala和Clojure的人们,很多最后都发现,这些语言里面最重要最有用的特性,其实早就已经在Java里了。如果现在要做一个系统,真的宁可用Java也不要去折腾什么Scala或者Clojure。
Java没有特别讨厌的地方
Java也许缺少一些方便的特性,然而长久以来用Java进行教学,用Java工作,用Java开发PySonar,RubySonar,Yin语言,…… 我发现Java其实并不像很多人想象的那么可恶。我发现自己想要的95%以上的功能,在Java里面都能找到比较直接的用法。
很多人讨厌Java,其实是因为早期的GoF Design Patterns,试图提出千篇一律的模板,给程序带来了不必要的复杂性。然而Java语言本身,其实跟Design Patterns并不是等价的。Java的设计者跟Design Pattern的设计者,完全是不同的人。你完全可以使用Java写出非常简单的代码,而不使用Design Patterns。这样写出来的代码,比起用Scheme等函数式语言写的,其实没有很大的区别,甚至在某些方面还更加简单一些。
Java有优秀的IDE支持
我平时都用IntelliJ来写Java代码。我发现IntelliJ里面,有一些非常好的设计思想。其中很多功能,其实超越了所有的文本编辑器(Emacs,VIM……)。IntelliJ让Java如虎添翼,开发起来简直感觉跟在飞一样。
用IntelliJ的时候,你不需要为“给变量起名字”之类的事情焦虑。因为IntelliJ有非常强大而友好的refactor功能,你可以非常迅速的换掉变量的名字。所以在第一次创造变量的时候,你不需要花心思去起一个完美的名字。用一个还算凑合的名字,把代码很快写出来,实验成功。然后再返回去看代码,把名字换成一个更合适的就可以。
IntelliJ还可以进行非常迅速的结构变换。这使得编程的时候,就像艺术家在构造一个雕塑作品。最开头我可以大刀阔斧的把代码劈成大致的形状,然后再修修补补,把代码揉捏成更好,更容易理解,更具魅力的形状。
结论
综上所述,如果没有特别的性能和资源需求要用C++,目前我建议大家就老老实实的用Java吧,我实在不忍心看着有些人被Scala和Clojure忽悠。虽然不如一些新的语言炫酷,然而实际的系统,还真没有什么是Java写不出来的。有少数地方可能需要绕过一些问题,然而这样的情况不是很多。
如果世界上有一个语言超越了Java,那恐怕就是C#。我的Yin语言可以比它们好一些,然而不会好得很多,因为大部分最重要的优点,Java都已经有了。
----------------------------------------------------------------------------------------------------------------------------------------------------------
转载自王垠博客《当然我在扯淡》更多4


1楼2016-02-27 16:53回复