程序员的精益成长指南3:不得不知道的13个问题

如何进行主动学习与被动学习?深度学习为何十分重要?读文档仍是读代码?这篇文章给出了你最关心的13个问题,但愿对你有启发。算法

1.主动学习与被动学习

你听别人讲,或是本身看书,或是让别人演示给你,这些都不能让你真正得到学习能力,由于你是在被别人灌输,在听别人说。编程

只有你开始本身思考,开始本身总结和概括,开始找人交流讨论,开始践行,并开始对外输出,你才会掌握到真正的学习能力。框架

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

2.深度学习十分重要

应该怎样进行深度学习呢?下面几点是关键。工具

  • 高质量的信息源和第一手的知识。
  • 把知识连成地图,将本身的理解反述出来。
  • 不断地反思和思辨,与不一样年龄段的人讨论。
  • 触类旁通,并践行之,把知识转换成技能。

换言之,学习有三个步骤性能

  • 知识采集。信息源是很是重要的,获取信息源头、破解表面信息的内在本质、多方数据印证,是这个步骤的关键。
  • 知识缝合。所谓缝合就是把信息组织起来,成为结构体的知识。这里,链接记忆,逻辑推理,知识梳理是很重要的三部分。
  • 技能转换。经过触类旁通、实践和练习,以及传授教导,把知识转化成本身的技能。这种技能可让你进入更高的阶层。

我以为这是任何人都是能够作到的,就是看你想不想作了。学习

3.学习是为了找到方法和原理

学习不只仅是为了找到答案,而更是为了找到方法。只有掌握解题的思路和方法,你才算得上拥有解决问题的能力。测试

学习不只仅是为了知道,而更是为了思考和理解。在学习的过程当中,咱们不是为了知道某个事的表面是什么,而是要经过表象去探索其内在的本质和原理。spa

在学习的过程当中,咱们要不断地问本身,这个技术出现的初衷是什么?是要解决什么样的问题?为何那个问题要用这种方法解?为何不能用别的方法解?为何不能简单一些?……debug

拥有正确的学习观念:学习不只仅是为了找到答案,而更是为了找到方法;学习不只仅是为了知道,而更是为了思考和理解;学习不只仅是为了开拓眼界,而更是为了找到本身的未知,为了了解本身;学习不只仅是为了成长,而更是为了改变本身,改变本身的思考方式,改变本身的思惟方式,改变本身与生俱来的那些垃圾和低效的算法。

端正的学习态度和正确的学习观念,是高效学习的第一步,拥有这二者必定可让你事半功倍。

4.挑选知识和信息源

若是你以为用百度搜中文关键词就能够找到本身想要的知识,那么你必定远远落后于这个时代了。若是你用 Google 英文关键词能够找到本身想要的知识,那么你算是能跟得上这个时代。若是你能在社区里跟社区里的大牛交流获得答案,那么你算是领先于这个时代了。

你的信息源要有下面几个特质。

  • 应该是第一手资料,不是被别人理解过、消化过的二手资料。尤为对于知识性的东西来讲,更是这样。应该是原汁原味的,不该该是被添油加醋的。
  • 应该是有佐证、有数据、有引用的,或是有权威人士或大公司生产系统背书的资料。应该是被时间和实践检验过的,或是当心求证过的,不是拍脑壳野路子或是道听途说出来的资料。
  • 应该是加入了一些本身的经验和思考,能够引起人深思的,是所谓信息的密集很大的文章。

5.注重基础和原理

我说过,不少人并非学得不够快,而他们的基础真的不行。基础不行,会影响你对事物的理解,甚至会让你不能理解为何是这样。当你对事物的出现有不理解的东西时,一般来讲,是由于你的基础知识没有跟上。

6.使用知识图

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

7.系统地学习

在学习某个技术的时候,可使用一个学习模板。只有把这个学习模板中的内容都填实了,我才罢休。这个模板以下

  1. 这个技术出现的背景、初衷和要达到什么样的目标或是要解决什么样的问题。 这个问题很是关键,也就是说,你在学习一个技术的时候,须要知道这个技术的成因和目标,也就是这个技术的灵魂。若是不知道这些的话,那么你会看不懂这个技术的一些设计理念。
  2. 这个技术的优点和劣势分别是什么,或者说,这个技术的 trade-off 是什么。 任何技术都有其好坏,在解决一个问题的时候,也会带来新的问题。另外,通常来讲,任何设计都有 trade-off(要什么和不要什么),因此,你要清楚这个技术的优点和劣势,以及带来的挑战。
  3. 这个技术适用的场景。 任何技术都有其适用的场景,离开了这个场景,这个技术可能会有不少槽点,因此学习技术不但要知道这个技术是什么,还要知道其适用的场景。没有任何一个技术是普适的。注意,所谓场景通常分别两个,一个是业务场景,一个是技术场景。
  4. 技术的组成部分和关键点。 这是技术的核心思想和核心组件了,也是这个技术的灵魂所在了。学习技术的核心部分是快速掌握的关键。
  5. 技术的底层原理和关键实现。 任何一个技术都有其底层的关键基础技术,这些关键技术颇有可能也是其它技术的关键基础技术。因此,学习这些关键的基础底层技术,可让你将来很快地掌握其它技术。能够参看我在 CoolShell 上写的 Docker 底层技术那一系列文章。
  6. 已有的实现和它之间的对比。 通常来讲,任何一个技术都会有不一样的实现,不一样的实现都会有不一样的侧重。学习不一样的实现,可让你获得不一样的想法和思路,对于开阔思惟,深刻细节是很是重要的。

基本上来讲,若是你按照我上面所提的这 6 大点来学习一门技术,你必定会学习到技术的精髓,并且学习的高度在一开始就超过不少人了。若是你能这样坚持 2-3 年,我相信你必定会在某个领域成为煊赫一时的佼佼者。

8.触类旁通

我认为,人与人最大的差异就是触类旁通的能力。那些聪明的或者是有经验的人触类旁通起来真是太使人惊叹。

我以为一我的的触类旁通能力,能够分解成以下三种基本能力。

  • 联想能力。 这种能力的锻炼须要你平时就在不停地思考同一个事物的不一样的用法,或是联想与之有关的别的事物。对于软件开发和技术学习也同样。
  • 抽象能力。 抽象能力是触类旁通的基本技能。平时你解决问题的时候,若是你能对这个问题进行抽象,你就能够得到更多的表现形式。抽象能力须要找到解决问题的通用模型,好比数学就是对现实世界的一种抽象。只要咱们能把现实世界的各类问题创建成数据模型(如,创建各类维度的向量),咱们就能够用数学来求解,这也是机器学习的本质。
  • 自省能力。 所谓自省能力就是本身找本身的难看。当你获得一个解的时候,要站在本身的对立面来找这个解的漏洞。有点像左右手互博。这种本身和本身辩论的能力又叫思辨能力。将本身分裂成正反方,左右方,甚至多方,站在不一样的立场上来和本身辩论,从而作到不漏过一个 case,从而得到完整全面的问题分析能力。

在这方面,我对本身的训练以下。

  1. 对于一个场景,制造出各类不一样的问题或难题。
  2. 对于一个问题,努力寻找尽量多的解,并比较这些解的优劣。
  3. 对于一个解,努力寻找各类不一样的测试案例,以图让其健壮。

老实说,要得到这三种能力,除了你要很喜欢思考和找其它人来辩论或讨论之外,还要看你本身是否真的善于思考,是否有好奇心,是否喜欢打破沙锅问到底,是否喜欢关注细节,作事是否定真,是否严谨……

9.概括和总结

对本身的知识进行总结和概括是提升学习能力的一个很是重要的手段。这是把一个复杂问题用简单的语言来描述的能力。

咱们把学到的东西用本身的语言和理解从新组织并表达出来,本质上是对信息进行消化和再加工的过程,这个过程可能会有信息损失,但也可能会有新信息加入,本质上是信息重构的过程。咱们积累的知识越多,在知识间进行联系和区辨的能力就越强,对知识进行总结和概括也就越轻松。而想要提升总结概括的能力,首先要多阅读,多积累素材,扩大本身的知识面,多和别人讨论,多思辨,从而见多识广。

咱们须要注意的是,若是只学了部分知识或者尚未学透,就开始对知识进行总结概括,那么总结概括出来的知识结构也只能是混乱和幼稚的。所以,学习的开始阶段,能够不急于总结概括,不急于下判断,作结论,而应该保留部分知识的不肯定性,保持对知识的开放状态。当对整个知识的理解更深刻,本身站的位置更高之后,总结和概括才会更有条理。总结概括更可能是在复习中对知识的回顾和重组,而不是一边学习一边就总结概括。

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

要训练本身这方面的能力,你须要多看一些经典的方法论图书,看看别人是怎样总结和概括知识的。你能够在一开始模仿并把本身的理解的知识给写出来,写博客会是一种很好的方式。另一种更好的方式是讲一遍给别人听。总之,你须要把你总结概括的知识公开出来,给别人看,接受别人的批评和反馈,这样你才能成长得更快。其实,我也在锻炼这样的能力。

10.读文档仍是读代码

书和文档是人对人说的话,代码是人对机器说的话(注:代码中有一部份逻辑是控制流程的逻辑,不是业务逻辑),因此

  1. 若是你想知道人为何要这么搞,那么应该去看书(像 Effective C++、Code Complete、Design Pattern、Thinking in Java 等),看文档。
  2. 若是你要知道让机器干了什么?那你应该看代码!(就像 Linus 去看 zlib 的代码来找性能问题。)

所以,我认为都比较重要,关键看你的目的是什么了。

若是你想了解一种思想,一种方法,一种原理,一种思路,一种经验,恐怕,读书和读文档会更有效率一些,由于其中会有做者的思路描述。像 Effective C++ 之类的书,里面有不少对不一样用法和设计的推敲,TCP/IP 详解里面也会有对 TCP 算法好坏的比较……这些思惟方式能让你对技术的把握力更强,而光看代码很难达到这种级别。(如今你知道什么样的书是好书了吧)

若是你想了解的就是具体细节,好比某协程的实现,某个模块的性能,某个算法的实现,那么你仍是要去读代码的,由于代码中会有更具体的处理(尤为是对于一些 edge case 或是代码技巧方面的内容)。

从学习的过程当中,咱们来分析一下看代码和看书这两个活动。人对新事物的学习过程基本都是从“感性认识”到“理性认识”的。

若是你是个新手,那应该多读代码,多动手写代码,由于你须要的是“感性认识”,这个时候“理性认识”你体会不到。一是由于,你没有切身的感觉,即使告诉你 Why 你也体会不到。另外一方面,这个阶段,你要的不是作漂亮,而是作出来。因此,在新手阶段,你会喜欢 GitHub 这样的东西。

若是你是个老手,你有多年的“感性认识”了,那么你的成长须要更多的“理性认识”。由于这个阶段,一方面,你会不知足于作出来,你会想去作更牛更漂亮的东西;另外一方面,你知道的越多,你的问题也越多,你迫切地须要知道 Why!这时,你须要大量地找牛人交流(读牛人的书,是一种特殊的人与人的交流),因此,这个阶段,你会喜欢读好的书和文章。

然而,对于计算机行业这个技术创新能力超强、技术种类繁多的行业来讲,咱们每一个人都既是新手,也是老手。

11.如何阅读源代码

在阅读代码以前,我建议你须要有下面的这些前提再去阅读代码,这样你读起代码来会很顺畅。

  • 基础知识。相关的语言和基础技术的知识。
  • 软件功能。你先要知道这个软件完成的是什么样的功能,有哪些特性,哪些配置项。你先要读一遍用户手册,而后让软件跑起来,本身先用一下感觉一下。
  • 相关文档。读一下相关的内部文档,Readme 也好,Release Notes 也好,Design 也好,Wiki 也好,这些文档可让你明白整个软件的方方面面。若是你的软件没有文档,那么,你只能期望这个软件的原做者还在,并且他还乐于交流。
  • 代码的组织结构。也就是代码目录中每一个目录是什么样的功能,每一个文档是干什么的。若是你要读的程序是在某种标准的框架下组织的,好比:Java 的 Spring 框架,那么恭喜你,这些代码不难读了。

阅读代码的方法以下:

  • 通常采用自顶向下,从整体到细节的“剥洋葱皮”的读法。
  • 画图是必要的,程序流程图,调用时序图,模块组织图……
  • 代码逻辑归一下类,排除杂音,主要逻辑才会更清楚。
  • debug 跟踪一下代码是了解代码在执行中发生了什么的最好方式。

对了,阅读代码你须要一个很好的 IDE。我记得之前读 C 和 C++ 代码时,有一个叫 source insight 的工具就大大提升了个人代码阅读效率。说白了就是能够查看代码间相互的调用 reference 的工具,这方面 Visual Studio 作得是很是好的。

12.如何面对枯燥的知识

若是你发现有些知识太过于枯燥,那么能够经过下面的方法解决。

  • 这个知识对于你来讲来过高级了,你可能不知道能用在什么地方。
  • 人的认知是从感性认识向理性认识转化的,因此,你可能要先去找一下应用场景,学点更实用的,再回来学理论。
  • 学习须要有反馈,有成就感,带着相关问题去学习会更好。
  • 固然,找到牛人来给你讲解,也是一个很不错的手段。

13.如何面对大量知识

我给你的建议是,一点一点学,一口一口吃。你可使用我前面说过的那些方法,注重基础,画知识图,多问为何,多动手,而后坚持住,哪怕你每周就学一个知识点,你一年也能够学到 50 个知识点。只要你在进步,总有一天能够把这些知识学到手的。

固然,你的目的不是学完这些知识,由于学无止境,你永远也学不完,因此你在学习时,必定不要学在表面上,必定要学到本质,学到原理上,那些东西是不容易变的,也是经得住时间考验的。把学习当成投资,这是这个世界上回报最好的投资。

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

把你学习的心得、过程、笔记、代码分享出来,找到和你一同窗习的人,由于一我的长跑很辛苦,有人同行就会好不少,就算没有人同行,你的读者,你的观众也会为你鼓励叫好,这些也是让你持续前行的动力。

其它几个实用的技巧:

  • 用不一样的方式来学习同一个东西。 好比:经过看书,听课,建立脑图,写博客,讲课,解决实际问题,等等。
  • 不要被打断。 被打断简直就是学习的天敌,因此,你在学习的时候,最好把手机设置成勿扰模式放在一边,而后把电脑上的全部通知也关掉,最好到一个别人找不到你的地方。
  • 总结压缩信息。 当你得到太多的信息时,你须要有一个“压缩算法”。我经常使用的压缩算法是只关心关键点,因此,你须要使用表格、图示、笔记或者脑图来帮助你压缩信息。
  • 把未知关联到已知。 把你新学的知识点关联到已知的事物上来。好比,你在学习 Go 语言,你就把一些知识关联到本身已经学过的语言上好比 C 和 Java。经过类比,你会学得更扎实,也会思考得更多。
  • 用教的方式来学习。 你想一想,若是你过几天要在公开场合对不少人讲一个技术,那么这个压力会让你学得更好。由于要教给别人,因此,这么高的标准须要你不但要把本身已掌握的东西学好,还要把周边的也一并学了,才可能作到百问不倒。你才敢去教别人,不是么?(试试教 6 岁的孩子编程,若是你掌握了这种技能,那么你必定是把知识吃得很是透彻了。)
  • 学以至用。 把学到的东西用起来,没有什么比用起来能让你的知识更巩固的了。在实践中,你才会有更为真实的体会,你才会遇到很是细节和很是具体的问题,这些都会让你从新思考,或深化学习。
  • 不要记忆。 聪明的人不会记忆知识的,他们会找方法,那些能够推导出知识或答案的方法。这也是为何外国人特别喜欢方法论。
  • 多犯错误。 犯错会让你学获得更多,经过错误总结教训,你会比没有犯过错的人体会得更深。可是千万不要犯低级错误,也不要同一个错误犯两次。

全文完。


关注公众号,第一时间接收最新文章。若是对你有一点点帮助,能够点喜欢点赞点收藏,还能够小额打赏做者,以鼓励做者写出更多更好的文章。关注公众号便可领取全栈精品视频教程大礼包。

关注公众号

相关文章
相关标签/搜索