物聯網是繼 Web 、無線以後的又一次重大技術變革,在變革的大潮中,程序員的知識體系和思惟方式將面臨全面更新。前端
前端開發的歷史程序員
在準備這個live的過程當中,我回顧了前端開發短暫的歷史,有幾回我認爲很是重要的變革。web
第一個是富交互。十年前咱們聊到富交互,首先會想到的是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廠商到模組廠商,到各類家電的方案商、板卡商、工業設計再到生產組裝,以及軟件研發、售後、用戶交互等等,有很是多的環節。這種複雜的供應鏈和產業鏈,給這個行業帶來了一些困境。
困境一:成本
第一個困境我認爲是成本。尤爲是在家電這種競爭已經白熱化的行業,它的鏈路特別長、角色特別多,因此每一個環節對成本的控制就要求很是高,幾毛錢、幾分錢的成本都要去摳,致使用戶體驗等比較關鍵的事情上容易屈從於成本。
困境二:供應鏈
第二個困境就是供應鏈的問題。一個新的技術通過層層角色,最終到用戶手上的產品,要通過很長的時間。好比一個芯片上的技術創新,須要通過芯片研發、代理商鋪貨、模組商調試、板卡商對接、生產組裝、軟件研發等一系列的過程,最後到用戶手上可能須要一兩年的時間。
困境三:效率
基於前面兩個困境,它的創新效率會很是低。由於整個行業,尤爲是家電、工業、城市這種行業裏面,每一個環節的技術創新都須要大量的供應鏈的更新、招標成本的控制覈算,才能實施下去。
這樣下去致使一個悖論,就是用戶但願有更好的體驗,可是這個行業的成本和慣性不容許廠商來進行革命性的創新。爲何咱們以爲智能家電一直這麼不智能,其實很大程度就是由於這樣。即便實驗室裏已經有了很好的技術、很好的體驗,可是通過層層的角色和環節,到了用戶的手上,就會有很大的延遲且效果打了折扣。
同時咱們也能夠看到一些好的發展趨勢。第一是硬件成本不斷下降,性能不斷提高,同時用戶對體驗的要求愈來愈高,這樣廠商就會慢慢把效率和創新變成主要訴求。
第二個是平臺化和產業革新,國內像阿里、百度、小米都已經開始嘗試用平臺化和影響產業鏈的方式來推動行業發展。讓中下游的傳統廠商和中小企業能夠省掉不少中間環節,方便、快捷地更新技術和體驗。
第三個是人工智能技術在這個行業裏不斷滲透,好比咱們如今已經很習慣語音交互,或者一些新的視覺上的交互方式。新的技術概念可讓用戶認知和接受,反過來推動在行業的落地,對這個行業是很好的促進。
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裏面或者音響裏面接入的這種音樂、服務,這些確定是須要開放的。就是說在底層基礎設施之上,上面須要一個很大的生態來知足各類,好比說家庭場景或者工業場景的各類第三方的服務和內容的輸入輸出。這部分我認爲是物聯網在開放平臺上的很大的機會,也是像阿里這種互聯網企業比較擅長作的一些事情。由於像在底層,在通訊,在硬件這方面,可能像中國聯通這樣的運營商,或者華爲、中興這樣的設備商有更多的經驗,可是在上層,在用戶體驗、在內容、在生態上面,互聯網公司有更多的場景。