如何学习前端
作为一个新的毕业生,学习前端的年限不算很长,也不算很短,看着同龄人突出的表现、前辈们牛逼的技术,总是想着自己什么时候能成为一个优秀的前端工程师?于是,在全网搜索着“如何系统学习前端知识”的字样。
但静下心来思考,我们为什么要学习?我该学习什么?怎么去学习?
为什么要学习?
我们为什么要学习?大学前,我们学习的目的,为了考上大学;大学时,我们学习的目的,为了找到工作;工作后,我们学习的目的,为了不断升职,赚更多的钱。这些目的好像都无可厚非,但目的又太广泛,泛到我们经常忘记自己的目的,或者达到一部分目的后,坐享其成,沾沾自喜,而忘记了继续努力。或者努力了一段时间,发现没有任何起效,垂头丧气,直接开始“摆烂生活”,一段时间后又觉得自己太颓废进入后悔阶段,重新打起精神,开启新一轮的努力,陷入努力->无起效->摆烂->后悔->努力的死循环中。
我们到底为什么要学习呢?我认为学习是为了解决遇到的问题,然后提高多巴胺。可这世上产生多巴胺的事情那么多,为什么偏偏要学习呢?我可以刷一天抖音、看一天小说、玩一天游戏,都可以产生多巴胺,但产生多巴胺后随之产生的是罪恶感,认为自己浑浑噩噩、虚度光阴,而学习给我们的多巴胺是成就、是快乐,而这种多巴胺的地位是远高于娱乐多巴胺之上的。
但为什么这么多人会选择娱乐带来的多巴胺,而不选择学习带来的多巴胺呢?原因显而易见:娱乐多巴胺反馈时效短,不到一分钟就能快速提高多巴胺;而学习的开始往往是枯燥无味的,需要经过漫长的学习,1 天甚至更久,才能得到成就多巴胺,而很多人就在这途中放弃了。
那我们应该怎么做,让我们爱上学习的多巴胺呢?
- 即时反馈,不要一头埋进地狱模式的问题中,找那些我们垫一垫脚就能解决的问题,减少反馈时长。
- 环境:营造合适的环境,将手机关机或远离身边
- 目标:告诉自己,我就要升职,我就要涨薪,激励自己。
胡言乱语到这里,为什么要学习的目的应该很清晰了。解决遇到的问题,获得学习的多巴胺,并达到我们的最终目的。
我该学什么?
找到了学习的目的,我该学什么呢?前端知识这么多,范围这么广,我不可能全部学完吧?于是在全网搜索着“如何系统学习前端”的字样,有人给你提供 RoadMap,但你发现好多知识都需要取补充,时间却不够,怎么办呢?
我们先静下来,思考一下,我们为什么要“系统地学习前端”?这似乎是我们从小到大的学习准则,在高中时,我们需要系统地学习知识点,应付高考;在高中,我们需要系统地学习专业知识,应付期末考;于是我们将这一套准则,照搬进了学习前端里,然而真的有用吗?
前端知识这么多,这么广,我们不可能面面俱到,只能挑一些重点知识来学习,怎么学习呢?
我们可以先找到感兴趣的方向,将想了解的知识点罗列出来,再将其分类,剔除一些低价值的知识点,根据知识点的价值分配时间,逐个突破。
重点:
- 高价值、中低价值挑选
- 分类
什么是高价值知识点?什么是低价值知识点?
高价值知识点:深入了解原理。 低价值知识点:业务实现。
简单举个例子:以下是我想了解的一些知识点,哪些是高价值知识点呢?
- Webpack plugins 开发
- 学习 hybrid
- 学习 flutter
- node.js 学习:重点模块
- 骨架屏
- Redux 和 Mobx 的区别,如何选型
- BFF
- polyfill
- 高阶组件
- PureComponent
- 虚拟滚动
高价值(深入):node.js 学习(仅挑选重点模块学习,其他模块使用到再了解),webpack plugins 原理、高阶组件
中、低价值(了解):hybrid、flutter、BFF、polyfill、骨架屏、Redux 和 Mobx 的区别,如何选型
高价值知识点,我们需要花费大量时间去学习,深入原理,并进行输出。
而中低价值知识点,我们只需要了解,可以通过晨读等方式进行简单了解,我们需要了解哪些内容呢?(无须非常深入,但若别人说起能聊上一聊)
- 怎么使用
- 基本原理(无须了解具体细节)
- 与同类型的对比
怎么学?
假设我们已经整理好了学习清单,根据知识的价值以及类型进行了分类,接下来进入到了学习内容,应该如何学呢?
主要有以下几点准则:
- 逐个问题解决
- 通过费尔曼学习法进行输出
- 将学习落地到实践中
- 遇到问题不要逃,要舍得花力气去钻研。
- 永远不要想“等我最好了,再去做”,而是现在就去做。就算做得不好,也是一种经验,往后会做得更好
- 定期回顾:学习不是一劳永逸的事情,我们无法过目不忘,只能反复回顾。
- 保持好奇心
逐个问题解决
我们学习不能囫囵吞枣,不能期望自己是个“天才”,能够一次性全部消化,只能逐一解决。举个简单的例子,我想要深入了解setState是同步的还是异步的,虽然这个问题的答案我已经倒背如流,但是React内部的实现,我从未了解过。
`setState`是同步的还是异步的?
- 在合成事件和钩子函数中表现异步,在原生事件和计时器中表现同步。
- 合成事件:React 为了解决跨平台、兼容性问题,实现了一套合成事件机制,例如 onClick、onChange 等等
- 原生事件:addEventListner 等等事件。
为什么在合成事件和钩子函数中表现异步呢,因为在执行合成事件和钩子函数时,会进行一系列处理操作,会进入到一个`batchUpdate`函数中,在这个函数中修改`exucuteContext`变量,在 setState 的时候会对这个变量进行一个判断,如果为`NoContext`以及其他条件(可以简单的理解为 React 现在无活可干),就会立即 flush 更新 state 渲染;但由于在合成事件和钩子函数中修改了该变量,因此不能进入 flush 环节,表现出了异步。
而原生事件和计时器,没有经历 React 的调度过程,也就没有打上标记的过程,因此表现同步。
错误示范 1
这时候我是怎么做的呢? 下载 react 源码,全局搜索 setState 函数,一行一行代码的去看,然后发现自己看不懂,fiber 是什么?这个函数到底重不重要?越看越烦躁,于是拿出手机刷了起来,第一次尝试失败。
错误示范 2
吸取了上次的教训,我不再直接看代码,开始通过 debugger 模式来看执行的 stack,执行的流程是清晰了,但我还是没有看懂。有放弃了。
可能有人会问,为什么不去看别人的源码解析?对,我就是叛逆心理,别人都能直接看懂源码,为什么我不能呢!然后被困难吓退了。
错误示范 3
经历了第二次失败,我开始打退堂鼓了,“我好菜啊”,于是在网上找源码解析来看了,看了多个知乎问题,摸到了一点点头绪,无意间打开了“React 技术揭秘”网站,这个网站从头到尾对整个 React 源码进行了深入分析,从 fiber、render 到 commit,事无巨细,然后我又从头开始啃,啃着啃着,想把一整个源码一下啃干净,越看越难越看越难,发现自己好像忘记了一开始的目的,“setState 是同步的还是异步的”。失败。
最后尝试
有了第三次的知识积累,我开始只关注“setState 是同步的还是异步的”这个问题的解答,忽略其他细节,新产生的疑问,放到学习清单去做整理,不做深究,渐入佳境。
以上这 4 次阅读源码的尝试,想表达什么?
- 站在巨人的肩膀上去学习!千万不要认为自己天才,不屑。看不起文章,看不起视频,学习的方式千千万,能学懂就是最牛的!
- 始终铭记自己最开始的问题,不要发散太广,逐个问题击破!
- 当发现自己做不下去时,不要直接放弃,而是想想是否有更简单的方式去解决?如果单看源码看不懂,那我们就去找文章,如果文章看不懂我们就去看视频,总有一个方法能解决。
- 静下心来,越学习越会发现自己知识的空虚,空虚不可怕,更可怕的是伪装,害怕别人发现自己的无知。
以教代学:费尔曼学习法
学了一个知识后,发现自己似懂非懂,那就是没懂!知识只是短暂的停留在了你的脑海里,你表达不出来,过两天就消散而尽。
如何提高我们消化知识的能力呢?以教代学:费尔曼学习法。
如果你学了某个知识点,你能很清晰的将其表达出来,那就是你学会了。在表达的过程中,我们会发现我们缺少的知识,再去补充,这就是个正反馈的过程。
我们都知道有这样一个学习效率金字塔:如果只是听别人讲,内容留存率只有 5%,如果是自己阅读,则为 10%,视觉 + 听觉,则为 20%,与别人讨论,则为 50%,讲知识用于实践,则为 75%,讲知识教授给他人,则为 90%。
费尔曼学习法的方法有很多,可以是老师对学生的教学,也可以是录视频讲解,也可以是文章的输出,形式多种多样,重点是“你自己的看法”,而不是直接的 CV。
过去,我写文章的时候,很喜欢做 CV 工程师,没有自己的理解和表达,似乎产出了一篇文章,但这一篇文章却不是我的个人观点,这算费尔曼学习法吗?不算!只有你自己的理解,你的观点才有用!
千万不要直接 Copy,一通废话好过直接 CV
知识落入实践中
我们学习一个知识,我们得想这个知识能怎么应用?而不是学就完事了,只有落地的知识,才能是真正的知识。
不要逃避,不要害怕
错误示范
现在的我,是一个典型的逃避、害怕人格。遇到问题,想的不是去解决问题,而是想着“这个问题应该很简单吧,别人轻松能搞定吧?”,于是想要掩盖问题、掩盖无知,逃避、躲避,藏着掖着,不寻求帮助,不深入钻研,结果越来越难搞,浪费的时间越来越多。
为什么会这样呢?因为害怕别人发现自己的无知,害怕别人瞧不起自己,可谁又不是从无知成长起来的呢?
你要坚信一点,“你不会的东西,别人也不会!”,在你遇到困难的时候,就是弯道超车的时候!
很多人在遇到问题时,可能会像现在的我一样,选择逃避,不去深入了解,不想搞明白,只想快速翻篇;如果这个时候,你舍得花力气去钻研,那你就比 90%的人优秀了!
在学习的过程中,遇到困难的问题,我们总是很本能的想要逃避,在简单的“舒适圈”里得心应手,这样长期以往,终究得不到成长!
结论:
- 遇到问题,静下心来,搞明白,在解决
- 不要害怕丢脸,不要害怕别人发现自己的无知,相信一个点“你不会的,别人一定也不会”!
干就完了
永远不要想“等我最好了,再去做”,而是现在就去做。就算做得不好,也是一种经验,往后会做得更好。
人永远不是在藏着掖着成长起来的,而是努力表现,努力去做成长起来的。
“我写作能力不好,写出来的文章给自己看就行了”,NO!正因为写作能力不好,所以更要给别人看,在写作的过程中提升,在反馈中改进。
“我能力不足,这个活我干不了“,NO!如果这个活是你垫一垫脚就能够着的,就勇敢去做!年轻人的试错成本是很低的。
“这个问题太简单了,我不好意思问”,NO!如果半小时得不到问题解答,勇敢去问!你藏着掖着找好几个小时,问别人能秒解答。
别想太多!干就完了!人从来就是在做的过程中成长起来的。
定期回顾
学习不是一劳永逸的事情,我们无法过目不忘,只能反复回顾。但我们学习的东西这么多,哪回顾得完呢?
那就回顾最重要,最高价值的事情。
其他中、低价值的事情,想办法进行输出,在输出中加深印象。
保持好奇心
对一切保持好奇心,对问题深究,如果短时间不能深入了解,先记入学习清单。