有些人问我,在现有的语言里面,有什么好的推荐?我说:“Java。java
” 他们很是吃惊:“什么?Java!” 因此我现在来解释一下。golang
或许是因为年轻人的逆反心理,人们都不把本身的入门语言当回事。很是早的时候。计算机系的学生用Scheme或者Pascal入门,现在大部分学校用Java。编程
这或许就是为何很是多人恨Java,瞧不起用Java的人。并发
提到Java,感受就像是爷爷那辈人用的东西。框架
你们都会用Java,怎么能显得我优秀出众呢?因而他们说:“Java老气,庞大。复杂。臃肿。ssh
我更愿意探索新的语言……”编程语言
某些Python程序猿,在论坛里跟刚開始学习的人解说Python有什么好。当中一个缘由竟然是:“因为Python不是Java。” 他们喜欢这样宣传:“看Python多简单清晰啊。都不需要写类型……” 对于Java的平白无故的恨,盲目的否定。致使了他们看不到它很是重要的长处。以致于迷失本身的方向。尽管气势上占上风,然而事实上Python做为一个编程语言。是全然没法和Java抗衡的。函数式编程
在性能上。Python比Java慢几十倍。因为缺少静态类型等重要设施,Python代码有bug很是不easy发现,发现了也不easydebug,因此Python没法用于构造大规模的,复杂的系统。你或许发现某些startup公司的主要代码是Python写的,然而这些公司的软件。质量事实上至关的低。函数
在成熟的公司里。Python最多仅仅用来写工具性质的东西,或者小型的。不会影响系统可靠性的脚本。工具
静态类型的缺少,也致使了Python不可能有很是好的IDE支持,你不能全然可靠地“跳转到定义”,不可能全然可靠地重构(refactor)Python代码。PyCharm对于早期的Python编程环境,是一个很是大的改进,然而理论决定了,它不可能全然可靠地进行“变量换名”等主要的重构操做。就算是比PyCharm强大很是多的PySonar,对此也无能为力。
因为Python的设计过分的“动态”。没有类型标记。使得全然准确的定义查找。成为了避免可断定(undecidable)的问题。
在设计上,Python,Ruby比起Java,事实上复杂很是多。缺乏了很是多重要的特性,有毛病的“强大特性”却是多了一堆。
因为盲目的推崇所谓“正宗的面向对象”方式。所谓“late binding”,这些语言里面有太多可以“重载”语义的地方。不管什么都可以被重定义,这致使代码具备很是大的不肯定性和复杂性,很是多bug就是被隐藏在这些被重载的语言结构里面了。
所以。Python和Ruby代码很是easy被滥用,不easy理解。easy写得很是乱,easy出问题。
很是多JavaScript程序猿也盲目地歧视Java,而事实上JavaScript比Python和Ruby还要差。不但具备它们的差点儿所有缺点。而且缺少一些必要的设施。JavaScript的各类“WEB框架”,层出不穷,彷佛一直在推陈出新,而事实上呢,全都是在黑暗里瞎蒙乱撞。
JavaScript的社区以幼稚和愚昧著称。你经常发现一些很是主要的常识,被JavaScript“专家”们当成了不得的发现似的。在大会上宣讲。我看不出来JavaScript社区开那些会议,究竟有什么意义。仿佛仅仅是为了拉关系找工做。
Python凑合可以用在不重要的地方,Ruby是垃圾,JavaScript是垃圾中的垃圾。缘由很是简单,因为Ruby和JavaScript的设计者,事实上都是只知其一;不知其二的民科。
然而世界就是这么奇怪。一个完全的垃圾语言,仍然可以宣称是“程序猿最好的朋友”。从而获得某些人的爱戴……
近期一段时间。很是多人热衷于Scala,Clojure,Go等新兴的语言。他们觉得这些是比Java更现代,更先进的语言。觉得它们终于会代替Java。
然而这些狂热分子们逐渐发现,Scala。Clojure和Go事实上并无解决它们声称能解决的问题,反而带来了它们本身的毛病,而这些毛病很是可能是Java没有的。而后他们才意识到,Java离寿终正寝的时候,还远得很是……
Go语言
关于Go。我已经评论过很是多了。有兴趣的人可以看这里。总之。Go是民科加自大狂的产物,奇葩得不得了。这里我就很少说它了,仅仅谈谈Scala和Clojure。
Scala
我认识一些人,开头很是推崇Scala,仿佛什么救星似的。我建议他们别去折腾了。老老实有用Java。没听个人。结果到后来。整天都在骂Scala的各类毛病。
可是没办法啊,项目上了贼船,不得不继续用下去。我不喜欢进行人身攻击,然而我发现一个语言的好坏,每每取决于它的设计者的背景。觉悟,人品和动机。很是多时候我看人的直觉是异常的准,以致于根据对语言设计者的第一印象,我就能预測到这个语言未来会怎么发展。在这里,我想谈一下对Scala和Clojure的设计者的见解。
Scala的设计者Martin Odersky。在PL领域有所建树。发表了很多学术论文( 包含著名的《The Call-by-Need Lambda Calculus》),而且仍是大名鼎鼎的Niklaus Wirth的门徒,我所以觉得他还比較靠谱。可是開始接触Scala没多久。我就很是吃惊的发现,有些很是主要的东西,Scala都设计错了。这就是为何我几度试图採用Scala,最后都不了了之。
因为我一边看,一边发现让人跌眼镜的设计失误。而这些问题都是Java没有的。这样几回以后。我就对Odersky失去了信心。对Scala失去了兴趣。
回头看看Odersky那些论文的本质,我发现尽管理论性貌似很是强。事实上很是可能是在故弄玄虚(包含那所谓的“call-by-need lambda calculus”)。他尽管对某些特定的问题有必定深度,然而知识面事实上不是很是广,眼光比較片面。对于语言的整体设计,把握不够好。感受他是把各类语言里的特性。强行拼凑在一块儿,并无考虑过它们可否够“和谐”的共存,也很是少考虑“可用性”。
因为Odersky是大学教授,名声在外。很是多人想找他拿个PhD,因此东拉西扯。喜欢往Scala里面增长一些不明不白,有潜在问题的“特性”。其目的就是发paper。混毕业。这致使Scala不加选择的增长过多的特性。过分繁复。增长的特性很是多后来被证实没有多大用处,反而带来了问题。学生把代码实现增长到Scala的编译器,毕业就走人不管了,因此Scala编译器里。就留下一堆堆的历史遗留垃圾和bug。这或许不是Odersky一我的的错。然而至少说明他把关不严,或者品位确实有问题。
最有名的採用Scala的公司,无非是Twitter。事实上像Twitter那样的系统,用Java照样写得出来。Twitter后来怎么样了呢?CEO都跑了 :P 新CEO上台就裁人300多人。包含project师在内。
我预计Twitter裁人的一个缘由是。有太多的Scala程序猿,扯着各类高大上不有用的口号,比方“函数式编程”,进行过分project。浪费公司的资源。
花着公司的钱,开着各类会议,组织各类meetup和hackathon。提升本身在open source领域的威望。事实上没有为公司创造很是多价值……
Clojure
再来讲一下Clojure。当Clojure最初“横空面世”的时候,有些人热血沸腾地向我推荐。因而我看了一下它的设计者Rich Hickey作的宣传讲座视频。
当时我就对他只知其一;不知其二拍胸脯的本事,印象很是的深入。Rich Hickey真的是半路出家,连个CS学位都没有。可他那种气势,仿佛其余的语言设计者什么都不懂。仅仅有他看到了真理似的。只是也仅仅有这种人。才干创造出“宗教”吧?
满口热门的名词,什么lazy啊,pure啊,STM啊。号称能解决“大规模并发”的问题。…… 这就很是easy让人上钩。
事实上他这些词儿。都是从别的语言道听途说来。却又没能深入理解其精髓。
有些“函数式语言”的特性,原本就是有问题的,却为了主义正确,为了显得高大上,抄过来。因此最后你发现这语言是挂着羊头卖狗肉,狗皮膏药同样说得头头是道。用起来怎么就那么蹩脚。
Clojure的社区,一直忙着从Scheme和Racket的项目里抄袭思想。却又想标榜是本身的发明。比方Typed Clojure,就是原封不动抄袭Typed Racket。有些如出一辙的基本概念,在Scheme里面都几十年了。恁是要改个不同的名字,省得大家发现那是Scheme先有的。甚至有人把SICP,The Little Schemer等名著里的代码。全都用Clojure改写一遍。结果全然失去了原做的简单和清晰。最后你发现,Clojure里面好的地方。全都是Scheme已经有的。Clojure里面新的特性,差点儿全都有问题。我參加过一些Clojure的meetup,可是后来发现。里面竟是各类喊着大口号的小白,各类趾高气昂的民科,愚昧之至。
假设现在要作一个系统,真的宁肯用Java,也不要浪费时间去折腾什么Scala或者Clojure。错误的人设计了错误的语言,拿出来浪费你们的时间。
我至今不明确,很是多人对Java的仇恨和歧视,从何而来。它或许缺乏一些方便的特性。然而长久以来用Java进行教学,用Java工做,用Java开发PySonar。RubySonar。Yin语言,…… 我发现Java事实上并不像很是多人传说的那么可恶。
我发现本身想要的95%以上的功能,在Java里面都能找到比較直接的使用方法。剩下的5%。用略微笨一点的办法,同样可以解决这个问题。
盲目推崇Scala和Clojure的人们,很是多最后都发现,这些语言里面的“新特性”,差点儿都有毛病。里面最重要最有用的特性,事实上早就已经在Java里了。有些人跟我说:“你看,Java作不了这件事情!” 后来经我分析。发现他们在潜意识里早已死板的认定。非得用某种最新最酷的语言特性。才干达到目的。Java没有这些特性,他们就觉得非得用另外的语言。事实上。假设你换一个角度来看问题,不要钻牛角尖,专一于解决这个问题,而不是去追求最新最酷的“写法”,你就能用Java解决它,而且解决得干净利落。
很是多人说Java复杂臃肿。事实上是因为早期的Design Patterns,试图提出千篇一概的模板。给程序带来了没必要要的复杂性。然而Java语言自己跟Design Patterns并不是等价的。Java的设计者,跟Design Pattern的设计者,全然是不一样的人。你全然可以使用Java写出很是简单的代码,而不使用Design Patterns。
Java仅仅是一个语言。语言仅仅提供给你主要的机制,至于代码写的复杂仍是简单。取决于人。把对一些滥用Design Patterns的Java程序猿的恨,转移到Java语言自己。从而全然抛弃它的一切,是不明智的。
我平时用着Java偷着乐,原本懒得评论其余语言的。
可是实在不忍心看着有些人被Scala和Clojure忽悠,因此在这里说几句。假设没有超级高的性能和资源需求(可能要用C这种低级语言),眼下我建议就老老实有用Java吧。
尽管不如一些新的语言炫酷,然而实际的系统,还真没有什么是Java写不出来的。少数地方可能需要绕过一些限制。或者放宽一些要求。然而这种状况不是很是多。
编程使用什么工具是重要的,然而工具终究不如本身的技术重要。很是多人花了太多时间,折腾各类新的语言,但愿它们会奇迹通常的改善代码质量,结果最后什么都没作出来。选择语言最重要的条件,应该是“够好用”就可以,因为项目的成功终因而靠人,而不是靠语言。既然Java没有特别大的问题,不会让你无法作好项目,为何要去试一些不靠谱的新语言呢?
原文地址: http://www.yinwang.org/blog-cn/2016/01/18/java/