2
本文作者: 史中 | 2016-04-25 17:30 | 專題:雷峰網(wǎng)公開課 |
嘉賓介紹:鄭曄,Ruff CTO,Oracle Duke選擇獎(jiǎng)獲獎(jiǎng)作品Moco的作者,目前投身于 IoT 領(lǐng)域,致力于簡化 IoT 應(yīng)用的開發(fā)方式。他多次在各種媒體上發(fā)表文章,在各種技術(shù)大會(huì)上做過演講,對(duì)敏捷軟件開發(fā)、軟件設(shè)計(jì)、領(lǐng)域特定語言等方面,有著深刻理解,愿意分享自己對(duì)于軟件開發(fā)的理解,也愿意吸收新的知識(shí),更愿意與人暢聊軟硬件開發(fā)。
【Ruff CTO 鄭曄】
IoT(Internet of Things)是大家公認(rèn)的未來。但讓人尷尬的是,這些代表未來的炫酷產(chǎn)品似乎只存在于業(yè)內(nèi)人士的 PPT 中。真正走進(jìn)普通人生活的,大多只是一些“帶有 Wi-Fi 的普通硬件”。和大多數(shù)生態(tài)普及過程中遇到的問題相同,IoT 缺少一個(gè)關(guān)鍵的系統(tǒng)——應(yīng)用。應(yīng)用缺失,自然難以營造用戶生態(tài)。然而這并不完全是開發(fā)者的責(zé)任,大多數(shù)情況下,開發(fā)者都處在臣妾做不到的狀態(tài),因?yàn)樯婕坝布摹扒度胧介_發(fā)”需要非常多的底層硬件代碼基礎(chǔ),這讓廣大的軟件程序猿望而卻步。
“Ruff”的目標(biāo)就是解決這個(gè)問題。簡而言之,Ruff 可以允許開發(fā)者用普及的 JavaScript 語言進(jìn)行嵌入式開發(fā),他們究竟是怎么做到的呢?且聽 Ruff CTO 鄭曄慢慢道來。
Ruff 是一個(gè)硬件應(yīng)用開發(fā)平臺(tái)。簡言之,通過 Ruff,開發(fā)者可以使用 JavaScript 開發(fā)硬件應(yīng)用。
從行業(yè)發(fā)展趨勢(shì)可以看到,IoT(Internet of Things)是大家公認(rèn)的未來。大家也知道,我國目前在生產(chǎn)制造的水準(zhǔn)也是世界級(jí)的。但是,從趨勢(shì)到現(xiàn)實(shí)中,中間還欠缺了什么呢?我們看到的是:應(yīng)用。
我們都在說智能硬件。實(shí)際上,所謂智能硬件是一個(gè)“硬件應(yīng)用”,是把硬件和應(yīng)用場景結(jié)合起來。應(yīng)用的成功本質(zhì)上是個(gè)概率問題,我們之所以還沒有看到很多成功的硬件應(yīng)用,主要是應(yīng)用的總體數(shù)量太少。很多人都能看到這是一片藍(lán)海,但問題是,并不是每個(gè)人都有能力進(jìn)入到這個(gè)領(lǐng)域,因?yàn)橛布?yīng)用的門檻太高了。
這一點(diǎn)類似于 Nokia 手機(jī)的時(shí)代,很多人都想編寫手機(jī)應(yīng)用,但只有很少量的程序員有能力編寫手機(jī)應(yīng)用,我自己就曾經(jīng)希望買 Nokia 手機(jī)來做開發(fā),但最后放棄了,也是因?yàn)殚_發(fā)太麻煩。后來有了 iOS 和 Android,開發(fā)門檻一下子降了下來,大量的程序員涌了進(jìn)來,才有了我們看到的移動(dòng)互聯(lián)網(wǎng)的興起,也才有了微信、滴滴等爆款應(yīng)用。
所以 Ruff 就是要在硬件應(yīng)用開發(fā)領(lǐng)域解決同樣的問題,降低硬件應(yīng)用開發(fā)的門檻,讓更多有應(yīng)用開發(fā)能力的人進(jìn)入到這個(gè)領(lǐng)域里。
有一個(gè)前端開發(fā)者,他拿到 Ruff,很快就寫了一個(gè)小應(yīng)用:用打火機(jī)點(diǎn)亮網(wǎng)頁上的一盞燈。因?yàn)橛辛?nbsp;Ruff,這個(gè)從來沒寫過硬件的開發(fā)者,就有機(jī)會(huì)開始編寫硬件應(yīng)用了。這就是 Ruff 降低門檻起到的作用??偨Y(jié)起來,Ruff 就是要降低硬件應(yīng)用開發(fā)門檻,讓開發(fā)者能夠創(chuàng)造出更多有創(chuàng)意的硬件應(yīng)用。
從現(xiàn)狀來看,硬件和應(yīng)用完全就是兩套詞匯表,比如,做硬件的人關(guān)心的是,GPIO、I2C、時(shí)序、驅(qū)動(dòng)等,而做應(yīng)用的人關(guān)心的是,需求、用戶體驗(yàn)、高可用性、系統(tǒng)架構(gòu)等。我問過應(yīng)用開發(fā)者什么是 GPIO,他們的表情就像見了鬼一樣;我也曾讓硬件開發(fā)者講講什么是 SOLID 設(shè)計(jì)原則,很少有人能講清楚。
這就是軟硬件之間的鴻溝,讓一個(gè)人同時(shí)具備硬件和應(yīng)用兩套技能,這是很高的要求。其實(shí),即便是只在硬件開發(fā)領(lǐng)域,除了應(yīng)用以外,做系統(tǒng)的和做硬件的也是不同的話語體系,有人關(guān)注進(jìn)程,有人關(guān)注晶振;有人關(guān)注嵌入式系統(tǒng),有人關(guān)注 PCB。
讓一個(gè)人掌握好所有的東西,難度系數(shù)會(huì)直線上升。即便有這樣的人,價(jià)格也會(huì)非常高,而且能找到的人數(shù)量也有限。另外,在硬件領(lǐng)域,重復(fù)造輪子的現(xiàn)象是很嚴(yán)重的。很多東西即便開發(fā)者再熟悉,到了一個(gè)新的環(huán)境可能就要重新做一遍,比如,常見的網(wǎng)絡(luò)協(xié)議要移植,常見的驅(qū)動(dòng)要編寫。我的這些印象,全部來自一個(gè)有20年硬件開發(fā)經(jīng)驗(yàn)的老法師,他將其稱為血淚史。
與應(yīng)用的對(duì)接中,硬件開發(fā)的過程,基本上是一個(gè)瀑布式開發(fā)的過程,或者說一個(gè)自頂向下的過程,也就是說,把需求確定好了,然后,進(jìn)入一個(gè)開發(fā)過程,這個(gè)過程往往會(huì)持續(xù)很長一段時(shí)間。從軟件工程的實(shí)踐來看,這是一種低效的做法,因?yàn)樽霎a(chǎn)品,最重要的是快速反饋,一年前的市場需求和現(xiàn)在的市場需求是不同的。
所以,在軟件領(lǐng)域有了敏捷、精益等方法論,改善這個(gè)過程,最重要的就是迭代的思想,不斷地對(duì)產(chǎn)品進(jìn)行改進(jìn)。目前市面上很多有想法的人來自互聯(lián)網(wǎng)領(lǐng)域,他們習(xí)慣了與軟件應(yīng)用開發(fā)者協(xié)同工作,所以,他們也更習(xí)慣采用迭代的思想進(jìn)行工作,但同樣的工作邏輯拿到硬件領(lǐng)域幾乎沒辦法行得通。
舉個(gè)例子,
產(chǎn)品經(jīng)理希望迭代地看到產(chǎn)品進(jìn)展,因?yàn)樗南敕ㄐ枰磸?fù)驗(yàn)證,而硬件開發(fā)者希望確定好需求再來做開發(fā),因?yàn)樵谒倪壿嬂铮布且坏┲瞥删秃茈y改變了。
造成這種現(xiàn)象更根本的原因是,是硬件制造商在編寫應(yīng)用。而應(yīng)用開發(fā)根本就不是硬件制造商擅長的。當(dāng)我們可以把硬件和應(yīng)用兩個(gè)概念分開之后,我們就會(huì)發(fā)現(xiàn),同樣的硬件,在不同的場合下,可以有不同的應(yīng)用。
舉例來說,
同樣的飲水機(jī),如果你買了回家,它的應(yīng)用是統(tǒng)計(jì)你家的飲水狀況,提醒你多喝水;
如果把飲水機(jī)租回家,它會(huì)提醒你按時(shí)繳費(fèi),保證正常使用。
硬件上是一樣的,但應(yīng)用是不同的。解決這個(gè)問題最好的辦法就是分工,讓應(yīng)用開發(fā)者只關(guān)注應(yīng)用,硬件制造商只關(guān)注硬件。將二者聯(lián)系起來,這就是 Ruff 要做的事情。
對(duì)程序員來說,語言的選擇永遠(yuǎn)是宗教戰(zhàn)爭。我們把 Ruff 定位成一個(gè)應(yīng)用開發(fā)平臺(tái),所以,選擇做技術(shù)選型的時(shí)候,盡可能考慮應(yīng)用開發(fā)者熟悉的東西,所以 Ruff 選擇了 JavaScript。
首先,我們排除了硬件開發(fā)者最熟悉的 C/C++,因?yàn)?nbsp;C/C++在多數(shù)程序員眼里是系統(tǒng)語言,一旦使用 C/C++,程序員們就會(huì)回到系統(tǒng)開發(fā)的思路上。
再次,我們排除的是目前最流行的語言 Java。從受眾的角度考慮,最該考慮的是 Java,這就是 Android 的做法,但在資源受限的硬件上,Java 太重了。
JavaScript 是一個(gè)恰當(dāng)?shù)恼Z言,原因如下:
首先,它是一門真正的全平臺(tái)語言,可以運(yùn)行在所有系統(tǒng)上,包括瀏覽器、手機(jī)、服務(wù)器、客戶端,都有。
其次,隨著 Node.js 的流行,JavaScript 的社區(qū)越來越活躍,許多新想法都是在這個(gè)社區(qū)內(nèi)涌現(xiàn)出來的。
再次,JavaScript 有很多不錯(cuò)的運(yùn)行時(shí)實(shí)現(xiàn),方便我們開展工作。套用軟件開發(fā)社區(qū)里的一個(gè) 說法:Atwood 定律,所有能用 JavaScript 寫的應(yīng)用,最終都會(huì)用 JavaScript 寫就。
然而,根因是受眾面,不需要從頭教育市場。所以,Ruff 選擇了 JavaScript。事實(shí)上,很多大廠也下水做這個(gè)領(lǐng)域,大部分人的選擇也是 JavaScript。
從個(gè)人的角度來說,我更愿意比較的是抽象層次,而非簡單的語法。從技術(shù)的發(fā)展趨勢(shì),我們已經(jīng)非常清楚地看到,應(yīng)用開發(fā)的抽象層次是越來越高的。
比如:最開始大家是用機(jī)器碼,因?yàn)橛洃洸环奖阌辛藚R編,又因?yàn)閰R編對(duì)于不同機(jī)型差異太大,而產(chǎn)生了 C 這樣的程序設(shè)計(jì)語言,再往后,C++提供了面向?qū)ο蟪绦蛟O(shè)計(jì),給程序組織提供了一種良好的方案。越高的抽象,意味著編寫同樣多的內(nèi)容用的代碼越少。
我曾經(jīng)對(duì)比過一個(gè)大廠出的 C/C++的硬件應(yīng)用開發(fā)框架,點(diǎn)亮一個(gè)板載燈,它寫了大約50行左右的代碼,用 Ruff,我寫了3行代碼,還有2行是框架代碼。
$.ready(function() {
$('#led-r').turnOn();
});
通過這段代碼大家就可以感受到差異,真正的核心代碼只有1行,這就是抽象的價(jià)值。
JavaScript 語言社區(qū)已經(jīng)提供了許多好的抽象,比如,基于事件的模型。
Ruff 還建立了自己建立的抽象。比如劃分了驅(qū)動(dòng)開發(fā)者和應(yīng)用開發(fā)者,只有驅(qū)動(dòng)開發(fā)者需要關(guān)心硬件細(xì)節(jié),而應(yīng)用開發(fā)者只要關(guān)注應(yīng)用邏輯就好了。
剛才給大家展示的這段代碼就是一段應(yīng)用代碼,你根本看不到硬件參數(shù)這些東西,這就是分層架構(gòu)的力量,抽象的力量。此外,Ruff 在設(shè)計(jì)之初,就考慮了應(yīng)用測(cè)試的問題。用 Ruff 開發(fā)的代碼可以在開發(fā)機(jī)器上把邏輯測(cè)試好,再部署到具體硬件板子上。這樣可以防止因?yàn)橐恍┑图?jí)錯(cuò)誤,反復(fù)燒板子,造成時(shí)間上的浪費(fèi)。
Ruff 還配套了命令行工具,簡化應(yīng)用開發(fā)和板卡部署,另外還有一個(gè)軟件倉庫,可以讓驅(qū)動(dòng)開發(fā)者上傳自己的驅(qū)動(dòng),與社區(qū)分享。
至于實(shí)現(xiàn)JavaScript的硬件編程,道理上很簡單:運(yùn)行一個(gè) JavaScript 引擎,在上面跑 Javascript 的程序。
從具體的實(shí)現(xiàn)上來說,
第一步:選擇了一個(gè)嵌入式 JavaScript 引擎;
第二部,在一個(gè)操作系統(tǒng)上把它運(yùn)行起來,在其基礎(chǔ)上構(gòu)建 Ruff,這也是目前對(duì)外發(fā)行的版本。
簡單來說,這是從打造最小可行產(chǎn)品(MVP)的思路來做的。Ruff 內(nèi)部正在研發(fā)基于 MCU 的版本,也就是將 JavaScript 引擎直接跑在硬件上。這樣可以更好地解決功耗、實(shí)時(shí)性等問題。
現(xiàn)在,開發(fā)者能看到一些開發(fā)板,例如:樹莓派、Ardunio 和 Intel Edison。而 Ruff 提供了一個(gè)開發(fā)框架。另外 Ruff 本身也提供了一套開發(fā)套件,這么做的原因是為了讓人盡快上手 Ruff。
更關(guān)鍵的差異在于,這些開發(fā)板只能做小應(yīng)用或是原型,當(dāng)然,這也是 Ruff 開發(fā)套件的現(xiàn)狀。不同的是,我們做 Ruff 的目的不限于此,我們是希望將 Ruff 將來打通到生產(chǎn)環(huán)節(jié)中。也就是說,一個(gè)硬件應(yīng)用在軟件代碼完全不用修改的情況下,把它用在更真實(shí)的設(shè)備上,比如 MCU 上。我們很清楚,Ruff 的終點(diǎn)不是開發(fā)板,這與其它的開發(fā)板目標(biāo)是截然不同的。
坦白來講,讓應(yīng)用開發(fā)者意識(shí)到自己能夠編寫硬件應(yīng)用會(huì)是比較困難的。很多軟件程序員思考問題的邊界就是硬件,根本不敢想這方面的問題。就像 Android 和 iOS 之前,應(yīng)用開發(fā)者不會(huì)覺得自己能寫手機(jī)應(yīng)用一樣。這里面是一個(gè)意識(shí)的鴻溝,大多數(shù)應(yīng)用開發(fā)者并不覺得硬件開發(fā)和他們有什么關(guān)系。正因?yàn)樗麄冇X得硬件應(yīng)用開發(fā)太困難,才會(huì)退避三舍。
對(duì)于 Ruff 而言,這是一個(gè)教育市場的過程。其實(shí),硬件應(yīng)用開發(fā)其實(shí)很簡單:控制你家的電視很簡單,點(diǎn)亮家里的燈也沒那么難??缭搅艘庾R(shí)上的鴻溝,再來了解硬件,就不那么困難了。當(dāng)我們的正式版發(fā)布之后,我們會(huì)在開發(fā)者社區(qū)方面投入大量的精力,讓開發(fā)者們意識(shí)到,他們能做的事情其實(shí)更多。
關(guān)于Ruff的最新動(dòng)態(tài)
在1月份,Ruff 推出了少量的公測(cè)版套件,定向地發(fā)給了一些有興趣的用戶,軟件 SDK 隨公測(cè)版發(fā)布。大致一個(gè)月左右會(huì)有一次新的發(fā)布。鄭曄表示,正式版在內(nèi)部的備貨基本上已經(jīng)完成,五一之后,就會(huì)正式開始銷售,更多的開發(fā)者就可以嘗試新的開發(fā)體驗(yàn)了。
Ruff 開發(fā)套件購買戳這
官方網(wǎng)站:ruff.io
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。