前言
很高兴见到你 👋 我是 Flywith24。
在大学刚入学时,我与老师进行过一次「术」和「道」的讨论:大学应该教什么,学生应该学到什么,如何学习。
如果将我之前的文章看作是对各种「术」的整理,那么本文的内容是对「道」的讨论。
在本文中,我会回顾自己学习 Android 的经历,并总结我在这一过程中对学习方法及路线的思考。
关于 Flywith24 名字的由来
为了不干扰阅读,感兴趣的小伙伴点击查看详情
我是科比的球迷,从 07-08 赛季的总决赛开始喜欢科比。而他的绰号叫「小飞侠」,因此初中时候给自己起了一个网络 id:与 24 号一起飞翔。
在大学时觉得太中二了,于是改成了 Flywith24 。
我的付费专栏 Android Detail 的名字致敬科比的一档篮球节目 Detail。
同时也欢迎各位小伙伴加我微信交流,微信号:Flywith24
起点——大一结束的暑假
那是 2015 年的暑假,这是我第一次了解济南最热时的温度。学校放假了,但我没有选择回家避暑,而是选择留在学校,开始了我的 Android 学习之旅。
在放假前,在师哥师姐的帮助下,我已经对 Android 有了简单了解,并且搭建好了 Eclipse + ADT 的开发环境。随后,官方发布了Android Studio 1.5 正式版,这意味着一切都是新的,需要从头学起。
至今我还记得看过的第一个教学视频,内容是使用 Fragment 实现微信主界面 tab 切换功能,后来我才得知视频的制作者是大名鼎鼎的 鸿洋。
挣扎迷茫——在校的自学之路
就这样自己学习了一年,但我发现这样的学习方式不能使知识体系化。彼时 郭霖 的《第一行代码第2版》出版,我开始了自己系统化的学习。
同时,我写了我的第一个 app,一个社交 + 运动类的 app,建大约跑。当时写代码就是在网上找想要的功能,然后抄到自己的项目中 🤣。
在校学习一直困扰我的问题是 对知识的掌握不成体系,有点闭门造车的感觉。大四时由于自己修够了学分,便选择了出去实习。
独挡一面——实习
在大三下学期期末考试前,我成功拿到了实习公司的 offer,并在 2017.07.03 开启了我的职业生涯。
我很幸运,实习公司有一批经验丰富的同事,其中还有一个当时有着 7 年 ROM 开发经验大佬。而领导对我也十分信任,将新立项的项目交给我——一个即时通讯的项目。
我在这段时间成长飞速,从零到一完成了公司的项目。学会了与后端开发人员配合,了解了 WebSocket,知道了 WebRTC 可以实现音视频通话,学会了自己封装 C 写的加密算法并通过 Java JNI 调用,后来还搞定了文件的分段加密和上传下载。与此同时,我还向大佬请教了很多 ROM 相关的知识。
在实习阶段,我成了一名能够独挡一面的开发者。但我依旧很焦虑,因为我知道自己开发项目只是处于「会用」的阶段,知其然却不知其所以然。
在这个阶段我知道了 Stay 的有心课堂,并开始总结学习方法,制定自己生涯的规划。
「有心课堂,传递的不仅仅是技术」,该站马上要关闭了,但我永远不会忘记 Stay 和 谷歌的小弟 等人给我的帮助。虽然你们不认识我。😆
渐入佳境——毕业后的工作
大学毕业后,我还是很焦虑,依旧是因为自己的知识体系不清晰。但我很清楚自己需要的是什么,我需要掌握一个科学的学习方法(道),而不是不断学习如何使用新技术(术)。
此时我了解到了 扔物线 的 HenCoderPlus
第三期的课程,价格很贵(我当时一个月的工资都不够🤣)。但我是一个愿意为自己投资的人,因为我知道,对自己投资永远不会亏损。凯哥在课程里说最多的话是:抓住本质 。其实课程里的内容都看似很「基础」,但我隐约觉得我当时就是需要这些内容,来建立自己的知识体系。
毕业一年后,我学会了 Kotlin,知识体系越来越清晰。更开心的是我转岗到了之前的大佬同事(毕业后我跟着该大佬来到了新公司)的手下同时做 App 层和 ROM 层的开发工作。就在此时我一边学习着如何定制 ROM,一边开始学习 Android Jetpack 相关组件。
但此刻我依旧焦虑,虽然自己的知识体系稍微清晰些,但我还是没有总结出自己的「道」。
观察——成功不可复制,但优秀的人总有相同的特质
2019 年中,我在掘金认识了 KunMinX,他的文章真是「大道至简」,因此我订阅了他的专栏——《重学安卓》。KunMinX 的文章都是经过「深度思考」的产物,我也通过该专栏结识了一大批志同道合的小伙伴。
同时在这个阶段,我知道了很多优秀的开发者,他们的文章都很有特色并且质量非常高:
我特别喜欢看别人的文章,观察这些优秀的人是如何思考的。
我一直持有这样的观念:一个人的成功不可复制,但优秀的人会有着相同的特质。
这些优秀的人共同的特质是什么?科学的学习方法是什么?我自己的「道」究竟是什么?
悟道——不仅要抬头向前,还要停下思考
我不是一个天赋高的人,但我喜欢总结。我的初中数学老师给了我这样的评价:你不是学东西最快的,但你掌握知识后的总结能力很棒,以后要发挥这方面的优势。
我一直在思考自己的「道」,直到看到 埃隆·马斯克 在 reddit 回答网友「你是如何做到学习如此快速的?」时,一切清晰了。
埃隆·马斯克 在四个领域(软件,能源,交通,航天)建立了四个数十亿美元的公司。
一点建议:把知识看做一个语义树十分重要,在你进入到叶子/细节之前,确保自己清楚基本原理(即树干和大树枝),否则这些叶子将无处安放。
我明白了,一些都清晰起来:
为什么我在大学时期学习 Android 这么挣扎,为什么工作后依旧因为知识体系焦虑。
因为我的「叶子/细节」无处安放啊。
为什么大学主要提供数据结构,计算机网络,操作系统原理,数据库,C 语言,这种通用技术课程而极少提供细化的技术类课程,如移动端开发,后台开发等专于某个领域的技术栈。
为什么大公司更看重一些看似平时用不到的基础知识,数据结构算法,网络,底层原理。
因为根基最重要啊,知识体系就像一棵树,有了根,才能慢慢长出树干,粗大的树枝,最后长出叶子与果实。
这不是什么神奇的理论,甚至中国的古话:「磨刀不误砍柴工」表达的也是这个意思。
因此我把学习方式分成两种,通用学习 和 需求学习。前者偏向于「道」,后者偏向于「术」。
所谓通用学习,便是树根,树干。具体些便是学习半衰期长的知识内容,因为这些内容通常是行业标准。行业标准,一定是简单易用、稳定可靠,所以才成为行业标准。所以行业标准一定是可以学习、可以掌握的(摘自 KunMinX 这是一份简洁有力的认知地图)。
而需求学习,偏向于某个具体领域的知识内容。相较于 Java 的通用学习,Android 的专用库便是需求学习。需求学习的内容通常知识半衰期较短,更新变化快。但 掌握了正确的学习方法,抓住本质,学会深度思考,需求学习的效率会很高。
仅仅掌握这个方法是不够的,还需要善于总结的能力。不要随机地学习,不要无思考地学习。将不同领域的知识连接起来,找到其共性,从扎实的根和粗壮的树干开始,随着知识增多,枝条和树叶开始与其它树木连接起来,最终孤木成林。要成为优秀的「园林艺术家」而不是普通的「标本收藏家」。
如果上面的描述比较抽象的话,这里举个简单的例子:
学习使用 OkHttp
,分析其源码。这属于什么学习?Okhttp
是 Java 做 Http 请求的工具库,我们可以将它视作需求学习。那么它的通用学习(根)呢?当然是计算机网络相关的内容,不了解 Http 报文,网络传输的分层,不同层级的协议等内容是很难理解其实现的。
它是否与其它树木有关联呢?有的,OkHttp
的核心是拦截器,那么是如何实现的?这便涉及到了责任链模式。责任链模式最初的定义为:如果某个处理器处理了该请求,则不会传递给后续的处理器。它还有一个变体:请求中途不会停止传递,所有处理器都会处理一遍。
Android 中有其它地方使用到了该模式了吗?View 的事件传递使用的是递归 + 责任链模式。
当你在为「return true」,「消费」等琐碎孤立的知识点苦恼时,回顾一下责任链的定义,是不是更清晰了。View 的事件传递为什么有 touchTarget
?为什么它的结构是链表?因为责任链模式的最常见实现方式就是使用链表存储处理器啊。责任链还可以使用数组实现,为什么选择链表?就这样一个个孤立的知识点便串联起来,一片片叶子交织在一起,成为森林。
实践——基于自己的方法学习
总结出自己的「道」,接下来要做的便是遵循自己的道进行学习,下面我介绍自己实践时的两个例子:
实践1:从根到叶的学习
在学习 Android 生命周期时,需要了解 Android 中的进程模式及进程优先级。而 Android 是基于 Linux 内核的,因此我先学习了 Linux 进程相关的知识:
课程内容有很多,例如网络部分,虚拟化容器化部分目前与我的技术栈关系不是很密切。因此我只需关注进程管理,内存管理相关的内容。
梳理清楚 Linux 进程相关的内容,我开始结合 Android 理解进程相关的概念并输出文章:
之后官方文档中关于进程模式的描述便很容易理解了,随后我输出了关于 Android 进程分配和进程优先级的文章:Android Detail:进程篇——进程内存分配与优先级。这篇文章可在掘金直接查看。
实践2:跨域学习
引入 gradle 依赖很麻烦,因此我想基于 uTools 来实现快速查找 gradle 依赖并复制的功能。
使用方式如下:
uTools 的第三方插件需要使用 js 来开发,而我没有学过 js,因此这算一个「需求学习」,同时也是一个跨域学习。
接下来我做了这样几件事:
- 简单学习 js 的语法
- 查看 uTools 插件开发文档,学习如何开发插件
- 查看 uTools 其它插件的源码,分析写插件的套路
- 找到 jcenter 等仓库的阿里镜像地址
期间遇到一些问题,google 仓库的依赖包没有可用的 Http API,只能通过 该网站 查询。
无奈只能通过 F12 查看其源文件,发现其中的每一项都是 xml,因此照葫芦画瓢写出来解析 xml 的 js 代码。
最终这个功能总算完成了,输出文章记录一下:【奇技淫巧】gradle依赖查找太麻烦?这个插件可能帮到你。
这个插件是今年疫情期间在家里闲着无事做的,从出现想法到完成耗时一天半。掌握正确的学习方法,抓住本质,需求学习的效率会很高。
我举这两个例子想表达的是,每个人由于所处阶段不同,目标不同,学习的内容肯定不同。重要的是要掌握科学的方法,抓住本质,深度思考并善于总结。
今年的小成果
掘金
从今年年初我开始在掘金上发文,主要分为 几个系列:
- 背上 Jetpack 系列
- Jetpack 更新系列
- 奇技淫巧系列
- Theme&Style 系列
- 译文系列
从年初发布第一篇文章开始,目前已经拥有 10 万阅读量了(为什么点赞数刚过千🤣)。
小专栏
8 月份我在小专栏开通了 Android Detail 专栏,目前发布 6 篇,累计拥有有 100+ 的读者。这里大部分读者都是从 重学安卓 过来的,此处再次郑重感谢 KunMinX 对我的帮助。
点击查看文章列表
Github
Github 的 ⭐ 突破了 300,虽然看起来依旧寒酸 🤣
公众号
在 秉心说 的启发下,我开通了自己的公众号。更新很佛系,未来会考虑更多将思考类的内容发布到公众号上。
知识星球
在体系化知识之外,还有一些较重要的碎片化知识,因此我创建了一个免费的知识星球,致力于分享高质量的碎片化知识。
自建博客
更换了自建博客 的主题,颜值更高了。
总结
2020 年是让人难忘的一年,这一年发生了太多,疫情席卷全球,篮球迷失去了科比,足球迷失去了马拉多纳。当然这一年也有一些值得开心的事,比如:
感谢在我成长路上所有帮助过我的人 🌹,他们是
大学时期的老师:佀老师,刘老师,侯老师...
大学时期带我入门的师哥师姐们:弓师哥,高师姐,樊师姐
那些未曾谋面的大佬们:郭霖,鸿洋,Stay,扔物线 ,KunMinX,南尘
一直帮助我的可爱的同事们:鑫哥,老胡,阿涛...
也感谢各位读者,尤其是 Android Detail 的付费读者,你们大多是基于对 KunMinX 的信任才订阅的。
虽然与你们不是相同的技术栈也不相识,但我从你们身上观察到了优秀的人的特质。是你们的存在让我不会因为一点点进步而沾沾自喜。
最后感谢我的女朋友,今年几乎每个周末我都窝在家里写博客,每次都使用「不要乱跑外面不安全」这样苍白无力的借口敷衍。感谢你的支持。
我是 Flywith24,一个来自普通家庭,普通学校毕业的普通人。我不是大佬,但我坚信,我在通往成为大佬的路上。希望我的故事能够帮助到那些仍然迷茫的人,祝每个认真的技术人心中有火,眼里有光,越来越好!