我的第一门课程 “Kotlin 系统入门与进阶”上线一年来,我不断地与大家探讨学习中的一些问题,最近颇有心得,遂分享给大家。
庄子曰:吾生也有涯,而知也无涯。
工作了这么久还要回头来谈学习,也许有些奇怪,但细想下,学校生涯的结束才是诸位学习的又一个新的开始。记得刚工作的时候组里有位大神吐槽:有些人,工作了十年还不如个两年的新人——是这位新人学得太快,还是这位老人学得太慢?都不是,而是这位老同志大概在适应了工作的环境之后就停留在了“舒适区”,止步不前了。想必大家都熟悉“舒适区”这个概念,如果你想要持续得到进步,那么你就不能过得太舒服,不然就如同这温水煮青蛙一般,一旦环境有变动,你将无所适从。
那么说到 Kotlin,它与 Java 是一脉相承的,这与 React Native、Flutter 有着本质的差异,即便我们有理由不去学习后面二者,那在现在的大环境和大背景之下,不去主动出击学习 Kotlin,就会直接导致大家失去一些选择的机会,也会让大家失去在技术思维和技术视野上反哺 Java 的机会。作为 Android 开发者,我们实际上已经没有理由继续待在 Java 的“舒适区”。
持续学习,要求我们能够勇于探索自己不熟悉的领域,主动扩张自己知识的边界,时刻敏感地关注行业变化,让自己始终保持活力。
每当有一门语言放在我们面前,糟糕的是我们还必须得学它,更糟糕的是在资料并不是很丰富的时候,我们该怎么办呢?
这实际上是一个饶有趣味的话题,前几天在群里跟同学们聊到一个点:看别人的例子学得快。我们且不说这个看别人的例子的问题,单说这个创造例子的“别人”,他又是怎么学得快的呢?无论什么东西出来,总会有那么一个人走在前面,他的付出自然是要比别人多一些的,因为他没有例子可以看,他是原创。
尽管说,遇到问题的时候大家很多人很多情况下都是可以在网络上搜一搜就能找到答案,但这并不是一个问题的通用解法——总有你搜索不到的东西,搜索不到的时候你该怎么办呢?千万不要说算了吧,如果是那样,你也许就在错过一个绝好的开创的机会;也不要说我不行,面对一个未知的东西,最开始大家都是一无所知的,所以要勇于去探索。
拿我自身的例子来说吧,作为国内最早一批接触 Kotlin 的人来说,一开始遇到问题需要解决的时候,感觉确实没有“网络上搜一搜就能找到答案”那么轻松,手头可以参考的主要就是当时还比较简陋的官方文档、Kotlin 的源码以及 Kotlin 编译之后的字节码,我比较早期的 Kotlin 文章基本上都要涉及点儿 Kotlin 源码阅读的内容,至少也要涉及 Kotlin 编译之后的字节码的分析。显然这几样是当时仅有的、也是最直接的问题的答案所在。
直到现在,我也比较建议大家在学习 Kotlin 的过程中:
- 仔细地不断地反复地研读官方文档,官方文档虽然言简意赅,但不是言之无物,我最有感触的就是泛型部分的内容,我前后阅读了不下五遍,每一次觉得自己理解上有不通的地方就去仔细研读,再结合一些实际的案例最终豁然开朗。
- 遇到问题特别是与 Java 兼容的问题时,先查看一下字节码,尽管阅读字节码可能会让人稍感不适,但长此以往必定对你的 Kotlin 学习乃至 Java 进阶大有裨益。
- 至于 Kotlin 源码,阅读难读较大,需要对编译原理等相关内容有较深刻的认识,除非遇到一些比较隐晦的知识点,多数情况下不需要。
我不反对大家直接去尝试使用 Kotlin 的一些高级特性,显然 Kotlin 所有吸引人的点都建立在这些特性之上。但浮于表面的把玩无非是在炫技,深入本质的运用才能让你熟知这些特性如何使用才能有效的提升你的开发效率。
深入学习,要求大家遇到任何语法、模式,都要深入探究一番,了解其中的来龙去脉,不能浅尝辄止。遇到任何不知道的扩展方法,例如当你看到 listOf(1,2,3).windowed(2)
不知道什么意思,马上去看源码,都可以搞清楚的。
不仅如此,学习过程中大家还要尽可能的联系对比其他语言,例如我们在探讨 Kotlin 的语法的时候就经常喜欢与 Scala 做对比,对比二者是如何处理类型,如何支持运算符重载;而与 C# 对比呢,也可以对比下泛型的实现机制,还可以对比下协程的支持;还可以跟 swift 对比,对比二者在处理空类型安全时的异同;我们甚至还可以与 Groovy 对比,对比 Kotlin 和 Groovy 在 Dsl 支持方面的优劣,最典型的例子就是 Gradle 了。
在深入了解语言本身的特性之后,还要思考语言设计者为什么这么设计。这个不是一个容易地过程,也不一定就能很轻松的找到答案,但经常站在上帝视角思考问题,思路一旦打开,便是别有洞天。
编程是一个需要大量动手实践的学科,需要不断地训练你的思维,让你的大脑能像编译器一样思考代码,并且让你的代码能像人类一样充满思想。这不是一个一蹴而就的过程,这需要长时间的积累和仔细的揣摩。
当然有人就会说,我很努力的在揣摩啊,可是我就是悟不透怎么办?
我们总是喜欢用一个人写过的有效的代码行数来衡量他所处的成长阶段,这里的有效是要剔除重复劳动的,即你后一刻的代码一定要比前一刻的有进步——但这样很难统计,所以干脆假定所有人都是主动上进的,于是只需看看你写过多少代码好了。有 1万行和 10万行代码经历那是完全不同的感觉,前者甚至无法想象的到后者的状态,我们只有不断地去实践才能有所思考,有所提升,有所感悟。
学习 Kotlin 之初,得益于还不错的 Java 基础,我自学了一周就开始尝试写项目,一个月之后就开始特别胆大的在公司项目里面使用 Kotlin,又过了半年多干脆开始写文章,后面又开始录视频直到现在。所谓教学相长,从事 Kotlin 布道也是一个很好的让我充分实践 Kotlin 的过程,期间也对一些模棱两可的知识点进行细致的研究,对各方面语法特性的理解也在不断加深,想想现在能有机会不断地给大家讲解 Kotlin 的知识点,全依赖于过去不断地实践。
提到多实践,想必道理大家都懂,只是很多人表示不知道该写点儿什么,谈何实践?这确实是一个比较劳心伤神的话题,不过这一次我为大家带来了一套全新的 “Kotlin 1.2 in Android 实战课程”,课程当中我选用了大家最为熟悉的 GitHub App 开发作为整套课程的线索,将 Kotlin 的高级特性一一融入其中予以讲解。通过这套课程,我们一方面要把学到的 Kotlin 的知识点结合实际的运用场景为大家呈现出来,让大家不仅知道这些知识点如何用,还要知道用在哪儿;另一方面,我也希望能以此给大家带来启发,如果实在找不到练手的项目,开发 GitHub App 是最合适不过的了,毕竟 GitHub 与我们的开发生活息息相关,同时它提供的接入流程和接口规范都是业内教科书式的典范。
这套课程的设计过程中,我们充分考虑了大家学习实践的需要,在讲解完必须的知识点之后,为大家留足了自我发挥的空间,既避免了填鸭式的灌输,也能充分调用大家实践的热情。
同时,我们也充分考虑了大家的学习需求,重点对泛型、反射、属性代理、协程、Dsl 做了详尽的讲解和框架设计与开发,力求带着大家完成“深入学习”和“实践学习”的部分环节,在教会大家知识点的同时也希望能让大家掌握这一学习方法,正所谓“授人以鱼不如授人以渔”嘛。
常言道:活到老,学到老。
我们如果想要跟上时代发展的节奏,就需要持续学习;如果想要走在别人的前面,就需要原创学习;如果想要成为领域内的专家,就需要深入学习;而这一切都最终要归结到实践学习上,通过实践,才能让理论得到升华,进而反过来促进理论的发展。
共同学习,写下你的评论
评论加载中...
作者其他优质文章