你知道嗎,Java之父也討厭Bug

joytoy發表於2021-09-11

你知道嗎,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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章