你知道嗎,Java之父也討厭Bug
在程式設計工作或是學習中,你最頭疼的是什麼?你知道嗎,Java之父也很討厭Bug,最讓他頭疼的事情是數值分析。然而,學生時期的他即便用最差的語言完成作業,成績照樣是A。這樣一位看似普通卻又充滿傳奇色彩的程式設計師,相信你也同樣對他充滿好奇。
90年代初,James Gosling和一群技術人員合作“綠色計劃”,建立了一個名為Oak的專案,旨在開發出能夠執行於虛擬機器的程式語言,開創計算機在家電產品上的嵌入式應用。後來,這項工作就演變為Java。
996年1月,Sun公司釋出了Java的第一個開發工具包;
1997年2月,JDK 1.1面世;
1998年12月8日,第二代Java平臺的企業版J2EE釋出;
2000年5月,JDK1.3、JDK1.4和J2SE1.3相繼釋出;
……
隨著網際網路的普及,Java成為全球最流行的開發語言。James Gosling也因此被稱作“Java之父”。
James Gosling本人,出生於加拿大,是一位計算機程式設計天才,1977年獲得加拿大卡爾加里大學電腦科學學士學位,1983年獲得了美國卡內基梅隆大學電腦科學博士學位。畢業後到Sun公司工作,這才有了上面的Java。
近日,外媒Evrone的軟體工程師、技術編輯Grigory與Java之父James進行了一場線上對話。在採訪中,James提出了許多觀點,他認為:“對軟體的可靠性要求越高,靜態型別語言就越有幫助。”他還分享了自己對某些程式語言的看法:反感C語言中的宏、對Lombok又愛又恨、很喜愛Lisp等等。
關於現代程式語言的構建方式
Grigory:作為軟體開發人員和軟體顧問,我們試圖在俄羅斯組織Python、Ruby、Java和Go社群。您在Java方面的經驗和工作可以很好地幫助開發人員。透過這次採訪,我們希望能夠幫助到其他開發者,一起解決業內的基本問題。
有些語言,比如Go,沒有類和繼承一說,而另一些語言則嘗試使用諸如Rust的特性。作為一名語言設計師,您認為現代通用的、合理的程式語言構建方式應該是什麼?
James:我應該會繼續使用類,類對我的程式設計工作很有用。在C語言中有一些宏,這非常糟糕,因為宏不是語言的一部分,不應該納入其中。而Rust的工作人員正在嘗試恰到好處地使用宏。
對於其他語言,如Lisp家族,人們總是設法更靈活地應用它們。它們有一種定義語法的方法,語法幾乎完全與語義無關。在大多數語言中,語法和語義是密切相關的。我曾寫了很多Lisp,我真的很喜歡使用Lisp程式。有的語言能讓你以不同的方式做到這一點,比如在Groovy中,你可以直接使用AST,Rust有一些語法整合的宏。但我總覺得還有一個問題:除此之外還能做什麼呢?
Lisp對程式碼片段進行運算,再生成新程式碼,在Java世界裡,人們就是這樣做的。雖然看似低階,但很受歡迎。人們可以使用註釋的組合,用一些不同的語言生成位元組碼,這是超級強大的。它會給你意想不到的驚喜,比如在Jackson,它透過計算序列化程式延展了效能。
一方面,這是一種非常強大的技術,另一方面,它非常難以駕馭。這個技術充滿可能性,但這種可能性是有限的。我對Lombok又愛又恨,因為它新增了一大堆Java特性,這些特性都很不錯,但從另一方面來說,也顯示出了弱點。JCP的社群職能在下降,我已經離開好幾年了,雖然有些事情可以做,但也只能是在紙上談談。
Grigory:這就是為什麼我們更想了解您建立語言的經驗,而不是一些Java增強建議。五年前,我嘗試操控一些Java位元組碼。我發現,用它來建立特定領域的語言有點困難。但是有了Ruby後,就容易多了。Evrone公司有許多精通Ruby的開發人員。Ruby開發人員很優秀,但是他們需要多年的培訓才能真正掌控DSL的魔力。
James:像程式碼片段運算這樣的特性,在Java中之所以尷尬是因為Java總是試圖去編譯機器程式碼,Ruby幾乎總是被解釋。如果你想同時獲得超強功能和終極效能,這一切就會變得很困難。
如何看待破壞性的更改?
Grigory:最近,我們採訪了Ruby的創作者Yukihiro Matsumoto,他對最新的Ruby 3.0版本進行了實驗,試圖在不破壞更改的情況下發布這個版本。我知道Java對“不破壞更改”的態度一直很謹慎。讓所有語言在完全相容的情況下進化,這是合理的嗎?還是說這個方法只能用於特定的語言,例如Ruby或Java?
James:這幾乎完全取決於開發人員社群的規模。每一個破壞性的變更都會給開發人員社群帶來痛苦。如果你沒有很多的開發人員,那麼破壞更改並不是一個大問題。
除此之外,你還必須權衡成本效益。如果你做了一個突破性的改變,它會增加你的工作負擔,但也可能會帶來一些好處。不過,如果你只是將下標運算子從方括號更改為圓括號,這並不會帶來任何好處,只會徒增麻煩。
在JDK 9中,出現了一個罕見的破壞性變化:如果你使用的是隱藏API,封裝機制就會被打亂。人們打破封裝界限,運用了非常規的方式,使用了不應該使用的東西,這種改變是痛苦的。然而,一旦我們徹底改變,平臺便有了更多的創新空間。在這種改變下,平臺可以被分割,你可以定製打包,Java的執行環境就會更小。
另一個麻煩是:當遇到Bug時,人們會為之做一些變通措施,如果你修復了這個Bug,變通措施就被破壞了。在Java的世界中,確實有這樣的例子,我們要麼不修復Bug,要麼引入一個方法來修正錯誤,這甚至體現在硬體上。
如何看待靜態型別檢查器?
Grigory:25年前,當我開始自己的軟體開發生涯時,我寫了很多C和C++程式碼。幾乎每個月都會遇到一次錯誤警報。除錯這些錯誤是一件很痛苦的事情。但是現在,我看到許多工具整合到我們的工作流程中,比如靜態型別檢查器。現代開發人員使用IDE,如NetBeans、IntelliJ IDEA,甚至Visual Studio。他們編寫原始碼,編寫靜態型別檢查器解析程式,構造抽象語法樹,並進行檢查,然後在文字編輯器中標記錯誤。這些技巧不僅適用於靜態型別的語言,也適用於動態型別的語言,在Python、Ruby和TypeScript中皆可使用。
你對靜態型別檢查器有什麼看法?它們能幫助人們編寫出更好的程式,還是說需要在語言語法中新增更多內容?
James:我都同意。我非常喜歡使用靜態型別系統的語言,因為它們為靜態型別檢查器和IDE提供了一個框架。作為一名資深軟體工程師,尋找那些奇怪的Bug是最浪費時間的。為減少這方面的時間浪費,我會盡力阻止Bug的出現。因此,我非常喜歡IDE,它能夠提供減少Bug的方法。而動態型別語言很少有框架來解決這個問題,因為它們不一定能判斷所有型別,只能靠猜測。強型別語言(如Java)為型別檢查器提供了更嚴格的框架。在另一個層次上,甚至可以進行自動的定理證明。像Dafny這樣的系統,它有一個非常複雜的定理證明器。所以如果你想建立一個加密演算法,你將能夠用數學方法進行證明。這聽上去很誇張,但對於某些程式碼來說,真的很有用。
這很大程度上取決於你的目標是什麼。
如果你是一名正在努力完成作業的大學生,或是一名正在努力畢業的博士生,那麼當你編寫一個程式時,你的目標是讓這個程式至少能執行一次,因為你必須要展示成果。
如果你在行業環境中,那麼每次執行都必須成功。一次執行成功和每次都執行成功之間的差別是巨大的。如果只需要運作一次,那麼動態語言會更合適。如果你必須確保它能一次又一次地執行,那麼所有的靜態型別工具都適用。
如果你是一個物理學家,你想得出一些計算結果,那麼它只需要執行一次。這取決於你的工作背景。你對軟體的可靠性要求越高,靜態型別語言就越有幫助。
以上就是Java之父專訪的介紹,希望對大家有所幫助。更多精彩內容分享:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4650/viewspace-2828216/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Laravel joinSub的使用,你也知道嗎?Laravel
- 你知道 Java 有哪些引用嗎?Java
- 你知道CPU結構也會影響Redis效能嗎?Redis
- 3個每個人都討厭的Java實踐 - MilošJava
- 越來越討厭爬蟲爬蟲
- 這6個高效的Java庫,你知道嗎?Java
- 多年之後,《憤怒的小鳥》也活成了自己曾討厭的樣子
- 《被討厭的勇氣》總結
- 2150: 令人討厭的手機號
- [譯] 熱愛 JavaScript,但是討厭 CSS ?JavaScriptCSS
- 相信我!這絕不是你討厭的那個數學函式函式
- 程式設計師最討厭的9句話,你可有補充?程式設計師
- 用Java這麼多年,這些祕密你知道嗎?Java
- 你知道著名的3畫素Bug指的是什麼嗎?怎麼解決呢?
- 為什麼我如此討厭scrums? - RedditScrum
- 互相討厭的奧運與氣候
- [20200107]討厭的forefox瀏覽器.txt瀏覽器
- 我不討厭JS,只是更愛CSSJSCSS
- 你真的知道跨域嗎跨域
- 為什麼人們都討厭開會?
- 正則匹配身份證有bug你知道麼?
- 看過無數Java GC文章,這5個問題你也未必知道!JavaGC
- 你知道什麼是ECMAScript嗎?
- Gradle Kotlin DSL , 你知道它嗎?GradleKotlin
- Go SliceHeader 和 StringHeader,你知道嗎?GoHeader
- 你知道如何學習Linux嗎?Linux
- 你知道什麼是 AOP 嗎?
- Java從入門到精通的學習路線你知道嗎?Java
- 程式猿討厭沒有價值的任務
- 2149.令人討厭的手機號(再續)
- Java三種面試者是面試官最討厭的,見之即斃!Java面試
- 也許你不知道的npm-scriptsNPM
- 你的員工幹什麼你知道嗎
- 身為初學Java的你,這些IDE的優缺點你都知道嗎?JavaIDE
- 你知道黑客的入侵方式都有哪些嗎?這些你知道幾個?黑客
- 你知道h.265吧?但關於AV1編碼格式你也來了解一下嗎?
- Java 8 的Stream流那麼強大,你知道它的原理嗎?Java
- 你知道什麼是微服務嗎?微服務