標籤:not 使用方法 javascrip dia 效能 限制 宣講 www targe
為Java說句公道話
有些人問我,在現有的語言裡面,有什麼好的推薦?我說:“Java。
” 他們非常吃驚:“什嗎?Java!” 所以我如今來解釋一下。
Java超越了全部咒罵它的“動態語言”
或許是由於年輕人的逆反心理,人們都不把自己的入門語言當回事。非常早的時候。電腦系的學生用Scheme或者Pascal入門,如今大部分學校用Java。
這或許就是為什麼非常多人恨Java,瞧不起用Java的人。
提到Java,感覺就像是爺爺那輩人用的東西。
大家都會用Java,怎麼能顯得我優秀出眾呢?於是他們說:“Java老氣,龐大。複雜。臃腫。
我更願意探索新的語言……”
某些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/
為Java說句公道話