编译:伯乐在线/黄小非
谷歌大牛说:为什么 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 虚拟机。我觉得我的评估是基于以下几个原因:
Kotlin 已经小有名气;
当时我写 iOS 版的时候就想用 Swift(但是没用成);
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 看起来非常有意思!