編程語言的被淘汰:選錯語言毀終身
在我當前所在項目里,其中的某一個子系統是用 Groovy 中的 Gradle 插件。Groovy 作為一個運行在 JVM 上的腳本語言,天生具有膠水的特性。加之,它支持 DSL 與其程式的簡潔語法。嗯,如果不考慮性能問題,這真的是不一個不錯的語言。
可真的是如此嗎?
開始之前,我再次 FBI warning 一下:
- 關于編程語言的討論,并非能真實,都存在或多或少的個人偏愛因素。因此,文中的某些觀點或許會有些偏頗。若是不正確又或者是出入較大,也希望大家能指正。
- 這里的場景主要是基于團隊協作的場景之下討論的,而非個人項目,又或者是小項目。也就是說,只有團隊協作時,才會出現的問題,才會出現各種討論。
- 說起這一點我也是有個人偏好,如業余開發選各種語言,而真正做項目的時候,選的語言便是 Java;業余開發用 React、Stencil.js,在公司做項目的時候,還是 Angular 大法好。
引子 1 :編程語言的讀與寫
我們都知道,編程語言是寫給人看的代碼,寫機器運行的機器碼。所以呢,對于編程語言而言,我們會有一個簡單的判別標準,即它的讀與寫。從使用體驗上呢,我們可以分為:易讀易寫,易讀難寫,易寫難讀,難寫難讀,這么四類的語言。
為了貼合文章的主題,我大概對我在項目上用過的 JVM 語言做了一個分類。(PS:真實情況下,差異沒有這么大。)與此同時,由于每個語言的使用場景不一樣,我們并不考慮諸如于性能等問題。
難度 | 易寫 | 難寫 |
---|---|---|
易讀 | Java | Groovy |
難讀 | Kotlin | Scala |
簡單說明一下 (笑,我們并不討論他們的優點。例子中的 Kotlin 不太適合,只是我暫時沒有在項目上用過其它 JVM 語言,也許 JRuby 就不好讀了):
Java 語言嘛,大家都懂,又好讀又好寫,所以 Java 程序員便宜。
Groovy (Gradle 所采用的 DSL 語言)難寫的地方在于,文檔少、語法糖導致IDE 支持差(相對而言)。事實上,它也不是那么好懂,在 IDE 支持的情況下,要用碳基腦做個類型推斷。
Kotlin,如果已經熟悉 Java 或者其它語言的話,寫 Kotlin 并不是一件難事。這件事情難就難在閱讀別人的 Kotlin 代碼,可能會有點費勁,除非你有良好的 IDE 支持——它的親爸爸可能是 Jetbrains。離開了 IDEA,找個擴展(extension)都得找半天。所以難度總體上還是不難的,只是相對難讀一點——因為語法糖。
Scala,早期的某個項目,我幾個月后看不懂幾個月前寫的代碼。
而如上所說,對于語言每個人是有偏好的。所以,這里依舊是我的一些個人觀點。我也并非這方面的專家,只是從個人閱讀開源代碼和編寫相關代碼的感受來說的。
引子 2:適用領域與流行應用
談及編程語言,我們要討論的是另外的另一特質:適用領域。如我們熟悉的:
- Golang 背靠云原生和 Google
- Python 是科學家們的偏好,畢竟不是以代碼為生。
- JavaScript 是交互方式發生了變化
- Ruby 是 Rails 框架,所以流行開了。
- Java 用于企業編程,因為程序員便宜
而諸如 Rust 這樣的小類語言,還沒有正式有一個能發揚光大的場景。
引子 3 :編程的快樂,先寫得爽
有一些語言能讓你拾起編程的快樂,比如 Ruby,但是也能讓你不想去維護代碼——讓人又愛又恨的 Method Missing,可以讓你搞起元編程。也能分分鐘讓你看不懂別人寫的代碼。如果沒有文檔的話,那么我覺得你不會再看了。
又比如說,操作符重載也是一個讓人寫的代碼更加直觀。嗯,再重載一下賦值操作符,是不是非常爽。
對于快樂來說,維護性那是以后要考慮的問題。
編程語言的被淘汰
在項目上經歷了慘痛的 Groovy 開發大型項目的經驗后,我和我的同事們一致覺得這是一門可能被淘汰的語言。主要原因有這么幾個:
- 可維護性丟失
- 缺失更好的 IDE 支持(相比于 Java 之類的)。說白了就是開發人員寫起來不爽。
- 在最廣泛的場景之下,可遷移語言出現(如 Kotlin Script)
如果你還想把編程語言的一些缺點考慮一下,那也是可以的。
可維護性丟失
這也并非是語言本身的問題,而是語言應對大型項目時,將會遇到的一個挑戰。對于大型項目而言,自由靈活的語法糖會帶來大量的問題。而隨著項目的進一步擴大,保持同一套代碼風格容易,而要使用同一套語法越來越困難。如同樣是聲明類型,有的用具體的類型,有的則是用 def 或者是 var。
缺失更好的 IDE 支持
嗯,如果你習慣了用 IDEA 對 Java 代碼進行快速的重構之后。而與此同時,你并不能使用相似的方式來對你的 Groovy 代碼進行重構。你們就會慢慢陷入了一個循環,既然有一個更好的語言,為什么我們不去使用它們呢。
退而求其次的,為了使用 IDEA 的高級功能,如重構。我們開始將代碼中的 def 轉換為具體的類型。
可遷移的語言出現
而其實上面兩個問題,并不是這個語言的主要問題。畢竟,對于小的項目來說,IDE 和可維護性支持都不是問題。
過去,我們根據 Gradle 官方文檔,使用 Groovy 來編寫 Gradle 插件。而有一天,Gradle 官方文檔同時提供了 Kotlin Script 的支持。
這就相當于是,上帝真的拋了個橄欖枝給你。你可以同時擁有更好的 IDE 支持,更好的可維護性。同時,還可以快速地遷移過去。為什么不呢?
其它
與之相似的一個例子便是 JavaScript 和 TypeScript,但是瀏覽器運行的是 JavaScript。所以,JavaScript 并不能這么容易被取代。
結論
有沒有可能出現一個兼容所有語言的語言?
本文轉載自微信公眾號「Phodal」,可以通過以下二維碼關注。轉載本文請聯系Phodal公眾號。