文档结构  
翻译进度:已翻译     翻译赏金:5 元 (?)    ¥ 我要打赏

先来点噱头,问个问题,互联网如果没有它将会是怎样的? 答案会让你大吃一惊!

但是说实话,我并不是有意要贬低你最喜欢的语言。 毕竟,你选择的语言可能正在慢慢的变得越来越好。 不是吗?如果你的语言还没死,那么它慢慢也会变得越来越好,当然如果它还在维护更新的话。

然而,到底有多慢呢?... 如果你正在使用的是Java语言,那么你应该意识到这一点,那就是当Java成为一个相当好的语言时,你就早已经挂了,而且很久了已经。 我知道我们大家都不喜欢考虑自己的死亡问题,但是当你回顾Java的发展轨迹,从其20多年前出生,到全身大手术升级到了Java 8,你不禁会想知道,"我的下半辈子都会困在这里吗?如果能够尽善尽美呢?"

第 1 段(可获 2 积分)

然而当我最终开始尝试开发安卓应用的时候,又一次碰到了旧语言的问题。 我有一个之前开发的iOS游戏客户端Wyvern,而最近我决定想冒点险,来写一个安卓版本的。 我没有意识到它会变成一个语言问题(就像说, "我到底在做什么?")但是然后呢,如果你做过任何Android编程的话,你就会知道这实际上是安卓领域急待解决的问题。

去年夏天我第一次尝试做安卓开发,但是妈蛋的,太糟糕了。 我的意思是,他们警告过我,每个人都这么说: "接口设计非常糟糕"。我不得不承认他们警告过我。

第 2 段(可获 1.58 积分)

然而,再糟糕能糟糕成什么样子?它只是Java而已,不是吗?

遗留的恶心

不幸的是,-- 由于没人在乎的长期且复杂的遗留原因 -- 安卓的一些核心API真的很糟糕。 我的意思是非常的非常的不好。 我关上书, 深呼吸,然后出去喝杯咖啡。  那些警告依然存在。

不过,这是一个大杂烩。大部分的接口是极好的。我发现很多在iOS里很难实现的东西,在安卓里却很容易实现。 产品们都很偏爱的是,下载服务, findViewById()方法,Preferences的activity等等。安卓里有大量的东西在iOS里完全找不到对应的东西,因此在iOS里,你最终不得不写一些恶心的hack过的代码或者专门构建一个精良的类库来解决同样的问题。

第 3 段(可获 1.6 积分)

但是,但可是呢,当大家在学习编写安卓程序时,每个人都把注意力集中在了糟糕的API上,就像你在堵车的时候都去注意红灯,而不是绿灯一样。 我们通常会以遇到了多少个红灯来评价某次通勤的顺畅程度。

安卓有一些相当大的"红灯"API(指糟糕的API)。比如说,Fragments 是安卓里一个非常有名的旗舰性的糟糕API。事实上整个生命周期都是令人抓狂的,包括Activities和Fragments。而iOS是其不应该那么糟糕的活生生的证据。没有人会否认这一点。它是如此糟糕,以致于去年夏年我第一次尝试使用的时候我当时就放弃了。我认输了。滚蛋吧,我心里想 -- 我也许有一天会雇个人来做这件事(指开发安卓客户端)。

第 4 段(可获 1.78 积分)

然后在接下来的半年时间我就再也没有碰过安卓编程了。

被俄罗斯人所拯救

我一直听说出来了一种JVM平台和安卓上的新的编程语言,叫Kotlin。  它来自俄罗斯。更具体地说,是来自JetBrains,它是世界著名的IntelliJ IDEA IDE(集成开发工具)的制造商,其成名的主要原因 是它可爱的橙色、 绿色、紫色和黑色等不同颜色的'Darcula' 主题。

图1:  一个很老的吸血鬼在表达他使用Java 8时的兴奋心情。

那为什么叫它Kotlin?很明显有一种寓意就是,它是对Java的‘J’的增量。基于此,我们能想到的'Kremlin'、'Khrushchev'和 'KGB'都已经被使用了,大部分是被加州大学伯克利分校所占用的。因此他们就选择了仅次于它们的最好的东西,即以一个俄罗斯军事基地的名字命名。这并不是一个糟糕的名字。你要习惯它。

第 5 段(可获 1.73 积分)

去年我就注意到Kotlin有相当数量的关注。  不是炒作,只是一些关注。人们都在很低调地谈论它。因此当然了,我也观察了一下,就如我在过去15年时间里对其他几十种语言所做的那样,只为探寻任何可以替代Java的合理的东西。

Kotlin的第一印象

当我第一次看Kotlin时,我承认我并没想过我会在实际生活中用到它,甚至根本不可能。我只是逛街一样。第一眼?没看到什么不妥的东西。它整洁且具现代感。 如果非要说有什么的话,那就是它在语言设计层面很时髦的应用了所有最近的新趋势。但有许多语言也是如此。 例如Rust,另外一种可靠的、命名良好的、但几乎没人使用的语言。一个语言有多“好”,从应用的角度看并不重要。

第 6 段(可获 1.91 积分)

不过,Kotlin让人感觉有点诡异的熟悉,最后我才意识到那是因为它有点像Swift -- 我是慢慢才注意到的,因为我的iOS应用由于恼人的遗留历史问题一直在使用 Objective C。当然现在我知道其实是相反的:Kotlin 比Swift 要早几年出现,所以更准确地说, Swift 有点像 Kotlin 

但这些并没有让我下定决心使用它。Kotlin 只是另外一款看起来很体面的语言,而作为一个上班族,我并不想花费大量时间来学好它,从而来做些真实的东西。

第 7 段(可获 1.34 积分)

从实践Kotlin到抛弃Java

我记不清楚我到底是什么时间或者如何爱上Kotlin的,但我完全没有预料到会这样。

据我所记,当时我的游戏的玩家一直在乞求我做一款安卓版本的游戏。我的游戏是12月份在苹果的App Store上架的,在短短几个星期内,大量的老粉丝告诉我如果没有安卓版的话他们就没法玩。因此,尽管我已经“永远”的抛弃了安卓,我还是决定再给它一次机会。但是必须得改变些东西,因为我不想再次 使用古老的安卓Java语言进行开发,我需要一个框架来减轻点疼痛。

第 8 段(可获 1.65 积分)

一月中旬,我做了快速的评估后决定试用Kotlin,它同时还支持安卓的 Dalvik 和 Art 运行时环境。我想我在评估时,同时考虑了以下三方面: (a) Kotlin 的热度, (b)希望我能使用Swift重新我的iOS应用,还有 (c) Kotlin有一个比较聪明的名叫Anko的安卓DSL,虽然最终我并没使用它,但是它一开始就引起我的兴趣。

所以我准备开始试用它。 在接下来的4到5周时间内, 我使用Kotlin对我已经使用20多年的游戏服务平台进行了改写。 使用了Kotlin一个月之后,我彻底折服了。我并不是要贬低Scala或者其他任何语言,但是对于一个像我这样的普通人来说,Kotlin是完美的。我只是想要街头食品,你知道吗?Scala 很不错,但是对我来说太花哨了,它全是牛蛙腿、牛脑和松露蜗牛。使用Clojure、Scala或其他东西对我来说有点格格不入。

第 9 段(可获 2.09 积分)

我只花了差不多三天的时间就学会了足够的Kotlin知识以便可以开始写一些代码了,虽然我完全明白我不知道我在做什么,但是我知道这个语言和开发工具能让我省去不少麻烦。

而一旦我有一点顺手的时候,哇,那可了不得了。用过了太多的语言都有点厌倦,我都认为我永远不可能再喜欢上一种语言了,但Kotlin实在是太棒了。 使用它写出来的任何东西都让我感觉我是在做很酷的事情。当然以前用其他语言时我也有过类似的体会,但是它们中的大多数学习曲线相当的陡,Kotlin却是为我们这些仍然为Java 8 的各种名词(parallel streaming filterable collecting scheduled completable callbacking futuring listening forking executor)抓耳挠腮的Java程序员们所量身定制的。  Kotlin给我们提供同样的能力(实际上更多,由于它的协同支持),不过使用它能够更容易的表达东西。Java 8也可以让你表达一些有趣的事情,但是你不得不大费周章。

第 10 段(可获 2.3 积分)

不过,我想Kotlin容易学习的其中一个最重要的因素是由于它的IDE的支持(很棒)。 其他的几乎所有的JVM语言或安卓语言(除了Java)往往是由固定的几个社区志愿者进行IDE的支持。而Kotlin则是由世界一流的IDE供应商所发明,因此从一开始它便有了最好的工具支持。你能想到有多少语言从一开始就有IDE支持的?  大多数语言都不是这样进化的;实际上很多语言设计者完全避开IDE。(没错,罗伯就是个典型的代表!) 我能想到的仅有的另一个是C# ,而且C#无疑是地球上最好的语言之一。

第 11 段(可获 1.53 积分)

作为一个以IDE优先的语言的好处是,你可以在Kotlin的缓冲区里输入任意东西,哪怕是大概差不多正确的东西,IDE就能很贴心的告诉你你想要输入的是什么东西。 更牛的是,你甚至可以把Java代码复制过来,它能够为你自动转换(为Kotlin)。如果你喜欢Java的IDE支持功能的话,我可以告诉你Kotlin已经把这种体验提升到了一个前所未有的高度。甚至一个前微软的工程师曾经跟我说,"我曾经以为Visual Studio是无与伦比的旗舰IDE,但是IntelliJ实际上技高一筹!" 我也不知道Visual Studio到底怎么样,所以我就只是引述他们所说的话(也就不作评论了)。但是我敢打赌IDEA至少跟VS能打个平手。

第 12 段(可获 1.5 积分)

当然,我会经常切换到Emacs来完成工作,因为使用IntelliJ就没法打字很快。它的自动完成功能无法跟上快速打字的速度,因此最终往往是你的文件里到处是打了一半的标识符。而且对于原始文本操作来说,同样很糟糕,就跟其他IDE一样。因此我需要同时使用两个IDE。Emacs的Kotlin支持目前来说并不那么好,不过随着时间推移也许会有所改善吧。我经常在Emacs和IntelliJ之间来回切换,而且我也已经习惯了。

我花了十几年时间寻找一个能够替代Java的语言。找起来真的很辛苦。具有讽刺意味的是,当我决定放弃的时候,它终于出现了。 对于JetBrains来说,是一个很了不起的成就。

第 13 段(可获 1.74 积分)

Android:Kotlin的杀手级应用

现如今任何一门新的语言要想获得紧密的关注几乎是不可能的。那并不是说就没有新语言产生了。几乎每年都会有全新的语言产生!但是几乎没有人会使用让它们。语言市场已完全饱和了。 一门新语言想要引起关注,唯一途径就是有一个“杀手级的应用”使用它,而且我认为可能在未来的十年,甚至是二十年时间内都是如此。它需要一个平台,这个平台每个人都很想使用,因此也就愿意学习一门新语言来在上面进行编程。

第 14 段(可获 1.49 积分)

事实证明,完美的杀手级应用是安卓的蹩脚的Red Light 的API。 当你在安卓世界里沿着道路快速行驶时,每当你遇到一个API挡着你的去路的时候,你会诅咒这个平台。实际上只要有足够多的糟糕的API使你不得不停下来四处寻找解决方案,那么无论安卓有再多优秀的API都不重要了。

而且在安卓里大的“解决方案”比比皆是。对于初学者来说,有大量的Java注解处理器,这就明确说明了这个语言是有问题的。而且还有一大堆的像 Lyft's Scoop的小型框架。甚至还有有全面偏离安卓的东西:  React Native,Cordova,Xamarin,Flutter等等。毫无疑问,人们都开始寻找替代品了。

第 15 段(可获 1.8 积分)

当你有这么大的差距的时候,有一个基于语言的解决方案的机会。不出意外的话,解决方案都是基于非Java的特定语言。

然而Kotlin的竞争优势是它并非完全的脱离Java。它是百分百的可以与Java进行互操作,甚至是interminglable(什么鬼?!),几乎达到了C++和C的关系。 Kotlin 感觉像是进化出来的东西。你可以开始将它混入你现有的Android项目里,也就是在同一个目录下,互相来回调用,睫毛都不用眨一下。

第 16 段(可获 1.24 积分)

所有其他的大型Android平台竞争者都会使你不得不学习和使用一种完全不同的语言和平台, 而且每种语言都有自己的范式、习语和怪癖。 Kotlin让你可以像普通级别的Android程序员那样编写Android程序。 API完全一样,但是在一定程度上来说更好些。而且感觉好了一个数量级。

去年夏天我先是把Android书籍书扔到墙上,然后放弃了, 但是现在有了Kotlin,我发现Android编程可以说是很愉悦。我想这说明Android那些"糟糕的" API也并不是那么糟糕,而且可以说是Java自身的一些特性掩盖Android的整洁功能。








第 17 段(可获 1.6 积分)

Kotlin会设法帮你绕过几乎所有的Android红灯,这种体验在整体上我认为要优于iOS开发。至少对于Objective-C来说是这样的。我相信Swift很棒,因为它跟Kotlin比较相似!

我特别喜欢Kotlin的哪些方面?

关于细节将会是另一个比较庞杂的内容,因此我会单独写一篇文章来讲述。接下来呢,我只是讲一些比较高级别的概括的东西。

  • 跟Java工作类似。它并不像Clojure或者Scala那样有点“怪怪的”(正视这点吧,他们确实相当的怪异)。你可以很快的学会它。很显然它就是为Java开发者量身定制的。

  • 比Java安全些。它对很多需要使用Java注解处理的东西都提供了内置的支持,比如覆写(override)检查、空值分析等等。它还具有更安全的数字转换规则,虽然我并不怎么喜欢它们,但是我很感谢它们使得我能够更多的考虑数字的表示方法。

  • 跟Java可以互操作。而且他们的交互是无暇的。我见过太多的JVM语言无法继承一个静态内部类或者非静态内部类,或者一些你需要的怪异的边缘情况。Kotlin把与Java的互通性作为作为首要考虑因素,也就是说迁移到Kotlin可以逐步完成,一次完成一个文件即可。

  • 简洁。我有点像高尔夫球手,这点我承认。在其他情况保持不变的情况下,我更喜欢能够做同样事情的较短的程序,前提是它们足够清晰。平均来说,我发现它比等价的Jython代码要短上5%-10%(这是我的黄金标准),并且还能保证更具可读性和更加的类型安全。

  • 实用。Kotlin允许多个类在同一个文件里,还有顶级函数、操作符重载、扩展方法、类型别名、字符串模板和一大堆其他语言特性,而这些东西不管什么原因,即使大家都希望能实现,但Java就是没有引入。

  • 快速发展。例如它们刚刚推出了协同程序支持,提供异步的async/await,生成器和所有其他你会喜欢的线程并发特性。

  • 大胆博采众长。Kotlin经常从其他语言吸取伟大的思想,而且从不试图隐藏。它们会说,“我们喜欢C#的泛型,所以我们这样做。“ 我喜欢这一点。

  • 有DSL。如果没有认真考虑好替代方案就不应该创建DSL,但DSL做得好就可以成为一个强大的工具。比如,相比Gradle的DSL,Maven项目中则拥有数以千行计的XML文件(真的是令人头疼)。Kotlin使这样的东西实现起来很容易。

  • 有一个牛逼的IDE。最近我在Emacs里写一些新文件,它能让我很快写出大量的代码,但是里面却充满了一些可怕的错误。然后我把它们在IntelliJ里打开进行编辑,通过使用Alt-Enter大约50次,IDE就替我解决了一切问题。这是一个伟大的共生关系。

  • 很有趣。Kotlin就是很有趣。也许是潜意识的广告,因为他们的声明方法的关键字是有趣的。但也因为此,我从一个呆板的专业程序员又变成了一个爱好者。

第 18 段(可获 7.25 积分)

总之,你懂的。我收拾好一些,搬到一个新邻居门下,它的名字叫Kotlin。我曾经沉迷于其他语言很多次,但是从来没有用它们重写我以前的宝贵的Java游戏服务器代码。 但是现在呢,我正忙着尽快将所有的东西都用Kotlin进行重写。

我认识不少其他程序员早就全面转向了Kotlin。他们中的大多数比我至少要早一两年。我们有时会谈论它。  "Kotlin再次使编程变得有趣,"我们都这么说。有趣的是,我们都只有在使用了Kotlin之后才真正领会到编程会变得如此有趣。它把你带回到你第一次学习编程时的样子,一切看起来似乎都可以实现。

第 19 段(可获 1.68 积分)

再次致敬JetBrains。他们用这种语言做了一件很了不起的工作。我脱帽子表示致敬。

那么,Kotlin是否比你使用的任何愚蠢的语言都要棒吗?我认为是这样的。而且如果恰巧你正在使用Java的话,当然更是如此了。如果你的日常工作涉及到使用Java进行编码的话,我想你会觉得Kotlin就像是一口令人心情气爽的新鲜空气。让我知道你们的想法吧!

免责声明:以上这些东西是基于我个人的安卓开发的经验的个人观点,并没有受到我的雇主或者JetBrains公司任何形式的支持。

第 20 段(可获 1.19 积分)

文章评论

访客
准备开始学习kotlin~