为什么写这篇文章

去年七八月份,我第一次知道 PBL 教学法。在了解相关概念后,发现与我一直以来倡导的学习技能的方法高度契合。

就好像我基于反复实践而积累形成的经验主义,最终遇到了与之对应的理论知识,从实践结合理论,形成了高度统一性。

但不久之后,我因为没有对此做系统性的总结,就忘记这个方法的名字了。

这次趁开始学习 C++ 嵌入式软件开发,我打算把所有思路都梳理清楚,把这套亲测有效的学习方法分享出来。

我最开始学 Java,后来做 Android 开发,2018 年转型学习前端 Vue,并参与前端项目开发。同时,开始参与产品原型设计和项目管理的工作。

2020 年因为技术的发展演变,以及项目成本方面的考虑,转为使用 Flutter 开发 APP。

算下来,应该是有不下五次转型的经历,有些太细碎的,就没提了。

这些转型经历,让我深刻认识到快速学习一项技能的重要性。

当然,这个问题在开始转型学习前端 Vue 就有想过了,只是当时没能找到规律。

转型前端开发工程师

我开始转型学习前端 Vue 框架,当时的学习思路是这样的,我在 W3school 这个网站里找到了 JavaScript、HTML、CSS 这三部分的教程,然后从 HTML 开始,把上面的例子利用周末的时间全都敲了一遍。

然后,通过自己整理成文章,发布到简书上面去。

因为 W3school 网站虽然有在线编译器,可以让你运行显示代码效果,但是你要是重温的话,就必须每次都点一下。

在我看来,真的太麻烦了,索性就把全部的知识点都敲了一遍,然后把效果截图到文章里。

然而,我并没有看完全部的教程内容,就直接参与到项目中,去开发具体的功能了。

哪里不会,就通过官方文档寻找答案,或者网上找其他人实现的类似案例。

看代码是怎么实现的,依葫芦画瓢,别管到底能不能看懂,先搬过来运行看看效果。

如果是成功实现了功能,那就再深入看下代码,这里提一下,深入看下代码的意思,不是让你把全部代码背后的底层原理,都理解得清清楚楚。

只需要知道当前用到的代码,是什么意思就行了,也不用把关联的相关知识都学了,没有多大的意义,等以后用到再学就行。

比如 JavaScript 里的 Math 对象,它的方法那么多,常用的就那几个,你就没必要现在花时间去记住,就当工具书,有个印象,后面真用到,再查一下就行。

只学当下用到的,其他的一概不学。

如果没能实现功能,就再找,实在找不到,就问其他同事,大概是怎么实现的,自己再回去捣鼓,千万不能有那种要是我去问同事或者领导,会不会被人看不起,自己技术很菜的心理。

因为你本来就不是做这个的,你只是新手,你都愿意学习了,已经很不错了,其他人没理由这样觉得,反而你要是一个人在座位上钻牛角尖,功能没有如期交付,反而给其他人留下了不好的印象。

我没有花几个月时间先学完所有理论知识,而是在项目中遇到什么问题,就去学习什么知识,学完马上用到项目中。

基于这个方法,我很快就能独立负责前端 Vue 项目开发的工作了。

转型 Flutter 开发工程师

2020 年,我开始学习 Flutter 开发,完全零基础,部门里就我带着另一个同事负责这个 APP 的开发工作,这一次和转向前端 Vue 开发工作不同,我连官网文档都没看过,就直接上手敲代码实现功能。

比如要实现登录页面,我完全不知道文本、输入框、按钮怎么实现,布局怎么设置,逻辑代码怎么写,登录请求怎么发,但我已经在 Android Studio 里开始敲代码了。

我先把登录页面拆解成一个个小任务:

  1. 文本怎么设置
  2. 输入框怎么实现
  3. 按钮怎么写
  4. 布局怎么设置
  5. 登录请求怎么发

然后,我去 Flutter 官网找到对应的章节,直接抄代码过来,先实现功能,看看效果。

我记得当时,好像在布局方向设置和网络请求上卡了很久,网上找了很多资料都不知道怎么做,抓耳挠腮,难受极了。

有问题,部门里也没有其他人会的,只能去网上查资料,但是有些就是没找到怎么实现。

这种感觉就像在沙漠里迷路,找不到出路,只能凭感觉反复试错,这也是这个方法最难熬的地方。

但熬过来之后,就豁然开朗了。等完全会做了,回过头总结出经验,后面的工作,再遇到什么问题,基本上就迎刃而解了。

先出效果,后学知识

从上面两次转型经历,可以看出来,在开始学一项技能的时候,我不是从零开始去看那些基础知识文档的。

而是直接上手,动起手来,就开始做,做的时候完全是凭感觉的,如果不对,那就把功能分解成多个小功能,一点一点实现,针对性学习,不学那些对当下没用的知识点。

现在最有用的是,把功能做出来,哪怕你抄呢,抄都要抄出来,先做出来,做出来你就知道到底是什么一回事儿了。

等真正上手了,再去适当补充下基础知识、原理等内容,因为这个时候你已经做了很多功能了,一定积累了很多问题,带着问题去看这些知识,就会有一种豁然开朗的感觉,原来如此,原来是这样实现的。

解决了之前遇到的问题,弥补知识空白,整个知识地图就全部点亮了。

中场总结

上面就是我自己的经历了,如果还是觉得抽象的话,实际上,可以拿学吉他来比喻,一开始你不懂乐理,不懂看五线谱,都没有关系,直接照着视频,别人按哪里,你也跟着按哪里,就算是用 12345 死记硬背,先按哪个,再按哪个,把一首你很喜欢的曲子弹出来。

能很熟练的弹出来,然后接着使用这个方式学习第二首曲子。等练到三四首,再好好研究为什么是这样按的,乐谱是怎么看的。

说到这里,很多要说的东西,已经说完了,要整理一个学习的步骤的话,那就是:

  1. 设计一个能覆盖核心知识的项目
  2. 不要等,拆解成小功能,直接上手敲代码
  3. 只学当下用到的知识点
  4. 第一印象很重要

因为第二点、第三点在上面已经提到了,所以下面就不重复提及了,只想说一下第一点和第四点。

设计一个能覆盖核心知识的项目

在上面提到过,直接参与公司项目开发,动手去敲代码。但是,有时你打算在下班时间,学习这些技能,应该怎么做呢?

我自己的做法是,会设计一个能覆盖该技能核心知识的项目,然后一点一点的实现,等这个项目的功能全都实现了,那这个技能所涵盖的知识点,也就能掌握了。

早期,这种项目通常都是去 GitHub 上面找的,找一个现成的项目,然后你就照着这个项目所用到的技术栈和功能,自己复刻一个出来,哪里不会就去参照一下,看看是怎么实现的。

但是现在 AI 发展迅速,不用费力去 Github 上面找,完全是可以定制的,只要在 AI 上面,让它基于 PBL 教学法设计一个某个技能的项目,它就可以给你完整的学习路径。

如果你能使用 ChatGPT 或者谷歌的 Gemini 更好,它们都自带学习模式,甚至源码都给你提供了。

不过这里就使用学习吉他来举例子吧。

还是那句话,不要等,直接动手,发现问题,解决问题,直到完全实现。只要功能可以实现,抄都要抄过来,因为你只有看到效果,才会更有动力学习下去。

第一印象的重要性

为什么要在这个学习技能的文章里提到这一点呢?第一印象好像在社交中更为重要,职场中估计也就面试的时候,稍微重视一下。

真进来工作个几年,大家在工作方面都知根知底,也就没那么重视了。

但是在转型的时候,其实还是非常重要的,这个是我最近突然醒悟过来的一个点,为什么这么说呢?

因为我在转型前端 Vue 开发、转型产品原型设计、转型产品测试验收、转型项目管理、转型团队管理等工作的时候,并未觉得有什么难度,甚至觉得项目管理、团队管理、产品原型设计、产品测试验收工作,自己就是最强的。

基于这样膨胀的信心,在做这些事情的时候,自然就不会注意到,一个人不可能做什么事情,都能是最优秀的,总会有自己不擅长的方向,到那个时候,你要怎么办呢?

那就需要认识到,每一次转型都是一个潜在的机会,要重视第一次参与陌生领域的学习和工作。

很多人在转型的时候,会有一种 “我都愿意学习新技术了,稍微慢一点怎么了” 的心态,但其实第一印象非常重要。

你的领导会根据你的第一次表现来判断你的能力,如果你能快速上手、做出成绩,领导就会给你分配更有价值的工作,就像雪球一样越滚越大,强者恒强。

反之,如果你表现得不够好,可能就会失去很多机会。

甚至,给你贴上标签,一旦标签被贴上,就真的是刻板印象了。只要留下的是不好的印象,即便你日后十倍的努力,都不一定能逆转这个刻板印象对你的不利之处。

最后

千万不要从零开始看教程,直接上手敲项目代码,要实现什么功能,用到什么知识,再去学习对应的内容。

先做出功能,积累信心,随着功能做得越来越多,你就会越来越有动力。

除此之外,还有一个方法,就是翻译法,就是把要学习的技能知识点,翻译成你已知道的知识,比如你是前端开发工程师,现在打算学习C++,那么就把 C++ 的知识点,翻译成 TypeScript 中对应的知识,你一眼就看明白了。

C++ 语法 / 概念TS 翻译结果翻译说明
struct Orderinterface Order数据结构:结构体 → 接口
double/intnumber类型:数值统一为 number
coutconsole.log输出:控制台 API 适配

写在最后,你就会发现,万变不离其宗,还是回到了《实践论》,其他,都是锦上添花罢了。