java 板


LINE

※ 引述《dharma (达)》之铭言: 以前在学校我学 java 写 java 但是不喜欢 java,觉得它很烦很土。上班後虽然没那麽 讨厌,但还是时常怀疑它到底会不会很快就被淘汰? 直到过去一年中我花很多时间学 javascript、groovy、gradle,学习跨平台开发工具 cordova 之後,我才完全改观。 最近看到这篇简体文章後,心里颇有戚戚焉,在此转换为繁体中文惯用的说法来表达,欢 迎转录。 《为 Java 说句公道话》 http://www.yinwang.org/blog-cn/2016/01/18/java/ 作者是王垠,一位以 java 实现 python 型态检定工具 pySonar 的旅外开发者,主修领域 好像是电脑科学中的程式语言。 它的github https://github.com/yinwang0 ----------------------------------------------------------------------------- 为Java说句公道话 有些人问我,在现有的语言里面,有什麽好的推荐?我说:「Java。」 他们很惊讶:「 什麽?Java!」 所以我现在来解释一下。 Java超越了所有咒骂它的「动态语言」 ---------------------------------- 也许是因为年轻人的叛逆心理,人们都不把自己的入门语言当回事。很早的时候,计算机 系的学生用Scheme或者Pascal入门,现在大部分学校用Java。这也许就是为什麽很多人恨 Java,瞧不起用Java的人。提到Java,感觉就像是爷爷那辈人用的东西。大家都会用Java ,怎麽能显得我优秀出众呢?於是他们说:「Java老气,庞大,复杂,臃肿。我更愿意探 索新的语言……」 某些Python程式员,在论坛里跟初学者讲解Python有什麽好,其中一个原因竟然是:「因 为Python不是Java!」 他们喜欢这样宣传:「看Python多简单清晰啊,都不需要写类型 ……」 对於Java的无缘无故的恨,盲目的否认,导致了他们看不到它很重要的优点,以 至於迷失自己的方向。虽然气势上占上风,然而其实Python作为一个程式语言,是完全无 法和Java抗衡的。 在性能上,Python比Java慢几十倍。由於缺乏静态类型等重要设施,Python代码有bug很 不容易发现,发现了也不容易debug,所以Python无法用於建构大规模的复杂系统。你也 许发现某些startup公司的主要程式码是Python写的,然而这些公司的软体,品质其实相 当的低。在成熟的公司里,Python最多只用来写工具性质的东西,或者小型的,不会影响 系统可靠性的脚本。 静态类型的缺乏,也导致了Python不可能有很好的IDE支援,你不能完全可靠地「跳转到 定义」,不可能完全可靠地重构(refactor)Python代码。PyCharm对於早期的Python编 程环境,是一个很大的改进,然而理论决定了,它不可能完全可靠地进行「变数改名」等 基本的重构操作。就算是比PyCharm强大很多的PySonar,对此也无能为力。由於Python的 设计过度的「动态」,没有类型标记,使得完全准确的定义查找,成为了不可判定( undecidable)的问题。 在设计上,Python,Ruby比起Java,其实复杂很多。缺少了很多重要的特性,有毛病的「 强大特性」倒是多了一堆。由於盲目的推崇所谓「正宗的物件导向」方式,所谓「late binding」,这些语言里面有太多可以「重载」语义的地方,不管什麽都可以被重定义, 这导致程式码具有很大的不确定性和复杂性,很多bug就是隐藏在这些被重载的语言结构 里面。因此,Python和Ruby代码很容易被滥用,不容易理解,容易写得很乱,容易出问题 。 很多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,我已经评论过很多了,有兴趣的人可以看 http://www.yinwang.org/blog-cn/2014/04/18/golang/。 总之,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多人,包括工程师 在内。我推测Twitter裁员的一个原因是,有太多的Scala程式员,扯着各种高大上不实用 的口号,比如「函数式编程」 (funcational programming),进行过度工程,浪费公司的 资源。花着公司的钱,开着各种会议,组织各种meetup和hackathon,提高自己在open source领域的威望,其实没有为公司创造很多价值…… Clojure 再来说一下Clojure。当Clojure最初「横空面世」的时候,有些人热血沸腾地向我推荐。 於是我看了一下它的设计者Rich Hickey做的宣传讲座影片。当时我就对他一知半解拍胸 脯的本事印象非常深刻。Rich Hickey真的是半路出家,连个CS学位都没有。可他那种气 势,彷佛其他的语言设计者什麽都不懂,只有他看到了真理似的。不过也只有这样的人, 才能创造出「宗教」吧? 满口热门的名词,什麽lazy啊,pure啊,STM啊,号称能解决「大规模同步」的问题,… … 这就很容易让人上钩。其实他这些词都是从别的语言道听途说来,却又没能深刻理解 其精髓。有些「函数式语言」的特性,本来就是有问题的,却为了主义正确,为了显得高 大上,抄过来。所以最後你发现这语言是挂羊头卖狗肉,狗皮膏药一样说得头头是道,用 起来怎麽就那麽蹩脚。 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有优秀的IDE支援 ------------------- 我平常都用IntelliJ来写Java程式码。我发现IntelliJ里面,有一些非常好的设计思想。 其中很多功能,其实超越了所有的文件编辑器(Emacs,VIM……)。IntelliJ让Java如虎添 翼,开发起来感觉是在飞一样。 用IntelliJ的时候,你不需要为「给变数取名字」之类的事情焦虑。因为IntelliJ有非常 强大而友好的refactor功能,你可以非常迅速的换掉变数的名字。所以在第一次创造变数 的时候,你不需要花心思去想一个完美的名字。用一个还算能用的名字,把程式码很快写 出来,实验成功。然後再返回去看程式码,把名字换成一个更合适的就可以。 IntelliJ还可以进行非常迅速的结构变换,这让你就像艺术家在建构一个雕塑作品。刚开 始我可以大刀阔斧,把程式码劈成大致的形状,然後再把它仔细推敲,揉捏成更好,更容 易理解,更具魅力的形状。 结论 ---- 我实在不忍心看着有些人被Scala和Clojure唬咙。如果没有超级高的效能和资源需求(可 能要用C这样的低阶语言),目前我建议就老老实实用Java吧。虽然不如一些新的语言酷 炫,然而实际的系统,还真没有什麽是Java写不出来的。少数地方可能需要绕过一些限制 ,或者放宽一些要求,然而这样的情况不是很多。 撰写程式使用什麽工具是重要的,然而工具终究不如自己的技术重要。很多人花了太多时 间,折腾各种新的语言,希望它们会奇蹟一般的改善程式码品质,结果最後什麽都没做出 来。选择语言最重要的条件,应该是「够好用」就可以,因为专案的成功最终是靠人,而 不是靠语言。既然Java没有特别大的问题,不会让你没法做好专案,为什麽要去试一些不 可靠的新语言呢? --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.231.178.105
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1453389400.A.9B8.html ※ 编辑: dream1124 (61.231.178.105), 01/22/2016 00:02:59
1F:推 dharma: 看了 01/23 22:07







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Gossiping站内搜寻

TOP