爲Java說句公道話

有些人問我,在現有的語言裏面,有什麼好的推薦?我說:「Java。」 他們很驚訝:「什麼?Java!」 因此我如今來解釋一下。程序員

Java超越了全部咒罵它的「動態語言」

也許是由於年輕人的逆反心理,人們都不把本身的入門語言當回事。很早的時候,計算機系的學生用Scheme或者Pascal入門,如今大部分學校用Java。這也許就是爲何不少人恨Java,瞧不起用Java的人。提到Java,感受就像是爺爺那輩人用的東西。他們說,Java老氣,龐大,複雜,臃腫。golang

某些Python程序員,在論壇裏跟初學者講解Python有什麼好,其中一個緣由居然是:「由於Python不是Java!」 他們喜歡這樣宣傳:「看Python多簡單清晰啊,都不須要寫類型……」 對於Java的平白無故的恨,盲目的否定,致使了他們看不到Java很重要的優勢,以致於迷失本身的方向。雖然氣勢上佔上風,然而其實Python做爲一個編程語言,是徹底沒法和Java抗衡的。編程

在性能上,Python比Java慢幾十倍。因爲缺少靜態類型等重要設施,Python代碼有bug很不容易察覺,察覺了也不容易debug,因此Python沒法用於構造大規模的,複雜的系統。你也許發現某些startup公司的主要代碼是Python寫的,然而這些公司的軟件,質量其實至關的低。在成熟的公司裏,Python最多隻用來寫工具性質的東西,或者小型的,不會影響系統可靠性的腳本。框架

 

靜態類型的缺少,也致使了Python不可能有很好的IDE支持,你不能徹底可靠地重構(refactor)Python代碼。PyCharm對於早期的Python編程環境,是一個很大的改進,然而理論決定了,它不可能徹底可靠地達到「變量換名」等基本的refactor操做。編程語言

在設計上,Python,Ruby比起Java,其實複雜不少。缺乏了不少重要的特性,有毛病的「強大特性」卻是多了一堆。因爲盲目的推崇所謂「正宗的面向對象」方式,所謂「late-binding」,這些語言裏面有太多能夠「重載」語義的地方,無論什麼均可以被重定義,這致使代碼具備很大的不肯定性和複雜性。Python和Ruby代碼很容易被濫用,不容易理解,容易寫得很亂,容易出問題。編輯器

不少JavaScript程序員也盲目地鄙視Java,而其實JavaScript比Python和Ruby還要差。不但具備它們的全部缺點,並且缺少不少必要的,方便的特性,好比基本的class定義都沒有。JavaScript的各類「WEB框架」,層出不窮,彷佛一直在推陳出新,而其實呢,全都是在黑暗裏瞎蒙亂撞。JavaScript的社區以幼稚著稱。你常常發現一些很是基本的常識,被JavaScript「專家」們當成了不得的發現似的,在大會上宣講。我看不出來JavaScript社區開那些會議,到底有什麼意義,彷彿只是爲了拉關係找工做。函數

Python湊合能夠用在不重要的地方,Ruby是垃圾,JavaScript是垃圾中的垃圾。緣由很簡單,由於Ruby和JavaScript的設計者,其實都只是民科。工具

Java的「繼承人」沒能超越它

最近一段時間,不少人熱衷於Scala,Clojure,Go等新興的語言,他們覺得這些是比Java更現代,更先進的語言,覺得它們最終會取代Java。然而這些狂熱分子們逐漸發現,Scala,Clojure和Go其實並無解決它們聲稱能解決的問題,反而帶來了它們本身的毛病。這些毛病不少是Java沒有的。性能

關於Go,我已經評論過不少了,有興趣的人能夠看這裏。總之,Go是民科加自大狂的產物,這裏我就很少說它了。debug

我認識一些人,開頭很推崇Scala,彷彿什麼救星似的。我建議他們別去折騰了,老老實實用Java。沒聽個人,結果到後來,整天都在罵Scala的各類毛病。可是沒辦法啊,項目上了賊船,不得不繼續用下去。我不喜歡進行人身攻擊,然而我發現一個語言的好壞,每每取決於它的設計者的水平,人品,和動機。不少時候我看人的直覺是異常的準,以致於依據對語言設計者的第一印象,我就能預測到這個語言未來會怎麼發展。在這裏,我想談一下對Scala和Clojure的設計者的見解。

Scala的設計者Martin Odersky,雖然在程序語言領域有所建樹,發表了很多看似高深的學術論文( 其實不少是扯淡的),然而他對於語言的「設計」,其實並非特別在行。因此我很驚訝的發現,有些很是基本的東西,Scala都會搞錯。因爲Odersky是大學教授,名聲在外,不少人想找他拿個PhD,因此東拉西扯的,喜歡往Scala裏面加入一些不明不白,有潛在問題的「特性」,其目的就是發paper,混畢業。這致使Scala過分繁複,加入的特性不少後來被證實沒有多大用處,反而帶來了問題。學生把代碼實現加入到Scala的編譯器,畢業就走人無論了,因此Scala編譯器裏,就留下一堆堆的歷史遺留垃圾和bug。

再來講一下Clojure。當Clojure最初「橫空面世」的時候,有些人熱血沸騰地向我推薦。因而我看了一下它的設計者Rich Hickey作的宣傳講座視頻。當時我就對他只知其一;不知其二拍胸脯的本事,印象很是的深入。Rich Hickey真的是半路出家,連個CS學位都沒有。可他那種氣勢,彷彿其餘的語言設計者什麼都不懂,只有他看到了真理似的。不過也只有這樣的人,才能創造出「宗教」吧?Clojure大力宣傳的「特性」(什麼lazy啊,pure啊,transactional memory啊),都是從別的語言道聽途說抄過來,卻又沒能深入理解其精髓。有些「函數式語言」的特性,原本就是有問題的,卻不問青紅皁白,爲了「主義正確」,抄過來。因此最後你發現這語言是掛着羊頭賣狗肉,說得頭頭是道,用起來怎麼就那麼蹩腳。

Clojure的社區,一直忙着從Scheme和Racket的社區抄襲思想,卻又想標榜是本身的發明。好比Typed Clojure,就是原封不動抄襲Typed Racket。有些如出一轍的基本概念,在Scheme裏面都幾十年了,恁是要改個不同的名字,省得大家發現那是Scheme先有的。甚至有人把SICP,The Little Schemer等名著裏的代碼,全都用Clojure改寫一遍,結果徹底失去了原做的簡單性和精華性。最後你發現,Clojure裏面好的地方,全都是Scheme已經有的,Clojure裏面新的特性,幾乎全都有問題。我參加過一些Clojure的meetup,但是後來發現,裏面竟是各類喊着大口號的初學者,各類趾高氣昂的民科,愚昧之至。

盲目推崇Scala和Clojure的人們,不少最後都發現,這些語言裏面的「新特性」,幾乎都有毛病。它們裏面最重要最有用的特性,其實早就已經在Java裏了。有些人跟我說:「你看,Java作不了這件事情!」 後來經我分析,發現他們在潛意識裏早已死板的認定,非得用某種最新最酷的語言特性,才能達到目的。Java沒有這些特性,他們就覺得Java作不了,非得用另外的語言。其實,若是你換一個角度來看問題,不要鑽牛角尖,專一於解決問題,而不是去追求最新最酷的「寫法」,你就能用Java解決它,並且解決得乾淨利落。

若是如今要作一個系統,真的寧肯用Java,也不要浪費時間去折騰什麼Scala或者Clojure。錯誤的人設計了錯誤的語言,拿出來浪費你們的時間。

Java沒有特別討厭的地方

Java也許缺乏一些方便的特性,然而長久以來用Java進行教學,用Java工做,用Java開發PySonar,RubySonar,Yin語言,…… 我發現Java其實並不像不少人傳說的那麼可惡。我發現本身想要的95%以上的功能,在Java裏面都能找到比較直接的用法。剩下的5%,用稍微笨一點的辦法,同樣能夠解決問題。

不少人討厭Java,實際上是由於早期的GoF Design Patterns,試圖提出千篇一概的模板,給程序帶來了沒必要要的複雜性。然而Java語言自己,其實跟Design Patterns並非等價的。Java的設計者跟Design Pattern的設計者,徹底是不一樣的人。你徹底可使用Java寫出很是簡單的代碼,而不使用Design Patterns。

Java有優秀的IDE支持

我平時都用IntelliJ來寫Java代碼。我發現IntelliJ裏面,有一些很是好的設計思想。其中不少功能,其實超越了全部的文本編輯器(Emacs,VIM……)。IntelliJ讓Java如虎添翼,開發起來感受是在飛同樣。

用IntelliJ的時候,你不須要爲「給變量起名字」之類的事情焦慮。由於IntelliJ有很是強大而友好的refactor功能,你能夠很是迅速的換掉變量的名字。因此在第一次創造變量的時候,你不須要花心思去起一個完美的名字。用一個還算湊合的名字,把代碼很快寫出來,實驗成功。而後再返回去看代碼,把名字換成一個更合適的就能夠。

IntelliJ還能夠進行很是迅速的結構變換,這讓你就像藝術家在構造一個雕塑做品。最開頭我能夠大刀闊斧,把代碼劈成大體的形狀,而後再把它仔細推敲,揉捏成更好,更容易理解,更具魅力的形狀。

結論

我實在不忍心看着有些人被Scala和Clojure忽悠。若是沒有超級高的性能和資源需求(可能要用C這樣的低級語言),目前我建議就老老實實用Java吧。雖然不如一些新的語言炫酷,然而實際的系統,還真沒有什麼是Java寫不出來的。少數地方可能須要繞過一些限制,或者放寬一些要求,然而這樣的狀況不是不少。

編程使用什麼工具是重要的,然而工具終究不如本身的技術重要。不少人花了太多時間,折騰各類新的語言,但願它們會奇蹟通常的改善代碼質量,結果最後什麼都沒作出來。選擇語言最重要的條件,應該是「夠好用」就能夠,由於項目的成功最終是靠人,而不是靠語言。

相關文章
相關標籤/搜索