Re: [問題] Java在鄙視鏈圖的位置?《為 Java 說句公道話》

看板java作者 (全新開始)時間8年前 (2016/01/21 23:16), 8年前編輯推噓1(100)
留言1則, 1人參與, 最新討論串1/1
※ 引述《dharma (達)》之銘言: 以前在學校我學 java 寫 java 但是不喜歡 java,覺得它很煩很土。上班後雖然沒那麼 討厭,但還是時常懷疑它到底會不會很快就被淘汰? 直到過去一年中我花很多時間學 javascript、groovy、gradle,學習跨平台開發工具 cordova 之後,我才完全改觀。 最近看到這篇簡體文章後,心裡頗有戚戚焉,在此轉換為繁體中文慣用的說法來表達,歡 迎轉錄。 《為 Java 說句公道話》 http://www.yinwang.org/blog-cn/2016/01/18/java/ 作者是王垠,一位以 java 實現 python 型態檢定工具 pySonar 的旅外開發者,主修領域 好像是電腦科學中的程式語言。 它的github https://github.com/yinwang0 ----------------------------------------------------------------------------- 為Java說句公道話 有些人問我,在現有的語言裡面,有什麼好的推薦?我說:「Java。」 他們很驚訝:「 什麼?Java!」 所以我現在來解釋一下。 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,我已經評論過很多了,有興趣的人可以看 http://www.yinwang.org/blog-cn/2014/04/18/golang/。 總之,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程式員,扯著各種高大上不實用 的口號,比如「函數式編程」 (funcational programming),進行過度工程,浪費公司的 資源。花著公司的錢,開著各種會議,組織各種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有優秀的IDE支援 ------------------- 我平常都用IntelliJ來寫Java程式碼。我發現IntelliJ裡面,有一些非常好的設計思想。 其中很多功能,其實超越了所有的文件編輯器(Emacs,VIM……)。IntelliJ讓Java如虎添 翼,開發起來感覺是在飛一樣。 用IntelliJ的時候,你不需要為「給變數取名字」之類的事情焦慮。因為IntelliJ有非常 強大而友好的refactor功能,你可以非常迅速的換掉變數的名字。所以在第一次創造變數 的時候,你不需要花心思去想一個完美的名字。用一個還算能用的名字,把程式碼很快寫 出來,實驗成功。然後再返回去看程式碼,把名字換成一個更合適的就可以。 IntelliJ還可以進行非常迅速的結構變換,這讓你就像藝術家在建構一個雕塑作品。剛開 始我可以大刀闊斧,把程式碼劈成大致的形狀,然後再把它仔細推敲,揉捏成更好,更容 易理解,更具魅力的形狀。 結論 ---- 我實在不忍心看著有些人被Scala和Clojure唬嚨。如果沒有超級高的效能和資源需求(可 能要用C這樣的低階語言),目前我建議就老老實實用Java吧。雖然不如一些新的語言酷 炫,然而實際的系統,還真沒有什麼是Java寫不出來的。少數地方可能需要繞過一些限制 ,或者放寬一些要求,然而這樣的情況不是很多。 撰寫程式使用什麼工具是重要的,然而工具終究不如自己的技術重要。很多人花了太多時 間,折騰各種新的語言,希望它們會奇蹟一般的改善程式碼品質,結果最後什麼都沒做出 來。選擇語言最重要的條件,應該是「夠好用」就可以,因為專案的成功最終是靠人,而 不是靠語言。既然Java沒有特別大的問題,不會讓你沒法做好專案,為什麼要去試一些不 可靠的新語言呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.231.178.105 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1453389400.A.9B8.html ※ 編輯: dream1124 (61.231.178.105), 01/22/2016 00:02:59

01/23 22:07, , 1F
看了
01/23 22:07, 1F
文章代碼(AID): #1MeFPOcu (java)