左耳听风文章阅读笔记-高效学习篇

左耳听风文章阅读笔记-高效学习篇

一、端正学习态度

学习是一件“逆人性”的事,就像锻炼身体一样,需要人持续付出,会让人感到痛苦,并随时想找理由放弃

1.主动学习和被动学习

学习金字塔

image-20231225141950468

被动学习:听讲、阅读、视听、演示

主动学习:讨论、实践、教授他人

学习不是努力读更多的书,盲目追求阅读的速度和数量,这会让人产生低层次的勤奋和成长的感觉,这只是在使蛮力。要思辨,要践行,要总结和归纳,否则,你只是在机械地重复某件事,而不会有质的成长的。

2.浅度学习和深度学习

深度学习的关键

​ 1)高质量的信息源和第一手的知识

​ 2)把知识连成地图,将自己的理解反述出来

​ 3)不断地反思和思辨,与不同年龄段的人讨论

​ 4)举一反三,并践行之,把知识转换成技能

学习的三个步骤

​ 1)知识采集

​ 2)知识缝合(将信息组织起来,形成结构体。连接记忆,逻辑推理,知识梳理)

​ 3)技能转换(举一反三,实践和练习以及传授教导)

3.学习的目的

**学习是为了找到方法 ** 学习是为了找到通往答案的路径和方法,是为了拥有无师自通的能力。

学习是为了找到原理 一旦理解和掌握了这些本质的东西,你就会发现,整个复杂多变的世界在变得越来越简单。你就好像找到了所有问题的最终答案似的,一通百通了。

学习是为了了解自己 开拓眼界的目的就是发现自己的不足和上升空间,从而才能让自己成长。

学习是为了改变自己 学习是为了改变自己的思考方式,改变自己的思维方式,改变自己与生俱来的那些垃圾和低效的算法。总之,学习让我们改变自己,行动和践行,反思和改善,从而获得成长。

二、源头、原理和知识地图

1.挑选知识和信息源

好信息源的特质

1)应该是第一手资料,不是被别人理解过、消化过的二手资料。尤其对于知识性的东西来说,更是这样。应该是原汁原味的,不应该是被添油加醋的。

2)应该是有佐证、有数据、有引用的,或是有权威人士或大公司生产系统背书的资料。应该是被时间和实践检验过的,或是小心求证过的,不是拍脑袋野路子或是道听途说出来的资料。

3)应该是加入了一些自己的经验和思考,可以引发人深思的,是所谓信息的密集很大的文章。

2.注重基础和原理

如果你学习过底层的 Socket 编程,了解多路复用和各种 I/O 模型的话(select, poll, epoll, aio, windows completion port, libevent 等),那么,对于 Node.js、Java NIO、Nginx、C++ 的 ACE 框架等这些中间件或是编程框架,你就会发现,无论表现形式是什么样的,其底层原理都是一个样的。

无论是 JVM 还是 Node,或者是 Python 解释器里干了什么,它都无法逾越底层操作系统 API 对“物理世界”的限制。而当你了解了这个底层物理世界以后,无论那些技术玩成什么花样,它们都无法超出你的掌控

3.使用知识图

画知识图的方式可以让你从一个技术最重要最主干的地方出发开始遍历所有的技术细节,也就是画地图的方式。如果你不想在知识的海洋中迷路,你需要有一份地图,所以,学习并不是为了要记忆那些知识点,而是为了要找到一个知识的地图,你在这个地图上能通过关键路径找到你想要的答案

三、深度、归纳和坚持实践

1.系统地学习

学习模板

​ 1)这个技术出现的背景、初衷和要达到什么样的目标或是要解决什么样的问题

​ 2)这个技术的优势和劣势分别是什么,或者说,这个技术的 trade-off (权衡)是什么

​ 3)这个技术适用的场景

​ 4)技术的组成部分和关键点

​ 5)技术的底层原理和关键实现

​ 6)已有的实现和它之间的对比

2.举一反三

三种基本能力

​ 1)联想能力。这种能力的锻炼需要你平时就在不停地思考同一个事物的不同的用法,或是联想与之有关的别的事物。对于软件开发和技术学习也一样。

​ 2)抽象能力。抽象能力是举一反三的基本技能。平时你解决问题的时候,如果你能对这个问题进行抽象,你就可以获得更多的表现形式。抽象能力需要找到解决问题的通用模型,比如数学就是对现实世界的一种抽象。只要我们能把现实世界的各种问题建立成数据模型(如,建立各种维度的向量),我们就可以用数学来求解,这也是机器学习的本质。

​ 3)自省能力。所谓自省能力就是自己找自己的难看。当你得到一个解的时候,要站在自己的对立面来找这个解的漏洞。有点像左右手互博。这种自己和自己辩论的能力又叫思辨能力。将自己分裂成正反方,左右方,甚至多方,站在不同的立场上来和自己辩论,从而做到不漏过一个 case,从而获得完整全面的问题分析能力。

3.总结和归纳

我们积累的知识越多,在知识间进行联系和区辨的能力就越强,对知识进行总结和归纳也就越轻松

学习的开始阶段,可以不急于总结归纳,不急于下判断,做结论,而应该保留部分知识的不确定性,保持对知识的开放状态

总结归纳方法:把你看到和学习到的信息,归整好,排列好,关联好,总之把信息碎片给结构化掉,然后在结构化的信息中,找到规律,找到相通之处,找到共同之处,进行简化、归纳和总结,最终形成一种套路,一种模式,一种通用方法。

4.实践出真知

实践是很累很痛苦的事,但只有痛苦才会让人反思,而反思则是学习和改变自己的动力。Grow up through the pain, 是非常有道理的

5.坚持不懈

一方面你要把你的坚持形成成果晒出来,让别人来给你点赞,另一方面,你还要把坚持变成一种习惯,就像吃饭喝水一样,你感觉不到太多的成本付出。只有做到这两点,你才能够真正坚持

四、如何学习和阅读代码

1.读文档还是读代码

如果你想了解一种思想,一种方法,一种原理,一种思路,一种经验,恐怕,读书和读文档会更有效率一些

如果你想了解的就是具体细节,比如某协程的实现,某个模块的性能,某个算法的实现,那么你还是要去读代码的

2.如何阅读源代码

阅读代码的前提

​ 1)基础知识。相关的语言和基础技术的知识。

​ 2)软件功能。你先要知道这个软件完成的是什么样的功能,有哪些特性,哪些配置项。你先要读一遍用户手册,然后让软件跑起来,自己先用一下感受一下。

​ 3)相关文档。读一下相关的内部文档,Readme 也好,Release Notes 也好,Design 也好,Wiki 也好,这些文档可以让你明白整个软件的方方面面。如果你的软件没有文档,那么,你只能指望这个软件的原作者还在,而且他还乐于交流。

​ 4)代码的组织结构。也就是代码目录中每个目录是什么样的功能,每个文档是干什么的。如果你要读的程序是在某种标准的框架下组织的,比如:Java 的 Spring 框架,那么恭喜你,这些代码不难读了。

软件代码的一般构成

​ 1)接口抽象定义

​ 2)模块粘合层

​ 3)业务流程

​ 4)具体实现(代码逻辑(业务逻辑和控制逻辑)、出错处理、数据处理、重要的算法、底层交互)

阅读代码的方法

​ 1)一般采用自顶向下,从总体到细节的“剥洋葱皮”的读法。

​ 2)画图是必要的,程序流程图,调用时序图,模块组织图……

​ 3)代码逻辑归一下类,排除杂音,主要逻辑才会更清楚。

​ 4)debug 跟踪一下代码是了解代码在执行中发生了什么的最好方式。

五、如何面对枯燥和量大的知识

1.如何面对枯燥的知识

解决方法

​ 1)了解用处:这个知识对于你来说来太高级了,你可能不知道能用在什么地方。

​ 2)人的认知是从感性认识向理性认识转化的,所以,你可能要先去找一下应用场景,学点更实用的,再回来学理论。

​ 3)学习需要有反馈,有成就感,带着相关问题去学习会更好。

​ 4)当然,找到牛人来给你讲解,也是一个很不错的手段。

2.如何面对大量的知识

一点一点学,一口一口吃。注重基础,画知识图,多问为什么,多动手,然后坚持住。

带着问题去学习,带着要解决的东西去学习,带着挑战去学习,于是每当你解决了一个问题,做了一个功能,完成了一个挑战,你就会感到兴奋和有成就感。这样,你也就找到了源源不断的学习驱动力。

把你学习的心得、过程、笔记、代码分享出来,找到和你一同学习的人,因为一个人长跑很辛苦,有人同行就会好很多,就算没有人同行,你的读者,你的观众也会为你鼓掌加油,这些也是让你持续前行的动力。

3.认真阅读文档

很多技术问题都是出在技术人员不认真读技术手册上。用户手册(User Manual)一定要好好地读一读,很多很多提示都在里面了,这是让你可以少掉很多坑的法宝。

4.其他几个实用的技巧

​ 1)用不同的方式来学习同一个东西。比如:通过看书,听课,创建脑图,写博客,讲课,解决实际问题,等等。

​ 2)不要被打断

​ 3)总结压缩信息

​ 4)把未知关联到已知

​ 5)用教的方式来学习

​ 6)学以致用

​ 7)不要记忆

​ 8)多犯错误


左耳听风文章阅读笔记-高效学习篇
http://cxspace.org.cn/2023/12/25/左耳听风文章阅读笔记-高效学习篇/
Author
陈晓
Posted on
December 25, 2023
Licensed under