
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,我已經評論過很多了,有興趣的人可以看這裡。總之,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程式員,扯着各種高大上不實用的口号,比如 “函數式程式設計”,進行過度工程,浪費公司的資源。花着公司的錢,開着各種會議,組織各種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偷着樂,本來懶得評論其它語言的。可是實在不忍心看着有些人被scala和clojure忽悠,是以在這裡說幾句。如果沒有超級 高的性能和資源需求(可能要用c這樣的低級語言),目前我建議就老老實實用java吧。雖然不如一些新的語言炫酷,然而實際的系統,還真沒有什麼是 java寫不出來的。少數地方可能需要繞過一些限制,或者放寬一些要求,然而這樣的情況不是很多。
程式設計使用什麼工具是重要的,然而工具終究不如自己的技術重要。很多人花了太多時間,折騰各種新的語言,希望它們會奇迹一般的改善代碼品質,結果最後 什麼都沒做出來。選擇語言最重要的條件,應該是“夠好用”就可以,因為項目的成功最終是靠人,而不是靠語言。既然java沒有特别大的問題,不會讓你沒法 做好項目,為什麼要去試一些不靠譜的新語言呢?
====================================分割線================================