擊關(guān)注 InfoQ,置頂公眾號(hào)
接收程序員的技術(shù)早餐
嘉賓|桑世龍
編輯|覃云
2009 年,Node.js 橫空出世,在幾年時(shí)間里,Node.js 憑借其高性能、易部署等特點(diǎn)迅速在前端領(lǐng)域脫穎而出,成為大火的明星。但一個(gè)技術(shù)再好,也是有生命周期的,許多開發(fā)者開始質(zhì)疑,Node.js 是不是在走下坡路了?Node.js 是不是越來越不吃香了?
為此,InfoQ 采訪了阿里巴巴前端技術(shù)專家、Node 技術(shù)傳道者桑世龍(狼叔),為大家解答關(guān)于 Node 的問題,以及開發(fā)者在日新月異的技術(shù)迭代環(huán)境中應(yīng)該如何建立起自己的“大局觀”。以下是采訪的全部內(nèi)容。
友情提示:在即將到來的 2018 年 GMTC 大會(huì)上,狼叔將擔(dān)任 Node 專場(chǎng)的出品人,喜歡狼叔和對(duì) Node 有興趣的讀者千萬別錯(cuò)過。
Node 為解決后端并發(fā)而生,但卻無心插柳,成為大前端的基石。伴隨大前端的發(fā)展,Node 也發(fā)展得越來越好,越來越重要,其應(yīng)用場(chǎng)景從腳手架、輔助前端開發(fā)(比如 SSR、PWA 等)的快速開發(fā)實(shí)踐,到 API 中間層、代理層,到專業(yè)的后端開發(fā)都有非常成熟的經(jīng)驗(yàn)。另外,前端越來越復(fù)雜,后端服務(wù)化,今日的前端要面臨更多的挑戰(zhàn),Node 全棧給大家更多可能,狼叔對(duì)此堅(jiān)定不移。
1 2017 年,Node 的日子好過嗎?
狼叔主要從以下四個(gè)方面介紹了 2017 年 Node 發(fā)生的變化:
a)Node 8 進(jìn)入 LTS 時(shí)代
b)企業(yè)級(jí) Web 開發(fā)
c)不可不見的 Api 中間層
d)新領(lǐng)域(深度學(xué)習(xí)、區(qū)塊鏈等)
a)Node 8 進(jìn)入 LTS 時(shí)代
2017 年,Node.js 最大的變化是進(jìn)入 Node 8 時(shí)代,它是一個(gè)穩(wěn)定的長期支持版本(LTS),除了性能提升外,還有以下幾個(gè)要點(diǎn)。
Async/Await 支持。其實(shí)在 Node.js v7.6 就可以通過 flag 支持了,在 node8 里直接落地。通過 Async 函數(shù)可以更好的進(jìn)行異步流程控制,遠(yuǎn)離 Callback Hell。在 Async 函數(shù)里,你可以通過 await 調(diào)用 Promise,以及通過 co 包裹的 generator,可以說,向前是完美的 Async 函數(shù),向后也完美兼容各種遺留代碼,稱為異步終極解決方案不為過。
ES6 模塊支持。通過 vue/react、webpack、babel 和 typescript 等火爆發(fā)展,es6 模塊得到了廣泛普及和應(yīng)用,在 Node.js v8.5 可以通過 --experimental-modules 來開啟這個(gè)體驗(yàn)版特性。當(dāng)然,你想在 Node.js 更早版本里使用 ES6 模塊,可以采用 @std/esm 模塊。
HTTP2 支持。在 Node.js v8.8 就開始默認(rèn)啟用了,http2 對(duì)服務(wù)器端推送,多通道復(fù)用等特性,能夠更好地為瀏覽器便利,是性能優(yōu)化的利器。
Node v9.9 對(duì) ES2018 支持是 75%,在 Node v10 里支持是 100%,還是非常值得期待的,更多信息參見 http://node.green/#ES2018。
b)企業(yè)級(jí) Web 開發(fā)
基礎(chǔ)框架除了應(yīng)用最廣泛的主流 Web 框架 Koa 外,F(xiàn)astify 也是一直勁敵,作者 Matteo Collina 是 Node.js 核心開發(fā),Stream 掌門,性能優(yōu)化專家。Fastify 基于 Schema 優(yōu)化,對(duì)性能提升極其明顯。狼叔認(rèn)為這是企業(yè)級(jí) Web 開發(fā),他在這里給我們介紹了 3 個(gè)知名框架。
b1)Egg.js
阿里開源的企業(yè)級(jí) Node.js 框架 Egg 發(fā)布 2.0,基于 Koa 2.x,異步解決方案直接基于 Async Function。框架層優(yōu)化不含 Node 8 帶來的提升外,帶來 30% 左右的性能提升。
Egg 采用的是 『微內(nèi)核 + 插件 + 上層框架』 模式,對(duì)于定制,生態(tài),快速開發(fā)有明顯提升,另外值得關(guān)注的是穩(wěn)定性和安全上,也是極為出色的。
b2)Nest
Nest 是基于 TypeScript 和 Express 的企業(yè)級(jí) Web 框架。
很多人開玩笑說,Nest 是最像 Java 開發(fā)方式的,確實(shí),Nest 采用 TypeScript 作為底層語言,TypeScript 是 ES6 超集,對(duì)類型支持,面向?qū)ο螅珼ecorator(類似于 Java 里注解 Annotation)等支持。在寫法上,保持 Java 開發(fā)者的習(xí)慣,能夠吸引更多人快速上手。
TypeScript 支持幾乎是目前所有 Node Web 框架都要做的頭等大事,在 2017 年 Nest 算首個(gè)知名項(xiàng)目,值得一提。
b3)ThinkJS
ThinkJS 是一款擁抱未來的 Node.js Web 框架,致力于集成項(xiàng)目最佳實(shí)踐,規(guī)范項(xiàng)目讓企業(yè)級(jí)團(tuán)隊(duì)開發(fā)變得更加簡(jiǎn)單,更加高效。秉承簡(jiǎn)潔易用的設(shè)計(jì)原則,在保持出色的性能和至簡(jiǎn)的代碼同時(shí),注重開發(fā)體驗(yàn)和易用性,為 WEB 應(yīng)用開發(fā)提供強(qiáng)有力的支持。
ThinkJS 是國產(chǎn)老牌 Web 框架,在 2017 年 10 月發(fā)布 v3 版本,基于 Koa 內(nèi)核,在性能和開發(fā)體驗(yàn)上有更好的提升。
整體來看,Node.js 在企業(yè) Web 開發(fā)領(lǐng)域日漸成熟,無論微服務(wù),還是 Api 中間層都得到了非常好的落地。2017 年,唯一遺憾的是 Node.js 在 servless 上表現(xiàn)的不太好,相關(guān)框架實(shí)踐偏少。
c)不可不見的 Api 中間層
前端越來越復(fù)雜,后端服務(wù)化,今日的前端要面臨更多的挑戰(zhàn)。一個(gè)典型的場(chǎng)景就是在服務(wù)化架構(gòu)里,前端面臨的最頭痛的問題是異構(gòu) API,前后端聯(lián)調(diào)的時(shí)候,多個(gè)后端互相推諉,要么拖慢上線進(jìn)度,要么讓前端性能變得極其慢。進(jìn)度慢找前端,性能差也找前端,但這個(gè)鍋真的該前端來背么?
Node.js 的 Api 中間層應(yīng)用很好地解決了這個(gè)問題。后端不想改的時(shí)候,實(shí)在不行就前端自己做,更靈活,更能應(yīng)變。
透?jìng)鹘涌冢瑢?duì)于內(nèi)網(wǎng)或者非安全接口,可以采用中間層透?jìng)鳌?/p>
聚合接口,對(duì)異構(gòu) API 處理非常方便,如果能夠梳理 model,應(yīng)變更容易。
Mock 接口,通過 Mock 接口,提供前端開發(fā)效率,對(duì)流程優(yōu)化效果極其明顯,比如去哪兒開發(fā)的 yapi 就是專門解決這個(gè)問題的。
除此之外,前端如果想做一些技術(shù)驅(qū)動(dòng)的事兒,SSR(服務(wù)器端渲染)和 PWA(漸進(jìn)式 Web 應(yīng)用)也是非常不錯(cuò)的選擇。
d)新領(lǐng)域(深度學(xué)習(xí)、區(qū)塊鏈等)
深度學(xué)習(xí),https://github.com/PAIR-code/deeplearnjs
神經(jīng)網(wǎng)絡(luò),https://github.com/BrainJS/brain.js
區(qū)塊鏈,http://truffleframework.com/
狼叔說他這部分接觸得不多,不過從這些開源項(xiàng)目可以看到有很多開發(fā)者熱衷于使用 Node.js 做開發(fā)創(chuàng)新,這是非常值得高興的。
2 如何將 Node 的價(jià)值發(fā)揮到極致?
狼叔說過,“不是 Node 不行,而是你不會(huì)用”,他認(rèn)為很多人對(duì) Node.js 有很多誤解,從 2009 年誕生到現(xiàn)在,Node.js 的改變進(jìn)化是非常明顯的,甚至說是有了質(zhì)的變化。
比如 Callback hell,現(xiàn)在可以通過 Async 函數(shù)解決。
比如作為過渡技術(shù)棧的 thunk 函數(shù)和 generator,慢慢的消失在歷史舞臺(tái)。
比如 node 是單進(jìn)程非常脆弱,但是你真的部署對(duì)了么?
比如數(shù)據(jù)庫事務(wù)問題,這是 node 的鍋么?你用 mongodb 玩不好,也要賴到 node 身上么?
一般,后端開發(fā)指的是 Web
應(yīng)用開發(fā)中和視圖渲染無關(guān)的部分,但現(xiàn)在架構(gòu)升級(jí),Node
承擔(dān)了前后端分離重任之后,有了更多玩法。從帶視圖的傳統(tǒng)Web 應(yīng)用
和面向 Api 接口應(yīng)用
,到通過RPC
調(diào)用封裝對(duì)數(shù)據(jù)庫的操作,到提供前端Api
代理和網(wǎng)關(guān),服務(wù)組裝等,統(tǒng)稱為后端開發(fā),不再是以往只有和數(shù)據(jù)庫打交道的部分才算后端,這樣,就可以讓前端工程師對(duì)開發(fā)過程可控,更好的進(jìn)行調(diào)優(yōu)和性能優(yōu)化。
對(duì) Node.js 來說,一直沒有在后端取得其合理的占有率。原因很簡(jiǎn)單:
1)利益分配,已有實(shí)現(xiàn)大多是 Java 或者其他語言,基本是沒法撼動(dòng)的,重寫的成本是巨大的,另外,如果用 Node 寫了,那么那些寫 Java 的人怎么辦?搶人飯碗,這是要拼命的。
2)Node 相對(duì)年輕,大家對(duì) Node 的理解不夠,回調(diào)和異步流程控制略麻煩,很多架構(gòu)師都不愿意花時(shí)間去學(xué)習(xí)。盡管在 Web 應(yīng)用部分處理起來非常簡(jiǎn)單高效,但在遇到問題時(shí)并不容易排查定位,對(duì)開發(fā)者水平要求略高。
3)開發(fā)者技能單一,很多是從前端轉(zhuǎn)過來的,對(duì)數(shù)據(jù)庫,架構(gòu)方面知識(shí)欠缺,對(duì)系統(tǒng)設(shè)計(jì)也知之不多,這是很危險(xiǎn)的,有種麻桿打狼兩頭害怕的感覺。
4)Node 在科普、培訓(xùn)、布道等方面做的并不好,國外使用的非常多,國內(nèi)卻很少人知道,不如某些語言做得好。
縱覽 2017 年 Node.js 的發(fā)展路程,作為一個(gè)親歷者,他覺得 Node 在 4 個(gè)方面表現(xiàn)得極為突出:
前端實(shí)踐,腳手架,工程化,快速開發(fā);
API Proxy 中間層實(shí)踐,頁面即服務(wù)概念;
面向企業(yè)開發(fā)的 Web 框架;
Node 最新技術(shù)與性能調(diào)優(yōu)。
狼叔希望更多的 Node.js 開發(fā)者能夠參與其中,本次 GMTC 大會(huì)也會(huì)圍繞這寫主題進(jìn)行 topic 篩選,希望能夠?yàn)閲鴥?nèi) Node.js 的繁榮做出一點(diǎn)貢獻(xiàn)。
3 如何選擇適合自己的 Node 框架?
開發(fā)者在面對(duì)如此多的 Node 框架時(shí),總會(huì)眼花繚亂,不知道是該從眾還是應(yīng)當(dāng)選擇自己擅長的框架,對(duì)此,狼叔是這么說的。
Web 應(yīng)用大致分 2 種,帶視圖的 傳統(tǒng) Web 應(yīng)用和面向 Api 接口應(yīng)用,而 Node.js Web 應(yīng)用開發(fā)框架的演進(jìn)時(shí)間線大致如下:
2010 年 TJ Holowaychuk 寫的 Express。
2011 年 Derby.js 開始開發(fā),8 月 5 日,WalmartLabs 的一位成員 Eran Hammer 提交了 Hapi 的第一次 git 記錄。Hapi 原本是 Postmile 的一部分,并且最開始是基于 Express 構(gòu)建的。后來它發(fā)展成自己自己的框架。
2012 年 1 月 21 日,專注于 Rest api 的 Restify 發(fā)布 1.0 版本,同構(gòu)的 Meteor 開始投入開發(fā),最像 Rails 的 Sails 也開始了開發(fā)。
2013 年 TJ Holowaychuk 開始玩 es6 generator,編寫 co
這個(gè) Generator 執(zhí)行器,并開始了 Koa 項(xiàng)目。2013 年下半年李成銀開始 ThinkJS,參考 ThinkPHP。
2014 年 4 月 9 日,Express 發(fā)布 4.0,進(jìn)入 4.x 時(shí)代持續(xù)到今天,MEAN.js 開始隨著 MEAN 架構(gòu)的提出開始開發(fā),意圖大一統(tǒng),另外 Total.js 開始起步,最像 PHP 里 Laravel 或 Python 里的 Django 或 ASP.NET MVC 的框架,代表著 Node.js 的成熟,開始從其他語言里的成熟框架借鑒。
2015 年 8 月 22 日,下一代 Web 框架 Koa 發(fā)布 1.0,可以在 Node.js v0.12 下面,通過co
和 generator 實(shí)現(xiàn)同步邏輯,那時(shí)候co
還是基于thunkfy
的,在 2015 年 10 月 30 日,ThinkJS 發(fā)布了首個(gè)基于 Es2015+ 特性開發(fā)的 v2.0 版本。
2016 年 09 月,螞蟻金服的 Eggjs,在 JSConf China 2016 上亮相并宣布開源。
2017 年 2 月,下一代 Web 框架 Koa 發(fā)布 v2.0 正式版。
2017 年 10 月,ThinkJS v3 發(fā)布,基于 Koa 內(nèi)核。
2017 年 12 月,阿里巴巴開源 Egg.js v1,采用的是 『微內(nèi)核 + 插件 + 上層框架』 模式。
2018 年 3 月,阿里巴巴開源 Egg.js v2,全面支持 async 函數(shù),性能提升 30% 以上。
我們根據(jù)框架的特性進(jìn)行分類:
對(duì)于框架選型
業(yè)務(wù)場(chǎng)景、特點(diǎn),不必為了什么而什么,避免本末倒置;
自身團(tuán)隊(duì)能力、喜好,有時(shí)候技術(shù)選型決定團(tuán)隊(duì)氛圍的,需要平衡激進(jìn)與穩(wěn)定;
出現(xiàn)問題的時(shí)候,有人能夠做到源碼級(jí)定制。Node.js 已經(jīng)有 8 年歷史,但模塊完善程度良莠不齊,如果不慎踩到一個(gè)坑里,需要團(tuán)隊(duì)在無外力的情況能夠搞定,否則會(huì)影響進(jìn)度。
個(gè)人學(xué)習(xí)求新,企業(yè)架構(gòu)求穩(wěn),無非喜好與場(chǎng)景而已。
Node.js 本來就為了做后端而設(shè)計(jì)的,這里我們?cè)倏纯蠢鎲栴}。Node.js 向后端延伸,必然會(huì)觸動(dòng)后端開發(fā)的利益。那么 Proxy 層的事兒,前后端矛盾的交界處,后端不想變,前端又求變,那么長此以往,Api 接口會(huì)變得越來越惡心。后端是愿意把 Api 的事兒叫前端的,對(duì)后端來說,只要你不動(dòng)我的數(shù)據(jù)庫和服務(wù)就可以。
但是 Node.js 能不能做這部分呢?答案是能的,這個(gè)是和 Java、PHP 類似的,一般是和數(shù)據(jù)庫連接到一起,處理帶有業(yè)務(wù)邏輯的。目前國內(nèi)大部分都是以 Java、PHP 等為主,所以要想吃到這部分并不容易。
小公司,創(chuàng)業(yè)公司,新孵化的項(xiàng)目更傾向于 Node.js ,簡(jiǎn)單,快速,高效;
微服務(wù)架構(gòu)下的某些服務(wù),使用 Node.js 開發(fā),是比較合理的。
國內(nèi)這部分一直沒有做的很好,所以 Node.js 在大公司還沒有很好的被應(yīng)用,安全問題、生態(tài)問題、歷史遺留問題等,還有很多人對(duì) Node.js 的誤解。
單線程很脆弱,這是事實(shí),但單線程不等于不能多核并發(fā),而且你還有集群呢!
運(yùn)維,其實(shí)很簡(jiǎn)單,比其他語言之簡(jiǎn)單,日志采集、監(jiān)控也非常簡(jiǎn)單。
模塊穩(wěn)定性,對(duì)于 MongoDB
、MySQL
、Redis
等還是相當(dāng)不錯(cuò),但其他的數(shù)據(jù)庫支持可能沒那么好。
安全問題是個(gè)偽命題,所有框架面臨的都是一樣的。
這些對(duì)于提供 Api 服務(wù)來說已經(jīng)足夠了。
對(duì)于企業(yè) Web 開發(fā)來說,更重視穩(wěn)定性和安全性,通過約定開發(fā)方式,提供高效開發(fā)效率。目前 Egg、Thinkjs、Nest 這方面是先行者,想必開發(fā)者對(duì)它們都已經(jīng)非常熟悉了,可以放心使用。
4 “向前看” or “向錢看”?
生活無非是迷茫的和目標(biāo)清晰的。迷茫的人想找到目標(biāo)是非常曲折的一個(gè)過程,所以最簡(jiǎn)單的辦法就是“向錢看”,市場(chǎng)作為檢驗(yàn)技術(shù)流行程度的一個(gè)標(biāo)準(zhǔn)。沒有目標(biāo),那就多學(xué)點(diǎn)能賺錢的技能。
很多人度過了迷茫期,這時(shí)候就需要“向前看”,知道自己想要什么,只能自己該做什么,有自驅(qū)能力,這時(shí)候更多的是看清趨勢(shì),在變化中總能做對(duì)事情,除了做好的分內(nèi)之事外,無論業(yè)務(wù)還是技術(shù)發(fā)展都需要對(duì)發(fā)展走勢(shì)做出正確的判斷。
對(duì)于 Node.js 開發(fā)者來說,
1)“向錢看”:學(xué)會(huì),能用,如果學(xué)會(huì) Node.js 不能在收入或者潛在收入有提升,那也沒啥意思。
Node.js 編寫的包管理器 npm 已成為開源包管理了領(lǐng)域最好的生態(tài),直接到 2017 年 10 月份,有模塊超過 47 萬,每周下載量超過 32 億次,每個(gè)月有超過 700 萬開發(fā)者使用 npm。現(xiàn)在早已經(jīng)超過 60 萬個(gè)模塊了。在此,狼叔舉了一個(gè)例子,他說曾有開發(fā)者向他討教調(diào)整狀態(tài)的辦法,而狼叔的建議是,讓他每天看 10 個(gè) npm 模塊。
狼叔認(rèn)為,對(duì)于學(xué)習(xí) Node.js 迷茫的人來說,這是最好的方式,當(dāng)你不知道如何做的時(shí)候,就要向前(錢)看,你要知道積累哪些技能對(duì)以后有好處。對(duì)于學(xué)習(xí) Node.js 必經(jīng)之路,一定是要掌握很多模塊用法,并從中汲取技巧、思路、設(shè)計(jì)思想的。與其不知道學(xué)什么,為什么不每天積累幾個(gè)技巧呢?
2)“向前看”:用好,創(chuàng)造更多價(jià)值。各家公司都有 KPI,怎么能夠通過 Node 快速達(dá)成自己的 KPI 是非常重要的。
a)遇到各種問題,解決不了,能不能用 node?
b)技術(shù)驅(qū)動(dòng),能不能在 node 層做一些創(chuàng)新?
c)提高開發(fā)效率,能否讓團(tuán)隊(duì)用好 node,梳理出工程化最佳時(shí)間。
d) 在遇到性能瓶頸的時(shí)候,node 能否解決這些問題。
對(duì)此,狼叔給出了他的招人標(biāo)準(zhǔn):
基本的 Node.js 幾個(gè)特性,比如事件驅(qū)動(dòng)、非阻塞 I/O、Stream 等;
異步流程控制相關(guān),Promise 是必問的;
掌握 1 種以上 Web 框架,比如 Express、Koa、Thinkjs、Restfy、Hapi 等,會(huì)問遇到過哪些問題、以及前端優(yōu)化等常識(shí);
數(shù)據(jù)庫相關(guān),尤其是 SQL、緩存、Mongodb 等;
對(duì)于常見 Node.js 模塊、工具的使用,觀察一個(gè)人是否愛學(xué)習(xí)、折騰;
是否熟悉 linux,是否獨(dú)立部署過服務(wù)器,加分項(xiàng);
js 語法和 es6、es7,延伸 CoffeeScript、TypeScript 等,看看你是否關(guān)注新技術(shù),加分項(xiàng);
對(duì)前端是否了解,加分項(xiàng);
是否參與過或?qū)戇^開源項(xiàng)目、技術(shù)博客,加分項(xiàng)。
“向前看”不是簡(jiǎn)單在一個(gè)領(lǐng)域內(nèi)鉆研,而是能夠在精通一門之后,擴(kuò)展廣度,提高自身的解決問題能力。當(dāng)然,如果能夠在架構(gòu)層面去思考問題,那就更完美了,對(duì)未來職業(yè)發(fā)展有無限好處。
5 “專注” or “技多不壓身”?
狼叔對(duì)自己的定位是專注于 Node.js 技術(shù),如果沒法做更多 Node.js 相關(guān)的內(nèi)容,不如就離開,但這是不是意味著與“技多不壓身”的觀點(diǎn)相悖呢?對(duì)此,狼叔是這么解釋的。
《Node.js in action》一書里說,Node.js 所針對(duì)的應(yīng)用程序有一個(gè)專門的簡(jiǎn)稱:DIRT。它表示數(shù)據(jù)密集型實(shí)時(shí)(data-intensive real-time)程序。因?yàn)?Node.js 自身在 I/O 上非常輕量,它善于將數(shù)據(jù)從一個(gè)管道混排或代理到另一個(gè)管道上,這能在處理大量請(qǐng)求時(shí)持有很多開放的連接,并且只占用一小部分內(nèi)存。它的設(shè)計(jì)目標(biāo)是保證響應(yīng)能力,跟瀏覽器一樣。
這話不假,但在今天來看,DIRT 還是范圍小了。其實(shí) DIRT 本質(zhì)上說的 I/O 處理的都算,但隨著大前端的發(fā)展,Node.js 已經(jīng)不再只是 I/O 處理相關(guān),而是更加的“Node”!
Node.js 使用場(chǎng)景主要分為 4 大類:
1)跨平臺(tái):覆蓋你能想到的面向用戶的所有平臺(tái),傳統(tǒng)的 PC Web 端,以及 PC 客戶端 nw.js/electron
、移動(dòng)端cordova
、HTML5、react-native
、weex
,硬件http://ruff.io
等。
2)Web 應(yīng)用開發(fā):網(wǎng)站、Api、RPC 服務(wù)等。
3)前端:三大框架 React \ Vue
\Angular
輔助開發(fā),以及工程化演進(jìn)過程(使用Gulp
/Webpack 構(gòu)建 Web 開發(fā)工具)。
4)工具:npm
上各種工具模塊,包括各種前端預(yù)編譯、構(gòu)建工具Grunt
/Gulp
、腳手架,命令行工具,各種奇技淫巧。
可以說目前大家能夠看到的、用到的軟件都有 Node.js 身影,當(dāng)下最流行的軟件寫法也大都是基于 Node.js 的,比如 PC 客戶端 luin/medis 采用 electron
打包,寫法采用 React + Redux。他一直實(shí)踐的【Node 全棧】,也正是基于這種趨勢(shì)而形成的。在未來,Node.js 的應(yīng)用場(chǎng)景會(huì)更加的廣泛,更多參見 sindresorhus/awesome-nodejs。
狼叔親歷了從 node 0.10 到 iojs,從 node4 到目前的 node9,也寫了很多文章,參加很多技術(shù)大會(huì),做過很多次演講,有機(jī)會(huì)和業(yè)內(nèi)更多高手交流的機(jī)會(huì)。當(dāng)然他也從 qunar 到阿里經(jīng)歷了各種 node 應(yīng)用場(chǎng)景,對(duì)于 node 的前景他是非常篤定的。正如上文所說,善于使用 node 有無數(shù)好處,如快速出成績、性能調(diào)優(yōu)、優(yōu)化團(tuán)隊(duì)結(jié)構(gòu)、人員招聘等諸多利好,讓他堅(jiān)定地守護(hù) Node.js。
Node.js 目前的應(yīng)用場(chǎng)景和招聘市場(chǎng)都是極大的,很多公司都使用 Node.js,阿里、騰訊、百度和去哪兒等,還有青島的海爾集團(tuán)這樣的傳統(tǒng)名企,video++、石墨文檔這樣的創(chuàng)業(yè)互聯(lián)網(wǎng)公司,Node 產(chǎn)生的商業(yè)價(jià)值是無法估量的。
狼叔的定位是 Node 全棧,以大前端為主,Node 輔助,把所有和用戶直接相關(guān)的開發(fā)囊括。他認(rèn)為這是趨勢(shì),他也在自身的經(jīng)歷中體驗(yàn)到了好處。而大前端目前沒有形成固定模式,還在混亂發(fā)展,所以前景是非常看好的。
但他認(rèn)為“篤定 Node”和“技多不壓身”的觀點(diǎn)不沖突,一個(gè)前端領(lǐng)域已經(jīng)足夠復(fù)雜,如果是大前端涵蓋得更廣,可謂進(jìn)可攻退可守。在這種背景下,Node 其實(shí)是增加自身附加值的。個(gè)人經(jīng)歷優(yōu)先,無法覆蓋更多,這樣的定位也算是另外一種專注吧。
6 大局觀:多思考、多折騰、多更新
“年輕時(shí)死磕,年長點(diǎn)讓小弟死磕,現(xiàn)在抓個(gè)專家一起吃飯,沒有什么是一頓飯解決不了的,不行就二頓”,這句話雖然是調(diào)侃,但也是實(shí)話,每個(gè)階段做好每個(gè)階段該做的事兒就好。有一句名言說的特別好,“高筑墻,廣積糧,緩稱王”。
年輕死磕是為了長本事,少抱怨,多思考,未來更美好。30 歲以前都可以這樣做。
帶團(tuán)隊(duì)后,要懂得任務(wù)下放,讓更多人幫你,別帶人越多越累。
30 歲之后是打牌階段,技能積累足夠用,這時(shí)要注重社交,打組合拳才能玩的更好。
大部分人都會(huì)認(rèn)為 30 歲后事情,壓力會(huì)明顯大得多,比如家庭,孩子,房子,車子,票子,甚至是管理,權(quán)利,欲望等。對(duì)此,狼叔印象最深的是身體不如從前和記憶力明顯下降。
擁有一個(gè)好的大局觀,沒有捷徑,就是多折騰。以前看事情是點(diǎn),現(xiàn)在看的是趨勢(shì),能夠做到心中有數(shù),自然胸有成竹的感覺。技術(shù)發(fā)展這么快,作為一個(gè)一把年紀(jì)的人,每天也需要適當(dāng)?shù)耐度胍稽c(diǎn)精力關(guān)注開源,需要不斷的更新自己,才不會(huì)讓自己的大局觀過時(shí)。
PWA 技術(shù)在阿里體系內(nèi)是如何實(shí)踐及應(yīng)用、騰訊基于 Cocos 改造 Hybrid 形式產(chǎn)品、騰訊頂級(jí)人工智能實(shí)驗(yàn)室的 AI 終端產(chǎn)品實(shí)踐、微服務(wù)平臺(tái)下基于 GraphQL 構(gòu)建 BFF 的實(shí)踐與思考、Vue 服務(wù)端渲染在快手直播中的應(yīng)用...... 更多最新最熱的大前端技術(shù)議題即將來襲。
GMTC2018 上,來自 Google、Facebook、BAT 等 60+ 國內(nèi)外一線前端大牛,將與你面對(duì)面探討大前端領(lǐng)域最新技術(shù)趨勢(shì)和實(shí)踐。掃描下方二維碼或點(diǎn)擊“閱讀原文”解鎖更多大會(huì)詳情!
使是Node的核心貢獻(xiàn)者都開始說,這項(xiàng)技術(shù),雖然很新,并且是被大肆炒作,但是已經(jīng)開始準(zhǔn)備走向頂峰。
——沃爾瑪移動(dòng)通訊工程的副總裁加爾布雷思
很多前端的小伙伴聯(lián)系我說為什么你們飛雀教育的前端可以做整個(gè)產(chǎn)品實(shí)訓(xùn),這不是扯淡么?產(chǎn)品需要前端和后端兩塊,沒有后端只學(xué)HTML5前端怎么可以自己做出來產(chǎn)品呢?
主要是因?yàn)樗簄ode.js
飛雀的課程安排中node.js占了很大比例,講的就是全棧式開發(fā)。
Node就是有這個(gè)奇妙的作用,它可以讓很多會(huì)前端的同學(xué)干到后端,自己搭起一個(gè)完整的項(xiàng)目,在前端與后端之間,搭起一座橋梁。讓后端的同學(xué)感受到原來前端也是很有趣的。
有很多人說node太新了,還不夠成熟,是存在很多弊端的。然而電子商務(wù)巨頭沃爾瑪當(dāng)初就是換成Node.js開發(fā),從10臺(tái)服務(wù)器減少到1臺(tái),震驚了業(yè)內(nèi)。沃爾瑪通過Node,能為客戶端的移動(dòng)用戶提供非常復(fù)雜的服務(wù)和功能。它通過識(shí)別設(shè)備類型和瀏覽器,向購物者提供自定義內(nèi)容,為移動(dòng)購物者節(jié)約大量的時(shí)間。沃爾瑪重新設(shè)計(jì)了基于Node的移動(dòng)應(yīng)用程序后,所有的前后端都在執(zhí)行一樣的代碼。
加爾布雷思(沃爾瑪移動(dòng)通訊工程的副總裁)說,他的團(tuán)隊(duì)希望創(chuàng)造“一個(gè)網(wǎng)站,非常豐富并且具有動(dòng)態(tài)感......能夠運(yùn)行在不是很強(qiáng)大的設(shè)備上。”正好node就是有這個(gè)魅力能滿足他所有需求。
我曾經(jīng)問過一個(gè)在沃爾瑪工作的朋友為什么當(dāng)初沒選擇Facebook,卻選擇了沃爾瑪,他回答,如果可以在沃爾瑪選擇用node開發(fā),我為什么要去Facebook用php開發(fā)呢?
除了外國企業(yè)沃爾瑪、paypal、LinkedIn等等,幾乎國內(nèi)所有的大型公司也都會(huì)使用node.js開發(fā),最突出的就是阿里巴巴。
除了node.js本身的就業(yè)前景廣之外,飛雀HTML5課程選擇用node.js做全棧式人才培養(yǎng)還因?yàn)閚ode.js技術(shù)本身的特性。
首先,數(shù)據(jù)說明一切。
第二. Node.js是基于JavaScript的語法,JavaScript不僅可以開發(fā)前端,也可以開發(fā)后端,實(shí)現(xiàn)全棧更容易。
第三. 由于JavaScript屬于腳本語言,也比較容易學(xué)習(xí)。
第四. Node.js效率更高,重事件驅(qū)動(dòng)和異步并發(fā)。
從node.js近幾年在國內(nèi)外的發(fā)展和本身的技術(shù)特性可以看出,node.js不是曇花一現(xiàn),而是未來發(fā)展趨勢(shì)。
復(fù)合型人才才是社會(huì)真正想要的。
uby on Rails 的衰落是毋庸置疑的,而且今年以來的衰落速度比以往更快。
先看 Google Trends,雖然不太科學(xué)、但至少能說明一點(diǎn)問題。無論是 Ruby 還是 Ruby on Rails,多年來在 Google Trends 都處于一路走低的狀態(tài)。
如上圖所示,二者先是急劇上漲、然后是一路橫盤。但從 2016 年開始明顯下跌后,它們的命運(yùn)就基本已經(jīng)注定了。不知道為什么 2020 年這里又有一次斷崖式下降,這可能只是 Google 數(shù)據(jù)出了問題。但不管怎么說,狀態(tài)不好是肯定的。
Ruby 是一種用于面向?qū)ο缶幊痰慕忉屝阅_本語言,核心優(yōu)勢(shì)就是允許開發(fā)者快速構(gòu)建并啟動(dòng)應(yīng)用程序。Ruby 語言本身采用大量英語單詞,所以上手難度更低。但由于可擴(kuò)展性不佳,Ruby 應(yīng)用程序的運(yùn)行速度往往不及其他語言。
這門編程語言由 Yukihiro Matsumoto 于 1993 年開始創(chuàng)建,于 1995 年正式發(fā)布。雖然和 Java 基本上可以算是同時(shí)期(Java 誕生于 1993 年,正式發(fā)布于 1995 年),但在 2004 年 David Heinemeier Hansson 發(fā)布 Ruby on Rails 之前,Ruby 一直非常小眾。
Ruby on Rails (也簡(jiǎn)稱為 Rails)是一個(gè)使用 Ruby 編程語言的開源 Web 應(yīng)用程序框架,曾一度大受歡迎,Rails 的出現(xiàn)極大的推動(dòng)了 Ruby 語言的發(fā)展。在 2004 年之后,Rails 社區(qū)貢獻(xiàn)出了廣泛的插件(Gems)、書籍(光 2006 年就有 10 本關(guān)于 Rails 的書籍問世)、培訓(xùn)、一個(gè)主要會(huì)議(RubyConf)等等。隨著 Rails 風(fēng)頭正勁,甚至連最保守的公司都開始考慮采用 Ruby。
《From Java to Ruby》一書的作者 Bruce Tate,曾是一位 Java 程序員,在當(dāng)時(shí)也變成了一名 Ruby 狂熱分子,他曾在 2007 年提出一個(gè)“木馬計(jì)(Trojan Horse)”的方法,讓一些領(lǐng)路人在保守的公司里為 Ruby 樹立威望:
“實(shí)現(xiàn)一個(gè)試點(diǎn)項(xiàng)目,用這個(gè)策略來暗度陳倉,在眼皮底下把 Ruby 整合進(jìn)系統(tǒng)。剩下的工作讓 Ruby 完成就可以了。不過,為了建立你的試點(diǎn)項(xiàng)目,你首先需要?jiǎng)?chuàng)建一個(gè)案例,讓 Ruby 看起來足夠吸引眼球,從而讓大家甘心冒這個(gè)風(fēng)險(xiǎn)。接著,你得在你的試點(diǎn)策略里面添筋加骨。鑒于人們對(duì)采用一門新語言與生俱來的抵抗力,你要選擇一個(gè)不給疑慮留任何余地的方法。最終,你得愿意為成功建立制度根基。”
從 2000 年開始,到該時(shí)代中期,Ruby 受歡迎程度在 TIOBE 指數(shù)評(píng)級(jí)中逐漸達(dá)到頂峰,人們認(rèn)為 Ruby 還有它的旗艦級(jí) Rails 框架,可以大大提高生產(chǎn)力。不少現(xiàn)在的大型網(wǎng)站,比如 Twitter 和 Groupon 在當(dāng)時(shí)都是這門框架的使用者之一。
只不過,人們也逐漸發(fā)現(xiàn)它存在一些致命缺陷。Groupon 工程師 Sean McCullough 在 2013 年的一個(gè)技術(shù)會(huì)議上講道,“要在 Groupon.com 整個(gè)網(wǎng)頁上更改一種顏色,估計(jì)需要三個(gè)月的時(shí)間。這導(dǎo)致我們無法以需要的速度進(jìn)行迭代。”
Groupon 工程師不得不研究 Ruby on Rails 的一系列替代方案,最終選擇了流行的 Node.js,并花了一年時(shí)間進(jìn)行遷移。Groupon 還表示,更換之后頁面加載速度得到了顯著提升,高達(dá) 50%。從 2008 年引進(jìn),到 2013 年替換掉,Groupon 在這個(gè)坑里掙扎了 5 年。而在同一時(shí)期,備受擴(kuò)展性問題困擾后,Twitter 也放棄了 Ruby on Rails。
接下來,讓我們一起從課程、實(shí)踐、社區(qū)情況來看看當(dāng)年盛極一時(shí)的網(wǎng)紅編程語言發(fā)展現(xiàn)狀。
現(xiàn)在,很多朋友可能注意到,專門的 Ruby 播客或者新聞網(wǎng)站已經(jīng)越來越少。除了一個(gè)每周通訊網(wǎng)站(?https://rubyweekly.com/?)還能保持高質(zhì)量,其他的真就沒什么了。
這就突出了 Ruby 語言正陷入惡性循環(huán):因?yàn)槿狈玫男畔⒑徒坛蹋率珠_發(fā)者就不愿選擇它;而因?yàn)闆]有足夠的新人,市場(chǎng)對(duì)信息和教程的需求也隨之減少。
因?yàn)樵趧趧?dòng)力市場(chǎng)上不被看好,編碼訓(xùn)練機(jī)構(gòu) Coding Dojo 決定從 2017 年開始將 Ruby 課程從全美六大學(xué)區(qū)內(nèi)盡數(shù)撤下,同時(shí)增加 Java 的全棧開發(fā)課程。Coding Dojo 課程負(fù)責(zé)人 Speros Misirlakis 曾表示,“我們一直在關(guān)注各地市場(chǎng)、把握技術(shù)需求,并發(fā)現(xiàn) Java 的人氣位居榜首。相比之下,Ruby on Rails 在招聘熱度、市場(chǎng)需求和開發(fā)者關(guān)注度等方面都遠(yuǎn)遠(yuǎn)落后。”
到現(xiàn)在,以 Udemy 為例,截至 2022 年 3 月,上面只有 109 種關(guān)于 Ruby(on Rails)的課程。但 Python、Java 和 JavaScript 等語言的課程量都超過 10000 種。目前質(zhì)量最高的 Rails 課程之一最后公開更新是在 2020 年。當(dāng)然,go-rails 等其他服務(wù)也在提供相關(guān)課程,但 Ruby 衰落的趨勢(shì)已經(jīng)非常明顯。
十年前,Ruby 背后還有高度活躍的社區(qū),比如 GitHub、熱門 repo。現(xiàn)在情況也發(fā)生了變化,支持并使用 Ruby 的開發(fā)者越來越少,曾被經(jīng)常提起的 gems 服務(wù),現(xiàn)在基本屬于無人問津。再舉個(gè)典型的例子,Rails 的 Azure 支持。
對(duì)微軟 Azure 的支持狀態(tài)可謂一團(tuán)糟。相關(guān)一部分成果無人維護(hù),過去幾年來也毫無動(dòng)靜。大量問題被提出之后就長期擱置。例如,Azure 官方庫中有 22 個(gè)問題仍在開放,其中的依賴性問題大多源自 Nokogiri 庫版本過老。我知道這例子有點(diǎn)極端,但它確實(shí)能反映出生存狀態(tài)的一個(gè)側(cè)面。
最近十年來,現(xiàn)代 SaaS 方案中的 API 幾乎都不提供官方 Ruby 客戶端或 SDK。
形成鮮明對(duì)比的是,Java、JavaScript、Python 甚至是 Rust 可都在支持之列。
Slack 沒有官方的 Ruby 客戶端或者 SDK(其他語言都有),Dropbox 也一樣。之前提到過,Azure 倒是有,但基本沒有維護(hù)。在所有 HubSpot API 實(shí)施意見中,Ruby 版本的人氣(根據(jù) stars 和 forks 判斷)和更新頻率都是最低的。像 Monday、Teamleader 或者 Notion 這樣的現(xiàn)代項(xiàng)目管理方案都沒提到過 Ruby。這里要澄清一下,我舉的都是不支持 Ruby 的 SaaS 項(xiàng)目。支持 Ruby 的也不少,從 AWS 到 Square,都提供一流且維護(hù)良好的 gems 供用戶選擇。
雖然沒對(duì) Ruby gems、repo、待解決問題等量化指標(biāo)做過數(shù)據(jù)分析,但單是瀏覽一下基本情況就已經(jīng)看得出相當(dāng)負(fù)面的趨勢(shì)。而且從部分 SaaS 服務(wù)上看,Ruby 確實(shí)不太受待見。
2010 年時(shí) Ruby 的 SDK 和 API 客戶端都是最亮眼的,之所以出色,是因?yàn)楫?dāng)時(shí)的 API 與 SaaS 開發(fā)團(tuán)隊(duì)往往會(huì)自己動(dòng)手編寫 Ruby 版本,所以客戶端質(zhì)量自然不在一個(gè)層面上。但近年來情況大變,而相應(yīng)的社區(qū)版本要么維護(hù)不善、要么壓根沒有。
關(guān)注大型 SaaS 或者軟件公司,我們會(huì)發(fā)現(xiàn)運(yùn)行在 Ruby(on Rails)上的成果基本都有點(diǎn)年頭了。
特別是在 2020 年之后,已經(jīng)很難找到任何立足 Rails 構(gòu)建的成功 SaaS 產(chǎn)品。GitHub 誕生在 2008 年,Shopify 是 2006 年,Twitter 是 2006 年,Groupon 是 2008 年,Zendesk 是 2007 年,Airbnb 是 2008 年,F(xiàn)iverr 則是 2010 年。我能想到的誕生于 2010 年之后、而且運(yùn)行在 Ruby 或 Rails 上的成功廠商就只有 Stripe(2011 年)和 Gitlab(2014 年)。在比較流行的 Ruby 開源項(xiàng)目方面,我能想到的也只有 Discourse 和 Mastodon。但這里確實(shí)也有幸存者偏差的因素:成功的企業(yè)需要經(jīng)歷漫長的磨練才會(huì)顯露,所以不管用不用 Rails,成功的 SaaS 都得用時(shí)間證明自己。
2010 年那會(huì) Rails 的成功催生出使用模型視圖控制器(MVC)架構(gòu)建立快速應(yīng)用開發(fā)(RAD)框架的市場(chǎng)需求。可以肯定地說,Rails 這類框架確實(shí)擁有比較明確的市場(chǎng)定位,但還不至于火到那個(gè)程度。這些架構(gòu)的解決能力和適用范圍都比較差,所以無論使用哪種語言,Rails 本身的流行度下降甚至在根源上來自 MVC 和 RAD 方法的逐漸衰落。
2021 年 StackOverflow 的調(diào)查結(jié)果也支持了這樣的判斷:Ruby 與 Rails 在各項(xiàng)評(píng)比中基本都處于象限底端。Ruby 得到的“贊”和“踩”基本相當(dāng)。很遺憾,StackOverflow 并不提供可供訪問的趨勢(shì)指標(biāo),倒是有一款基于標(biāo)簽活動(dòng)的獨(dú)立工具。經(jīng)過查閱,發(fā)現(xiàn) Ruby 這幾十年來持續(xù)下滑、而且身處底部象限。TIOBE 指數(shù)也給出了類似的結(jié)論,Ruby 穩(wěn)定保持著每況愈下的生存狀態(tài),逐漸落后于其他語言。
雖然徹底消亡并不容易,就像 Pascal、COBOL 乃至 Perl 當(dāng)下也仍然存在一樣。Ruby 的情況要好一些,這艘船還遠(yuǎn)遠(yuǎn)沒沉、只是速度越來越慢。
不過人氣并不能直接決定語言的質(zhì)量。畢竟如果用人氣來衡量,那 IE 6 將是人類歷史上最好的網(wǎng)絡(luò)瀏覽器。Ruby 仍然保持著 2005 年時(shí)的出色開發(fā)體驗(yàn),而且體驗(yàn)只會(huì)越來越好。Rails 也仍是實(shí)現(xiàn)原型設(shè)計(jì)演示的好方法,能幫助大家在幾天之內(nèi)更穩(wěn)妥地構(gòu)建起最小可行性產(chǎn)品。
那我們是不是不該在職業(yè)規(guī)劃中學(xué)習(xí) Ruby 或者 Rails?話可不能這么說。市場(chǎng)對(duì)于 Rails 和 Ruby 開發(fā)者的需求仍然相當(dāng)旺盛,或者說市場(chǎng)對(duì)任何語言的開發(fā)者都需求旺盛。自 2008 年以來出現(xiàn)的一切 SaaS,在未來幾十年中都需要新的開發(fā)者加入進(jìn)來。
但我們也要考慮到,在 Ruby 陷入萎縮的同時(shí),Node.js 開始快速流行。在過去的十年里,開發(fā)領(lǐng)域的創(chuàng)新成果可謂百花齊放。HTML5、Node.js、Angular 和 React 已經(jīng)在前端和后端遍地開花。JavaScript 與 Python 在市場(chǎng)需求穩(wěn)定性上也越來越具有優(yōu)勢(shì)。Python 是過去十年中增長速度最快的主流編程語言,目前已經(jīng)擴(kuò)展到 Web 開發(fā)、數(shù)據(jù)科學(xué)、科學(xué)編程等多個(gè)領(lǐng)域。Stack Overflow 的調(diào)查也顯示出,JavaScript 已經(jīng)成為全球應(yīng)用最廣泛的語言。
另一方面,很多技術(shù)都會(huì)有自然的生命周期。開發(fā)者們的關(guān)注和精力就那么多,流向了其他地方、自然也就不再流向這里。
所以這里還是想提醒大家,如果 Ruby 繼續(xù)保持過去十年來的衰落趨勢(shì),那各位一定要認(rèn)真考慮學(xué)習(xí)這門語言的風(fēng)險(xiǎn)——也許 Ruby 終有一天也會(huì)像 COBOL 或者 Perl 那樣成為時(shí)代的眼淚。
參考鏈接:
https://berk.es/2022/03/08/the-waning-of-ruby-and-rails/
https://www.infoq.cn/article/From-Java-to-Ruby--Strategies
https://www.datacenterknowledge.com/archives/2013/12/06/need-speed-groupon-migrated-node-js
https://siliconangle.com/2013/11/11/how-groupon-web-traffic-moves-from-legacy-ruby-on-rails-to-node-js/
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。