物联网是前端工程师的新蓝海吗? | Live笔记
物联网是继 Web 、无线之后的又一次重大技术变革,在变革的大潮中,程序员的知识体系和思维方式将面临全面更新。
前端开发的历史
在准备这个live的过程中,我回顾了前端开发短暂的历史,有几次我认为非常重要的变革。
第一个是富交互。十年前我们聊到富交互,首先会想到的是Action,微软也出过一个叫Silverlight的方案,后来随着前端单页应用的流行以及大量复杂交互框架的出现,让前端开始从切页面进入到复杂的Web应用开发,我认为这是前端开发非常重要的转变。
第二个是无线化。七八年前,我们讲到无线开发,最先想到是Objective-C或Java,后来随着HTML5的流行以及React Native和类React Native方案的出现,让前端在无线上面有了非常大的场景和空间。
第三件事是Node.js的出现。2009年Node.js发布,很快开始大规模流行。在那之前,我们讲到前后端分离,可能前端工程师只能触达到服务端应用的模板层面。讲到工程化,我还记得我们当时在用一个Java社区的构建工具Ant,来做前端的构建。Node.js流行起来后,前端开始在服务端、工程化上有了非常多的可能性,出现了“大前端”的概念。
下一个节点可能是什么?我认为有可能是物联网。
现在,所有的人都在谈物联网,从政府到金融投资到技术界,物联网正在引发新一次的技术革命。
那么在这个时代到来之前,前端工程师可以做什么?应该怎么做?是我们今天主要要聊的话题。
先来看两张图,第一张是美国著名的咨询机构Gartner发布的2016年新技术成熟度曲线。可以看到,物联网相关的行业方向已经占了非常多。像VR、AR等技术已经开始进入到大规模应用的阶段,IoT平台等技术正在快速上升中。
第二张是国际标准组织IEEE发布的2016年的IoT行业技术人员报告,它提到,目前在美国,Java语言在IoT行业中的应用排名第三,仅次于Java和C,Node.js也有31.5%的热度。在他们2015年的报告中,Java只有30%多,Node.js只有20%多。这一年过去,JS在IoT中的热度持续上升。可以看到在美国,已经有很多的物联网工程师在使用Java和Node.js来做物联网应用开发。
目录
我们这次Live的内容大体分为三部分。
第一部分简要介绍什么是物联网,以及物联网的技术链路。
第二部分讲前端技术以及Java这门语言在物联网中的应用及前景。
第三部分讲前端工程师如何切入IoT,如何找到新的方向,以及前端工程师的成长问题。
什么是物联网
物联网这个行业特别大,没有一个人敢说自己是物联网专家。物联网,Internet of Things,首先它是internet,是以互联网为基础的。传统的互联网,我们认为是电脑之间的连接,那物联网其实就是物之间的连接。
认识物联网
什么是物呢?像我们熟悉的智能家电,家里的空调、音响,都已经可以方便的联网。同样还有一些大家不太熟悉的物,比如在工业领域,在中国大西北,有非常多的林场、风力发电厂,已经在物联网方面有了很多的应用。比如风力发电机会接入网络,它们在大沙漠里运行,不需要人去值守,它们可以通过数据和算法来监控和预测,比如提前半年告诉你这个风机要出问题了,需要准备更换。同样在城市里,也已经有很多东西开始联网,比如红绿灯、路灯、水文气象监测站、交通治安摄像头。还有些比较夸张的,比如杭州在尝试把垃圾箱联网,就可以通过传感器来分析垃圾箱里垃圾是不是满了,它的腐败的程度是不是该换了,来优化垃圾车和环卫工人的路线和工作,可以很好地提高效率和节约成本。
所以大致可以把物联网分为3个方向 : 一是家庭和个人,二是工业服务业,三是城市。
很多人都相信,人工智能机器将取代人类的绝大部分工作,人将不再需要工作,会进入到一种类似于共产主义的社会,专心生活。在这个乌托邦到来之前,就需要物联网的深入发展,将工业、服务业、城市、个人的方方面面都联网,并且在云端有大数据、云计算、人工智能来驱动这些的运行。
物联网的技术体系
简单来说,物联网的技术关注三个端:硬件端、用户交互端、云端。三个端通过网络来互相连接,这是最简单的模型。
细化到每个端,又有非常细致、复杂的技术。比如硬件端,就存在各种形态的硬件,有简单的嵌入式设备,有可以高级操作系统的带屏设备,有只负责数据采集的传感器,也有通信网关类的设备等等。
用户交互端也有很多形态,比如常见的APP、 Web、桌面交互,也有新的VR、AR、语音交互,还有像政府、工厂使用的大屏、控制台等交互。
云端同样也很复杂。需要处理数据的收发和处理、大数据计算、人工智能,还有各种设备间的互联互通。每个细节都需要很多的技术方案去处理。
下面我们就从通信协议、芯片、操作系统、平台来详细说一下。
协议
我认为物联网最重要的就是协议。 协议分两部分,一部分是底层的网络协议,一部分是上层的应用协议。物联网是基于互联网的,在传输层主要还是基于TCP构建的通信协议,包括HTTP协议,及MQTT等专门为物联网设计的协议。在组网层面,存在适合各种不同场景的协议。比如针对家庭大量小型设备的ZigBee协议、Sub-GHz的协议,以及针对城市的NB-IoT等协议。上层应用的协议主要关注设备和服务数据的解读、处理和存储,以及如何联动和控制。
芯片
另外一个很重要的部分是芯片。每个计算机都有CPU,同样,在物联网的每个端都需要有运算的能力,也需要有CPU。CPU有很多种,像我们常说的嵌入式MCU,以及包含基本的软件系统的SoC,都是CPU在物联网上的不同的形态。
在CPU之外,物联网中很重要的一部分叫做模组。模组就是把常用的功能封装成软件、硬件、板卡一体的方案,比如说我们讲的WIFI模组,蓝牙模组,以及ZigBee模组,都是需要由模组商提供集成化模组,便于组装和生产。
操作系统
在芯片之上,还需要关注的是操作系统。Windows、Linux是通用操作系统,虽然Linux、Android在物联网中很常见,但另外的大量嵌入式设备中,对计算能力要求不高,但要求低成本的设备上,更流行RTOS,即实时(Real Time)操作系统。这些操作系统不需要非常强大的进程管理,但需要精确的时钟控制,可以通过事件中断的方式来完成基本的硬件操作。
平台
最后一块重要的就是计算。我们都了解云计算的概念,在物联网中,还有一些其他形态的计算,比如边缘计算,或雾计算。边缘计算是什么意思呢,因为物联网设备特别多,全都跟云端直接通信的话,在连接管理、数据传输量上都是很大的浪费,网络延迟也存在限制,所以完全可以在网关、路由器等网络节点中,或者在工厂、家庭的集中的控制中心里完成计算。
边缘计算节点跟云之间需要数据同步、离线化等细节处理,这样就可以在用最快的时间或复杂的网络状态下完成基本处理,同时保持跟云端的结果同步。
在物联网行业里面出现了大量的云平台服务,亚马逊、IBM、微软,包括阿里都在做面向IoT的平台,这些平台主要的功能是提供对数据和设备的管理,另外在这之上提供了大量的服务,让开发者可以高质高效地完成物联网开发。
行业现状、应用、前景
行业现状
物联网行业最大的特点就是角色特别特别多,环节层层相扣。从芯片来讲,从CPU厂商到模组厂商,到各种家电的方案商、板卡商、工业设计再到生产组装,以及软件研发、售后、用户交互等等,有非常多的环节。这种复杂的供应链和产业链,给这个行业带来了一些困境。
困境一:成本
第一个困境我认为是成本。尤其是在家电这种竞争已经白热化的行业,它的链路特别长、角色特别多,所以每个环节对成本的控制就要求非常高,几毛钱、几分钱的成本都要去抠,导致用户体验等比较关键的事情上容易屈从于成本。
困境二:供应链
第二个困境就是供应链的问题。一个新的技术经过层层角色,最终到用户手上的产品,要经过很长的时间。比如一个芯片上的技术创新,需要经过芯片研发、代理商铺货、模组商调试、板卡商对接、生产组装、软件研发等一系列的过程,最后到用户手上可能需要一两年的时间。
困境三:效率
基于前面两个困境,它的创新效率会非常低。因为整个行业,尤其是家电、工业、城市这种行业里面,每个环节的技术创新都需要大量的供应链的更新、招标成本的控制核算,才能实施下去。
这样下去导致一个悖论,就是用户希望有更好的体验,但是这个行业的成本和惯性不允许厂商来进行革命性的创新。为什么我们觉得智能家电一直这么不智能,其实很大程度就是因为这样。即使实验室里已经有了很好的技术、很好的体验,但是经过层层的角色和环节,到了用户的手上,就会有很大的延迟且效果打了折扣。
3个好的发展趋势
同时我们也可以看到一些好的发展趋势。第一是硬件成本不断降低,性能不断提升,同时用户对体验的要求越来越高,这样厂商就会慢慢把效率和创新变成主要诉求。
第二个是平台化和产业革新,国内像阿里、百度、小米都已经开始尝试用平台化和影响产业链的方式来推进行业发展。让中下游的传统厂商和中小企业可以省掉很多中间环节,方便、快捷地更新技术和体验。
第三个是人工智能技术在这个行业里不断渗透,比如我们现在已经很习惯语音交互,或者一些新的视觉上的交互方式。新的技术概念可以让用户认知和接受,反过来推进在行业的落地,对这个行业是很好的促进。
Java 与物联网的火花
Java的优势
Java 程序员有一个梗,就是阿特伍德定律:所有可以用Java实现的东西最终都会用Java实现。这个是阿特伍德在2008年说的一句话,后来09年Node.js出现后,不断地验证它,Java开始在各种领域有了非常大的发展。
性能不再是问题
综合来看无非有这样几个原因:一是V8的出现解决了Java的性能问题。
灵活
作为一门脚本语言,它在各种端、各种平台上面都有一致性的实现,在服务端、网页、无线客户端、嵌入式里面都可以一致的使用。
简单灵活的另一个体现就是它可以动态化下发到各种平台和应用,实现热更新,这是非常重要的一个特性。
社区活跃
它的社区非常的活跃,在各个行业、方向都有大量的开发者和模块。基于这些优势,Java在物联网上已经成为了非常受欢迎的语言。下面我们从几个方面讲:一是JS如何驱动硬件,JS硬件框架,JS在物联网平台以及人工智能上的应用。
js如何驱动硬件
首先我们看Java在硬件里是怎么玩的。
分为两种方案: 一种就是把Node.js、V8直接放进一个硬件,这样的好处就是直接可以使用Node.js开发方式来开发,并且使用NPM这样的包管理工具和社区生态。它的劣势就是Node.js的运行内存最小是64M,对硬件的要求比较高。
所以就出现了第二种,嵌入式的JS解析器,现在比较流行的有Duktape和Jerry。这两种实现方案类似,它们实现了自己的语言的解析器,然后加上一个事件驱动的模型,这两个用的都是LabUV,跟Node.js是同一个事件的引擎。有了这个之后,他们可以把解析器做得非常小,大概只有100多k的RAM和ROM,能完成JS的解析。
js硬件框架
既然JS可以跑在硬件里了,上层就需要给开发者提供一些框架,包含硬件操作API、事件管理、输入输出接口、流控制、时间定时器控制等等。
基于JS的硬件开发框架大概有几种形态:一种是基于Node.js的,比如美国有家创业公司Tessel,基于Node.js环境提供了开发板,开发者可以用Node.js的方式来开发硬件,这种方案非常适合不计成本但要求效率的硬件工作,比如原型验证等。
第二种典型方案是非Node.js的,以国内的Ruff为例,它使用Jerry作为解析器,其特点首先就是非常小,同时Jerry的API兼容Node.js,是Node.js API的子集,Ruff也在尝试把NPM的包使用在Ruff上面。Ruff的理念是软件定义硬件,它希望把这样一套Ruff的系统、框架、生态来驱动硬件的开发,并且其成本可以控制到可以量产的水平。
第三种方案是直接面向行业生态的,比如说三星的IoT.js,它的技术方案跟Ruff非常像,也使用Jerry,Jerry本来也是三星开发的。它通过产业联盟、深入供应链等方式,在工业、产业上有更多的推进。
下图可以清晰的看到Node.js方案与类IoT.js架构的异同:
js在物联网平台以及在人工智能上的应用
我以亚马逊的IoT平台为例,介绍一下Java在平台体系里面可以做些什么。
如图,亚马逊的IoT有几层关键技术:一个是IaaS基础设施层,就是它的虚拟主机、数据库、存储等基础应用。
在这之上,亚马逊有个规则引擎服务叫Lambda,我认为它更是一种开发模型。它把应用都抽象成一个简单的触发和执行的模型,一个event和一个callback。同时它提供一种容器,让开发者可以用各种语言开发Lambda脚本,放在这个容器中统一运行。容器的好处一是可以统一管理脚本,二是可以有大量的服务API扩展,亚马逊及三方提供的服务都可以作为容器的插件来提供给lambda脚本调用。Lambda是AWS构建上层应用的重要的框架,同样在物联网这种大数据量、有各种联动触发的场景里非常适用。
第三层是它提供了一个IoT平台,主要负责管理设备的连接、设备的控制、设备的数据管理。这边有个非常好的概念叫Shadow,就是影子,它维护了一个虚拟的设备的模型,这个模型可以让你的用户端跟你的设备端、云端的开发解耦,各个端只需要针对Shadow来编程。Shadow同时会负责离线状态下的各种状态保持和同步,对开发者非常友好。
在这之外,它提供了第四层叫Greengrass,是一个硬件端框架,开发者可以在把Lambda、Shadow等编程模型和框架一致化的在硬件中开发,并且可以做到在本地网络、在不跟云端通信的情况下来实行本地的控制。
这是亚马逊在IoT上一个非常完整的架构。
在这个架构里面,Java可以做什么呢?
答案是什么都可以做。它每一层都是支持各种开发语言的。基础设施肯定可以支持Node.js,Lambda有Java脚本的实现,Shadow同样也提供了硬件端、PC端、客户端的JS SDK,Greengrass里也提供一致化的Java实现。也就是说,你使用亚马逊的平台或者搭配一个JS硬件开发板,比如Ruff或IoT.js,你只用Java语言就可以完成从硬件到云端、到用户交互端的所有的开发。
相对于传统的开发方式——硬件里面需要用C、汇编,去编译、烧录、串口调试;云端需要Java,要构建、部署;用户端native方式开发iOS、Android、桌面等不同的应用——在新的模式下,只用一门语言,Java,就可以非常方便地完成各个端,基本上是无缝的。并且它的编程模型和框架是一致的、很多脚本可以复用和共用,这样的方式是一个非常大的变革,对开发方式、开发效率、创新效率、成本控制都是非常好的变化。
物联网与用户交互
前端的新挑战
前端工程师,包括传统的前端用户体验的开发技术在物联网中有哪些新的应用场景和挑战?
前端开发的老本行是用户交互界面,传统的界面开发在物联网行业会遇到更多的挑战。一是解决刚讲的行业的创新的成本和效率的困境,物联网行业的用户交互的端很多,有PC、无线、控制台、设备屏幕等各种媒介。行业中存在大量的中小厂商,需要模块化等方式快速搭建UI界面。
对界面开发来说,第一,需要给各种不同的行业客户提供模块化的快速开发方案。同时要保证用户体验,保证执行效率和稳定性。现在一些好的方案如React Native,在这个场景下面就有更多的施展的场景。
第二是可视化在物联网行业有了更多应用场景,尤其是工业生产、城市等领域,需要大量的数据可视化和流程可视化,并且对精度的实时性要求比较高,同时出现了矢量、3D渲染等新要求。
第三,Node.js开发及框架设计,比如刚才讲同一门JS语言需要在嵌入设备、网关设备、云端来开发一致性的应用,这个对Node.js的不同场景下的框架设计、库实现、包管理、工程支撑、开发社区等都是新的挑战。
同时,物联网行业出现了一些新的交互媒介,比如VR、AR、语音交互、视频交互,目前在这些方向都出现了很多新的框架,比如如VR方向的A-Frame、WebAR、Renderloop 等; AR的AR.js、argon.js等,我们熟悉的Three.js也在AR的时代出现了很多扩展和库来实现AR渲染;对于语音交互,主要的挑战是内容和服务的管理,比如在智能音箱里需要对接订机票、买东西、查天气、叫车等三方服务,这背后需要一个复杂的NLP领域管理和对接各种行业服务的框架,需要一种灵活、动态部署的胶水语言来连接,Java是很好的选择。亚马逊的ASK就是一个语音交互框架的好案例。
前端工程师如何切入物联网并建立竞争力
前端工程师如何建立竞争力?
前端工程师在这个行业里面怎么去成长、怎么去建立竞争力。我觉得最重要的是你先去了解它、先动手玩。你要去了解Java在前端、在硬件、在物联网平台里是需要怎么做。最简单的就是买个开发板,我强烈推荐从Ruff来入手,了解使用Java、Node.js的方式来开发一个硬件的应用、硬件的驱动。同时Ruff已经支持很多的物联网平台,比如说向微软、亚马逊的平台都支持。目前亚马逊是免费一年,你可以去玩Lambda、Shadow,看是怎么回事。
因为这个行业特别新,并且特别大,所以可以找到非常多的点去贡献、去建立影响力。你可以去尝试做一些科研项目,在社区里面参与项目,都可以很快地找到很多的小伙伴跟你一起来玩。
第二部分我们可以用Web思维解决行业的困境。Web天然的就是动态更新,灵活部署,这个东西在物联网行业是非常珍贵的特性。怎么样让你的硬件里的程序来进行方便的部署、包管理、动态更新,怎么样让用户的控制终端可以快速地更新体验,流畅地运行,并且可以不断升级,跟硬件同步进化,这个是我们用Web前端的开发经验可以去优化的很多地方。
第三个就是作为全栈开发者,我觉得非常珍贵的一点就是我们可以从全局、从整个用户体验的角度去推进,动用一切技术优化用户体验,这物联网行业也非常重要。因为它的端很多,怎么在各种端用一致化的模型来开发应用,来做功能的拓展,前端工程师或者Java工程师在这里面有非常合适的场景。
第四点我觉得非常重要的就是用户体验,前端工程师一直是关注用户界面和用户体验。Web1.0时代,是人与信息的交互,Web2.0时代,我们关心的是人和人的交互,在物联网时代,我们应该去关心人与物、人与环境、人与生活的交互。我们关于用户体验的最佳实践和理论基础是可以延续到物联网这个行业的。前端工程师发端于Web,带着Web的基因,在新的时代,我们也必将来继承这种情怀和梦想,继续前行。
前端工程师的成长建议
我的建议有三点:深度、广度、好奇心。
第一是要有足够的深度,在协议、编程语言、工程化上有深入的理解。不管是富交互、无线、Node,还是物联网,对基础技术的要求都类似,有了这种深度,才可以去拓展你的广度。因为前端开发的领域非常大,边界非常大,Java这门语言也是有非常多的场景,你在不同的场景下都可以找到一些非常好的东西去尝试、去落地技术成果。所以就需要你有强烈的好奇心,你需要对新的技术,对新的领域有敏感、有洞察力、有兴趣去探索、去挖掘。
以上是我今天讲的内容,内容比较多,时间比较短,所以很多是点到为止。我前面也建了一个群,后面大家有需要也可以一起加入这个群来交流(QQ群:627103455)。
Q & A
Q1:从技术上看,NB-IOT已炒作了一段时间,智能家居却仍以蓝牙、WIFI为主,除了技术不成熟外,是否有其他原因?
A1:NB-IOT是一种数据LPWAN窄带物联网技术,并由通信运营商控制,可以理解成一种类似3G的网络,它的传输速率不快,但是功耗特别低,连接更稳定。所以对市政这类的设备,比如说路灯、垃圾桶,是非常适用的。但它明显不适用于智能家居,因为家庭里面都是有电有稳定网络的环境,不需要来直接跟运营商网络通信。我认为NB-IoT在未来的智能城市和工业、服务业里面会有非常大的发展。同时窄带物联网还有一些别的协议,比如像LoRa,它是完全开放的协议,不依赖运营商,企业可以自行组建园区、城市网络。这些技术在不同的场景下都会有很多需求,但是目前在智能家居里,还是WiFi、蓝牙或者以ZigBee等更适用。
Q2:物联网和传统web有什么不一样?为什么说是前端新蓝海?感觉物联网更需要后端发力。
A2:我觉得前端工程师不要把自己局限于做Web页面的,有两种方式。第一种,你往Java程序员的方向发展,因为这门语言在IoT行业确实有非常大的应用的场景。第二,你从用户交互的角度,比如在IoT的无线客户端上的场景,或者在一些用户交互界面的场景去做一些创新,这个是非常有需要的。比如说我们现在在做基于React Native在做一些家电控制上的组件化、服务化,一些开放的东西,这个对前端的开发能力和工程能力要求都是非常高的。应用的场景也非常非常大。
Q3:物联网在开放平台的发展上面现状是什么样的?
A3:刚才讲其实现在大部分的平台是来满足基本的接入、控制、数据管理这方面以及边缘计算这方面的事情。在上层,有很大的需求其实是在开发平台有要求的。比如说物联网中很重要的像内容、服务,内容的话,比如说你的VR、AR里面或者音响里面接入的这种音乐、服务,这些肯定是需要开放的。就是说在底层基础设施之上,上面需要一个很大的生态来满足各种,比如说家庭场景或者工业场景的各种第三方的服务和内容的输入输出。这部分我认为是物联网在开放平台上的很大的机会,也是像阿里这种互联网企业比较擅长做的一些事情。因为像在底层,在通信,在硬件这方面,可能像中国联通这样的运营商,或者华为、中兴这样的设备商有更多的经验,但是在上层,在用户体验、在内容、在生态上面,互联网公司有更多的场景。