知识迁移——工程师多向发展的优势

From:「GDG DevFest 2019」
这是由演讲 PPT 汇集而成的内容,可能与演讲内容有所差异,并非演讲稿,望悉知。

知识迁移?

首先得提出一个问题,到底什么是知识迁移,在 wiki 上有这样一段解释。

在一个地方所学的技能、知识与态度对另一个学习的影响,它可以加快学习的速度。
——艾尔德

简单的来说,就是一个已经了解的东西对于未知的,将要接触的东西存在影响,可以加快我们学习速度。

知识迁移开胃菜

首先我们来思考这样一个问题:前端怎么学习后端比较快。

有一本开源的书叫做「Go for JavaScript Developers」,它就是一个很好的例子。

我们利用已经学会的 JavaScript 知识与即将要学习的 Go 语言知识进行关联和映射,让我们的学习成本急速下降。

然后,我们来说说一个名词:「匿名函数」。匿名函数简单的来说就是没有名字的函数,广泛的存在于各大语言。

而我们在某些语言的学习中,比如 Python,可能会看到另一个词,Lamda 表达式,它也是一种匿名函数。

再来,ES6 中,我们知道了有一个叫做箭头函数的东西,它同样也是一种匿名函数的表现形式。

然后我们就知道了——哦,大家都是匿名函数,根本不是什么新鲜的东西,不用重复去学习。

然而,举着这两个例子,似乎没有什么价值,毕竟,一个匿名函数的概念,学一下也用不了几分钟,接下来,例子将会一点点带大家深入「知识与知识之间的影响」。

正式起航

正式开始的第一问,我向在座的各位发起一个灵魂问题,每个月总有那么几个人会来问我:前端工程师学算法到底有什么用——接下来我来用几个应用场景来解答一下这个问题。

  1. 树形选择器:前端最常见的需求是,我想要一个树选择器,这在很多组件库中都能见到,简单的需求就是树的构建,复杂一点的可能要针对某一树节点进行回溯,移动等操作。那么很明显,这是可以用树算法解决的问题。
  2. 信息关联图:树算法可能是大家掌握的最好的算法了,这个例子就比较复杂,但是我在饿了么的时候确实遇到过,我们需要做一个关系图,这个时候关系可能并不是简单的上下级关系,无法用树表示,那么我们就得用到图算法了。
  3. 瀑布流:另一个常见于 C 端的应用场景是瀑布流,有人可能会觉得,瀑布流很简单啊,从几列中找到最短的那一列,将新的图片附加上去。然而,如果严格要求每列差值最小,最好的方法其实是动态规划——由于这里并不是算法课堂,所以对动态规划这个概念暂不做赘述。

由此我们可以看到,我们尽管也可以通过传统方法完成我们的任务,但是如果你能合理的运用算法知识,你能够把问题解决的更好——这也是知识迁移的作用之一。

说了这么说算法,我又不是来推销算法课的,所以我们的下一个例子是:「七天,学一个新框架,老子要上生产」——对于有经验的开发者而言学 Hello World 很快,但是似乎也没有这么快吧。

实际上,对于有经验的开发者而言,一切就是这么简单。

尽管框架似乎都不一样,但是我们知道,现在主流的前端或者后端框架就是由两种成熟的模型组成的:MVC 和 MVVM。

甚至更加具体的 API,拿 Hooks 来说,这是 Vue 3.0 的最新设计,我们会发现,它竟然和 React Hooks 长得差不多——确实在设计上 Vue3.0 借鉴了 React Hooks,他们略有差异,但是想要解决的目标都是一致的。
15765023851969.jpg

让我们再看看后端的情况,这是我选取的四个不同语言的框架:PHP 的 Laravel,Node.js 的 Egg.js,Ruby On Rails,以及 Python 的 Django。尽管他们其实是不同语言的不同框架,但是你会发现,他们有非常多的相似之处:比如,他们都是 MVC 的框架,基本组成都是:Router / Controller / Model / View / Service / Error Handler 等,无非是命名不同,函数名不同,语法不同,将我们已经学习过的知识点与他们做出一一的映射,或许你会发现——仿佛还是那个你最爱的框架。

这里我要进行一次勘误,那就是很多刚学编程的人会迷惑的问题:我学得慢,是我不适合学习编程吗?

我们往往会在网上的一些高端社交平台,比如知乎,V2EX 等等地方看到有些大神在七天之内学会了一门新语言,用它开发了一个多么好用的软件,然后获得了多少用户,多少 Star 等等。可是刚入门的新人可能七天连个项目的 Hello World 都没整明白。

其实这也正是因为知识迁移降低了那些大神们的学习成本,你积累的知识越多,学习的速度将会越快。

说到这里,就不得不说说我刚学编程的时候,搞不懂递归到底是怎么回事,于是去 SegmentFault 提问「到底要怎么样去理解递归」。最终大佬们告诉我,这都搞不懂,你不适合学这个,趁早转行吧。但是正因为我没有转行,所以我今天站在了这里。

再硬核一点

说了这么多,你可能会发现,已经从知识迁移跑偏了吧?——其实我想说的知识迁移,就是一种思维方式,用我们已知的知识去解决未知的问题。

接下来我会用几个经典的模型和他们的应用来解释什么是用已有的知识解决真正的解决问题。

  1. 分治法:分治法可以说是计算机里最经典的思想算法之一,简单的来说就是把大问题分解成小问题,然后把小问题解决了,也就解决了大问题。很多人一定没想到的是,我们最常接触的分治法的应用是——快速排序,也就是那个大家都嫌弃并且怀疑「为什么要考」的算法。除了在快速排序上的应用,分布式框架都是使用了分治法的思想进行设计的,比如 Map Reduce.
  2. LRU:全称是 Least Recently Used,最近最少使用,本来是用于计算机内缓存的淘汰算法的,我们在 CPU 里可以看到各种 LRU 的改版算法,实际上在应用层,我们也经常使用它来进行各级的缓存,正如大家所知道的那样,系统中往往只有 20% 的热门数据,此时 LRU 可以保证你缓存的资源都是最热门的资源,但是更神奇的是,在前端,React 中也用到了 LRU 算法。
  3. 发布订阅模式:这个名字有些人可能会比较陌生,但如果我说观察者模式,很多人可能会反应过来,在设计模式中就会遇到它。实际上观察者模式与发布订阅模式在角色身份的关系上有所区别,这里暂时不表。除此以外,它也是消息队列的基础,甚至我们每次用的事件监听,也就是发布订阅模式的一个应用。
  4. 事件循环:说到事件监听,就不得不说说事件循环了,它由 JavaScript 发扬光大,但是实际上,Nginx 和 Redis 也在使用它在各个领域大放异彩。

真的总结

举了这么多例子,我想说明什么呢?第一,开发并不是在写代码,而是在解决问题。而遇到问题的时候,知识迁移能力可以更好地帮我们解决问题,比如使用成熟的系统设计、模型、算法来解决未知的问题,因此,知识迁移能力对于我们非常有价值。

至此,基本上已经可以回答这样的问题了:我是某某工程师,我学另一个领域的知识有没有用,是不是在浪费时间——不是。

彩蛋

最后的彩蛋,我想来讲讲我们移动端开发的故事,我们使用 Flutter 开发,和 React Native 一样,尽管他可以通过同样的代码保证跨平台性,但是如果真的要进行一些额外的支持,Native 工程能力似乎是并不可少的,但是我们并没有因此去招聘 Native 工程师——而是怎么做呢——相信大家都懂了。

植入部分

如果您觉得文章不错,可以通过赞助支持我。

如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。

标签: 知识

已有 2 条评论

  1. snake

  2. horse

    每次读都有新的理解,skyao yyds!

添加新评论