技术提升篇:如何快速学习某项技术?
作者:沉默王二 发布时间:2022-07-29T18:14:02.949+0800
球友们好,我是二哥呀。
今天早上在 B 站上刷到颜群大佬分享的《如何快速且深入的学习一门技术 》,视频中的一些观点让我深受启发,于是我就想,不如把比较精华的内容和我自己的一些感悟一起分享出来,希望能给球友们一点点启发和帮助 👍。
内容收录在星球专栏《Java 面试指南》的《职场修炼篇》中,专栏托管在语雀平台上(更方便你沉浸式阅读和做笔记),访问地址和密码:https://t.zsxq.com/6iuzn6I
球友们在遇到好的内容的时候,也一定要记得分享出来,哪怕有一些是别人的观点也无妨,因为从小到大,我们就是一直在吸取,一直在模仿嘛,然后再悄悄地变成我们自己的 😜。
软件开发正处在一个快速发展和高速迭代的窗口,新技术层出不穷,原有的技术也加快了更新频率,那么作为这个日新月异的互联网时代的软件开发者,我们应该如何保证自己的技术竞争力呢?
观其大略
大家可能都知道,英语考试里面有一个经典的题目叫"完形填空",老师经常告诉我们,在做完形填空之前,一定要先花一分钟的时间,把整篇文章快速阅读一遍,对整篇文章有一个大致的了解之后,如果再去做题,准确率就会提高很多,那我认为这种做完形填空的方法也应该同样适用于软件学习。
我们在学习某一个新技术,也应该先快速的浏览一下这个新技术的大致情况,再去研究新技术里边到底包含了哪些技术细节,遵循从整体到深入的过程。
找出套路
各种技术都有自己的模板结构,比如说:
- HTML: 代码结构固定
- Netty: 代码流程类似
- JDBC: 实现步骤固定
不论是前端还是后端框架,这些技术都有一个共同的特点,就是他们有一定的套路可遵循,因此我认为一个比较好的学习方法应该是不管三七二十一,先快速的去了解一下具体的套路到底是什么,然后再去深入研究套路里面的每一步到底是什么,那这样才能高效的学习一门新技术。
那么如何了解套路呢?
在学习一门新技术之前,我们一定得先宏观的、全局性地、快速地了解一下技术的全貌,知道哪些是套路,哪些是重点,那么接下来你可能会问,到底应该如何快速了解技术的全貌呢?
这其实是快速阅读的理论知识了,推荐大家以跳跃性的方式来查阅一些资料,来看一下执行流程是怎样的,具体细节你可以查阅技术官网,看书看博客或看一些视频教程。重点要看这些教程里边反复出现的重复代码,一般而言那些频繁出现的重复代码就是这个新技术的技术代码结构了。
总结一下
如何快速了解新技术?
- 快速、跳跃式的查询资料(官网,看书,博客,视频)
- 注意出现频率较多的重复代码
说白了,就是先囫囵吐枣式的过一遍,就好像拿到一本书,先把目录大纲过一遍,如果是自己已经掌握过的内容,那就不要再看了,直接跳过。
快速的在脑海中创建全景图,有了模糊的知识树导航,对后续的深入学习也好,耗费的时间成本也好,都会有一个最初印象,一定程度上可以消除对新技术的陌生感和恐惧感。
二哥的理解
那这里就不得不提一提 helloworld 了,学习任何一门新技术,先搞出来一个 helloworld 再说别的。
要知道这个 helloworld 可不容易了,它还需要一些前置条件,比如说我们学习 Java,得装一个 JDK 吧,得装 Intellij IDEA 吧。
如果是在云服务器上,还得懂 Linux,掌握一些必要的 Linux 命令,否则前置条件这块就能把人搞崩溃。
这也就是为什么大神/极客总喜欢在命令下搞事情,而新手小白喜欢在图形化界面里搞事情。
大学往往是不会教这些的,不会教你怎么用 Shell,不会教你怎么用 Vim,不会教你用 Git,但这些其实也很重要,都是一些很必要的前置条件。
可以把这些条件看成是技术支撑,很多高校喜欢让学生学习 C语言,但我觉得学 JavaScript 更好一些,因为只要有一个浏览器就可以搞定了,按下 F12,打开开发者模式,在 console 面板下就可以学习基本的语法了,甚至还有基本的命令提醒。
深度学习
技术初体验仅仅只能算一个入门程序,要想真正的掌握,必然还得进行深入的学习,那该怎么深入呢?
这里以学习 Netty 为例。
当我们要学习 Netty 的时候,先去官网 看一下它的大致介绍。
然后再看它提供的学习文档,直接搞 helloworld。
然后再找一个视频课/学习教程/书籍对 Netty 过一下全貌。
紧接着就要写各种案例,深入的学习 Netty 了。
- 第 1 步,通过快速学习两个小时,了解了 Netty 的整体流程
- 第 2 步,从初体验的 hello world 开始,逐步积累 Netty 的案例库
- 第 3 步,当案例搭建完成,大脑已经建立了对 Netty 的思维框架图
深度学习并不容易,这是一个打怪升级的迭代过程,中间必然会因为细节栽倒,我们要学会从坑里爬起来返回理论去找缘由,再返回实践验证。这里与其说是深度学习,不如说是对毅力的考验,如果在韧劲上能加上一点兴趣,遇到问题的心态能够更加放松,并乐于挑战,那么这个阶段,估计会倒下一大批同学。
强化学习
相信通过前面的讲解,你已经清楚的知道如何快速掌握一门新技术,但是现在还有两个重要问题需要解决:
- 一个是对知识的掌握足够吗?
- 另一个是刚才学到的新技术会不会很快忘掉?
我的建议就是做微服务案例,通过案例来滚动整合先前的技术。我们可以先用每一个技术搭建一个独立的服务,然后再把由不同技术搭建的微服务整合起来。
- 支付系统
- 电商系统
- 用户管理系统
- 秒杀系统
举个例子,当你学完 SSM 的时候就用 SSM 搭建一个支付的服务,学完 Spring Boot 后搭建一个电商服务,学完高并发就搭建一个秒杀系统,之后再通过 RPC 技术把各个系统串联起来。
这么做一方面可以通过动手开发的方式来做项目,让我们对已有的技术进行一个查漏补缺,因为在开发这些微服务案例的同时,你就会清晰的认识到这些技术里边哪些是重点,哪些又是自己当初在学习室给遗漏掉的。
另一方面,这种微服务项目可以保持我们对技术的一个新鲜度,比如说 SSM 到 Spring Boot,就是一次升级,再用 RPC 串联起来后又是一次技术栈的更新迭代。
到这里相信大家已经掌握了一种持续学习的方法了,这里的持续本身包含迭代和复习巩固在里面。
强化学习也可以理解为整合学习,是一种复习也是一种补漏,交叉螺旋上升,是在深度学习基础上的进一步巩固和强化,也是对知识的的一种水平延展。如果说深度学习目的是为了理解深刻,那么强化学习要达到的是持久化,因为别忘了记忆是有遗忘曲线的。强化得越多,基础也扎实,可能的创新也会更充分。
技术难点
最后再给大家讨论一下,如何学习技术难点,我们可以将技术难点分为两类:
- 一类是偏理论的
- 一个是偏实战的
偏理论
像数据结构和算法、设计模式以及架构设计等一些技术,都是较为难以理解的偏理论型。这些技术也经常是开发者在进阶路上的绊脚石,那应该如何才能顺利的跨越这些障碍呢?
我认为可以采用先拆解目标再集中消化的方式来学习,举个例子对于算法、设计模式等一些难以理解的技术来说,尽量不要想着花一周或者一个月就把他们彻底搞定了,而应该先计算一下这些知识的数量,然后用碎片化的时间去学习。
举个例子,假设你想要学习算法,那首先要先计算一下这些算法一共有几个,比如说有 30 个,那就把这些算法再根据难易程度进行排序,有了这些难易排序之后,我们就可以用碎片化的时间将 30 个算法逐个进行攻破。
比如在上下班的地铁之上,在晚餐后的半小时,或者说在睡前的一段时间,利用一些碎片化的时间去学习某一个算法,如果能真正的加以高效利用起来,相信你一定能够在不知不觉里边克服很多难点,从而减少对难点的为难情绪。
如果难点攻克差不多了,那此时就可以采用一个比较集中的时间,将它彻底消化掉。
偏实践
接下来我们再聊一聊,如何学习偏实践性的难点技术,这里称之为实践。有些技术必须借助于开发工具来追踪代码或者调试才能掌握,比如说阅读一个框架的源代码,就是学习偏实践型技术的一个典型代表了。
对于偏实践性的技术学习,最主要的就是要在实践之前,心里边已经对要实践的内容有了清晰的基础理论了,实践仅仅是一种揭晓谜底的过程。
这里给大家换一下我当时学 MyBatis 框架时的一些情况吧,当时在我阅读 MyBatis 框架源码之前,我已经对这个框架应用比较熟悉了,因此我清晰的知道 MyBatis 执行的步骤和流程。
现在仅仅是想通过阅读源码,亲眼见证一下它的底层到底是怎么实现的而已,于是我通过开发工具,通过 debug 进入的源代码……
当然考虑到每个人对技术的基础掌握是不一样的,每门技术也有很大的不同,所以不同的人在不学习不同的技术可能会存在很多的差异,但我相信这个学习新技术的整体思路是一致的,就可以先通过快速的整体阅读,然后逐步积累逐步深入,可以说这应该是一个比较不错的学习方法吧
学习气氛
线下共同学习
很多时候开发者在学习的时候都是比较孤独的,都是一个人趴在电脑前,一定程度来讲,个人学习的气氛实际上是没有团体好的。反正我如果没有球友们的督促的话,一定不会有这么强的动力输出倒逼输入。
那大家也可以回想一下,是不是在高中的自习室,或在大学的图书馆里会学习的比较好。
学习氛围是一件非常重要的事情,二哥建这个知识星球也是这个目的,来到这里的球友大部分都是愿意主动去学习和分享的,那就可以好好利用这个环境,主动去分享自己,主动强迫自己适应每天都要学习的节奏。
所以如果你有很多志同道合的朋友,那么完全可以邀请他们来一同学习,所谓独学而无友则孤陋而寡闻就是这个道理,大家一起争执,一起互帮互助,就会进步非常大。
线上分享学习
如果有可能的话,球友们最好自己搭建一个博客,或者注册一个博客,每天坚持分享。
分享不仅是对自己的一种提炼总结,更重要的是让自己养成主动去学习的习惯,因为如果你不及时汲取营养的话,很快就会被掏空的。
总之,重点就是要想办法将自己的学习成果分享出来,让大家一起来阅读一起来访问,一起来监督你的学习,并且你也可以通过留言功能与大家进行一个互动。
总结
今天的分享到这里就结束,最后再总结一下:
- 在学习新技术时我们可以先快速的了解一下技术的宏观内容,观其大略,找到其中的套路和代码流程或者模板。
- 然后从 hello world 开始,逐步搭建一个案例库,通过案例倒逼自己深入学习,从而掌握技术的广度和深度
- 当案例后搭建完毕以后,再通过微服务技术和其他服务进行一个整合,从而形成一张更大支持网络,不断让自己长期的可以接触到这些技术,防止遗漏
- 对于一些偏理论性的技术可以用碎片化的学习时间来逐个攻破,减少自己对难点技术的恐惧心理
- 对于一些偏实践性的基础来说,我们需要在实践之前,心里已经对事件的内容有了一定的了解
- 最后建议大家也可以将自己学到的技术分享出去,做好记录成长的同时,也能不断的提高自己的知名度。
学习的目的不是为了寻找答案,而是寻找方法,只有方法才是事半功倍的。我常想吴军为什么会那么多才,在知识的深度和广度上做到兼得,一定是有过人的学习方法。并通过这种先进的方法持续的学习和积累。
从清华毕业后去美国约翰霍普金斯大学留学,然后进入谷歌搜索,成为一名计算机科学家。做投资的同时,又写有《数学之美》 、《浪潮之巅》、《文明之光》、《大学之路》、《态度》《全球科技通史》、《硅谷之谜》、《智能时代》、《硅谷来信》等等。
与球友们共勉。
球友们好,我是二哥呀。
今天早上在 B 站上刷到颜群大佬分享的《如何快速且深入的学习一门技术 》,视频中的一些观点让我深受启发,于是我就想,不如把比较精华的内容和我自己的一些感悟一起分享出来,希望能给球友们一点点启发和帮助 👍。
内容收录在星球专栏《Java 面试指南》的《职场修炼篇》中,专栏托管在语雀平台上(更方便你沉浸式阅读和做笔记),访问地址和密码:https://t.zsxq.com/6iuzn6I
球友们在遇到好的内容的时候,也一定要记得分享出来,哪怕有一些是别人的观点也无妨,因为从小到大,我们就是一直在吸取,一直在模仿嘛,然后再悄悄地变成我们自己的 😜。
软件开发正处在一个快速发展和高速迭代的窗口,新技术层出不穷,原有的技术也加快了更新频率,那么作为这个日新月异的互联网时代的软件开发者,我们应该如何保证自己的技术竞争力呢?
观其大略
大家可能都知道,英语考试里面有一个经典的题目叫"完形填空",老师经常告诉我们,在做完形填空之前,一定要先花一分钟的时间,把整篇文章快速阅读一遍,对整篇文章有一个大致的了解之后,如果再去做题,准确率就会提高很多,那我认为这种做完形填空的方法也应该同样适用于软件学习。
我们在学习某一个新技术,也应该先快速的浏览一下这个新技术的大致情况,再去研究新技术里边到底包含了哪些技术细节,遵循从整体到深入的过程。
找出套路
各种技术都有自己的模板结构,比如说:
- HTML: 代码结构固定
- Netty: 代码流程类似
- JDBC: 实现步骤固定
不论是前端还是后端框架,这些技术都有一个共同的特点,就是他们有一定的套路可遵循,因此我认为一个比较好的学习方法应该是不管三七二十一,先快速的去了解一下具体的套路到底是什么,然后再去深入研究套路里面的每一步到底是什么,那这样才能高效的学习一门新技术。
那么如何了解套路呢?
在学习一门新技术之前,我们一定得先宏观的、全局性地、快速地了解一下技术的全貌,知道哪些是套路,哪些是重点,那么接下来你可能会问,到底应该如何快速了解技术的全貌呢?
这其实是快速阅读的理论知识了,推荐大家以跳跃性的方式来查阅一些资料,来看一下执行流程是怎样的,具体细节你可以查阅技术官网,看书看博客或看一些视频教程。重点要看这些教程里边反复出现的重复代码,一般而言那些频繁出现的重复代码就是这个新技术的技术代码结构了。
总结一下
如何快速了解新技术?
- 快速、跳跃式的查询资料(官网,看书,博客,视频)
- 注意出现频率较多的重复代码
说白了,就是先囫囵吐枣式的过一遍,就好像拿到一本书,先把目录大纲过一遍,如果是自己已经掌握过的内容,那就不要再看了,直接跳过。
快速的在脑海中创建全景图,有了模糊的知识树导航,对后续的深入学习也好,耗费的时间成本也好,都会有一个最初印象,一定程度上可以消除对新技术的陌生感和恐惧感。
二哥的理解
那这里就不得不提一提 helloworld 了,学习任何一门新技术,先搞出来一个 helloworld 再说别的。
要知道这个 helloworld 可不容易了,它还需要一些前置条件,比如说我们学习 Java,得装一个 JDK 吧,得装 Intellij IDEA 吧。
如果是在云服务器上,还得懂 Linux,掌握一些必要的 Linux 命令,否则前置条件这块就能把人搞崩溃。
这也就是为什么大神/极客总喜欢在命令下搞事情,而新手小白喜欢在图形化界面里搞事情。
大学往往是不会教这些的,不会教你怎么用 Shell,不会教你怎么用 Vim,不会教你用 Git,但这些其实也很重要,都是一些很必要的前置条件。
可以把这些条件看成是技术支撑,很多高校喜欢让学生学习 C语言,但我觉得学 JavaScript 更好一些,因为只要有一个浏览器就可以搞定了,按下 F12,打开开发者模式,在 console 面板下就可以学习基本的语法了,甚至还有基本的命令提醒。
深度学习
技术初体验仅仅只能算一个入门程序,要想真正的掌握,必然还得进行深入的学习,那该怎么深入呢?
这里以学习 Netty 为例。
当我们要学习 Netty 的时候,先去官网 看一下它的大致介绍。
然后再看它提供的学习文档,直接搞 helloworld。
然后再找一个视频课/学习教程/书籍对 Netty 过一下全貌。
紧接着就要写各种案例,深入的学习 Netty 了。
- 第 1 步,通过快速学习两个小时,了解了 Netty 的整体流程
- 第 2 步,从初体验的 hello world 开始,逐步积累 Netty 的案例库
- 第 3 步,当案例搭建完成,大脑已经建立了对 Netty 的思维框架图
深度学习并不容易,这是一个打怪升级的迭代过程,中间必然会因为细节栽倒,我们要学会从坑里爬起来返回理论去找缘由,再返回实践验证。这里与其说是深度学习,不如说是对毅力的考验,如果在韧劲上能加上一点兴趣,遇到问题的心态能够更加放松,并乐于挑战,那么这个阶段,估计会倒下一大批同学。
强化学习
相信通过前面的讲解,你已经清楚的知道如何快速掌握一门新技术,但是现在还有两个重要问题需要解决:
- 一个是对知识的掌握足够吗?
- 另一个是刚才学到的新技术会不会很快忘掉?
我的建议就是做微服务案例,通过案例来滚动整合先前的技术。我们可以先用每一个技术搭建一个独立的服务,然后再把由不同技术搭建的微服务整合起来。
- 支付系统
- 电商系统
- 用户管理系统
- 秒杀系统
举个例子,当你学完 SSM 的时候就用 SSM 搭建一个支付的服务,学完 Spring Boot 后搭建一个电商服务,学完高并发就搭建一个秒杀系统,之后再通过 RPC 技术把各个系统串联起来。
这么做一方面可以通过动手开发的方式来做项目,让我们对已有的技术进行一个查漏补缺,因为在开发这些微服务案例的同时,你就会清晰的认识到这些技术里边哪些是重点,哪些又是自己当初在学习室给遗漏掉的。
另一方面,这种微服务项目可以保持我们对技术的一个新鲜度,比如说 SSM 到 Spring Boot,就是一次升级,再用 RPC 串联起来后又是一次技术栈的更新迭代。
到这里相信大家已经掌握了一种持续学习的方法了,这里的持续本身包含迭代和复习巩固在里面。
强化学习也可以理解为整合学习,是一种复习也是一种补漏,交叉螺旋上升,是在深度学习基础上的进一步巩固和强化,也是对知识的的一种水平延展。如果说深度学习目的是为了理解深刻,那么强化学习要达到的是持久化,因为别忘了记忆是有遗忘曲线的。强化得越多,基础也扎实,可能的创新也会更充分。
技术难点
最后再给大家讨论一下,如何学习技术难点,我们可以将技术难点分为两类:
- 一类是偏理论的
- 一个是偏实战的
偏理论
像数据结构和算法、设计模式以及架构设计等一些技术,都是较为难以理解的偏理论型。这些技术也经常是开发者在进阶路上的绊脚石,那应该如何才能顺利的跨越这些障碍呢?
我认为可以采用先拆解目标再集中消化的方式来学习,举个例子对于算法、设计模式等一些难以理解的技术来说,尽量不要想着花一周或者一个月就把他们彻底搞定了,而应该先计算一下这些知识的数量,然后用碎片化的时间去学习。
举个例子,假设你想要学习算法,那首先要先计算一下这些算法一共有几个,比如说有 30 个,那就把这些算法再根据难易程度进行排序,有了这些难易排序之后,我们就可以用碎片化的时间将 30 个算法逐个进行攻破。
比如在上下班的地铁之上,在晚餐后的半小时,或者说在睡前的一段时间,利用一些碎片化的时间去学习某一个算法,如果能真正的加以高效利用起来,相信你一定能够在不知不觉里边克服很多难点,从而减少对难点的为难情绪。
如果难点攻克差不多了,那此时就可以采用一个比较集中的时间,将它彻底消化掉。
偏实践
接下来我们再聊一聊,如何学习偏实践性的难点技术,这里称之为实践。有些技术必须借助于开发工具来追踪代码或者调试才能掌握,比如说阅读一个框架的源代码,就是学习偏实践型技术的一个典型代表了。
对于偏实践性的技术学习,最主要的就是要在实践之前,心里边已经对要实践的内容有了清晰的基础理论了,实践仅仅是一种揭晓谜底的过程。
这里给大家换一下我当时学 MyBatis 框架时的一些情况吧,当时在我阅读 MyBatis 框架源码之前,我已经对这个框架应用比较熟悉了,因此我清晰的知道 MyBatis 执行的步骤和流程。
现在仅仅是想通过阅读源码,亲眼见证一下它的底层到底是怎么实现的而已,于是我通过开发工具,通过 debug 进入的源代码……
当然考虑到每个人对技术的基础掌握是不一样的,每门技术也有很大的不同,所以不同的人在不学习不同的技术可能会存在很多的差异,但我相信这个学习新技术的整体思路是一致的,就可以先通过快速的整体阅读,然后逐步积累逐步深入,可以说这应该是一个比较不错的学习方法吧
学习气氛
线下共同学习
很多时候开发者在学习的时候都是比较孤独的,都是一个人趴在电脑前,一定程度来讲,个人学习的气氛实际上是没有团体好的。反正我如果没有球友们的督促的话,一定不会有这么强的动力输出倒逼输入。
那大家也可以回想一下,是不是在高中的自习室,或在大学的图书馆里会学习的比较好。
学习氛围是一件非常重要的事情,二哥建这个知识星球也是这个目的,来到这里的球友大部分都是愿意主动去学习和分享的,那就可以好好利用这个环境,主动去分享自己,主动强迫自己适应每天都要学习的节奏。
所以如果你有很多志同道合的朋友,那么完全可以邀请他们来一同学习,所谓独学而无友则孤陋而寡闻就是这个道理,大家一起争执,一起互帮互助,就会进步非常大。
线上分享学习
如果有可能的话,球友们最好自己搭建一个博客,或者注册一个博客,每天坚持分享。
分享不仅是对自己的一种提炼总结,更重要的是让自己养成主动去学习的习惯,因为如果你不及时汲取营养的话,很快就会被掏空的。
总之,重点就是要想办法将自己的学习成果分享出来,让大家一起来阅读一起来访问,一起来监督你的学习,并且你也可以通过留言功能与大家进行一个互动。
总结
今天的分享到这里就结束,最后再总结一下:
- 在学习新技术时我们可以先快速的了解一下技术的宏观内容,观其大略,找到其中的套路和代码流程或者模板。
- 然后从 hello world 开始,逐步搭建一个案例库,通过案例倒逼自己深入学习,从而掌握技术的广度和深度
- 当案例后搭建完毕以后,再通过微服务技术和其他服务进行一个整合,从而形成一张更大支持网络,不断让自己长期的可以接触到这些技术,防止遗漏
- 对于一些偏理论性的技术可以用碎片化的学习时间来逐个攻破,减少自己对难点技术的恐惧心理
- 对于一些偏实践性的基础来说,我们需要在实践之前,心里已经对事件的内容有了一定的了解
- 最后建议大家也可以将自己学到的技术分享出去,做好记录成长的同时,也能不断的提高自己的知名度。
学习的目的不是为了寻找答案,而是寻找方法,只有方法才是事半功倍的。我常想吴军为什么会那么多才,在知识的深度和广度上做到兼得,一定是有过人的学习方法。并通过这种先进的方法持续的学习和积累。
从清华毕业后去美国约翰霍普金斯大学留学,然后进入谷歌搜索,成为一名计算机科学家。做投资的同时,又写有《数学之美》 、《浪潮之巅》、《文明之光》、《大学之路》、《态度》《全球科技通史》、《硅谷之谜》、《智能时代》、《硅谷来信》等等。
与球友们共勉。
球友们好,我是二哥呀。
今天早上在 B 站上刷到颜群大佬分享的《如何快速且深入的学习一门技术 》,视频中的一些观点让我深受启发,于是我就想,不如把比较精华的内容和我自己的一些感悟一起分享出来,希望能给球友们一点点启发和帮助 👍。
内容收录在星球专栏《Java 面试指南》的《职场修炼篇》中,专栏托管在语雀平台上(更方便你沉浸式阅读和做笔记),访问地址和密码:https://t.zsxq.com/6iuzn6I
球友们在遇到好的内容的时候,也一定要记得分享出来,哪怕有一些是别人的观点也无妨,因为从小到大,我们就是一直在吸取,一直在模仿嘛,然后再悄悄地变成我们自己的 😜。
软件开发正处在一个快速发展和高速迭代的窗口,新技术层出不穷,原有的技术也加快了更新频率,那么作为这个日新月异的互联网时代的软件开发者,我们应该如何保证自己的技术竞争力呢?
观其大略
大家可能都知道,英语考试里面有一个经典的题目叫"完形填空",老师经常告诉我们,在做完形填空之前,一定要先花一分钟的时间,把整篇文章快速阅读一遍,对整篇文章有一个大致的了解之后,如果再去做题,准确率就会提高很多,那我认为这种做完形填空的方法也应该同样适用于软件学习。
我们在学习某一个新技术,也应该先快速的浏览一下这个新技术的大致情况,再去研究新技术里边到底包含了哪些技术细节,遵循从整体到深入的过程。
找出套路
各种技术都有自己的模板结构,比如说:
- HTML: 代码结构固定
- Netty: 代码流程类似
- JDBC: 实现步骤固定
不论是前端还是后端框架,这些技术都有一个共同的特点,就是他们有一定的套路可遵循,因此我认为一个比较好的学习方法应该是不管三七二十一,先快速的去了解一下具体的套路到底是什么,然后再去深入研究套路里面的每一步到底是什么,那这样才能高效的学习一门新技术。
那么如何了解套路呢?
在学习一门新技术之前,我们一定得先宏观的、全局性地、快速地了解一下技术的全貌,知道哪些是套路,哪些是重点,那么接下来你可能会问,到底应该如何快速了解技术的全貌呢?
这其实是快速阅读的理论知识了,推荐大家以跳跃性的方式来查阅一些资料,来看一下执行流程是怎样的,具体细节你可以查阅技术官网,看书看博客或看一些视频教程。重点要看这些教程里边反复出现的重复代码,一般而言那些频繁出现的重复代码就是这个新技术的技术代码结构了。
总结一下
如何快速了解新技术?
- 快速、跳跃式的查询资料(官网,看书,博客,视频)
- 注意出现频率较多的重复代码
说白了,就是先囫囵吐枣式的过一遍,就好像拿到一本书,先把目录大纲过一遍,如果是自己已经掌握过的内容,那就不要再看了,直接跳过。
快速的在脑海中创建全景图,有了模糊的知识树导航,对后续的深入学习也好,耗费的时间成本也好,都会有一个最初印象,一定程度上可以消除对新技术的陌生感和恐惧感。
二哥的理解
那这里就不得不提一提 helloworld 了,学习任何一门新技术,先搞出来一个 helloworld 再说别的。
要知道这个 helloworld 可不容易了,它还需要一些前置条件,比如说我们学习 Java,得装一个 JDK 吧,得装 Intellij IDEA 吧。
如果是在云服务器上,还得懂 Linux,掌握一些必要的 Linux 命令,否则前置条件这块就能把人搞崩溃。
这也就是为什么大神/极客总喜欢在命令下搞事情,而新手小白喜欢在图形化界面里搞事情。
大学往往是不会教这些的,不会教你怎么用 Shell,不会教你怎么用 Vim,不会教你用 Git,但这些其实也很重要,都是一些很必要的前置条件。
可以把这些条件看成是技术支撑,很多高校喜欢让学生学习 C语言,但我觉得学 JavaScript 更好一些,因为只要有一个浏览器就可以搞定了,按下 F12,打开开发者模式,在 console 面板下就可以学习基本的语法了,甚至还有基本的命令提醒。
深度学习
技术初体验仅仅只能算一个入门程序,要想真正的掌握,必然还得进行深入的学习,那该怎么深入呢?
这里以学习 Netty 为例。
当我们要学习 Netty 的时候,先去官网 看一下它的大致介绍。
然后再看它提供的学习文档,直接搞 helloworld。
然后再找一个视频课/学习教程/书籍对 Netty 过一下全貌。
紧接着就要写各种案例,深入的学习 Netty 了。
- 第 1 步,通过快速学习两个小时,了解了 Netty 的整体流程
- 第 2 步,从初体验的 hello world 开始,逐步积累 Netty 的案例库
- 第 3 步,当案例搭建完成,大脑已经建立了对 Netty 的思维框架图
深度学习并不容易,这是一个打怪升级的迭代过程,中间必然会因为细节栽倒,我们要学会从坑里爬起来返回理论去找缘由,再返回实践验证。这里与其说是深度学习,不如说是对毅力的考验,如果在韧劲上能加上一点兴趣,遇到问题的心态能够更加放松,并乐于挑战,那么这个阶段,估计会倒下一大批同学。
强化学习
相信通过前面的讲解,你已经清楚的知道如何快速掌握一门新技术,但是现在还有两个重要问题需要解决:
- 一个是对知识的掌握足够吗?
- 另一个是刚才学到的新技术会不会很快忘掉?
我的建议就是做微服务案例,通过案例来滚动整合先前的技术。我们可以先用每一个技术搭建一个独立的服务,然后再把由不同技术搭建的微服务整合起来。
- 支付系统
- 电商系统
- 用户管理系统
- 秒杀系统
举个例子,当你学完 SSM 的时候就用 SSM 搭建一个支付的服务,学完 Spring Boot 后搭建一个电商服务,学完高并发就搭建一个秒杀系统,之后再通过 RPC 技术把各个系统串联起来。
这么做一方面可以通过动手开发的方式来做项目,让我们对已有的技术进行一个查漏补缺,因为在开发这些微服务案例的同时,你就会清晰的认识到这些技术里边哪些是重点,哪些又是自己当初在学习室给遗漏掉的。
另一方面,这种微服务项目可以保持我们对技术的一个新鲜度,比如说 SSM 到 Spring Boot,就是一次升级,再用 RPC 串联起来后又是一次技术栈的更新迭代。
到这里相信大家已经掌握了一种持续学习的方法了,这里的持续本身包含迭代和复习巩固在里面。
强化学习也可以理解为整合学习,是一种复习也是一种补漏,交叉螺旋上升,是在深度学习基础上的进一步巩固和强化,也是对知识的的一种水平延展。如果说深度学习目的是为了理解深刻,那么强化学习要达到的是持久化,因为别忘了记忆是有遗忘曲线的。强化得越多,基础也扎实,可能的创新也会更充分。
技术难点
最后再给大家讨论一下,如何学习技术难点,我们可以将技术难点分为两类:
- 一类是偏理论的
- 一个是偏实战的
偏理论
像数据结构和算法、设计模式以及架构设计等一些技术,都是较为难以理解的偏理论型。这些技术也经常是开发者在进阶路上的绊脚石,那应该如何才能顺利的跨越这些障碍呢?
我认为可以采用先拆解目标再集中消化的方式来学习,举个例子对于算法、设计模式等一些难以理解的技术来说,尽量不要想着花一周或者一个月就把他们彻底搞定了,而应该先计算一下这些知识的数量,然后用碎片化的时间去学习。
举个例子,假设你想要学习算法,那首先要先计算一下这些算法一共有几个,比如说有 30 个,那就把这些算法再根据难易程度进行排序,有了这些难易排序之后,我们就可以用碎片化的时间将 30 个算法逐个进行攻破。
比如在上下班的地铁之上,在晚餐后的半小时,或者说在睡前的一段时间,利用一些碎片化的时间去学习某一个算法,如果能真正的加以高效利用起来,相信你一定能够在不知不觉里边克服很多难点,从而减少对难点的为难情绪。
如果难点攻克差不多了,那此时就可以采用一个比较集中的时间,将它彻底消化掉。
偏实践
接下来我们再聊一聊,如何学习偏实践性的难点技术,这里称之为实践。有些技术必须借助于开发工具来追踪代码或者调试才能掌握,比如说阅读一个框架的源代码,就是学习偏实践型技术的一个典型代表了。
对于偏实践性的技术学习,最主要的就是要在实践之前,心里边已经对要实践的内容有了清晰的基础理论了,实践仅仅是一种揭晓谜底的过程。
这里给大家换一下我当时学 MyBatis 框架时的一些情况吧,当时在我阅读 MyBatis 框架源码之前,我已经对这个框架应用比较熟悉了,因此我清晰的知道 MyBatis 执行的步骤和流程。
现在仅仅是想通过阅读源码,亲眼见证一下它的底层到底是怎么实现的而已,于是我通过开发工具,通过 debug 进入的源代码……
当然考虑到每个人对技术的基础掌握是不一样的,每门技术也有很大的不同,所以不同的人在不学习不同的技术可能会存在很多的差异,但我相信这个学习新技术的整体思路是一致的,就可以先通过快速的整体阅读,然后逐步积累逐步深入,可以说这应该是一个比较不错的学习方法吧
学习气氛
线下共同学习
很多时候开发者在学习的时候都是比较孤独的,都是一个人趴在电脑前,一定程度来讲,个人学习的气氛实际上是没有团体好的。反正我如果没有球友们的督促的话,一定不会有这么强的动力输出倒逼输入。
那大家也可以回想一下,是不是在高中的自习室,或在大学的图书馆里会学习的比较好。
学习氛围是一件非常重要的事情,二哥建这个知识星球也是这个目的,来到这里的球友大部分都是愿意主动去学习和分享的,那就可以好好利用这个环境,主动去分享自己,主动强迫自己适应每天都要学习的节奏。
所以如果你有很多志同道合的朋友,那么完全可以邀请他们来一同学习,所谓独学而无友则孤陋而寡闻就是这个道理,大家一起争执,一起互帮互助,就会进步非常大。
线上分享学习
如果有可能的话,球友们最好自己搭建一个博客,或者注册一个博客,每天坚持分享。
分享不仅是对自己的一种提炼总结,更重要的是让自己养成主动去学习的习惯,因为如果你不及时汲取营养的话,很快就会被掏空的。
总之,重点就是要想办法将自己的学习成果分享出来,让大家一起来阅读一起来访问,一起来监督你的学习,并且你也可以通过留言功能与大家进行一个互动。
总结
今天的分享到这里就结束,最后再总结一下:
- 在学习新技术时我们可以先快速的了解一下技术的宏观内容,观其大略,找到其中的套路和代码流程或者模板。
- 然后从 hello world 开始,逐步搭建一个案例库,通过案例倒逼自己深入学习,从而掌握技术的广度和深度
- 当案例后搭建完毕以后,再通过微服务技术和其他服务进行一个整合,从而形成一张更大支持网络,不断让自己长期的可以接触到这些技术,防止遗漏
- 对于一些偏理论性的技术可以用碎片化的学习时间来逐个攻破,减少自己对难点技术的恐惧心理
- 对于一些偏实践性的基础来说,我们需要在实践之前,心里已经对事件的内容有了一定的了解
- 最后建议大家也可以将自己学到的技术分享出去,做好记录成长的同时,也能不断的提高自己的知名度。
学习的目的不是为了寻找答案,而是寻找方法,只有方法才是事半功倍的。我常想吴军为什么会那么多才,在知识的深度和广度上做到兼得,一定是有过人的学习方法。并通过这种先进的方法持续的学习和积累。
从清华毕业后去美国约翰霍普金斯大学留学,然后进入谷歌搜索,成为一名计算机科学家。做投资的同时,又写有《数学之美》 、《浪潮之巅》、《文明之光》、《大学之路》、《态度》《全球科技通史》、《硅谷之谜》、《智能时代》、《硅谷来信》等等。
与球友们共勉。
知识星球
扫码加入星球
查看更多优质内容
https://wx.zsxq.com/mweb/views/joingroup/join_group.html?group_id=15522885221412