當前位置:
首頁 > 知識 > 谷歌大牛說:為什麼 Kotlin 比你們用的那些垃圾語言都好

谷歌大牛說:為什麼 Kotlin 比你們用的那些垃圾語言都好

谷歌大牛說:為什麼 Kotlin 比你們用的那些垃圾語言都好

(Steve Yegge )

為什麼說 Kotlin 比你們用的那些垃圾語言都好

說真的,其實我不想去攻擊你們的語言信仰……至少不會「大大地」想。畢竟你喜歡的語言大放異彩的時期,可能要追溯到冰川時代了,對不?如果你喜歡的語言到今天還沒有死,那只能說明這門語言在逐漸地改進和更新,保持與時俱進。

但改進的速度呢?好吧……假設你現在用的語言碰巧是 Java,並且你也沉溺於 Java 曾經是一門非常優秀的語言的想法,那麼你就完蛋了。而且是早就完蛋了。儘管人類都不太喜歡思考終極命運問題,但是相比於在 20 多年前剛剛問世,Java 8 僅僅是做了部分語言特性的替換,對此你禁不住要想:「我真的要和這種語言來共度過的餘生么?還是說 Java 也就只能這樣了?」

因為終於要開始做 Android 開發了,我把各種老舊的語言問題又過了一遍。我寫過一個老遊戲 Wyvern,這個遊戲已經有一個 iOS 版本了,最近我決定再搞一個 Android 版本。我從來沒料到計算機語言會折騰到讓我「思考人生」(例如「我這是他娘的在浪費生命么?」)如果你寫過 Android 程序的話,你就知道在 Android 領域,語言的問題是會讓你相當難熬的。

我第一次嘗試寫 Android 程序是在去年夏天,我的個老天爺,那感覺簡直糟透了。其實是有人警告過我的。他們都說:「那些 API 可是很難搞啊。」而我卻不聽勸。一意孤行。

我想:這些玩意兒能糟糕到哪兒去呢?反正不就是 Java 么?

歷史代碼的災難

真是很不走運——因為很複雜的歷史原因,並且也沒人在意——造成 Android 的核心 API 實在是糟糕透頂。我是說:真的很糟,真的很糟,真的很糟。你只能關掉參考書,深呼吸,然後出去猛喝咖啡來壓壓驚。人們之前給我的告誡看來是完全正確的。

Android API 庫就是一個百寶箱。很多 API 真的是非常好用。我可以說,很多在 iOS 開發里非常難搞的事情在 Android 裡面卻很容易。Product flavors、Downloads 服務、findViewById() 方法、Preferences activity 等等,這些都是很好的例子。有太多 Android 裡面有的東西在 iOS 裡面是誒有的,所以在 iOS 裡面你總能看到:開發者自己實現的噁心的和優雅的應用庫並存。

但是!注意左邊是一個大寫加粗的但是!在寫 Android 程序的時候,人們只關注那些不好的 API,就像你開車時候只會數路上遇到了幾個紅燈一樣,綠燈的數量是沒人關心的。因為人們只會通過紅燈的數量來評價路途是否通順。

Android 確實有幾個很糟糕的「紅燈」API。例如 Fragments,這就是在 Andoird 「紅燈」 API 中的招牌 API。這個 API 的整個生命周期的糟糕程度達到了令人髮指的地步,好吧其實 Activities 和 Fragments 都是如此。說句不中聽的,iOS 反而卻沒有這麼糟糕的API。去年夏天我試了試這些API,它們是如此之糟糕以至於我當時就放棄了。我算是徹底服了。去它的,我還是以後找個人來幫我寫這些程序吧。

接下來的一年半,我就沒再碰過 Android 編程。

來自俄羅斯的救星

我一直聽說,有一種新語言叫做 Kotlin,可以用來寫基於 JVM 或者 Android 程序。發明這種語言的不是別國,正是戰鬥的民族俄羅斯。更具體一點兒,它是由 JetBrains 開發。JetBrains 可是世界知名的 IDE 開發商,代表作是 Intellij IDEA,還有他們那可愛而且大名鼎鼎的橘色,綠色,紫色和黑色混合的暗色「Darcula」主題。

谷歌大牛說:為什麼 Kotlin 比你們用的那些垃圾語言都好

圖:一個千年老妖按捺不住對 Java 8 的興奮

那麼為什麼要給這種語言起名叫 Kotlin 呢?好吧,有一種說法是因為 Java 的第一個字母是「J」,而 Kotlin 則用了Java 的下一個字母「K」作為開頭。除此之外,有人還猜想(這種猜想可能來自加州大學伯克利分校),「Kotlin」這個名字的靈感還來源於「克里姆林宮」,「赫魯曉夫」以及「克格勃」。這些都是前蘇聯的驕傲,所以他們就用了一個前蘇聯軍事基地的名字「Kotlin」來命名這種語言。總之這個名字不錯,而且你會習慣它的。


伯樂在線補充:Steve Yegge 在前文關於 Kotlin 的名字來源,應該錯了。在他自己原文評論中,也有網友指出了。

正確的應該是:① JetBrains 是一家註冊地在捷克布拉格的公司,在全球共有 6 個辦公點:布拉格、聖彼得堡、莫斯科、波士頓、慕尼黑和新西伯利亞。但主要管理層和開發者是在聖彼得堡。② 芬蘭灣中有個島就是「Kotlin/科特林」,在聖彼得堡以西 32 公里。

谷歌大牛說:為什麼 Kotlin 比你們用的那些垃圾語言都好

我發現去年業界關於 Kotlin 只是有不少「嘀咕(buzz)」。注意,只是「嘀咕」,不是天花亂墜地吹牛宣傳。人們只是低調地「嘀咕」著。好吧,總之,我當時看了一下,然後就覺得這個語言和我過去 15 年看過的 50 ~ 100 種計算機語言一樣,這也是一門可以替代 Java 的語言,當然,我認為任何理性的語言都能替代 Java。

對 Kotlin 的第一印象

我第一次看到 Kotlin 的時候,真心覺得這種語言不可能在現實生活中用到,真的是一點可能性都沒有。其實我也就是走馬觀花。我的第一印象?這個語言也沒什麼大問題。它很簡潔,也具有先進的特性。如果說它時髦也行,因為它幾乎囊括了計算機語言設計上的所有最新潮流。不過這也沒什麼大不了,因為很多語言也都滿足這一點。比如,Rust。Rust 也是一門健壯的,名字起得很好的,但是沒什麼人用的語言。

Kotlin 給我的一種奇怪的感覺是「似曾相識」,後來我才反應過來,原來這是因為它和 Swift 很像。我之所以沒有馬上反應過來,是因為我的 iOS 程序因為歷史代碼的原因不得不用 Objective-C 而不是 Swift 來寫。當然現在我也弄明白了:其實 Kotlin 的歷史比 Swift 要悠久幾年,所以正確的說法應該是:Swift 和 Kotlin 很像。

不過即便如此我當時也沒準備用這種語言幹活。Kotlin 對我來說確實是一種語法優雅的語言,但是我覺得我對這門語言還沒有掌握到足夠的程度,以至於讓我可以用它來應付殘酷的現實工作。

從 Java 叛逃到 Kotlin

我不太記得我是具體怎麼愛上 Kotlin 的了。但是我敢肯定的是這絕對不是有意為之。

我努力回憶了一下,事情是這樣的,我做的那個遊戲的玩家跟我說了好久,讓我開發一個 Android 版本。這個遊戲是 12 月份在 Apple Store 上架的,然後幾周之內,大量粉絲就跟我說,他們是 Andorid 用戶,所以沒法玩到這個遊戲。所以,儘管我已經「發誓」再也不碰Android 編程了,但是用戶就是上帝,所以我又開始嘗試了。不過這一次要換個玩兒法——不能再把胃口壞在 Android 的 Java 語言上了。我需要有個現成的框架,或者什麼類似的東西,來讓工作變得簡單一點兒。

在 1 月中旬,我做了一個粗略評估,然後就決定用 Kotlin 來開發了,Kotlin 當時可同時支持 Dalvik 和 Art 兩種 Android 虛擬機。我覺得我的評估是基於以下幾個原因:

  • 1. Kotlin 已經小有名氣;

  • 2. 當時我寫 iOS 版的時候就想用 Swift(但是沒用成);

  • 3. Kotlin有一種挺不錯的 Android DSL 叫做 Anko,這勾起了我的興趣,雖然最後我並沒有真的用到它。

所以我就用 Kotlin 開始做了。在接下來的 4-5 周內,我用 Kotlin 重寫了遊戲的服務平台。要知道這個平台之前已經有 20 多年歷史了。用了一個月的 Kotlin,我就被完全征服了。我不是要說 Scala 或者其他語言的壞話,但是對我這種普通碼農來說,Koltin 是完美的。我的要求不高,給口飯吃就行,知道不?Scala 固然很好,但是它好得過頭了,就像牛蛙牛腦松露蝸牛這些高檔菜那麼好。要知道我就是個藍領,Clojure、Scala 這類的語言對我來說太高大上了。

我大約花了 3 天時間來學習 Kotlin 的各種語法,然後就開始正式編程了,雖然我還是很不熟練,但是我知道這種語言和 IDE 工具足以讓我解決各種麻煩。

當我對這種語言稍微熟悉了一些以後,我就知道,我應該不會再去愛上另外一種語言了,因為 Kotlin 實在是太迷人了。你在代碼寫出來的東西讓你覺得很酷。當然我以前用其他的語言編程的時候也體驗過類似的感覺,但是那些語言的學習曲線一般都非常陡峭。Kotlin呢,它就是大救星:當 Java 程序員為了 Java 8 弄出來的一大堆新概念撓頭的時候,Kotlin 出現了。Kotlin 能實現 Java 8 的各種新特性,並且通過對 coroutines 的支持,其實能實現更強大的功能,而且語法表現力更簡潔。Java 8 確實也能表達很有意思的邏輯,但是很繁瑣,感覺就像讓你說話之前要先給你嘴裡塞沙子。

我想 Kotlin 上手很容易的原因太顯而易見了,要歸功於它的 IDE 支持。現在幾乎所有的 JVM 語言或者 Android 語言的 IDE 支持都是由社區的幾個志願者在維護(當然 Java 除外)。而 Kotlin 則是來自世界級的 IDE 廠商(Jetbrains),所以 Kotlin 打一開始就是自帶 IDE 支持的。有多少語言能做到從發明伊始就能有 IDE 支持呢?編程語言的進化歷程一般做不到這一點。況且有的編程語言從一開始就是要避開 IDE 這個因素的(Hi!Rob)另外一個能一開始就做到 IDE 支持的語言就是 C#,當然 C# 毫無疑問是全世界最好的編程語言之一。


伯樂在線譯註:上面這段中的 Rob,應該是指 Go 語言的發明者 Rob Pike,作者在這裡也許是暗諷 Go 語言從發明到現在都沒有一個靠譜的 IDE 支持吧。

作為一個自帶 IDE 支持的語言,你在 Kotlin buffer 敲代碼的時候,打字基本對就可以了。IDE 會幫你補全你沒寫完的部分。你知道嗎,你甚至可以把Java代碼複製到IDE裡面,然後 IDE 會幫你自動轉換成Kotlin代碼。如果你覺得 Java 的 IDE 都還不錯,那麼我可以很榮幸地告訴你,Kotlin IDE 會把這種「不錯」推進到前所未有的地步。甚至有一個前微軟工程師跟我說:「我本以為微軟的 Visual Studio 是 IDE 界的標杆,是不可超越的。但是我覺得 IntelliJ IDEA 的確要更好。」在我看來,因為我對 Visual Studio 不熟悉,所以我在這裡只是引用他說的話。不過我認為 IntelliJ IDEA 至少和 VS 是同等水平。

誠然,在現實工作中我還是要經常切換到 Emacs 的。IntelliJ 在你打字很快的時候還是有點兒反應不過來。如果你打字總是只打一半兒的話,那麼自動補全動能的運行壓力還是很大。況且對純文本的處理也很糟糕,這是所有 IDE 的通病。所以 IDE 和 Emacs 你都是需要用到的。不幸的是,目前 Emcacs 對 Kotlin 的支持現在也就那麼回事兒,不過相信以後會越來越好。我現在反正就是在 Emacs 和 IntelliJ 之間來回切換。目前還算是 OK。

就是這樣了。我曾經花了大約 10 年的時間,來找一種語言來取代 Java。我真的找得很努力很辛苦。諷刺的是,在我放棄了以後,這種東西居然出來了。去看看吧。Kudos 對 JetBrains 來說,是一個驚艷的成就。

Android:Kotlin 的殺手鐧

這年頭新生編程語言幾乎很難產生什麼巨大影響力。不是說現在沒有新語言產生了,相反是每年都有質量不錯的新語言產生,但是然並卵,沒人用!要給「不可能」劃定界限很難。但是計算機語言的市場已經非常飽和了。如果要讓一個新的語言能夠大火(而且這個規律在過去 10 到 20 年都成立),那麼這個語言就必須有一個「殺手級」的應用。這門語言需要綁定一個平台,讓大家都非常迫切地區使用這個平台,這才能促進大家學習這門語言以便在這個平台上編程。

就目前看來,我們上面所說的殺手級應用——也就是我們上面扯了這麼多的東西——卻是 Android 噁心的 API。每當你順著 Android 路線往下走,一遇到 API 就會卡殼,這只會讓你去詛咒 Android 這個平台。Android 不論有多少優秀的 API 都不管用,重要的是,Android 糟糕的 API 太多了,所以你不得不停下來去找」現成」的辦法(solution)。

不過兄弟,Android 裡面解決問題的「現成辦法」可是不少。對於新手來說,有一大堆 Java annotation processors可用,這就為語言的問題埋下伏筆。更不要提一堆迷你的框架(比如 Lyft 的 Scoop)。還有那些和 Android(Java)完全獨立的框架:React Native、Cordova、Xamarin、Flutter等等。

如果以上說的技術你都不喜歡,那麼你還可以從語言的角度來解決問題。當然,那些完全獨立的框架是基於特定語言的,而並不是Java。

Kotlin 的競爭優勢在於它並不是完全隔離於 Java 語言。它基本上是 100% 可與 Java 相互翻譯轉換的。這很像C++ 與 C 的關係一樣(但它們做不到 100% )。Kotlin 也是在不斷進化的。所以你可以直接把你寫的 Kotlin 代碼扔到 Android 工程中,連目錄都不用改,然後程序就能正常運行了,方便得眼睛都不用眨一下。

其他種類的 Android 平台都傾向於迫使你去學習一種全新的語言以及對應的平台,其編程範式,理念和特性都各不相同。Kotlin 則是讓你直接寫出 Android 可運行的類,就跟其他 Android 程序員用 Java 寫出來的一樣。其實其底層的 API 都是一樣的,但是 Kotlin 組織得要好很多。

還記得我去年夏天把 Android 編程書扔了然後再也不打算看了么。現在 Kotlin 則讓我感覺:Android 編程是快樂的?我甚至覺得可能 Android 那些糟糕的 API 很可能並不是那麼糟,只是 Java 把它搞得太噁心了而已。

Kotlin 致力於讓大家繞過 Android API 那些噁心的東西,並且能讓你充分發揮你的經驗,這一點甚至比 iOS 做得還要好。好吧,至少來說比 Objective-C 做得好,因為我覺得 Swift 肯定也不會差。知道為什麼嗎?因為 Swift 和 Kotlin 很像啊。

谷歌大牛說:為什麼 Kotlin 比你們用的那些垃圾語言都好

我特別喜歡 Kotlin 的地方有哪些?

嗯,這個話題其實要細說就很大了,我覺得我最好再開一篇文章來寫這個。這裡我就提一下那些高級(high-level)且共性的點。

  • Kotlin 很像 Java。它長得不像 Clojure 或者 Scala 那麼奇怪(承認現實把,這兩種語言就是挺奇怪的)。所以你學 Kotlin 應該很快。這門語言顯然就是寫給 Java 開發者來用的。

  • 它比 Java 更安全。Java 很多需要 annotation processors 來做的事情在 Kotlin 里則是內置的,例如 overriding,nullability等等。而且 Kotlin 對數值轉換的規則也更安全,雖然我不太喜歡 Kotlin 的處理方式,但是我還是很感謝這門語言強制我去思考我的數值表現形式。

  • Kotlin 和 Java 是可以互譯的。真的是指無縫互譯。我見過很多 JVM 語言最後掛掉,就是因為其不支持子類繼承機制。我不知道什麼時候就會用到靜態內部類,非靜態內部類,或者什麼破玩意兒類。Kotlin 在設計時就把和Java互譯的屬性放在第一位,也就是說,把 Java 翻譯到 Kotlin 可以逐漸進行,一次可以直接轉換一個文件。

  • Kotlin 很簡潔。你要知道我也算是個高爾夫球手,所以我實話實說。如果在一切都相同的情況下,我更喜歡短的程序,只要它寫的邏輯清楚。Kotlin 對我來說就像是打了一輪好局。平均下來我發現 Kotlin 的代碼長度比相同邏輯的 Jython 代碼短了 5%-10%(這可是我用某種「黃金標準」測出來的),而且還能保證程序的可讀性和類型安全。

  • Kotlin 更貼近實際。Kotlin 支持在一個文件里定義多個類,支持一等方法,操作符重載,擴展方法,類型別名,字元串模板,還有一堆看上去沒什麼新意的語言特性它都支持。而我就是不明白為什麼 Java 什麼都不支持,連人們需要的語言特性它都不做。

  • Kotlin 進化很快。例如剛剛宣布啟動的對 coroutine 的支持,將會成為提供 asyn/await, geneator 以及所有其他無鎖並發特性的基礎設施。

  • Kotlin 很擅長「拿來主義」。Kotlin 經常從其他的計算機語言設計中抄點子,並且也毫不避諱。他們說:「我們很喜歡 C# 的處理方式,所以我們就自己照著擼了一個。」

  • Kotlin 支持 DSL。DSL 不到深思熟慮萬不得已的話千萬不要引入,但是不得不承認 DSL 威力巨大。例如你看 Gradle 的 DSL 和 Maven 比,在典型的 Maven 項目里,配置代碼肯定要超過上千行。所以 Kotlin 是來給你降工作壓力的。

  • Kotlin 的 IDE 是在是太棒了。剛才不久我才在 Emacs 里寫程序文件,結果 Emacs 報了一對錯。而我把同樣的代碼拷貝到 IntelliJ 裡面,然後按 Alt-Enter 逐一自動修復了 50 多條,然後所有的錯誤就都搞定了。這真是幫了大忙啊。

  • Kotlin 很有趣。我跟你們說,Kotlin 就是有趣。也許這是我發自潛意識地在做廣告。Kolint 的關鍵字和方法名都很有意思。Kotlin 把我從一個只會死編程的碼農轉變為了一個計算機語言的愛好者。

總之,你就這麼想:我收拾東西搬家,然後碰到了鄰居 Kotlin。我之前也算見過的一堆計算機語言,但是只有 Kotlin,能夠讓我在那麼短的時間內重寫我的遊戲伺服器代碼。而我現在則是在用 Kotlin 重寫我之前寫過的一切。

我也知道還有好多其他的程序員也對 Kotlin 感覺非常好,打算成為 Kotlin 程序員。其中大部分的人應該在 1-2 年之內水平就能超過我了。我們私下裡談論過,互相都說「Kotlin 讓編程感覺美好的感覺又回來了。」還不錯,再我們尚未對編程全部失去興趣之前,Kotlin 來了。就彷彿你只要把語言的語法學會了。這回把你帶回到那種第一次學編程的感覺,無論寫什麼都覺得自己很牛逼。

再一次,向 JetBrains 致敬。他們對計算機語言做出了巨大的貢獻!我脫帽致敬。

那麼 Kotlin 比你用的任何其他編程語言都好嗎?我想對我來說是的。因為,如果你碰巧是在用 Java 的話。如果你一整天就是泡在椅子面前寫 Java,那麼你會發現 Kotlin 簡直就是一股清流。所以也讓我知道你們是怎麼想的吧。

免責聲明:本文只是闡述我個人對 Android 開發的觀點,並不代表我的僱主(谷歌)或者 JetBrains 的觀點。

稿源:伯樂在線

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 我不是程序猿 的精彩文章:

Linux/Unix運維之巧學活用shell編程
Linux/Unix運維之shell腳本初步入門
Linux/Unix運維之Shell變數知識進價與實踐
nodejs和php性能對比
為效率而生的十大node框架

TAG:我不是程序猿 |

您可能感興趣

它難懂、多變、挑剔,但這些cool girls卻精修這門語言
它難懂、多變、挑剔,但這些cool girls卻精修這門語言
語言趣談:「母校」英語是「Mother school」?別鬧笑話了!
可以用 Python 編程語言做哪些神奇好玩的事情?
大家都在學的編程語言 Python,可以用來幹什麼?
都說Python是最接近AI人工智慧的語言,那麼它的優勢和缺點是什麼?
那些美得令人心醉的撩妹語言,你能hold幾句?
除了Scratch 還有這些語言可以選
Stream:我們為何要從Python轉到Go語言?
好文翻譯丨我為什麼要從 Python 轉向 Crystal 語言
python是什麼語言?現在學Python好找工作嗎?
Facebook Libra的Move語言與其他語言有什麼不同?
換掉Python!那個還不錯的Stream公司上了GO語言的船!
我為什麼要從 Python 轉向 Crystal 語言
放棄幻想,全面擁抱 Transformer:自然語言處理三大特徵抽取器比較
為什麼Python語言是孩子們學習編程的最佳選擇?
為什麼Python被稱為「宇宙最好的編程語言」?
情感投射與想像——英國畫家Anne Mortime一種獨特的視覺語言
Netflix:你看的每一部電影背後都有Python編程語言的影子
Hello,有空嗎?我們聊聊留學申請與語言培訓的那些事