一位Javascript程式設計師認為Java被嚴重低估 - jackson

banq發表於2021-04-27

Java仍然主導著企業,並執行著一些世界上最大的關鍵任務應用程式,我花了很多時間在於沒有經驗的程式設計師接觸上。沒有經驗的程式設計師喜歡做什麼?他們對諸如程式語言這樣的工具感到興奮和固執。我遇到的CS本科生都無知得沒有談論Java,我認為不應如此。
年輕/天真的開發人員(包括我本人)經常陷入迷戀新語言和新工具的陷阱,以犧牲生產力和理智為代價。
我對JS生態系統有著非理性的親和力,因為這是新事物。它有炒作。現實沒有達到我的期望。今天,隨著我在Java方面的經驗,我現在正在享受JavaScript帶來的美好希望。Java有趣,編寫高效,但是在新開發人員中卻以恐龍的印象獲得了不公平的聲譽。
 

人機工程學是使Java出色的原因
這一點不可低估:Java編寫起來感覺很好。這很大程度上歸功於JetBrains在IntelliJ IDEA中的精湛工藝。一切都是自動完成的,跳轉到定義的速度很快,查詢使用效果很好,並且重構很容易。但是,Java真正出類拔萃的是第三方庫的開發人員經驗。
 

依賴繁重的工作和行業趨勢
我的經驗是有限的,但是我覺得風向傾向於自由使用外部依賴項。我認為當前JS中對第三方依賴關係的親和力並不是特別有害的事情,但是上游API的更改可能會對未型別化的JS / Python程式碼庫造成嚴重破壞。
使用Java使用第三方庫時,您始終確切知道需要將哪些型別傳遞給方法。最重要的是,錯誤使用函式會導致編輯器中出現紅色彎曲。考慮到大量的庫使用情況,我認為更多的人應該對Java感到興奮。
 

節省打字時間
動態/duck/weak/無論什麼型別的輸入都有許多缺點,您的應用程式將在執行時失敗,注意不是在構建時失敗,這將成為問題。當開發人員必須參考方法的實現來確定要傳遞哪種型別的方法時,這是在浪費時間。TypeScript和Python型別提示可以解決此問題,但是它們缺乏在執行時驗證傳遞的型別而沒有額外程式碼的能力。
型別防護是我最不喜歡的TypeScript功能。從本質上講,它們是duck的,您必須自己實施,並相信它們已正確實施。我認為這是兩全其美。考慮以下:

interface Dog {
    bark: () => void;
}

/* The developer has to manually implement
a heuristic check for interface adherence!
When they update the interface, they have
to update the type guards too! */
function isDog(pet: object): pet is Dog {
  return (pet as Dog).bark !== undefined;
}
const dog: any = {bark: () => console.log('woof')};

if (isDog(dog)) {
    // TS now knows that objects within this if statement are always type Dog
    // This is because the type guard isDog narrowed down the type to Dog
    dog.bark();
}


關於宣告一個型別並且必須為該型別編寫驗證邏輯的事情確實使我誤入歧途。上面的程式碼聞起來好像有人在使用錯誤的工具。
與TypeScript定義不同,Java的標稱型別系統透過使型別定義明確化並在預設情況下保證型別保護,從而減輕了程式設計師的負擔。
 

去除最佳化的責任
Java開發人員可以放心地相信JVM可以做到最好。無論是實現多執行緒應用程式還是將大量資料儲存在堆上,他們都可以確信自己不會因記憶體管理或資料爭用而步履維艱。與步槍時代的C ++相比,此優勢主要體現出來。
這是Java人體工程學經驗的一部分。當開發人員不必擔心技術方面的問題時,他們可以將精力更多地放在手頭的問題上。
 

生產力聖盃
您認為符合以下條件的語言有幾種?

  1. 質量包管理器和構建系統
  2. 標稱型別
  3. 大型社群
  4. 動手最佳化

我認為唯一合格的工具是Java,但請告訴我是否還有其他工具!
更正:正如Jwosty指出的那樣, Microsoft的Java競爭對手C#具有所有這些特徵以及更多/更新的語言功能。我從未在Unity遊戲引擎之外使用過C#,但我將對其進行研究。
 

令人驚訝的是大學課程沒有其課程
我目前就讀於科羅拉多大學博爾德分校。這是一所很棒的學校,但我們當然不以CS聞名。但是,我們的大部分高階電腦科學課程都是師從CMU或Stanford,包括作業以及所有內容中無恥地從他那裡偷來的。在CU期間,我使用以下程式語言:

  1. C ++。在所有必修的核心課程中都選擇了該語言:計算機系統,作業系統,資料結構等。該語言是一種合理的選擇,因為它可以直接進行記憶體管理,建立核心模組,並帶來許多挑戰和學習機會。
  2. Python和Julia。如您所料,這些語言是數值計算和離散數學教授的寵兒。
  3. Scala,該語言在“程式語言原理”教學中使用,主要是因為其功能程式設計和模式匹配功能。儘管Scala使用JVM並與Java互操作,但它具有與Java不同的開發人員體驗。
  4. 網路語言(HTML / CSS / JS)。這些僅在稱為“軟體開發方法和工具”的一門課程中使用,該課程側重於行業趨勢。

我本學期即將畢業,Java並沒有露面; 我認為這很遺憾。
 

結論
沒有一種真正的方式來構建應用程式,但是我認為Java沒有得到足夠的重視,尤其是在初創公司和新手程式設計社群中。無型別語言是有用的工具,但我認為它們不是構建大型應用程式的預設選擇。如果您是一個全棧開發人員並且從未廣泛使用過Java,那麼我想如果您在下一個專案中嘗試使用它,您會感到驚喜。
Java和JVM在90年代和2000年代初被炒得沸沸揚揚,但我不認為它應該消失了!我在IntelliJ和Java中發現的開發人員經驗值得興奮。
 

駭客新聞網友討論
對於我的用例,Java有所有錯誤的折衷方案:

  • -不夠高,無法與Python / Ruby / JS / PHP等競爭
  • -等級不足以與Rust / D / Nim / Zig競爭
  • -不夠專業,無法與Erlang / R / Go / Julia競爭
  • -沒有足夠的自信心與Lisp / Haskell競爭

那麼為什麼要使用Java?它很好,速度快,生產率高,經過數十年的開發,並且得到了眾多開發人員的良好支援,戰鬥測試和記錄。許多公司已經在使用它,並且工具非常出色。但這還不足以成為我選擇它的理由。Python比Java古老,受到了良好的支援,經過了戰鬥測試,並由大量開發人員記錄在案。但是對於高階內容,資料處理,指令碼編寫,粘合以及大多數Web開發人員而言,它是更好的方法。如果我想要一個分散式系統或具有很多I / O的東西,那麼Erlang和Go總是比Java更好。當然,它們不那麼普遍,它包含了所有的含義,但是出於如此好的需求,我將付出高昂的代價:我的目標是針對用例進行最佳化。對於需要快速執行或佔用空間少的東西也是如此,如果可以使用Rust,我就不會使用Java。因此,Java並不是一個不錯的選擇。這是一項出色的技術。我只是沒有用例需求。我就是玩兒
 

開始增長的Python專案有一種變得難以管理的趨勢,這是我在Java中從未見過的。
 
我被迫在工作中使用Python,因為資料科學家需要它,而且我可以連續至少24小時對您的“資料有益”語言感到滿意。Python在任何方面都不是很出色,但是在某些特定的地方卻很糟糕。當多程式是平行計算的首選方式時,Python核心庫就被IPC淘汰了!
 
Java如此成功地競爭的原因是它是高階的,卻提供了效能,可維護性和可觀察性(包括始終啟用,低開銷的深度剖析)幾乎無與倫比的組合。您提到的所有替代方案都沒有。這就是為什麼它仍然是亞馬遜,蘋果,Netflix,谷歌,阿里巴巴,優步,Soundclous和幾乎所有財富500強公司的首選。
 
我同意從經理責任的角度來看Java是低風險的:長期以來沒有人因為選擇它而被解僱。現在,從專案成功的角度來看,我認為不是。我已經看到很多Java專案都失敗了,經過了精心設計,充滿了義大利麵條式的程式碼,充滿了難以理解的抽象之謎,陷入了設計不良的體系結構的膠水之中,這種體系結構已經被型別系統僵化了。從專案風險的角度來看,這是一種相當普通的語言,它有優點也有缺點,但它們相互平衡。
 





 

相關文章