給Java說(shuō)句公道話

作者:王垠
有些人問(wèn)我,在現(xiàn)有的語(yǔ)言里面传蹈,有什么好的推薦押逼?我說(shuō):“Java〉虢纾” 他們很驚訝:“什么挑格?Java!” 所以我現(xiàn)在來(lái)解釋一下沾歪。

Java超越了所有咒罵它的“動(dòng)態(tài)語(yǔ)言”

也許是因?yàn)槟贻p人的逆反心理漂彤,人們都不把自己的入門(mén)語(yǔ)言當(dāng)回事。很早的時(shí)候灾搏,計(jì)算機(jī)系的學(xué)生用Scheme或者Pascal入門(mén)显歧,現(xiàn)在大部分學(xué)校用Java。這也許就是為什么很多人恨Java确镊,瞧不起用Java的人士骤。提到Java,感覺(jué)就像是爺爺那輩人用的東西蕾域。大家都會(huì)用Java拷肌,怎么能顯得我優(yōu)秀出眾呢?于是他們說(shuō):“Java老氣旨巷,龐大巨缘,復(fù)雜,臃腫采呐。我更愿意探索新的語(yǔ)言……”

某些Python程序員若锁,在論壇里跟初學(xué)者講解Python有什么好,其中一個(gè)原因竟然是:“因?yàn)镻ython不是Java斧吐!” 他們喜歡這樣宣傳:“看Python多簡(jiǎn)單清晰啊又固,都不需要寫(xiě)類型……” 對(duì)于Java的無(wú)緣無(wú)故的恨仲器,盲目的否認(rèn),導(dǎo)致了他們看不到它很重要的優(yōu)點(diǎn)仰冠,以至于迷失自己的方向乏冀。雖然氣勢(shì)上占上風(fēng),然而其實(shí)Python作為一個(gè)編程語(yǔ)言洋只,是完全無(wú)法和Java抗衡的辆沦。

在性能上,Python比Java慢幾十倍识虚。由于缺乏靜態(tài)類型等重要設(shè)施肢扯,Python代碼有bug很不容易發(fā)現(xiàn),發(fā)現(xiàn)了也不容易debug担锤,所以Python無(wú)法用于構(gòu)造大規(guī)模的蔚晨,復(fù)雜的系統(tǒng)。你也許發(fā)現(xiàn)某些startup公司的主要代碼是Python寫(xiě)的妻献,然而這些公司的軟件,質(zhì)量其實(shí)相當(dāng)?shù)牡屯帕蕖T诔墒斓墓纠镉Γ琍ython最多只用來(lái)寫(xiě)工具性質(zhì)的東西,或者小型的欢摄,不會(huì)影響系統(tǒng)可靠性的腳本熬丧。

靜態(tài)類型的缺乏,也導(dǎo)致了Python不可能有很好的IDE支持怀挠,你不能完全可靠地“跳轉(zhuǎn)到定義”届慈,不可能完全可靠地重構(gòu)(refactor)Python代碼枷餐。PyCharm對(duì)于早期的Python編程環(huán)境,是一個(gè)很大的改進(jìn),然而理論決定了播揪,它不可能完全可靠地進(jìn)行“變量換名”等基本的重構(gòu)操作。就算是比PyCharm強(qiáng)大很多的PySonar辱揭,對(duì)此也無(wú)能為力扁凛。由于Python的設(shè)計(jì)過(guò)度的“動(dòng)態(tài)”,沒(méi)有類型標(biāo)記裁赠,使得完全準(zhǔn)確的定義查找殿漠,成為了不可判定(undecidable)的問(wèn)題。

在設(shè)計(jì)上佩捞,Python绞幌,Ruby比起Java,其實(shí)復(fù)雜很多一忱。缺少了很多重要的特性莲蜘,有毛病的“強(qiáng)大特性”倒是多了一堆谭确。由于盲目的推崇所謂“正宗的面向?qū)ο蟆狈绞剑^“late binding”菇夸,這些語(yǔ)言里面有太多可以“重載”語(yǔ)義的地方琼富,不管什么都可以被重定義,這導(dǎo)致代碼具有很大的不確定性和復(fù)雜性庄新,很多bug就是被隱藏在這些被重載的語(yǔ)言結(jié)構(gòu)里面了鞠眉。因此,Python和Ruby代碼很容易被濫用择诈,不容易理解械蹋,容易寫(xiě)得很亂,容易出問(wèn)題羞芍。

很多JavaScript程序員也盲目地鄙視Java哗戈,而其實(shí)JavaScript比Python和Ruby還要差。不但具有它們的幾乎所有缺點(diǎn)荷科,而且缺乏一些必要的設(shè)施唯咬。JavaScript的各種“WEB框架”,層出不窮畏浆,似乎一直在推陳出新胆胰,而其實(shí)呢,全都是在黑暗里瞎蒙亂撞刻获。JavaScript的社區(qū)以幼稚和愚昧著稱蜀涨。你經(jīng)常發(fā)現(xiàn)一些非常基本的常識(shí)蝎毡,被JavaScript“專家”們當(dāng)成了不起的發(fā)現(xiàn)似的厚柳,在大會(huì)上宣講。我看不出來(lái)JavaScript社區(qū)開(kāi)那些會(huì)議沐兵,到底有什么意義别垮,仿佛只是為了拉關(guān)系找工作。

Python湊合可以用在不重要的地方扎谎,Ruby是垃圾宰闰,JavaScript是垃圾中的垃圾。原因很簡(jiǎn)單簿透,因?yàn)镽uby和JavaScript的設(shè)計(jì)者移袍,其實(shí)都是一知半解的民科。然而世界就是這么奇怪老充,一個(gè)徹底的垃圾語(yǔ)言葡盗,仍然可以宣稱是“程序員最好的朋友”,從而得到某些人的愛(ài)戴……

Java的“繼承人”沒(méi)能超越它

最近一段時(shí)間,很多人熱衷于Scala觅够,Clojure胶背,Go等新興的語(yǔ)言,他們以為這些是比Java更現(xiàn)代喘先,更先進(jìn)的語(yǔ)言钳吟,以為它們最終會(huì)取代Java。然而這些狂熱分子們逐漸發(fā)現(xiàn)窘拯,Scala红且,Clojure和Go其實(shí)并沒(méi)有解決它們聲稱能解決的問(wèn)題,反而帶來(lái)了它們自己的毛病涤姊,而這些毛病很多是Java沒(méi)有的暇番。然后他們才意識(shí)到,Java離壽終正寢的時(shí)候思喊,還遠(yuǎn)得很……

Go語(yǔ)言

關(guān)于Go壁酬,我已經(jīng)評(píng)論過(guò)很多了,有興趣的人可以看這里恨课∮咔牵總之,Go是民科加自大狂的產(chǎn)物剂公,奇葩得不得了希俩。這里我就不多說(shuō)它了,只談?wù)凷cala和Clojure诬留。

Scala

我認(rèn)識(shí)一些人斜纪,開(kāi)頭很推崇Scala贫母,仿佛什么救星似的文兑。我建議他們別去折騰了,老老實(shí)實(shí)用Java腺劣。沒(méi)聽(tīng)我的绿贞,結(jié)果到后來(lái),成天都在罵Scala的各種毛病橘原。但是沒(méi)辦法啊籍铁,項(xiàng)目上了賊船,不得不繼續(xù)用下去趾断。我不喜歡進(jìn)行人身攻擊拒名,然而我發(fā)現(xiàn)一個(gè)語(yǔ)言的好壞,往往取決于它的設(shè)計(jì)者的背景芋酌,覺(jué)悟增显,人品和動(dòng)機(jī)。很多時(shí)候我看人的直覺(jué)是異常的準(zhǔn)脐帝,以至于依據(jù)對(duì)語(yǔ)言設(shè)計(jì)者的第一印象同云,我就能預(yù)測(cè)到這個(gè)語(yǔ)言將來(lái)會(huì)怎么發(fā)展糖权。在這里,我想談一下對(duì)Scala和Clojure的設(shè)計(jì)者的看法炸站。

Scala的設(shè)計(jì)者M(jìn)artin Odersky星澳,在PL領(lǐng)域有所建樹(shù),發(fā)表了不少學(xué)術(shù)論文( 包括著名的《The Call-by-Need Lambda Calculus》)旱易,而且還是大名鼎鼎的Niklaus Wirth的門(mén)徒禁偎,我因此以為他還比較靠譜≈渌簦可是開(kāi)始接觸Scala沒(méi)多久届垫,我就很驚訝的發(fā)現(xiàn),有些非橙停基本的東西装处,Scala都設(shè)計(jì)錯(cuò)了。這就是為什么我?guī)锥仍噲D采用Scala浸船,最后都不了了之妄迁。因?yàn)槲乙贿吙矗贿叞l(fā)現(xiàn)讓人跌眼鏡的設(shè)計(jì)失誤李命,而這些問(wèn)題都是Java沒(méi)有的登淘。這樣幾次之后,我就對(duì)Odersky失去了信心封字,對(duì)Scala失去了興趣黔州。

回頭看看Odersky那些論文的本質(zhì),我發(fā)現(xiàn)雖然理論性貌似很強(qiáng)阔籽,其實(shí)很多是在故弄玄虛(包括那所謂的“call-by-need lambda calculus”)流妻。他雖然對(duì)某些特定的問(wèn)題有一定深度,然而知識(shí)面其實(shí)不是很廣笆制,眼光比較片面绅这。對(duì)于語(yǔ)言的整體設(shè)計(jì),把握不夠好在辆。感覺(jué)他是把各種語(yǔ)言里的特性证薇,強(qiáng)行拼湊在一起,并沒(méi)有考慮過(guò)它們是否能夠“和諧”的共存匆篓,也很少考慮“可用性”浑度。

由于Odersky是大學(xué)教授,名聲在外鸦概,很多人想找他拿個(gè)PhD箩张,所以東拉西扯,喜歡往Scala里面加入一些不明不白,有潛在問(wèn)題的“特性”伏钠,其目的就是發(fā)paper横漏,混畢業(yè)。這導(dǎo)致Scala不加選擇的加入過(guò)多的特性熟掂,過(guò)度繁復(fù)缎浇。加入的特性很多后來(lái)被證明沒(méi)有多大用處,反而帶來(lái)了問(wèn)題赴肚。學(xué)生把代碼實(shí)現(xiàn)加入到Scala的編譯器素跺,畢業(yè)就走人不管了,所以Scala編譯器里誉券,就留下一堆堆的歷史遺留垃圾和bug指厌。這也許不是Odersky一個(gè)人的錯(cuò),然而至少說(shuō)明他把關(guān)不嚴(yán)踊跟,或者品位確實(shí)有問(wèn)題踩验。

最有名的采用Scala的公司,無(wú)非是Twitter商玫。其實(shí)像Twitter那樣的系統(tǒng)箕憾,用Java照樣寫(xiě)得出來(lái)。Twitter后來(lái)怎么樣了呢拳昌?CEO都跑了 :P 新CEO上臺(tái)就裁員300多人袭异,包括工程師在內(nèi)。我估計(jì)Twitter裁員的一個(gè)原因是炬藤,有太多的Scala程序員御铃,扯著各種高大上不實(shí)用的口號(hào),比如“函數(shù)式編程”沈矿,進(jìn)行過(guò)度工程上真,浪費(fèi)公司的資源∠杆花著公司的錢谷羞,開(kāi)著各種會(huì)議帝火,組織各種meetup和hackathon溜徙,提高自己在open source領(lǐng)域的威望,其實(shí)沒(méi)有為公司創(chuàng)造很多價(jià)值……

Clojure

再來(lái)說(shuō)一下Clojure犀填。當(dāng)Clojure最初“橫空面世”的時(shí)候蠢壹,有些人熱血沸騰地向我推薦。于是我看了一下它的設(shè)計(jì)者Rich Hickey做的宣傳講座視頻九巡。當(dāng)時(shí)我就對(duì)他一知半解拍胸脯的本事图贸,印象非常的深刻。Rich Hickey真的是半路出家,連個(gè)CS學(xué)位都沒(méi)有疏日〕ソ啵可他那種氣勢(shì),仿佛其他的語(yǔ)言設(shè)計(jì)者什么都不懂沟优,只有他看到了真理似的涕滋。不過(guò)也只有這樣的人,才能創(chuàng)造出“宗教”吧挠阁?

滿口熱門(mén)的名詞宾肺,什么lazy啊,pure啊侵俗,STM啊锨用,號(hào)稱能解決“大規(guī)模并發(fā)”的問(wèn)題,…… 這就很容易讓人上鉤隘谣。其實(shí)他這些詞兒增拥,都是從別的語(yǔ)言道聽(tīng)途說(shuō)來(lái),卻又沒(méi)能深刻理解其精髓寻歧。有些“函數(shù)式語(yǔ)言”的特性跪者,本來(lái)就是有問(wèn)題的,卻為了主義正確熄求,為了顯得高大上渣玲,抄過(guò)來(lái)。所以最后你發(fā)現(xiàn)這語(yǔ)言是掛著羊頭賣狗肉弟晚,狗皮膏藥一樣說(shuō)得頭頭是道忘衍,用起來(lái)怎么就那么蹩腳。

Clojure的社區(qū)卿城,一直忙著從Scheme和Racket的項(xiàng)目里抄襲思想枚钓,卻又想標(biāo)榜是自己的發(fā)明。比如Typed Clojure瑟押,就是原封不動(dòng)抄襲Typed Racket搀捷。有些一模一樣的基本概念,在Scheme里面都幾十年了多望,恁是要改個(gè)不一樣的名字嫩舟,免得你們發(fā)現(xiàn)那是Scheme先有的。甚至有人把SICP怀偷,The Little Schemer等名著里的代碼家厌,全都用Clojure改寫(xiě)一遍,結(jié)果完全失去了原作的簡(jiǎn)單和清晰椎工。最后你發(fā)現(xiàn)饭于,Clojure里面好的地方蜀踏,全都是Scheme已經(jīng)有的,Clojure里面新的特性掰吕,幾乎全都有問(wèn)題果覆。我參加過(guò)一些Clojure的meetup,可是后來(lái)發(fā)現(xiàn)殖熟,里面竟是各種喊著大口號(hào)的小白随静,各種趾高氣昂的民科,愚昧之至吗讶。

如果現(xiàn)在要做一個(gè)系統(tǒng)燎猛,真的寧可用Java,也不要浪費(fèi)時(shí)間去折騰什么Scala或者Clojure照皆。錯(cuò)誤的人設(shè)計(jì)了錯(cuò)誤的語(yǔ)言重绷,拿出來(lái)浪費(fèi)大家的時(shí)間。

Java沒(méi)有特別討厭的地方

我至今不明白膜毁,很多人對(duì)Java的仇恨和鄙視昭卓,從何而來(lái)。它也許缺少一些方便的特性瘟滨,然而長(zhǎng)久以來(lái)用Java進(jìn)行教學(xué)候醒,用Java工作,用Java開(kāi)發(fā)PySonar杂瘸,RubySonar倒淫,Yin語(yǔ)言,…… 我發(fā)現(xiàn)Java其實(shí)并不像很多人傳說(shuō)的那么可惡败玉。我發(fā)現(xiàn)自己想要的95%以上的功能敌土,在Java里面都能找到比較直接的用法。剩下的5%运翼,用稍微笨一點(diǎn)的辦法返干,一樣可以解決問(wèn)題。

盲目推崇Scala和Clojure的人們血淌,很多最后都發(fā)現(xiàn)矩欠,這些語(yǔ)言里面的“新特性”,幾乎都有毛病悠夯,里面最重要最有用的特性癌淮,其實(shí)早就已經(jīng)在Java里了。有些人跟我說(shuō):“你看疗疟,Java做不了這件事情该默!” 后來(lái)經(jīng)我分析瞳氓,發(fā)現(xiàn)他們?cè)跐撘庾R(shí)里早已死板的認(rèn)定策彤,非得用某種最新最酷的語(yǔ)言特性栓袖,才能達(dá)到目的。Java沒(méi)有這些特性店诗,他們就以為非得用另外的語(yǔ)言裹刮。其實(shí),如果你換一個(gè)角度來(lái)看問(wèn)題庞瘸,不要鉆牛角尖捧弃,專注于解決問(wèn)題,而不是去追求最新最酷的“寫(xiě)法”擦囊,你就能用Java解決它违霞,而且解決得干凈利落。

很多人說(shuō)Java復(fù)雜臃腫瞬场,其實(shí)是因?yàn)樵缙诘?a target="_blank" rel="nofollow">Design Patterns买鸽,試圖提出千篇一律的模板,給程序帶來(lái)了不必要的復(fù)雜性贯被。然而Java語(yǔ)言本身跟Design Patterns并不是等價(jià)的眼五。Java的設(shè)計(jì)者,跟Design Pattern的設(shè)計(jì)者彤灶,完全是不同的人看幼。你完全可以使用Java寫(xiě)出非常簡(jiǎn)單的代碼,而不使用Design Patterns幌陕。

Java只是一個(gè)語(yǔ)言诵姜。語(yǔ)言只提供給你基本的機(jī)制,至于代碼寫(xiě)的復(fù)雜還是簡(jiǎn)單搏熄,取決于人茅诱。把對(duì)一些濫用Design Patterns的Java程序員的恨,轉(zhuǎn)移到Java語(yǔ)言本身搬卒,從而完全拋棄它的一切瑟俭,是不明智的。

結(jié)論

我平時(shí)用著Java偷著樂(lè)契邀,本來(lái)懶得評(píng)論其它語(yǔ)言的摆寄。可是實(shí)在不忍心看著有些人被Scala和Clojure忽悠坯门,所以在這里說(shuō)幾句微饥。如果沒(méi)有超級(jí)高的Performance和資源需求(可能要用C這樣的低級(jí)語(yǔ)言),目前我建議就老老實(shí)實(shí)用Java吧古戴。雖然不如一些新的語(yǔ)言炫酷欠橘,然而實(shí)際的系統(tǒng),還真沒(méi)有什么是Java寫(xiě)不出來(lái)的现恼。

編程使用什么工具是重要的肃续,然而工具終究不如自己的技術(shù)重要黍檩。很多人花了太多時(shí)間,折騰各種新的語(yǔ)言始锚,希望它們會(huì)奇跡一般的改善代碼質(zhì)量刽酱,結(jié)果最后什么都沒(méi)做出來(lái)。選擇語(yǔ)言最重要的條件瞧捌,應(yīng)該是“夠好用”就可以棵里,因?yàn)轫?xiàng)目的成功最終是靠人,而不是靠語(yǔ)言姐呐。既然Java沒(méi)有特別大的問(wèn)題殿怜,不會(huì)讓你沒(méi)法做好項(xiàng)目,為什么要去試一些不靠譜的新語(yǔ)言呢曙砂?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末稳捆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子麦轰,更是在濱河造成了極大的恐慌乔夯,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件款侵,死亡現(xiàn)場(chǎng)離奇詭異末荐,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)新锈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)甲脏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人妹笆,你說(shuō)我怎么就攤上這事块请。” “怎么了拳缠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵墩新,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我窟坐,道長(zhǎng)海渊,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任哲鸳,我火速辦了婚禮臣疑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘徙菠。我一直安慰自己讯沈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布婿奔。 她就那樣靜靜地躺著缺狠,像睡著了一般问慎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上儒老,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天蝴乔,我揣著相機(jī)與錄音记餐,去河邊找鬼驮樊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛片酝,可吹牛的內(nèi)容都是我干的囚衔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼雕沿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼练湿!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起审轮,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤肥哎,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后疾渣,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體篡诽,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年榴捡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杈女。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吊圾,死狀恐怖达椰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情项乒,我是刑警寧澤啰劲,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站檀何,受9級(jí)特大地震影響呈枉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜埃碱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一猖辫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧砚殿,春花似錦啃憎、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)悯姊。三九已至,卻和暖如春贩毕,著一層夾襖步出監(jiān)牢的瞬間悯许,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工辉阶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留先壕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓谆甜,卻偏偏與公主長(zhǎng)得像垃僚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子规辱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344