以下内容总结自左耳朵耗子陈皓的极客时间专栏《左耳听风》,有条件的可以订阅专栏看原版哦。
一、学习态度
学习是不可能速成的,不过在学习的过程中可以使用一些方法和技巧。
让我来个学习贴上一些标签: 逆人性,坚持,痛苦,放弃。
学习的一些误区:
- 只有意识没有行动,谓之缺乏动力。
- 不知道自己该学什么,谓之缺乏方向和目标。
- 不具备自主学习的能力,谓之缺乏方法和技能。
- 最致命的,谓之缺乏实践和坚持。
学习金字塔
1946年,美国学者诶德加·戴尔(Edgar Dale)提出了“学习金字塔”(Cone of Learning)的理论。
人的学习分为“被动学习” 和 “主动学习”两个层次。
- 被动学习:听讲、阅读、视听、演示,学习内容的平均留存率为5%、10%、20%和30%。
- 主动学习:讨论、实践、教授给他人,会将学习内容的平均留存率提升到50%、75%和90%。
在学习的过程中,最少也要做的到实践的这一层次。践行是十分重要的。
学习不是努力读更多的书,盲目追求速度和数量,会让人产生低层次的勤劳和成长的错觉。要思辨、践行、总结和归纳,进行深度的学习,而不是机械的重复某件事。
浅度学习和深度学习
当今社会的现状:
- 大多数人的信息渠道,被微信朋友圈、微博、知乎、字节系的产品所占据。这些信息渠道中有营养的信息少之又少。
- 大多数公司都是实行996这种加班文化,透支和消耗这下一代人,使其无法成长。
- 国内互联网访问不通畅,再加上因为水平受限,所以,大多数人无法获取到国外的第一首信息。
- 快餐文化盛行,大多数人急于速成,心态浮躁,对事物不求甚解。
由此来看,在这种环境下,你不需要付出额外的努力。只需要踏实一点,看得进书,看得懂英文资料,只需要正常学习,就能够超过身边的很多人。
同时,这也是一个资本疯狂追逐消费者的时代,知识的生产者会更加贴近大众的喜好,生产快速易懂的快餐式知识。长久之后,自然就形成了知识阶层,那些长期在底层知识阶层的人,需要等着高层的人来投喂,从而丧失进行深度学习的能力,再也无法打破知识阶层的限制,被困在认知底层翻不了身。
深度学习的关键:
- 高质量的信息源和第一手的知识。
- 把知识连成地图,将自己的理解反述出来。
- 不断的反思和思辨,与不同年龄段的人讨论。
- 举一反三,践行,把知识转换成技能。
总结为一下三个步骤:
- 知识采集:获取信息源头、破解表面信息的内在本质、多方数据印证。
- 知识缝合:把信息组织起来,称为有体系结构的知识。通过连接记忆、逻辑推理和知识梳理来进行整合。
- 技能转换:通过举一反三、实践和练习,以及传授教导,把知识转化成自己的技能。
为何而学
学习不仅是为了找到答案,而更是为了找到方法。学习是为了找到通往答案的路径和方法,是为了拥有无师自通的能力。
学习不仅仅是为了知道,而更是为了思考和理解。一旦理解和掌握了本质的东西,你会发现,整个复杂多变的世界在变的越来越简单。
学习不仅仅是为了开拓眼界,而是为了找到自己的未知,为了了解自己。开拓眼界的目的就是发现自己的不足和上升空间,从而让自己更好的成长。
学习不仅仅是为了成长,更是为了改变自己。学习是为了改变自己的思考方式,改变自己的思维方式,改变自己与生俱来的那些垃圾和低效的算法。总之,学习让我们改变自己,行动和践行,反思和改善,从而获得成长。
二、源头、原理和知识地图
首先,英语真的很重要、英语真的很重要、英语真的很重要。
优质的信息源
- 第一手资料,没有经过其他人二次处理的资料。
- 应该有佐证、有数据、有引用的,或者有权威人士或者大公司生产系统背书的资料。
- 添加了自己的经验和思考,可以给人启发的文章,即所谓信息密度大的文章。
这里推荐一个国外比较好的网站Medium,文章质量普遍较高。
要学会自己找食儿吃,而不是通过别人加工好的信息进行学习。优质的信息源会让学习是办公本。并且掌握渔比鱼更重要。
注重基础和原理
基础知识和原理性的东西是无比重要的。很多人不是学的不够快,而是基础真的不行。基础不好,不仅会影响人对事物的理解,甚至会让人不能理解为什么是这样。
最关键的是,基础知识和原理性的东西和技术都是经过长时间的考验的。这些基础技术也是很多人类历史上的智慧结晶,会给人带来很多启示和帮助。
基础牢固,学东西就快,学得快就会学得多,学得多思考就多,对比就多,结果就是学得更快……进而形成循环,形成体系。
形成知识地图
记忆单独的知识点不仅多而杂,而且很容易遗忘,将知识通过其内在的联系串起来,形成一个知识地图,从大知识点到小知识点,即便无法将所有的知识都背下来,也会形成整体的概况。
学习并不是要记忆所以的知识点,而是为了找到一个知识的地图,让你可以通过地图上的关键路径找到想要的答案。
三、深度,归纳和坚持实践
系统的学习
在学习某个技能时,除了利用知识地图,再多问几个为什么。最好形成一个模板,在学习的过程中将模板的内容填实了,对这个技术的掌握也就差不多了。
- 这个技术出现的背景、初衷和要达到什么样的目标或要解决什么样的问题。
- 这个技术的优势和劣势分别是什么,或者说这个技术的trade-off是什么。
- 这个技术适用的场景。
- 技术的组成部分和关键点。
- 技术的底层原理和关键实现。
- 已有的实现和它之间的对比。
举一反三
这个能力很重要,但是如何获得举一反三的能力呢?
举一反三=联想+抽象+自省
- 联想:对一个事物要从不同的角度进行思考,或联想与之有关的其他事务。
- 抽象:对问题进行抽象,形成通用模型,然后就可以在这个模型上解决问题(数学就是典型的抽象,这也是机器学习的本质)。
- 自省:站在不同的立场来对自己的方案进行找茬,也是思辨能力的一种体现。
训练方式:
- 对于一个场景,要提出各种不同的问题和难题。
- 对于一个问题,要努力寻找尽可能多的解,并比较这些解的优劣。
- 对于一个解,努力寻找各种不同的测试案例,以图让其健壮。
想要获得这种能力,除了要很喜欢思考和找其他人辩论或讨论外,还要看你是否真的善于思考,是否有好奇心,是否喜欢打破沙锅问到底,是否喜欢关注细节,做事是否认真,是否严谨……
总结和归纳
总结和归纳是对信息进行消化和再加工的过程,可能会丢失信息,也可能添加新的信息,本质上是对消息的重构。
训练这方面能力的方法就是多阅读、多积累素材,扩大自己的知识面,多和别人讨论,多思辨。
在学习的开始阶段不要急于总结归纳,要保持对知识的开放状态,因为只学了部分知识或者还没有学透,总结出的知识结构也只能是混乱和幼稚的。
把看到和学习到的信息,归整好,排列好,关联好,把信息碎片给结构化,然后在结构化的信息中,找到规律,找到想通之处,进行简化、归纳和总结,最终形成一种套路,一种模式,一种通用的方法。
这里建议多看一些经典的方法论的书,看看别人是如何总结和归纳知识的。
写博客和讲给别人听都是一种好方法。
坚持不懈
坚持不懈,这是一句正确的废话。难点在于如何做到这一点。
人不怕笨,但是怕懒,怕你找各种理由放弃。当然,坚持也是有方法的。
一方面可以把坚持形成的成果晒出来,让与其他人形成一个可以讨论的场景,另一方面,要把坚持变成一种习惯,就想吃饭喝水一样,降低坚持所付出的成本。
四、如何学习和阅读代码
读文档还是读代码
Code Tells You How, Comments Tell You Why. — 杰夫·阿特伍德(Jeff Atwood)
- 代码:What、How and Details
- 文档/书:What、How and Why
代码不会告诉你Why,只能通过猜测或推导来估计Why,所以会有很多误解。Why就是那些让人一通百通的东西。
而代码会告诉你细节,这是文档和书里没有的东西。细节是魔鬼,细节决定成败。
书和文档是人与人的对话,代码是人与机器的对话。
- 如果你想知道人为什么这么做,应该去看书或者文档。
- 如果你想知道让机器干了什么,那就应该去看代码。
所以说,文档/书与代码是互补的,理论与实现,单从任何一个方面你都无法得到一个事物的全貌。但是两者又是可以分先后的,在前期,我们应该多读代码,多动手写代码,积累自己的感性认识。这个阶段做出来,比做漂亮更重要。当你有了很多的积累和经验之后,那么你就需要更多的理性认识,需要读好的文章和书籍。
如何阅读源码
阅读源码的前提:
- 基础知识:指相关语言的基础技术知识。
- 软件功能:要清楚这个软件完成什么样的功能,有哪些特性,哪些配置项。对软件的应用有一个认识。
- 相关文档:软件的内部文档,Readme、Release Notes、Design、Wiki等等,这些文档能让你明白整个软件的方方面面。
- 代码的组织结构:也就是代码目录中每个目录都组织了什么样的功能,每个文档的作用。
有了以上的前提,还要了解这个软件的代码是由哪些部分构成的:
- 接口抽象定义:任何代码都会有很多接口和抽象的定义,描述了需要处理的数据结构或业务实体,理清他们之间的关系是非常重要的。
- 模块粘合层:比如中间件、Promises模式、回调(Callback)、代理委托、依赖注入等。这些粘合技术是非常重要的,它们会把原本平铺直叙的代码给分裂开,让人不容易看明白它们的关系。
- 业务流程:这是代码的运行过程。一般来说需要画程序的流程图或者时序图。
- 具体实现:以上三点都是让你对软件有总体认识。这个时候,你就可以深入细节,开始阅读具体实现的代码了。
- 代码逻辑:代码有两种逻辑,一种是业务逻辑,是真正的业务处理逻辑。另一种是控制逻辑,只用来控制程序流转的。
- 错误处理:根据二八原则,20%的代码是正常的逻辑,80%的代码是在处理各种错误,所以,在阅读代码时,可以将错处处理相关的代码用一个注释说明。排除干扰因素,只看核心代码。
- 数据处理:有些代码基本就是在进行数据的转换,比如DAO、DTO,比如JSON或者XML,这些代码一般不是主要逻辑,可以不理。
- 主要的算法:一般来说代码中会有很多重要的算法,比如排序、搜索、全局唯一ID的算法、信息推荐的算法、统计算法、通读算法等等。这些算法非常难读,但往往是最有技术含量的部分。
- 底层交互:一些代码是和底层系统交互的,一般来说是和OS或JVM的交互。读这些代码通常需要一定的底层技术知识,不然也很难读。
- 运行时调试:很多时候,只有代码运行起来了,才能知道具体发生了什么,所以,需要让代码运行起来,通过日志也好,debug断点跟踪也好。实际看一下代码的运行过程,也是了解代码的一种好方式。
总结:
- 一般采用自顶向下,从总体到细节的读法。
- 画图是必要的,程序流程图、调用时序图、模块组织图……
- 代码逻辑归下类,排除干扰。
- debug是一个好方法。
五、面对枯燥和量大的知识
一般来说,枯燥的东西通常是你不感兴趣的东西,或者并不知道有什么用的东西。这种知识通常比较底层或者抽象程度比较高,比如:线性代数、比如操作系统原理……越理论的东西越让人觉得枯燥。
学习这些知识时:
- 这个知识对你来说太高级了,你可能不知道能用在什么地方。
- 人的认知是从感性认识向理性认识转化的,所以可以先找一个应用场景,学点实用的,再回来学习理论。
- 学习需要反馈,要有成就感,带着问题学习的效果更好。
- 让牛人来讲解也是一个不错的手段。
如何面对大量的知识
答案是没有捷径,知识一点点学、饭一口口吃,注重基础,画好知识图,多问为什么,多实践,然后就是坚持不懈,哪怕一周学习一个知识点,一年也能收获50多个知识点。
并且,学习一定要学到本质,学到原理,这些东西是不容易变的,也是最能经得起时间考验的。
带着问题和挑战去学习,这样每当你解决了一个问题,做了一个功能,也就完成了一个挑战,会让你感到兴奋和有成就感。也能为你提供学习的驱动力。
六、一些个人的感悟
我个人从事软件开发行业将近5年时间,从事的工作比较杂,做过项目开发、也做过前端架构的组件开发,用Loadrunner跑过性能测试,也在现场做个实施部署……但是苦于自己没有一个良好的学习习惯和方法,所掌握的知识都是零散的,时间一久有些知识根本就想从没跟我相遇过一样,从而无法对我的职业晋升产生任何帮助。
借由陈叔的这个搞笑学习系列文章,也打算将自己的学习方式做一个全面更新,以32岁的高龄,重新认识学习,重新开始学习,希望三年以后的我感觉不到35岁的焦虑。
从这个系列的文章中,提炼出三个重点:
- 坚持不懈:是学习的第一前提。
- 学习本质原理:是提高效率的最好途径。
- 总结归纳:是沉淀知识的最终方法。
提炼容易,做到很难,愿每一天我都能记得上面讲述的这些东西。