经历了过去几年的发展,Node.js、Angular.js、Vue.js 等前端主流技术框架填补了原有技术的空白与不足,日渐趋于成熟。然而信息时代的来临,任何的技术不会趋于稳定而止于脚下,现如今物联网、人工智能、虚拟现实等新领域的出现,意味着前端下一风口的来临,新的技术革新与发展机遇悄然而至。在火热的物联网浪潮之下,作为一名前端开发工程师,如何迎接这一风口?JavaScript、Python 等脚本语言又会与物联网碰撞出怎样的火花?真正的转型需要学习什么样的新技能?未来发展前景如何?基于此,我们采访了 ThoughtWorks 软件开发工程师黄峰达,请他分享自身的前端开发经验以及物联网的探索之路。
现如今随着企业业务需求的不断增大,对前端工程师的要求也逐渐提高。您认为前端工程师应该在哪些方面进行积累?包括语言、工具、框架等方面。
前端应用的代码规模,是在最近几年里膨胀起来了。在这个过程中,我们可以看到两个比较明显的问题:JavaScript 语言的缺陷与前端工程化实践的不足。
值得注意的是,IE 的兼容性在过去是一个主要的问题。但是由于最近几个项目中,逐渐不支持早期的 IE 版本(禁止早期版本的 IE 用户使用),我觉得这一点在未来就不需要考虑了。
从 CoffeeScript 到 ES6、TypeScript 的受追捧,表明了 JavaScript 有诸多需要改进的语言缺点。这些缺点会影响前端代码的质量,导致出现一些意料之处的 Bug。对大型应用来说,使用一个强类型的语言,如 TypeScript 会帮助前端项目构建出更稳定的应用。因此,我推荐喜欢 ES6 的用户,可以尝试使用 TypeScript。
同时,建议工作一年左右的前端程序员,应该掌握从头构建一个完整的前端项目。即,能设计好一个前端项目的工作流——掌握好 gulp、grunt、npm 等构建工具、风格检测、测试框架等等。
按国内的趋势来说,Vue、React、Angular 是现有主流的三个前端 SPA 框架。一个好的前端工程师,不应该只会使用这些框架,而是能理解他们背后的原理的相似之处与不同之处。也不应该满足于可以使用 Vue 来完成工作,应该尝试使用 React、Angular 这种复杂的框架。如 React 框架,从思想上来说,我们只需要学会 React,就可以轻松地构建其他 UI 应用。
从业过程中,您如何提升自己的职业技能,是否有比较好的学习方法或技巧?
对于前端来说,要提升技能最好的方式还是靠刻意的练习——大量的编码。工作的时候,大家都忙于实现业务功能,没有时间能让我们提升技能。因此,要提升主要还是要靠刻意的练习。至于练习,我一般是采用这样的步骤:
- 买本相关的书籍,或者寻找份教程、官方指南。
- 再找个合适的 Demo,熟悉基础概念,并掌握好相关基础。
- 在 Demo 的基础上,实现一些业务功能,了解各种功能、特性。
- 查看官方文档,查有有没有漏掉了什么重要的东西。
- 撰写博客、日志来记录这个过程。
作为一名前端工程师,是什么吸引着您关注物联网领域的呢?
大学的时候,我主要学的是电子信息工程。在学校会和朋友一起做一些网站来赚买书钱。平时,便通过 Web 技术来结合硬件做一些内容。在现在,看来它们便是一些物联网应用。
在庞大的物联网体系下,前端工程师从何入手物联网开发呢?可否结合您的个人经验具体谈谈?
今天的物联网应用,本质上还和 Web 应用的区别不是特别大——使用数据库存储数据、使用传输协议来传输数据、使用客户端作为 UI 界面等等,主要做的工作也是数据传输。
在一些资源丰富的设备设计上,我们仍然可以使用 HTTP API,仍然可以使用脚本语言编程,如 Python、JavaScript。因此,建议前端工程师可以将 Web 视为物联网的基础,先在资源丰富的设备上,如 Raspberry Pi、Tessel、Ruff 学习物联网开发。
在这之上,再去考虑资源受限的设备,如 Arduino 便是一个很好的入口。这个时候,就需要学习更多的硬件知识,如底层编程、不同协议的数据传输等等。而事实上,有相当多的物联网应用并不需要在底层硬件上进行编程。
如今天流行的共享单车,便是最典型的物联网应用。除在单车本身,大部分的模型还是和 Web 相差无几,除了使用 HTTP 作为数据传输协议,还有可能使用 MQTT 来传输数据。而在单车上,它使用了 GPS、蓝牙低功耗来进行数据传输。
由于各种物联网云服务已经成熟了,因此在学习的过程中,推荐前端工程师可以直接采用各种云服务,如 AWS IoT、Azure IoT、IBM Watson IoT;又或者采用一些开源的物联网云软件。最后,再去编写相应的客户端软件。
物联网开发涉及面庞杂,开发周期长,所以我们必须寻找一种覆盖面广的编程语言和方法。JavaScript 支持 HTTP 和 JSON 、支持函数式编程、可提供交互式环境等特点堪称适用于物联网全栈开发;Python 作为一种胶水语言,可在物联网及嵌入式系统中承担大量任务,并部分替代以上语言。由此就 Javascript 和 Python 两种脚本语言来看,您认为哪一种在物联网全栈开发中更为适合?具体理由是什么?
我偏向于使用 JavaScript, 更适合全栈物联网。但是如果是在真实场景下,我偏向于结合两个语言。JavaScript 可以用于开发各种原型软件、及大部分的客户端软件:
- Node.js 可以实现高并发的物联网应用
- 使用 Electron 开发桌面客户端,来帮助传统
- 使用 React Native、Ionic 开发手机 APP
- 使用 Ruff、Tessel 开发硬件端的应用
- 编写微信小程序直接访问蓝牙设备,进行交互与数据传输
- 在嵌入式系统 Linux 上,又可以制作 UI 界面来加速开发
而我们知道 Python 在科学、大数据与人工智能领域有更广泛的应用,而在这些领域 JavaScript 只是能做,但是做不了最好。因此,我们可以将 Python 作为物联网智能的核心,剩下的内容都交给 JavaScript。
从开发者的角度来看,物联网开发主要面临什么样的技术挑战?开发者在面临这些挑战是会有什么样的误区?
个人认为,物联网开发的主要挑战是:如何快速开发出稳定、安全的系统。这里的『快速』指的是,比以往更快的速度。硬件开发,有一个开发周期长的问题,从设计制造出开发板、硬件原型,到最近的产品,是一个漫长的过程。它不能像 Web 应用一样,快速推出一个 MVP 产品,从市场中接受反馈。因此不仅仅对流程的要求高,还依赖于大量的经验丰富的程序员。
对于走迭代流程的 Web 应用来说,当线上出线 Bug 的时候,我们可以快速发布一个新的版本,或者回滚到上一个版本。可对于硬件应用来说,如果没有在一开始设计好更新策略,那么就只能召回这个产品。如果只是软件上有问题,那么还能通过软件更新来解决这个问题。如果是像三星 Galaxy Note 7一样的硬件问题,那么不仅仅会影响公司的发展,还会危险用户的生命安全。
又如,去年出现的 Mirai 蠕虫事件,今年出现对对抗Mirai 的白色蠕虫 Hajime,表明了如果一个用户众多的物联网产品受到威胁时,它将影响到全球互联网。
要成为一名优秀的物联网全栈开发工程师,需要什么样的条件?
我理解的全栈是,一个人可以完整的开发物联网系统,并不是指什么知识都会。而要成为物联网全栈开发工程师是蛮难的一件事,更何况是优秀的物联网全栈开发工程师。我离物联网全栈开发还有点远,按我的理解:物联网开发是一个知识面广、特定领域要求深度的领域。它需要结合前端、后台、硬件层的硬件设计、硬件层的软件(C语言)等等的知识。在这个其中,最难的地方是设计出可靠的硬件,它依赖于多年的丰富经验。
在软件开发方面,先掌握好主流的 Web 开发技术,再去理解物联网领域的技术,并深入理解硬件运行的机制,那么就差不多可以做到软件层上的全栈。
依您经验来看,前端工程师进入物联网领域有什么样的职业机会,您有什么建议想要对开发者分享?
前端工程师在物联网领域的主要开发内容还是一样的:客户端开发,与用户进行交互。除了 Web 前端,还会有一些移动端开发的内容,除此还有大量的数据可视化工作。
除此,我们还可以看到诸如 Chrome 浏览器、微信小程序,都可以让开发者使用 JavaScript 连接蓝牙设备,实现数据传输。相信在未来,手机便是最好的物联网载体,它可以让我们更好也与周围的设备进行沟通。
在过去的一年里,我看到一些国外的创客们,使用 Slack、Telegram 制作一些聊天机器人来简化物联网开发。每次都能有一些启发,进行物联网开发设计的时候:考虑使用成熟的工具来制作 MVP。
物联网时代下,前端开发前景
关于这个观点,我觉得这里有一个误区:写 JavaScript 的程序员就是前端工程师。前端工程师一定是 JavaScript 程序员,但是 JavaScript 程序员不一定是前端工程师。
所以,我觉得物联网开发不仅是前端工程师的新蓝海,还是硬件工程师、后台工程师的新蓝海,只是前端开发者因为使用 JavaScript,才有机会去接触更大的领域。
对于物联网软件、硬件的开发工具、标准、协议等方面,您最期待哪些方面的完善?
物联网领域,我并不期待有一个统一的标准出来,这是一件相当难的事。不同的协议适用于不同的场景,而受限于不同的硬件设备,有时候我们只能使用某一特定的协议。在协议方面,我比较看好 CoAP,但是无疑 MQTT 是最近采用的热门标准,当然传统的 HTTP 协议也是。
同时,我比较期待的是一些新的开发流程,如上所述,传统的硬件开发流程太慢了。去年在和 NodeMCU 创始人聊天时,听他谈起一个观点:云端构建『固件』。如同 package.json 一样,我只需要引入这个库,那么集成电路图、引入相关代码等等,剩下的事就水道渠成了。如 Ruff 已经可以做到部分的功能,可是这条路还是很慢长。