如何高效学习技术

如何高效学习技术

我们总以为学习一定会有收获,其实方法不当,既让人身心疲惫,也没有切实的回报。

我的高中同桌是个漂亮的女同学,她的物理成绩很差,虽然她非常勤奋的学习,但成绩总是不理想。为了巩固我们纯洁的友谊,我亲密无间地辅导她的物理,发现她不知道题目考什么。在应试教育的体系下,考题都不允许超出教学大纲。物理试卷的题目本质在考教科书上的定理或公式,简单的题目只考一两个知识点,复杂的题是考多个知识点的混合运用。能够看出题目的考点,离解题就不远了。

不少人每天都看技术文章,第二天就忘干净了。面试官问技术方案,明明心里清楚,口述出来却前言不搭后语。面试官再问底层算法,你说看过但是忘记了。他不在乎你看没看过,答不上就是零分。正如男女相亲,平时男方挺能说,关键时候却支支吾吾,姑娘必然认为他不行。

学到的东西,无法说出来让他人理解,本质是没有真正的弄懂。高效学习的诀窍是:把自己当成一台计算机,既有输入,也要有输出,用输出倒逼输入

1.怎么学

1.1 费曼学习法

费曼学习法是由美籍犹太裔物理学家理查德·菲利普斯·费曼提出的,他是1965年诺贝尔物理奖得主。如果学习只是单纯的信息输入,那对知识的掌握度是极其有限的,这种叫做「被动学习」。费曼学习法就是通过教别人的方式,来查漏补缺自己的知识体系,以达到教与学相辅相成的作用。

这种学习方法已经广泛应用,是切实可行的,有3点原因:

  • 巩固知识:教导别人的每次输出都加深巩固旧知识。
  • 逻辑开关:教导别人不是散乱的知识点,而是要系统化传授知识,大脑常常会开启why、what、how(为什么、是什么、怎么做)的思考。
  • 查漏补缺:和别人讲解知识,如果中间卡壳了,表明并没有完全掌握知识,需要再复习一次。如果别人的提问答不上来,那就找到了知识的盲区,促进自己去寻找答案,能更深刻的理解整个知识体系。

从下面这张图可以看到,教授他人是知识留存率最高的方式。

1.2 克服遗忘

高中是我们知识的巅峰时刻,每周小考每月大考,地狱式的反复操练强化记忆。复习是对抗遗忘的唯一办法。大脑的遗忘是有规律的,先快后慢。一天后,学到的知识只剩下原来的25%,甚至更低。随着时间的推移,遗忘的速度减慢,遗忘的数量也就减少。

时间间隔 记忆量
刚看完 100%
20分钟后 60%
1小时后 40%
1天后 30%
2天后 27%

每个人的遗忘程度都不一样,建议第二天复习前一天的内容,七天后复习这段时间的所有内容。

1.3 碎片时间

不少人习惯利用碎片时间学习,在公交地铁上看公众号的推送。其实嘈杂的环境下,注意力不容易集中,又会被手机上的其他信息打断,学习效率非常低。碎片时间只适合学习简单孤立的知识点。

学习复杂的知识,需要大段的连续时间。图书馆是个好地方,把手机放一边,阅读纸质书,泡上一整天。有些城市出现了付费自习室,提供独立的格子间,也是非常好的选择。

2. 学什么

2.1 基础与应用

每隔几年都会诞生了一些所谓的新技术,比如最时髦的AI(目前还在智障阶段),数学基础是初中就学过的概率统计。万丈高楼从地起,不要被新技术、新工具迷住双眼,一味地追新求快。基础知识是所有技术的基石,在未来很长的时间都不会变化,应该花费足够的时间巩固基础。

以数据结构和算法为例,Java同步工具类AQS用到了双向链表,链表知识不过关,肯定搞不懂它的原理。以Java工程师应该掌握的知识为例,按重要程度排出六个梯度:

  • 第一梯度:计算机组成原理、数据结构和算法、网络通信原理、操作系统原理;
  • 第二梯度:Java语言基础、JVM内存模型和GC算法、JVM性能调优、JDK工具、23种设计模式;
  • 第三梯度:Spring Booot/Spring Cloud、Mybatis、Dubbo等主流框架的原理和运用;
  • 第四梯度:MySQL/PostgreSQL、Redis、RabbitMQ/RocketMQ/Kafka等数据库或者中间件的原理和运用;
  • 第五梯度:CAP理论、BASE理论、Paxos或Raft算法等其他分布式理论;
  • 第六梯度:容器化(Docker与Kubernetes)、大数据处理、AI、区块链等等前沿技术理论;

有同学认为第五梯度应该在移到第一梯度。其实很多公司的日活犹如古天乐一样平平无奇,离大型分布式架构还远得很。学习使用分布式框架或中间件的时候,顺手掌握分布式理论,效果更好。

2.2 哲学

哲学不是故作高深的学科,它的意义是发现根本规律,提出终极的解决方案。小伙子是怎么泡妞的?三天两头花不断,大庭广众跪求爱,这类套路为什么总是能成功呢?礼物满足女人的物欲,当众求爱满足女人的虚荣心,投其所好。为什么食堂大妈打菜的手越来越抖,辣子鸡丁变成辣子辣丁?食堂要控制成本,直接提单价会惹众怒。

软件行业充满哲学味道的作品非常多,比如《人月神话》。举个例子,当软件系统遇到性能问题,尝试下面两种哲学思想提升性能:

  • 空间换时间:比如引入缓存,消耗额外的存储提高响应速度。
  • 时间换空间:比如大文件的分片、分段处理后再汇总结果。

再比如设计高可用的系统,通常从三个方面考虑问题:

  • 存储:数据会丢失吗,一致性怎么解决?
  • 计算:计算怎么扩容,业务系统可以任意增加节点吗?
  • 传输:网络中断或拥塞怎么办,系统能容忍的失败率是多少?

从无数的失败或者成功的经验中,总结出高度概括性的方案,让我们下一步做的更好。

2.3 英语

英语是重要的基础,学好英语与掌握编程一样重要。许多知名博客就是把英文翻译成中文,只是知识的搬运工。如果英语足够好,直接阅读一手资料,避免他人翻译存在的谬误。

如果纯粹为了日常技术工作,可以不练习英语口语,提高文档阅读能力即可。首先,要突破单词关,至少达到六级的5500个词汇量。其次,必须掌握专业英语的词汇,推荐采用机械工业出版社的《计算机专业英语》这本书。最后,坚持阅读一份有质量的技术文档,做到可以用英语表达技术意图,Spring的技术文档就是很好的学习材料。如果到处去搜罗各种英语文献,往往只收藏不阅读。

3 用起来

3.1 技术分享

精心准备PPT和演讲内容,给同事做几场技术分享,不光复习知识,还锻炼口才。有些朋友说话又快又急,别人常常听不清,但是自己浑然不觉。我们都有一些口头禅,比如"对吧、是不是”,如果当众讲话,口头禅没有传递任何信息,还可能引起听众反感。做了演讲之后,了解听众的真实评价,能够彻底认清缺点。

坚持写技术博客,别在意写的东西在网上已经重复千百遍。当自己动手的时候,才会意识到眼高手低。让文章读起来流畅清晰,需要呕心沥血的删改。写作是对大脑的长期考验,想不到肯定写不出,想不清楚肯定写不清楚。

3.2 造轮子

我们经常说不要重复造轮子。为了开发效率,可以不造轮子,但是必须具备造轮子的能力。优秀开源项目的作者通常具备极高的工程能力,从工程的实际需求出发,用代码实现一个通用的解决方案。造轮子的目的,首先是巩固编程知识,其次是锤炼工程能力。

建议造一个简单的MQ,会用到通信协议、设计模式、队列等许多知识。在造轮子的过程中,又要翻阅大量的技术资料或者博客,这就是用输出倒逼输入

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注