2024年最新智能化时代:前端开发者进阶史(2),2024年最新web前端面试常问知识

JavaScript 和 ES6

在这个过程你会发现,有很多 JS 知识点你并不能更好的理解为什么这么设计,以及这样设计的好处是什么,这就逼着让你去学习这单个知识点的来龙去脉,去哪学?第一,书籍,我知道你不喜欢看,我最近通过刷大厂面试题整理了一份前端核心知识笔记,比较书籍更精简,一句废话都没有,这份笔记也让我通过跳槽从8k涨成20k。

JavaScript部分截图

如果你觉得对你有帮助,可以戳这里获取:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

这个问题几乎会成为所有非 Python 脚本语言想要亲近机器学习的门槛,Tensorflow.js 也不例外,几乎是很难去做到让学者和工程师迁移到 JavaScript 的链路上,为此就需要花费极大的精力去抹平那些存在于 Python 生态中的内容。

 Node.js 与 Tensorflow

Tensorflow.js 的 Node.js 版本一直到比较滞后的版本才出现,在那之前,我也曾经基于 Tensorflow C API 写过一个 yorkie/tensorflow-nodejs,但不久后我就停止更新了。

Node.js 对于 Tensorflow 来说,的确是一个比较尴尬的运行时,首先 Node.js 运行时环境并不像 Web 会给机器学习带来一些新的交互场景,但是如果用来构建模型,又如上一节所说,需要做大量的生态迁移工作。一旦 Python 生态有一些新模型时,往往都需要额外的迁移工作。

与 Node.js 形成对比的是 Tensorflow 的 Swift 版本,它基于 CPython 封装了 Swift 调用 Python 的接口,从而不需要做任何的迁移工作,就可以使用 Swift 代码调用所有 Tensorflow 在 Python 实现的功能。

CPython 是 Python 语言的官方实现,使用 C 语言编写,因此叫 CPython,支持嵌入到任何环境,缺点是对于多线程/并行解释支持不友好。

基于 Tensorflow Swift 的思路,Pipcook 创造了 Boa,它也是通过 CPython,提供了在 Node.js 中调用 Python 的能力,如下:

const { keras } = boa.import(‘tensorflow’);

const { layers, Model } = keras;

class TestModel extends Model {

constructor() {

super();

this.conv1 = layers.Conv2D(32, 3, boa.kwargs({ activation: ‘relu’ }));

this.flatten = layers.Flatten();

this.d1 = layers.Dense(128, boa.kwargs({ activation: ‘relu’ }));

this.d2 = layers.Dense(10, boa.kwargs({ activation: ‘softmax’ }));

}

call(x) {

return this.conv1(x)

.flatten(x)

.d1(x)

.d2(x);

}

}

通过如上代码,我们构建了一个4层的神经网络模型类,以上代码只需要通过 Boa 安装 tensorflow 包,即可运行成功。

在 Boa 的帮助下,对于 JavaScript 生态的提升非常大,维护者再也不需为了同步 Python 相关的代码而花费精力,同时也能间接使用完整、稳定的 Tensorflow 功能。

 Node.js 的机器学习生态

Boa 除了能协助减少 Tensorflow 使用的成本外,同样对其他 Python 包一样,比如 numpy、sklearn、pandas 等基础库,当然也包括 pytorch、tvm 等大型框架。

了解了 Boa 的背景后,现在重点说说 Node.js 的生态和机器学习生态融合所带来的便利性。

对于不了解 Python 的前端开发者来说,上手的难度其实并没有多简单,对于新手而言、虽然语法可以快速入门,但包管理器、系统 API、熟悉各种库以及对于语言的熟练程度都不是立马能掌握的,此时如果能取长补短的话,带来的便利性会大大提升。

比如我仍然可以使用像 Koa、Express、Midway 等框架去搭建服务,然后在路由控制器中使用 Boa 提供的桥接能力调用到 Tensorflow 来完成模型的推理服务,这样对于一个已经熟悉 Node.js 生态的开发者来说,只需要掌握 Tensorflow 相关的 API,而不需要学习如何使用 Python 来搭建 HTTP 服务。

正如上一个例子,Boa 并非是让前端开发者用 JavaScript 来写 Python 代码,更大的价值还是生态的融合和补充,各自取长补短,在此基础上,发展出适合前端生态圈自己的机器学习生态来。

通过以上三个小节,我们分别了解了机器学习在前端智能化的演进过程,从一开始的 Tensorflow.js 在浏览器的使用,到 Tensorflow Node.js 的重新实现,再到通过 CPython 直接融合 Python 和 Node.js 生态,在我们的愿景,未来的前端机器学习生态将继续按照如下两个方向进行:

  1. 以 Tensorflow.js、MNN 为代表的,主要针对 Web 环境的推理优化

  2. 以 Boa 为基础发展出来的 Node.js 机器学习生态,主要通过复用两个生态,来打通各工程和算法链路,实现前端机器学习的最优解

以上就是我们对于前端和机器学习当前问题的一些观点,那么接下来,我们会以 Pipcook 的视角,来讲述关于 Pipcook 的故事。

智能化时代的 Node.js


大部分前端开发者一定对 Node.js 不陌生,从 2009 年 Ryan Dahl 开源以来,围绕着 Node.js 展开的一系列标杆技术,包括:NPM、TypeScript、Koa、Webpack 等等,都与 Node.js 发展离不开。

Node.js 的诞生,不仅让前端开发者的生态延展到了服务端开发的领域,也同样触及到了其他诸多领域,比如开发者们早就习惯了通过 commanderjs 或者 minist 来为自己开发简单易用的命令行工具,再比如 Electron 通过 Node.js 和 Chromium 来开发跨端的客户端应用,ReactNative/Weex 也间接使用了 Node.js 生态圈来帮助前端开发者构建移动应用,还有诸如 ShadowNode 和 IoT.js 这样将 Node.js 应用在嵌入式领域。

Node.js 一直在赋能前端开发者,帮助他们做到一切他们想做的事情,而 Pipcook,希望成为智能化时代的 Node.js,赋予前端开发者们智能化的能力。

▐  Pipcook、N********ode.js 与机器学习

如果要用一张图来描述 Pipcook 与 Node.js 的关系,那么上图就是比较恰当的描述。对于 Pipcook 来说,我们的愿景就是像 Node.js 一样,成为前端工程师进阶为机器学习工程师的一个简单易用的平台。

那么,前端工程师到底应该如何成为机器学习工程师呢?这里的机器学习工程师又是什么工种呢,要负责哪些事情,需要掌握什么样的知识?

首先我们来看看,对于 Node.js 体系下的服务端工程师都做了些什么。

小王是一家创业公司的 Node.js 主程,公司的主要业务是一套 O2O 的线上交易系统,全部使用 Node.js 完成,那么小王需要完成的工作包括根据交易系统的主链路,设计符合系统要求的数据库、消息队列、子服务以及网关服务等,数据库方面使用了 MongoDB,消息队列用了 ZMQ 和 Resque,网关使用 Nginx 配置完成。

小狼是一家大型互联网公司的 Node.js 工程师,日常工作是根据业务需求,使用 Node.js 来研发业务系统,其中涉及到的技术则是通过 Node.js 对接公司内部的数据库系统 XDB、内部消息队列 XMQ。在业务上线后,发现系统的某个请求的 QPS 远远达不到实际的使用要求,因此通过针对个别场景的优化,并引入缓存和修改索引,完成了线上的要求。

看完了小王和小狼的经历,其实可以看出来要完成这些工作,对于前端工程师并不容易,因为需要了解很多在服务器开发领域会用到的概念,比如数据库设计、消息队列、网关等,同时问题的优化手段与以往的前端领域也是不同的,唯一相同的点是使用了相同的语言。

这有点像是一个国家,会分为各种不同的工种,有负责军事的军人,负责政治的政客、负责经济的商人以及负责学术的学者,但他们同时都使用一种语言进行交流,当一名军人退役后想要从商,同样需要学习成为一名商人所需的素质和技能。

那么 Node.js 也是如此,一名前端工程师与 Node.js 工程师都使用 JavaScript,转型所需的知识和技能是必须要掌握的,不过 Node.js 会提供转型所需的工具和平滑的学习路线。要成为一名机器学习工程师,也需要掌握机器学习的基础知识,而 Pipcook 则是通过工具,帮助开发者更快地完成内化学习的过程。

接下来,我们就来看看 Pipcook 工具箱中都有哪些利器。

 如何使用机器学习的生态

正如上一节末尾所说:

以 Boa 为基础发展出来的 Node.js 机器学习生态,主要通过复用两个生态,来打通各工程和算法链路,实现前端机器学习的最优解

Boa 便是 Pipcook 工具箱中的利器之一,它快速地填充了前端与机器学习生态的离距,让两个生态能够更加无缝地融合,那么我们就来看看它是如何融合两个生态的。

无论是 JavaScript 还是 Python,它们都是一门脚本语言,需要通过额外的虚拟机(V8 或 CPython)才能执行代码,本文将会从更宏观的角度来看待这个虚拟机这个技术问题。

虚拟机,顾其名思其义,就是在一个世界中模拟出另一个世界。那么,可以这么理解,虚拟机其实就是一个世界,这个世界上会有花、有草、有人,用编程领域的概念来说,就是有“对象”,那么对于不同的虚拟机,就像是不同的世界,不同世界的游戏法则就不同,对于不同“对象”的定义也不同,所以可以把 JavaScript 和 Python 看作是两个不同的世界,并且由于规则的不同,衍生出来的生态也不同。

那么要融合这两个不同的世界,应当如何呢?如果要将两个世界中的每个类别、对象都一一对应上去,这个工作是极大的,而且每个世界本身也在不断地发展和壮大,因此永远也不可能完成这个对应关系。

那么得益于 Python 世界的架构之初,这优雅的设计(对象模型)使得 Python 万物都可归纳于几类,并且对身处高阶世界的我们开放了控制对象的接口,这就使得我们能从 JavaScript 世界中通过这个接口来控制 Python 世界中的万物,从而让生活在 JavaScript 中的人们具备使用 Python 世界资源的能力。

希望上面这个生动的例子,可以帮助更好地理解 Pipcook 在融合 JavaScript 与 Python 生态所做的事情,那么接下来,我们会从性能上来看看使用 Boa 时所带来的开销是否可以接受。

我们将使用以下两种调用方式来进行对比:a)通过 Boa 调用 Python,b)全部使用 Python,答案是非常明显的,就是性能上至少 a = b,极大可能 a  > b。

通过上图,无论对于 Boa 还是 Python,最底层都是在使用 Python Objects,它包含了 Python 中所有函数的定义、变量的定义以及操作符的定义等等,对于执行纯 Python 代码而言,它通过 CPython 的解释器将代码转换成对 Python Objects 的调用。

对于 Boa 来说,也是一样的,由 v8 完成对 JavaScript 代码的解析,然后再将对应的操作映射到 Python Objects,因此两者的差异就在于 v8 和 Python Interrupter 对于各自代码的解释/执行效率,那么对于这一点来说,Python 和 JavaScript 都有各自的优化策略和方法,所以几乎是不相伯仲的。

上述所表达的是,虽然听上去是要从 JavaScript 调用到 Python,但其实从实现的机制来说,并非将 JavaScript 转成 Python 代码,然后再由 Python 解释器执行,而是直接与 Python 底层的对象交互,这样并不会增加额外的性能开销,所以可以放心使用。

在性能问题解决之后,我们再说一下它对于前端机器学习的意义。

在有了它之后,我们不再需要像 nodejieba,tfjs-node 这样的桥接库了,它就像打开了一扇通往机器学习新世界的大门,从此 JavaScript 的世界中,可以以非常低的成本使用到最成熟、最前沿的机器学习生态了。

 前端机器学习的领域语言

什么是领域语言呢?或者我换一种说法 —— DSL,Pipcook 为了隐藏掉一些不必要的技术细节,基于 JSON 定义了一套用来描述如何训练模型的语言,叫 Pipeline。

我们首先从一个简单的 Pipeline 例子开始:

{

“plugins”: {

“dataCollect”: {

“package”: “@pipcook/plugins-mnist-data-collect”,

“params”: {

“trainCount”: 8000,

“testCount”: 2000

}

},

“dataAccess”: {

“package”: “@pipcook/plugins-pascalvoc-data-access”

},

“dataProcess”: {

“package”: “@pipcook/plugins-tensorflow-image-classification-process”,

“params”: {

“resize”: [224, 224]

}

},

“modelDefine”: {

“package”: “@pipcook/plugins-tensorflow-mobilenet-model-define”,

“params”: {}

},

“modelTrain”: {

“package”: “@pipcook/plugins-image-classification-tensorflow-model-train”,

“params”: {

“epochs”: 15

}

},

“modelEvaluate”: {

“package”: “@pipcook/plugins-image-classification-tensorflow-model-evaluate”

}

}

}

Pipeline 的结构看上去比较简单,基本上是由不同的插件(plugins)构成,每个插件节点由 package 和 params 组成,前者指定了插件的包名,后者则指定了插件所需的参数。

我们将一个完整的训练模型的过程,通过这种声明式的方式,分为了不同的节点,每个节点定义明确的输入与输出,而对于想要训练模型的开发者而言,只需要配置对应的插件和参数即可。

比如当我想要更换上述 Pipeline 的数据集,那么修改以下节点即可:

{

“plugins”: {

“dataCollect”: {

“package”: “@pipcook/plugins-image-classification-data-collect”,

“params”: {

“url”: “数据集的地址”

}

},

}

}

想要浏览官方插件的可以点击这里:https://github.com/imgcook?q=pipcook-plugin&type=&language=

通过这种声明式的方式,可以帮助用户在不需要理解任何代码的情况下,就能用自己的数据集轻松训练出自己的模型了,训练完成后,会生成如下文件:

output

┣ logs

┣ model

┣ package.json

┣ metadata.json

┗ index.js

在 output 目录下执行 npm 安装命令,即可通过 index.js 使用训练好的模型了。

import * as predict from ‘./output’;

predict(‘your input data’);

 使用 Pipcook 进阶机器学习

上一节中介绍了我们如何降低前端开发者训练一个模型的门槛,那么本节将以之前提到的插件开发展开,说说如何通过 Pipcook 进一步学习机器学习的知识。

在机器学习界,流传着一句这样的名言:特征工程(Feature Engineering)决定着机器学习的上限,而模型要做的只是无限地逼近它。对于 Pipcook 而言,同样需要帮助所有开发者解决特征工程和模型训练的问题,因此 Pipeline 将插件基本分为了两大类:

  • 数据类(DataCollect/DataAccess/DataProcess)解决数据和特征工程的问题
    前端资料汇总

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

我一直觉得技术面试不是考试,考前背背题,发给你一张考卷,答完交卷等通知。

首先,技术面试是一个 认识自己 的过程,知道自己和外面世界的差距。

更重要的是,技术面试是一个双向了解的过程,要让对方发现你的闪光点,同时也要 试图去找到对方的闪光点,因为他以后可能就是你的同事或者领导,所以,面试官问你有什么问题的时候,不要说没有了,要去试图了解他的工作内容、了解这个团队的氛围。
找工作无非就是看三点:和什么人、做什么事、给多少钱,要给这三者在自己的心里划分一个比例。
最后,祝愿大家在这并不友好的环境下都能找到自己心仪的归宿。

  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值