书 灵魂
我们从来都不缺书,缺的是有质量有灵魂的好书。
1. 功利与我们
最近 Kotlin 官方在搞一个 “Kotlin Hero” 的活动,这个活动可能在国外会比较流行,但在国内恐怕就要做冷板凳了。因为我们都很功利,能看到利益的我们就冲上去了,而这个 “Kotlin Hero” 能给我们带来什么?我拿了世界冠军,面试的时候有人看吗?
我们的功利,同样还反映在书上面。每当一个热点出现,就会有无数追热点的人。我记得 17年谷歌刚刚在 IO 大会上立太子的时候,一夜之间那个小而美的QQ群从400人涨到了 1700 多人,里面不乏打广告的,挖人的,干什么的都有。
2. 灵魂与书
当时市面上还缺一本 Kotlin 的书,我在想,大概很快就会有一本 《Kotlin 权威指南》问世了吧。不过幸运的是,这事儿没有发生。为什么呢?我在读书的时候每周二下午都会在学校图书馆等新书,Android、Java 相关的旧书也基本上被我都翻了一遍,总结的经验是什么 “疯狂XXX”、什么“XXX权威指南“、什么”XXXX实战经典“ 这样的书大多就是抄袭官方或翻译文档,要不就是写一个 Demo 项目通篇贴代码,很少见到作者的思考——这也不能怪他们,因为可能他们也没怎么真正用过这些东西呢。
当然,让我感到幸运的是,”深入理解“ 这块儿牌子暂时还没有被毁,周志明老师的《深入理解 Java 虚拟机》这本书的内容我三番五次的翻阅,算得上是我买的最值的一本书了;
3. 一本有灵魂的书
同样没有被毁掉的,还有 ”XXX核心“,最出名的自然就是 《Java 核心技术》了。然而,最近发现一本书叫 《Kotlin 核心编程》,我看到这个名字的时候第一感觉是”不好,又要毁书名啦“。但本着实事求是的态度,我当然是要鉴定下再下结论的嘛,通读了一下,发现书的内容还是非常超预期的。
作为一门讲解 Kotlin 语法的书,我们对它的基本预期就是把语法用法讲解清楚,如果只是做到这一点,那么它就会像我前面提到的”没有灵魂“;但如果能把语法设计思路以及与其他语言的横向对比都综合起来讲解的话,那么作者对于语言设计本身的理解和认识都就跃然纸上,读起来就不再会是翻字典一样的枯燥无味了。
这本书在讲解 Kotlin 的时候对比了 Scala、Java 8 甚至 Haskell,Kotlin 在语言设计之初就极大的参考了这些语言,这一点我是非常认同的,如果大家留意之前我的文章,你就会发现我也特别喜欢这样做。横向对比的好处是让你清楚这项语言特性从设计思路上到应用实践上有何种取舍和考量,你不必对于其他语言做到非常熟悉,你只需要知道其中一点就好:例如 Kotlin 的数据类在 Scala 中类似的角色是什么——这对于提升我们的编程思维有极大的好处,拓宽视野就自不必说了。
在讲解 Kotlin 的语法时,本书侧重于更深入的剖析,因此开篇用了一章(第2章)就快速的贯穿了整个语言最有特色的部分,例如 val/var,Lambda,表达式等等,对于有基础的开发者来说,这个讲法显得非常的不浪费时间,因为很快你就会发现你想要的东西。例如,2.4 节标题叫”面向表达式编程“,这个提法我过去是没有听到过的,自己也没有往这个方面去想,尽管我们经常在可以使用表达式的时候优选表达式(例如 when表达式,函数表达式),但这一理念并没有被明确的提出来——如果大家用其他的语言,你就会明显的发现这一点,很少有语言把 if ... else 也作为表达式的。
我比较喜欢的还有对于 Kotlin 的类型系统的讲解。本书花了一章的篇幅讲解类型系统,类型是语言的根基,教学的过程中我也确实发现有些同学对于类型的认识不足,导致对很多语法现象无法深入理解。例如书中提到 Any? 和 Any 的关系,实际上我们没有从官方得到明确的定义,但直觉告诉我们这二者一定是有关系的,什么关系呢?通过里氏替换原则,所有适用于 Any? 的地方都可以用 Any 替代,那么后者一定是前者的子类,类似的还有 Nothing? 与 Nothing 的关系等等。类型系统的讲解,自然要提到泛型,那么泛型相关的方方面面也都呈现了出来,除了必须要讲的型变,连 Java 1.5 的泛型为什么采用擦除的机制(而我们知道 C# 2.0 引入泛型时却背道而驰)都有提到,甚至还把泛型信息存储到字节码签名信息中的点也都点到,很全面,而且都是我面试的时候特别爱问题的语法基础知识点。
函数式编程部分对我帮助比较大,毕竟我也没有特别多的函数式理论基础,JavaScript 的函数式的书籍看的比较多,Scala 的小红书(《Scala 函数式编程》)啃了一半儿就扔一边儿了。这一章以 Kotlin 为实现目标,以 Scala 为辅助,以函数式的几个重要概念为主线展开讲解,整个内容读下来还是颇为耐人寻味的。特别是读到 Functor 的部分时,作者居然用到了定义在类内部的扩展方法来实现:
使用时则通过 run 来获得外部类对象的作用域:
这个写法颇有技巧性,恰好我在前几天完善我的 Kotlin DeepCopy 这个框架的时候也用到了这个技巧,会心一笑。
整体读下来书的内容还是非常翔实的,如果大家初学 Kotlin,那么建议阅读官方开发者编写的《Kotlin 实战》,如果大家有一定的 Kotlin 开发经验,需要寻求进阶,特别是转 Kotlin 的 Scala 开发者,《Kotlin 核心编程》这本书会非常的适合你。
文章来源:微信公众号 Kotlin