1. 程式人生 > >谷歌大牛說:為什麼 Kotlin 比你們用的那些垃圾語言都好

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

【伯樂線上導讀】:5月18日,安卓團隊在谷歌 I/O 2017 大會上宣佈 Kotlin 成為官方頭等支援語言。這條爆炸性資訊在當天就是 Hacker News 首頁熱門討論,與此同時,谷歌技術大牛 Steve Yegge 也寫了一篇關於 Kotlin 的使用體會總結文章,同樣也在首頁熱門,並引發 200+ 討論。伯樂線上編譯如下。

(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”主題。

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

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

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

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

我發現去年業界關於 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 的地方有哪些?

嗯,這個話題其實要細說就很大了,我覺得我最好再開一篇文章來寫這個。這裡我就提一下那些高階(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 的觀點。

伯樂線上摘錄原文的一些評論:

Igor Tovstopyat-Nelip

好文章!

JetBrains 不在捷克。雖然它是在(捷克)布拉格成立的,但主要在聖彼得堡。他們很多管理層和開發者都是俄羅斯人,很多是從聖彼得堡大學畢業的 。

關於取名,Java 語言是出自印尼群島中的 Java 島。Kotlin 是芬蘭灣中的一座島,離聖彼得堡很近。彼得大帝在 18 世紀早期從瑞典那裡搶過了聖彼得堡。此後,一直是俄國波羅的海艦隊的海軍基地。聖彼得堡有北國風光之美,海軍神廟(Naval Temple)令人印象深刻。

我們公司(位於亞特蘭大)也試過多種 JVM 語言,Java 是首選。現在我們更對 Kotlin 感興趣了。大家都非常喜歡。並且 Kotlin 和 Java 是無縫互通的。

Kotlin 也能編譯成 JS,並且值得一提的是,Kotlin Native 也處於火熱發展中,看起來會是 Rust 的強勁對手。

匿名網友:

我過去也一起用過 Eamcs 和 JetBrains 的 IDE(PyCharm 和 Webstorm)。雖然這種組合很怪,但出奇的好。Emacs 適合心靈控制級別的文字編輯,IDE 適合面向滑鼠的閒逛和小修改。

Stephen French:

我喜歡 C#,對 Java 落後太多真的失望至極,因為我的工作傾向 JVM。Kotlin 看起來非常有意思!

打賞支援我翻譯更多好文章,謝謝!

打賞譯者

打賞支援我翻譯更多好文章,謝謝!