先说一个现象
你有没有遇到过这种情况:学了一个新技术,过了一周回头看,发现脑子里只剩下几个模糊的词。这个技术叫什么来着,好像是关于什么的来着……
或者学了一个新框架的用法,能照着文档写 demo,但面试被问到"它底层是怎么实现的",立刻卡壳。
这些都是零散记忆的症状。知识点进到脑子里,但是没有挂靠点,所以很快就散了。
什么是知识骨架
知识骨架不是一个比喻,它描述的是一种很具体的状态。
当你有了某个领域的知识骨架,脑子里会有一张网。这张网的节点是核心概念,线是概念之间的关系。当你遇到一个新问题,会本能地想:这个问题属于哪个节点?它和哪些其他节点有关系?应该从哪个方向入手思考?
举个例子。如果你有 JavaScript 异步的知识骨架,遇到一道输出题 setTimeout(() => console.log(1), 0); console.log(2);,你不会靠背答案来回答,而是能自己推出来:JavaScript 是单线程的,setTimeout 的回调会注册到任务队列里,当前执行栈清空之后才会执行,所以 console.log(2) 先跑。然后你还能接着推:为什么 setTimeout 延迟 0 毫秒还是会后执行?因为事件循环机制、因为宏任务和微任务的区分、因为 Promise 的 then 是微任务会比 setTimeout 先执行。
能这样推出来的前提是:事件循环、调用栈、任务队列、宏任务、微任务这些概念在你的脑子里是一张网,而不是散落的点。
零散记忆是什么样的
零散记忆的状态是这样的:每个知识点单独看都认识,但不知道它们之间有什么关系。
比如你知道 useEffect 的依赖数组是什么,知道 useMemo 的依赖数组是什么,知道 useCallback 是用来稳定函数引用的,知道 React.memo 是用来避免子组件不必要的重新渲染的——但你不知道这些东西本质上都在回答同一个问题:React 怎么知道什么时候该重新执行一段代码?
你没有意识到,这四个东西其实是同一个机制在不同场景下的应用:React 的依赖比较机制。这个机制在 useEffect 里控制副作用的执行时机,在 useMemo 里控制计算结果是否需要重新生成,在 useCallback 里控制函数引用是否需要更新,在 React.memo 里控制组件是否需要重新渲染。
当你意识到它们是同一个机制的时候,你不需要分别记住四个规则,只需要理解一个机制,然后自己就能推出来。
这就是骨架和零散的区别。
骨架是怎么建立的
骨架不是靠读文章读出来的,是靠"连接"这个动作建出来的。
每次学到一个新概念,做三件事:
第一,往回连。这个概念是从哪个已有概念延伸出来的?它的父节点是什么?比如学 async/await,往回连到 Promise;学 Promise,往回连到回调;学回调,往回连到异步。一直连到 JavaScript 单线程、事件循环这个最底层的机制。
第二,往外连。这个概念和哪些同级的概念有关系?比如学 Promise,往外连到 Generator、async/await、EventEmitter。这些东西都是处理异步的方式,但各有各的适用场景。
第三,向前探。这个概念会引出哪些后续概念?比如学 React hooks,往前探到 Fiber、lane、并发特性。不需要现在就学懂,只需要知道"这个知识点还有后续"。
这三步做完,一个知识点就不再是孤立的点,而是网上的一个节点。
建骨架的工具有哪些
不需要什么特殊工具,一张白纸或者白板就够了。
第一步,拿出一张白纸,写下你最熟悉的一到两个技术领域。比如 React。
第二步,在这个领域下,写下最核心的几个概念。比如 React 核心这几个:组件、state、props、useEffect、Virtual DOM、Fiber、调和算法。
第三步,用箭头把概念连起来,表示它们之间的关系。比如:
- state 变化会触发组件重新渲染
- 重新渲染走 Fiber 的调和算法
- Fiber 调和算法连接 Virtual DOM
- useEffect 的依赖数组决定何时重新执行
第四步,对着这张图检查:哪些概念我能用自己的话讲清楚?哪些概念和哪些概念之间的关系我说不上来?说不上来的地方,就是需要补充的地方。
这张图不需要一次画完整,可以随着理解的深入不断迭代。每次学到一个新东西,先想想它应该挂在这张图的哪个位置。
骨架建好之后会怎样
当你有了一张还算完整的骨架,准备面试的方式会发生根本变化。
以前:打开 JD,看到"要求熟悉 React 原理",去找一篇"React 原理深入"的文章开始看,看完觉得好像懂了,又找下一篇。
现在:打开 JD,看到"要求熟悉 React 原理",心里知道这指的是哪些节点:Virtual DOM 的作用、Fiber 架构的目的、调和算法的实现、hooks 的实现原理。然后对着这些节点一个一个过:哪个节点还比较薄弱,专门找材料补哪个。
以前:遇到一道事件循环的输出题,背过类似的就能答出来,没背过就答错。
现在:遇到事件循环题,从 JavaScript 单线程、事件循环机制、宏任务微任务的队列顺序一步步推,推出来的答案不会因为题目换了就出错。
以前:面试被问到技术选型,说"我们用的是 Redux,因为它是业界最成熟的方案"。
现在:面试被问到技术选型,能说出我们选 Redux 的背景是什么、当时考虑过哪些替代方案、各自的优劣是什么、为什么最后选了 Redux,以及现在回看有没有更好的选择。
这三种状态的差距,就是骨架和零散记忆的差距。
怎么判断自己的骨架够不够
一个简单的自检方式:找一项你最常使用的技术,对着镜子或者录音讲五分钟它的原理。如果能讲满五分钟而且逻辑连贯,说明骨架基本建立。如果讲两分钟就卡住了,或者颠三倒四说不清楚,说明还需要在建骨架上投入时间。
另一个判断方式:被问到技术问题的时候,是在想"我有没有看过这个",还是在想"这个应该从哪条线出发来分析"。前者是零散记忆,后者是骨架思维。
这一章想说的
知识骨架不是一个玄乎的概念,它描述的是脑子里那张网的状态。有了网,新知识能快速找到挂靠点;没有网,新知识只是飘在脑子里的浮尘,风一吹就散了。
建骨架的方式是"连接":每次学新东西,往回连、往外连、向前探。这三步比读十篇文章有用得多。
有了骨架之后,准备面试的方式从"找材料"变成"对着网查漏补缺",效率会高很多。