为Java说句公道话
为Java说句公道话
有些人问我,在现有的语言里面,有什么好的推荐?我说:“Java。
” 他们非常吃惊:“什么?Java!” 所以我如今来解释一下。
Java超越了全部咒骂它的“动态语言”
或许是由于年轻人的逆反心理,人们都不把自己的入门语言当回事。非常早的时候。计算机系的学生用Scheme或者Pascal入门,如今大部分学校用Java。
这或许就是为什么非常多人恨Java,瞧不起用Java的人。
提到Java,感觉就像是爷爷那辈人用的东西。
大家都会用Java,怎么能显得我优秀出众呢?于是他们说:“Java老气,庞大。复杂。臃肿。
我更愿意探索新的语言……”
某些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的设计者,事实上都是一知半解的民科。
然而世界就是这么奇怪。一个彻底的垃圾语言,仍然能够宣称是“程序猿最好的朋友”。从而得到某些人的爱戴……
Java的“继承人”没能超越它
近期一段时间。非常多人热衷于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工作,用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/
为Java说句公道话的更多相关文章
- 【转】给Java说句公道话
有些人问我,在现有的语言里面,有什么好的推荐?我说:“Java.” 他们很惊讶:“什么?Java!” 所以我现在来解释一下. Java超越了所有咒骂它的“动态语言” 也许是因为年轻人的逆反心理,人们都 ...
- MySQL 只能做小项目?松哥要说几句公道话!
松哥上学那会,很多人对 MySQL 有一些偏见,偏见主要集中在以下几方面: MySQL 不支持事务(事实上 MyISAM 有表锁,但是效率比较低) MySQL 存储的数据量比较小,适合小项目,大项目还 ...
- 为鸿蒙OS说两句公道话(我对鸿蒙OS的一些看法)
为鸿蒙说两句公道话 今天看了鸿蒙系统的评测,看完后我感觉很欣慰,为什么这么说 ? 不是很多人吐槽鸿蒙是 Android 套壳吗 ?或者叫鸿蒙 UI 吗?说鸿蒙没有自己的核心技术.看了鸿蒙系统的设计,底 ...
- java 面试
115个Java面试题和答案——终极列表(上) 本文我们将要讨论Java面试中的各种不同类型的面试题,它们可以让雇主测试应聘者的Java和通用的面向对象编程的能力.下面的章节分为上下两篇,第一 ...
- Checked Exceptions
记得当年在程序员杂志上看出这次访谈,10多年过去了, 这件事儿最近被重提了, 原因是 Kotlin. 1.对Checked Exceptions特性持保留态度 (译者注:在写一段程序时,如果没有用tr ...
- 【转】Kotlin 和 Checked Exception
Kotlin 和 Checked Exception 最近 JetBrains 的 Kotlin 语言忽然成了热门话题.国内小编们传言说,Kotlin 取代了 Java,成为了 Android 的“钦 ...
- Java代码生成器加入postgresql数据库、HikariCP连接池、swagger2支持!
目录 前言 PostgreSql VS MySql HikariCP VS Druid Swagger2 自定义参数配置一览 结语 前言 最近几天又抽时间给代码生成器增加了几个新功能(预计今晚发布 ...
- Go 语言和 Scala 语言对比
我在Google写过Go(自己的业余时间),也在LinkedIn写过Scala.两者都是具有一流的并发特性的现代语言. 下面的回答是基于我编写大规模的软件的经验得出. Go是一种开发模式严格固定,并且 ...
- 关于2013年1月21日的DNS故障分析文章
首页 资讯 小组 资源 注册 登录 首页 最新文章 业界 开发 IT技术 设计 创业 IT职场 访谈 在国外 经典回顾 更多 > - 导航条 - 首页 最新文章 业界 - Googl ...
随机推荐
- es 集群部署
下载 [root@localhost ~]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.1 ...
- 基础数据类型(set集合)
认识集合 由一个或多个确定的元素所构成的整体叫做集合. 集合中的元素有三个特征: 1.确定性(集合中的元素必须是确定的) 2.互异性(集合中的元素互不相同.例如:集合A={1,a},则a不能等于1) ...
- C++类的存储及虚函数实现原理
一.C++成员函数在内存中的存储方式 用类去定义对象时,系统会为每一个对象分配存储空间.如果一个类包括了数据和函数,要分别为数据和函数的代码分配存储空间.按理说,如果用同一个类定义了10个对象,那么就 ...
- [题解] cogs 2240 架设电话线路
http://cogs.pro:8080/cogs/problem/problem.php?pid=2240 与洛谷P2885几乎一致,https://www.luogu.org/problemnew ...
- 全新Ubentu系统没有make,gcc命令解决办法
一定要记得先update sudo apt-get update 然后输入下述命令即可 sudo apt-get install make sudo apt-get install gcc
- 2019天梯赛练习题(L2专项练习)
7-2 列出连通集 (25 分) 给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序 ...
- Hash冲突的几种解决方法
1. 开放定值法: 也叫再散列法,当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突 ...
- nginx解决跨域(前后端分离)
Nginx解决跨域问题 后端接口 请求地址 返回数据(json数据) http://127.0.0.1:8080//app Hello World! 前端代码 通过nginx做静态资源服务器访问端口8 ...
- Firefox--摄像头麦克风权限
在自动化测试的过程中,可能会遇到来自浏览器的权限提示(摄像头.麦克风),今天,就讨论一下如何结局这个问题. 先来认识一下来自Firefox的权限提示,访问一个需要摄像头或者麦克风的网站 你可能觉得,一 ...
- 南邮CTF--bypass again
南邮CTF--bypass again 提示:依旧弱类型,来源hctf 解析: 源代码: if (isset($_GET['a']) and isset($_GET['b'])) { if ($_G ...