Google技術大牛 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 開發的觀點,并不代表我的雇主(Google)或者 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 看起來非常有意思!
新聞熱點
疑難解答