谷歌大牛说:为什么 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 看起来非常有意思!

原文链接:http://mp.weixin.qq.com/s?__biz=MzA3MDMyMjkzNg==&mid=2652262391&idx=1&sn=47c8d4834df6a6643dc64c008c61b6c4&chksm=84dc7060b3abf976ad4711116e54c7a0ceb48b8ac46f5994e0a36e008ddf82073a413e4f28fa&mpshare=1&scene=23&srcid=0525NidEaeLlL1cnkvxGgvJg##

ps:

Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行,最近发布了Kotlin/Native能把Kotlin编译成机器码,也就是C/C++一样的能力。本专题专注Kotlin,Kotlin/Native,KotlinJS与Kotlin_Android的那些事,让我们共同学习Kotlin壮大Kotlin~

加入专题吧Kotlin-Android-KotlinJS-Kotlin/Native:http://www.jianshu.com/c/e88f0f9356a8

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容