如何构建自己的知识体系?(完结)
如何构建自己的知识体系?(完结)
先说一件值得思考的事情:高考的时候大家都是一样的教科书,同一个教室,同样的老师
辅导,时间精力基本差不多,可是最后有人考的是清华北大或者一本,而有的人只能考个
三本、大专,为什么?
大家平时都看过很多方法论的文章,看的时候很爽觉得非常有用,但是一两周后基本还是
老样子。其中有很大一部分原因是那些方法对脑力有要求、或者方法论比较空,缺少落地
的步骤。
今天我就来给大家分享一下:如何构建自己的知识体系?
01. 关键问题点
为什么你的知识积累不了?
有些知识看过就忘、忘了再看,实际碰到问题还是关联不上,这其实是知识的积累出了问
题,没有深入的理解自然就不能灵活运用,也就谈不上解决问题了。这跟大家一起看相同
的高考教科书但是高考结果不一样是一个原因。问题出在了理解上,每个人的理解能力不
一样(智商),绝大多数人对知识的理解要靠不断地实践(做题)来巩固。
同样实践效果不一样?
同样工作一年碰到了 10 个问题(或者说做了 10 套高考模拟试卷),但是结果不一样,
那是因为在实践过程中方法不够好。或者说你对你为什么做对了、为什么做错了没有去复
盘。
假如碰到一个问题,身边的同事解决了,而我解决不了。那么我就去想这个问题他是怎么
解决的,他看到这个问题后的逻辑和思考是怎么样的,有哪些知识指导了他要这么推理,
哪些知识我也知道但是我没有想到这么去运用(说明我对这个知识理解的不到位导致灵活
运用缺乏);这些知识中又有哪些是我不知道的(知识缺乏,没什么好说的快去 Google
学习下——有场景案例和目的加持,学习理解起来更快)。
等你把这个问题基本按照你同事掌握的知识和逻辑推理想明白后,需要再去琢磨一下他的
逻辑推理、解题思路中有没有不对的,有没有啰嗦的地方,有没有更直接的方式(对知识
更好地运用)。
我相信每个问题都这么去实践的话就不应该再抱怨灵活运用、举一反三,同时知识也积累
下来了,这种场景下积累到的知识是不会那么容易忘记的。
这就是向身边的牛人学习,同时很快超过他的办法。这就是为什么高考前你做了 10 套模
拟题还不如其他人做一套的效果好的原因了。
知识+逻辑基本等于你的能力,知识让你知道那个东西,逻辑让你把东西和问题联系起
来。
这里的问题你可以理解成方案、架构、设计等。
系统化的知识哪里来?
知识之间是可以联系起来的并且像一颗大树一样自我生长,但是当你都没理解透彻,自然
没法产生联系,也就不能够自我生长了。
真正掌握好的知识点会慢慢生长连接最终组成一张大网。
但是我们最容易陷入的就是掌握的深度、系统化(工作中碎片时间过多,学校里缺少时
间)不够,所以一个知识点每次碰到花半个小时学习下来觉得掌握了,但是 3 个月后就又
没印象了。
总是感觉自己在懵懵懂懂中,或者一个领域学起来总是不得要领,根本的原因还是在于:
• 宏观整体了解不够(缺乏体系,每次都是盲人摸象);
• 关键知识点深度不够,理解不透彻,这些关键点就是这个领域的骨架、支点、抓手。
缺了抓手自然不能生长,缺了宏观大图容易误入歧途。
我们有时候发现自己在某个领域学起来特别快,但是换个领域就总是不得要领。这也就是
为什么学霸看两个小时的课本比你看两天效果还好,感受下来还觉得别人好聪明,是不是
智商比我高啊。
所以新进入一个领域的时候要去找他的大图和抓手。
好的同事总是能很轻易地把这个大图交给你,再顺便给你几个抓手,你就基本入门了,这
就是培训的魅力,这种情况肯定比自学效率高多了。但是目前绝大部分的培训都做不到这
点。
好的逻辑又怎么来?
实践、复盘。
02. 讲个前同事的故事
有一个前同事是 5Q 过来的,负责技术(所有解决不了的问题都找他),这位同学从
ChinaRen 出道,跟着王兴一块创业 5Q,5Q 在学校靠鸡腿打下大片市场,最后被陈一舟
的校内收购(据说被收购后 5Q 的好多技术都走了,最后王兴硬是呆在校内网把合约上的
所有钱都拿到了)。
这位同学让我最佩服的解决问题的能力,好多问题其实他也不一定就擅长,但是他就是有
本事通过 Help、Google 不停地验证尝试就把一个不熟悉的问题给解决了,这是我最羡慕
的能力,在后面的职业生涯中一直不停地往这个方面尝试。
应用刚启动连接到数据库的时候比较慢,但又不是慢查询。
这位同学的解决办法是通过 tcpdump 来分析网络包,看网络包的时间戳和网络包的内
容,然后找到了具体卡在了哪里。
如果是专业的 DBA 可能会通过 show processlist 看具体连接在做什么,比如看到这些连
接状态是 authentication 状态,然后再通过 Google 或者对这个状态的理解知道创建连接的
时候 MySQL 需要反查 IP、域名这里比较耗时,通过配置参数 skip-name-resolve 跳过去就
好了。
如果是 MySQL 的老司机,一上来就知道连接慢的话跟 skip-name-resolve 关系最大。
在我眼里这三种方式都解决了问题,最后一种最快但是纯靠积累和经验,换个问题也许就
不灵了;第一种方式是最牛逼和通用的,只需要最少的知识就把问题解决了。
我当时跟着他从 sudo、ls 等 Linux 命令开始学起。当然我不会轻易去打搅他,每次碰到问
题我尽量让他在我的电脑上来操作,解决后我再自己复盘,通过 history 调出他的所有操
作记录,看他在我的电脑上用 Google 搜啥了,然后一个个去学习分析他每个动作,去想
他为什么搜这个关键字,复盘完还有不懂的再到他面前跟他面对面的讨论他为什么要这么
做,指导他这么做的知识和逻辑又是什么。
03. 有哪些好的行为帮你更好地掌握知识
看东西的时候要做笔记,要不当时看得再爽也很容易忘记,我们需要反复复习来加深印象
和理解,复习的根据就是笔记(不可能再完整又看一次),笔记整理出里面的要点和你的
盲点。
一段时间后把相关的笔记整理成一篇体系性的博客文章,这样既加深了理解又系统化了相
关知识。以后再看到跟这篇博客相关的案例、知识点时不断地更新博客(完善你的知识
点)。
04. 场景式学习、体感的来源、面对问题学习
前面提到的对知识的深入理解这有点空,如何才能做到深入理解?
举个学习 TCP 三次握手例子
经历稍微丰富点的工程师都觉得 TCP 三次握手看过很多次、很多篇文章了,但是文章写
得再好似乎当时理解了,但是总是过几个月就忘了或者一看就懂,过一阵子被人一问就模
模糊糊了,或者两个为什么就答不上了,自己都觉得自己的回答是在猜或者不确定。
为什么会这样呢?而学其它知识就好通畅多了,我觉得这里最主要的是我们对 TCP 缺乏
体感,比如没有几个工程师去看过 TCP 握手的代码,也没法想象真正的 TCP 握手是如何
在电脑里运作的(打电话能给你一些类似的体感,但是细节覆盖面不够)。
如果这个时候你一边学习的时候一边再用 Wireshark 抓包看看三次握手具体在干什么,比
抽象的描述实在多了,你能看到具体握手的一来一回,并且看到一来一回带了哪些内容,
这些内容又是用来做什么、为什么要带,这个时候你再去看别人讲解的理论顿时会觉得好
理解多了,以后也很难忘记。
但是这里很多人执行能力不强,想去抓包,但是觉得要下载安装 Wireshark,要学习
Wireshark 就放弃了。只看不动手当然是最舒适的,但是这个最舒适给了你在学习的假
象,没有结果。
这是不是跟你要解决一个难题非常像,这个难题需要你去做很多事,比如下载源代码(翻
不了墙,放弃);比如要编译(还要去学习那些编译参数,放弃);比如要搭建环境(太
琐屑,放弃)。你看这中间九九八十一难你放弃了一难都取不了真经。这也是为什么同样
学习、同样的问题,他能学会,他能解决,你不可以。
再来看一个解决问题的例子
会员系统双 11 优化这个问题对我来说,我是个外来者,完全不懂这里面的部署架构、业
务逻辑。但是在问题的关键地方(会员认为自己没问题–压力测试正常的;淘宝 API 更是
认为自己没问题,AliMonitor 监控显示正常),结果就是会员的同学说我们没有问题,淘
宝 API 肯定有问题,然后就不去思考自己这边可能出问题的环节了。思想上已经甩包了,
那么即使再去 review 流程、环节也就不会那么仔细,自然更是发现不了问题了。
但是我的经验告诉我要有证据地甩包,或者说拿着证据优雅地甩包,这迫使我去找更多的
细节证据(证据要给力哦,不能让人家拍回来)。如果我是这么说的,这个问题在淘宝
API 这里,你看理由是……,我做了这些实验,看到了这些东东。那么淘宝 API 那边想要
证明我的理由错了就会更积极地去找一些数据。
事实上我就是做这些实验找证据过程中发现了会员的问题,这就是态度、执行力、知识、
逻辑能力综合下来拿到的一个结果。我最不喜欢的一句话就是我的程序没问题,因为我的
逻辑是这样的,不会错的。你当然不会写你知道的错误逻辑,程序之所以有错误都是在你
的逻辑、意料之外的东西。有很多次一堆人电话会议中扯皮的时候,我一般把电话静音
了,直接上去人肉一个个过对方的逻辑,一般来说电话会议还没有结束我就给出来对方逻
辑之外的东西。
05. 钉子式学习方法和系统性学习方法
系统性学习方法就是想掌握 MySQL,那么搞几本 MySQL 专著和 MySQL 官方 DOC 看下
来,一般课程设计的好的话还是比较容易掌握下来,绝大部分时候都是这种学习方法,可
是在种学习方法的问题在于学完后当时看着似乎理解了,但是很容易忘记,一片一片地系
统性的忘记,并且缺少应用能力(理解不深)。这是因为一般人对知识的理解没那么容易
真正理解(掌握或者说应用)。
钉子式的学习方式,就是在一大片知识中打入几个桩,反复演练将这个桩不停地夯实,夯
稳,做到在这个知识点上用通俗的语言跟小白都能讲明白,然后再这几个桩中间发散像星
星之火燎原一样把整个一片知识都掌握下来。这种学习方法的缺点就是很难找到一片知识
点的这个点,然后没有很好整合的话知识过于零散。
钉子式学习方法看着慢但是因为这样掌握的更透彻和牢固实际最终反而快。
我们常说的一个人很聪明,就是指系统性的看看书就都理解了,是真的理解那种,还能灵
活运用,但是大多数普通人就不是这样的,看完书似乎理解了,实际几周后基本都忘记
了,真正实践需要用的时候还是用不好。
举个 Open-SSH 的例子
为了做通 SSH 的免密登陆,大家都需要用到 ssh-keygen/ssh-copy-id, 如果我们把这两
个命令当一个小的钉子的话,会去了解 ssh-keygen 做了啥(生成了密钥对),或者 ssh-
copy-id 的时候报错了(原来是需要秘钥对),然后将 ssh-keygen 生成的 pub key 复制到
server 的~/.ssh/authorized_keys 中。
然后你应该会对这个原理要有一些理解(更大的钉子),于是理解了密钥对,和 SSH 验
证的流程,顺便学会怎么看 SSH debug 信息,那么接下来网络上各种 SSH 攻略、各种 SSH
卡顿的解决都是很简单的事情了。
比如你通过 SSH 可以解决这些问题:
• 免密登陆
• SSH 卡顿
• 怎么去掉 SSH 的时候需要手工多输入 yes
• 我的 SSH 怎么很快就断掉了
• 我怎么样才能一次通过跳板机 SSH 到目标机器
• 我怎么样通过 SSH 科学上网
• 我的 Ansible(底层批量命令都是基于 SSH)怎么这么多问题,到底是为什么
• 我的 Git 怎么报网络错误了
• X11 forward 我怎么配置不好
• HTTPS 为什么需要随机数加密,还需要签名
……
这些问题都是一步步在扩大 SSH 的外延,让这个钉子变成一个巨大的桩。
然后就会学习到一些高级一些的 SSH 配置,比如干掉经常 SSH 的时候要 yes 一下
(StrictHostKeyChecking=no),或者怎么配置一下 SSH 就不会断线了
(ServerAliveInterval=15),或者将 SSH 跳板机->SSH Server 的过程做成 SSH Server 一步
就可以了(ProxyCommand),进而发现用 SSH 的 ProxyCommand 很容易科学上网了,
或者 Git 有问题的时候轻而易举地把 SSH debug 打开,对 Git 进行 debug 了……
这基本都还是 SSH 的本质范围,像 Ansible、Git 在底层都是依赖 SSH 来通讯的,你会发现
学、调试 X11、Ansible 和 Git 简直太容易了。
另外理解了 SSH 的秘钥对,也就理解了非对称加密,同时也很容易理解 HTTPS 流程
(SSL),同时知道对称和非对称加密各自的优缺点,SSL 为什么需要用到这两种加密算
法了。
你看一个简单日常的知识我们只要沿着它用钉子精神,深挖细挖你就会发现知识之间的连
接,这个小小的知识点成为你知识体系的一根结实的柱子。
我见过太多的老的工程师、年轻的工程师,天天在那里 SSH 密码,SSH 跳板机,SSH 目标
机,一小会 SSH 断了,重来一遍;或者 SSH 后卡住了,等吧……
在这个问题上表现得没有求知欲、没有探索精神、没有一次把问题搞定的魄力,所以就习
惯了。
06. 空洞的口号
很多老师和文章都会教大家:举一反三、灵活运用、活学活用、多做多练。但是只有这些
口号是没法落地的,落地的基本步骤就是前面提到的,却总是被忽视了。
07. 什么是工程效率,什么是知识效率
有些人纯看理论就能掌握好一门技能,还能举一反三,这是知识效率,这种人非常少。
大多数普通人都是看点知识然后结合实践来强化理论,要经过反反复复才能比较好地掌握
一个知识,这就是工程效率,讲究技巧、工具来达到目的。
肯定知识效率最牛逼,但是拥有这种技能的人毕竟非常少(天生的高智商吧)。从小我们
周边那种不怎么学的学霸型基本都是这类,这种学霸都还能触类旁通非常快的掌握一个新
知识,非常气人。剩下的绝大部分只能拼时间+方法+总结等也能掌握一些知识。
非常遗憾我就是工程效率型,只能羡慕那些知识效率型的学霸。但是这事又不能独立看待
有些人在某些方向上是工程效率型,有些方向就又是知识效率型(有一种知识效率型是你
掌握的实在太多也就比较容易触类旁通了,这算灰色知识效率型)。
使劲挖掘自己在知识效率型方面的能力吧,两者之间当然没有明显的界限,知识积累多了
逻辑训练好了在别人看来你的智商就高了。
08. 知识分两种
一种是通用知识(不是说对所有人通用,而是说在一个专业领域去到哪个公司都能通
用);另外一种是跟业务公司绑定的特定知识。
通用知识没有任何疑问碰到后要非常饥渴地扑上去掌握他们(受益终生,这还有什么疑问
吗?)。对于特定知识就要看你对业务需要掌握的深度了,肯定也是需要掌握一些的,特
定知识掌握好的一般在公司里混的也会比较好。
一个具体知识体系里面又有一些核心知识点(抓手、Essential Knowledge),也就是掌握
可以快速帮你膨胀、延伸到其他相关知识的知识点。
还有一些知识、工具一旦掌握就能帮你贯穿、具象、理解别的知识点,比如网络知识体系
中的 wireshark;理工科中的数学;知识体系中的学习方法、行为方式。我们要多去发现
这些知识、工具(how?)。
原文链接:https://plantegg.github.io/2020/11/11/如何在工作中学习–V2.0/