爲Java說句公道話


爲Java說句公道話

有些人問我,在現有的語言裏面,有什麼好的推薦?我說:「Java。java

」 他們很是吃驚:「什麼?Java!」 因此我現在來解釋一下。golang

Java超越了所有咒罵它的「動態語言」

或許是因爲年輕人的逆反心理,人們都不把本身的入門語言當回事。很是早的時候。計算機系的學生用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的設計者,事實上都是隻知其一;不知其二的民科。

然而世界就是這麼奇怪。一個完全的垃圾語言,仍然可以宣稱是「程序猿最好的朋友」。從而獲得某些人的愛戴……

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/

相關文章
相關標籤/搜索