說明2017-12-14 我發(fā)了一篇文章《沒用過Node.js,就別瞎逼逼》是因為有人在知乎上黑Node.js。那篇文章的反響還是相當不錯的,甚至連著名的hax賀老都很認同,下班時讀那篇文章,竟然坐車的還坐過站了。大家可以很明顯的感到Node.js的普及度還不夠,還存很多誤解。甚至說很多小白用戶也得不到很好的學習。大神都功成身退,書也跟不上,大部分都是2013年左右的,Node.js版本都是基于v0.10左右的,現在已經v9了。想想也是有點可惜,使用如此廣泛的Node.js被大家默認,卻沒人來科普。 反思之后,我就想準備一個科普的Live,于是就有了《狼叔:如何正確學習 Node.js?》,相信能夠對很多喜歡Node.js的朋友有所幫助。Live已完成目前1200多人,230人評價,平均4.8+,還算是一個比較成功的Live?,F整理出來,希望對更多朋友有用。
【全文】狼叔:如何正確的學習Node.jsLive 簡介 現在,越來越多的科技公司和開發(fā)者開始使用 Node.js 開發(fā)各種應用。Node.js除了能夠輔助大前端開發(fā)外,還可以編寫Web應用,封裝Api,組裝RPC服務等,甚至是開發(fā)VSCode編輯器一樣的PC客戶端。和其它技術相比, Node.js 簡單易學,性能好、部署容易,能夠輕松處理高并發(fā)場景下的大量服務器請求。Node.js 周邊的生態(tài)也非常強大,NPM(Node包管理)上有超過60萬個模塊,日下超過載量3億次。但編寫 Node.js 代碼對新人和其它語言背景的開發(fā)者來說,不是一件容易的事,在入門之前需要弄懂不少復雜的概念。 我身邊也有很多人問我:如何學習 Node.js ?作為一名 Node.js 布道者,我做過很多 Node.js 普及和推廣的工作,對它的基本概念和核心模塊都很熟悉; 此外,我還在撰寫一本名為《更了不起的 Node.js 》的書,已經寫了 2 年,積累了很豐富的資料,本次 Live 也將為你提供對 Node.js 更全面的解讀。 本次 Live 主要包括以下內容,目錄 Part 0 :Node.js簡介 a)Node.js簡介 Part 1前言:學習 Node.js 的三個境界 Part 2準備:如何學習Node.js
Part 3延伸:大前端變化那么快,如何才能做到每日精進? Part 4實踐:從招聘角度來看, Node.js 開發(fā)需要具備哪些技能? Part 5答疑:回答大家的問題 本次Live主要是科普,適用新用戶和比較迷茫的Node朋友,希望大家多多理解和支持。 Part 0 :Node.js簡介a)Node.js簡介 a)Node.js簡介Node.js 誕生于 2009 年,由 Joyent 的員工 Ryan Dahl 開發(fā)而成,之后 Joyent 公司一直扮演著 Node.js 孵化者的角色。由于諸多原因,Ryan 在2012年離開社區(qū),隨后在2015年由于 Node 貢獻者對 es6 新特性集成問題的分歧,導致分裂出iojs,并由 iojs 發(fā)布1.0、2.0和3.0版本。由于 iojs 的分裂最終促成了2015年Node基金會的成立,并順利發(fā)布了4.0版本。Node.js基金會的創(chuàng)始成員包括 Google、Joyent、IBM、Paypal、微軟、Fidelity 和 Linux基金會,創(chuàng)始成員將共同掌管過去由 Joyent 一家企業(yè)掌控的 Node.js 開源項目。此后,Node.js基金會發(fā)展非常好,穩(wěn)定的發(fā)布5、6、7、8等版本,截止發(fā)稿最新版本已經是8.6,長期支持版本是6.11。 Node.js 不是一門語言也不是框架,它只是基于 Google V8 引擎的 JavaScript 運行時環(huán)境,同時結合 Libuv 擴展了 JavaScript 功能,使之支持 io、fs 等只有語言才有的特性,使得 JavaScript 能夠同時具有 DOM 操作(瀏覽器)和 I/O、文件讀寫、操作數據庫(服務器端)等能力,是目前最簡單的全棧式語言。 早在2007年,Jeff Atwood 就提出了著名的 任何能夠用 JavaScript 實現的應用系統(tǒng),最終都必將用 JavaScript 實現 目前 Node.js 在大部分領域都占有一席之地,尤其是 I/O 密集型的,比如 Web 開發(fā),微服務,前端構建等。不少大型網站都是使用 Node.js 作為后臺開發(fā)語言的,用的最多的就是使用Node.js做前端渲染和架構優(yōu)化,比如 淘寶 雙十一、去哪兒網 的 PC 端核心業(yè)務等。另外,有不少知名的前端庫也是使用 Node.js 開發(fā)的,比如,Webpack 是一個強大的打包器,React/Vue 是成熟的前端組件化框架。 Node.js通常被用來開發(fā)低延遲的網絡應用,也就是那些需要在服務器端環(huán)境和前端實時收集和交換數據的應用(API、即時聊天、微服務)。阿里巴巴、騰訊、Qunar、百度、PayPal、道瓊斯、沃爾瑪和 LinkedIn 都采用了 Node.js 框架搭建應用。 另外, Node.js 編寫的包管理器 npm 已成為開源包管理了領域最好的生態(tài),直接到2017年10月份,有模塊超過47萬,每周下載量超過32億次,每個月有超過700萬開發(fā)者使用npm。 當然了,Node.js 也有一些缺點。Node.js 經常被人們吐槽的一點就是:回調太多難于控制(俗稱回調地獄)和 CPU 密集任務處理的不是很好。但是,目前異步流程技術已經取得了非常不錯的進步,從Callback、Promise 到 Async函數,可以輕松的滿足所有開發(fā)需求。至于 CPU 密集任務處理并非不可解,方案有很多,比如通過系統(tǒng)底層語言 Rust 來擴展 Node.js,但這樣會比較麻煩。筆者堅信在合適的場景使用合適的東西,尤其是在微服務架構下,一切都是服務,可以做到語言無關。如果大家想使 JavaScript 做 CPU 密集任務,推薦 Node.js 的兄弟項目 fibjs,基于纖程(fiber,可以簡單理解為更輕量級的線程),效率非常高,兼容npm,同時沒有異步回調煩惱。 b)什么是Node.js?按照 Node.js官方網站主頁 的說法: 從這段介紹來看,解讀要點如下
大多數人都認為 Node.js 只能寫網站后臺或者前端工具,這其實是不全面的,Node.js的目標是讓并發(fā)編程更簡單,主要應用在以網絡編程為主的 I/O 密集型應用。它是開源的,跨平臺,并且高效(尤其是I/O處理),包括IBM、Microsoft、Yahoo、SAP、PayPal、沃爾瑪及GoDaddy都是 Node.js 的用戶。 c)基本原理下面是一張 Node.js 早期的架構圖,來自 Node.js 之父 Ryan Dahl 的演講稿,在今天依然不過時,它簡要的介紹了 Node.js 是基于 Chrome V8引擎構建的,由事件循環(huán)(Event Loop)分發(fā) I/O 任務,最終工作線程(Work Thread)將任務丟到線程池(Thread Pool)里去執(zhí)行,而事件循環(huán)只要等待執(zhí)行結果就可以了。 核心概念
梳理一下
我們再換一個維度看一下 核心
在解決并發(fā)問題上,異步是最好的解決方案,可以拿排隊和叫號機來理解
Node.js 其實就是幫我們構建類似的機制。我們在寫代碼的時候,實際上就是取號的過程,由 Event Loop 來接受處理,而真正執(zhí)行操作的是具體的線程池里的 I/O 任務。之所以說 Node.js 是單線程,就是因為在接受任務的時候是單線程的,它無需進程/線程切換上下文的成本,非常高效,但它在執(zhí)行具體任務的時候是多線程的。 Node.js 公開宣稱的目標是 “旨在提供一種簡單的構建可伸縮網絡程序的方法”,毫無疑問,它確實做到了。這種做法將并發(fā)編程模型簡化了,Event Loop和具體線程池等細節(jié)被 Node.js 封裝了,繼而將異步調用 Api 寫法暴露給開發(fā)者。真是福禍相依,一方面簡化了并發(fā)編程,另一方面在寫法上埋下了禍根,這種做法的好處是能讓更多人輕而易舉的寫出高性能的程序! 在Node.js Bindings層做的事兒就是將 Chrome V8 等暴露的 微軟在2016年宣布在MIT許可協議下開放 Chakra 引擎,并以 目前,Node.js 同時支持這2種 JavaScript 引擎,二者性能和特性上各有千秋, Part 1前言:學習 Node.js 的三個境界我總結的編程3種境界
大家可以自測一下,自己在哪個水平?如果是第三個階段,那么本場Live可能不太適合你。哈哈哈 Part 2準備:如何學習Node.jsNode不是語言,不是框架,只是基于V8運行時環(huán)境。結合libuv能夠通過js語法獲得更好的等價于c/c++的性能。 它很簡單,異步是解決并發(fā)的最佳實踐。本節(jié)主要講如何學習Node.js,是本次Live非常核心的內容,大家要注意聽。 基礎學習1)js語法必須會
犀牛書,《JavaScript權威指南》,沒事就多翻翻,看少多少遍都不為過。 2)個人學習和技術選型都要循序漸進
可以看出我的思路,先能寫,然后再追求更好的寫法,比如面向對象。等團隊水平到一定程度了,并且穩(wěn)定的時候,可以考慮更加極致的函數式寫法。 團隊是這樣選型的,個人學習也這樣,最好是循序漸進,步子邁大了不好。 3)各種高級的JavaScript友好語言 JavaScript友好語言指的是能夠使用其他語法實現,但最終編譯成js的語言。自從Node.js出現后,這種黑科技層出不窮。比如比較有名的coffee、typescript、babel(es)等。 CoffeeScript雖然也是JavaScript友好語言,但其語法借鑒ruby,崇尚極簡,對于類型和OO機制上還是偏弱,而且這么多年也沒發(fā)展起來,仍然是比較小眾的活著。未來比例會越來越少的。 顯然TypeScript會越來越好,TypeScript 的強大之處是要用過才知道的。
當下前端發(fā)展速度極快,以指數級的曲線增長。以前可能1年都不一定有一項新技術,現在可能每個月都有。大前端,Node全棧,架構演進等等都在快速變化。可以說,前端越復雜,有越多的不確定性,TypeScript的機會就越大。 4)再論面向對象 面向對象想用好也不容易的,而且js里有各種實現,真是讓人眼花繚亂。
對于es6高級特性,我是比較保守的,一般node長期支持版本lts支持的我都讓用,一些更新的特性我一般不讓使用。根本lts版本保持一致就好。 我的團隊現在是采用es6的面向對象寫法開發(fā),后面會一點一點轉到typescript上的。熟練oo轉到ts是非常容易的。 安裝Node.js環(huán)境3m安裝法
nvmnode版本發(fā)布非常快,而且多版本共存可能性較大,推薦使用nvm來安裝node nrmhttps://registry. 是node官方的源(registry),服務器在國外,下載速度較慢,推薦安裝nrm來切換源,國內的cnpm和taobao的源都非常快,當然,如果你想自建源也是支持的。 npmnrm切換完源之后,你安裝npm模塊的速度會更快。 npm基本命令
常用軟件
配合iterm2分屏 + spectacle全屏,幾乎無敵
安裝4個必備軟件
我雖然不算vim黨,但也深愛著。janus是一個非常好用的vim集成開發(fā)環(huán)境。比如ctrl-p、nerdtree等插件都集成了,對我這種懶人足夠了。 IDE和編輯器關于Node.js的IDE和編輯器有很多選擇,對比如下
Visual Studio Code是一個運行于 Mac、Windows和 Linux 之上的,針對于編寫現代 Web 和云應用的跨平臺源代碼編輯器。它功能強大,便于調試,加上它本身也是基于 Node.js 模塊 Visual Studio Code(以下簡稱vsc)
值得一學,我推薦VSCode編輯器! 更多調試方法,參見https://github.com/i5ting/nod... Node.js應用場景《Node.js in action》一書里說,Node.js 所針對的應用程序有一個專門的簡稱:DIRT。它表示數據密集型實時(data-intensive real-time)程序。因為 Node.js 自身在 I/O 上非常輕量,它善于將數據從一個管道混排或代理到另一個管道上,這能在處理大量請求時持有很多開放的連接,并且只占用一小部分內存。它的設計目標是保證響應能力,跟瀏覽器一樣。 這話不假,但在今天來看,DIRT 還是范圍小了。其實 DIRT 本質上說的 I/O 處理的都算,但隨著大前端的發(fā)展,Node.js 已經不再只是 I/O 處理相關,而是更加的“Node”! Node.js 使用場景主要分為4大類
下面列出具體的 Node.js 的使用場景,以模塊維度劃分
Node.js 應用場景非常豐富,比如 Node.js 可以開發(fā)操作系統(tǒng),但一般我都不講的,就算說了也沒多大意義,難道大家真的會用嗎?一般,我習慣將 Node.js 應用場景氛圍7個部分。 1)初衷,server端,不想成了前端開發(fā)的基礎設施
可以說目前大家能夠看到的、用到的軟件都有 Node.js 身影,當下最流行的軟件寫法也大都是基于 Node.js 的,比如 PC 客戶端 luin/medis 采用 Node核心:異步流程控制Node.js是為異步而生的,它自己把復雜的事兒做了(高并發(fā),低延時),交給用戶的只是有點難用的Callback寫法。也正是坦誠的將異步回調暴露出來,才有更好的流程控制方面的演進。也正是這些演進,讓Node.js從DIRT(數據敏感實時應用)擴展到更多的應用場景,今天的Node.js已經不只是能寫后端的JavaScript,已經涵蓋了所有涉及到開發(fā)的各個方面,而Node全棧更是熱門種的熱門。 直面問題才能有更好的解決方式,Node.js的異步是整個學習Node.js過程中重中之重。
1) 異步流程控制學習重點我整理了一張圖,更直觀一些。從09年到現在,8年多的時間里,整個Node.js社區(qū)做了大量嘗試,其中曲折足足夠寫一本書的了。大家先簡單了解一下。
結論:Promise是必須會的,那你為什么不順勢而為呢? 推薦:使用Async函數 + Promise組合,如下圖所示。 其實,一般使用是不需要掌握上圖中的所有技術的。對于初學者來說,先夠用,再去深究細節(jié)。所以,精簡一下,只了解3個就足夠足夠用了。 結論
所以下面我們會分個小部分進行講解。 2)Api寫法:Error-first Callback 和 EventEmittera)Error-first Callback
下面讓我們看一下調用函數示例,Node.js 文檔里最常采用下面這樣的回調方式: 這里的 b)EventEmitter 事件模塊是 Node.js 內置的對觀察者模式“發(fā)布/訂閱”(publish/subscribe)的實現,通過 在node 6之后,可以直接使用 和jquery、vue里的Event是非常類似的。而且前端自己也有EventEmitter。 c)如何更好的查Node.js文檔 API是應用程序接口Application Programming Interface的簡稱。從Node.js異步原理,我們可以知道,核心在于 Node.js SDK 中API調用,然后交由EventLoop(Libuv)去執(zhí)行,所以我們一定要熟悉Node.js的API操作。 Node.js的API都是異步的,同步的函數是奢求,要查API文檔,在高并發(fā)場景下慎用。 筆者推薦使用 Dash 或 Zeal 查看離線文檔,經常查看離線文檔,對Api理解會深入很多,比IDE輔助要好,可以有效避免離開IDE就不會寫代碼的窘境。 3)中流砥柱:Promise回調地獄 Node.js 因為采用了錯誤優(yōu)先的回調風格寫法,導致sdk里導出都是回調函數。如果組合調用的話,就會特別痛苦,經常會出現回調里嵌套回調的問題,大家都非常厭煩這種寫法,稱之為Callback Hell,即回調地獄。一個經典的例子來自著名的Promise模塊q文檔里。 這里只是做4步,嵌套了4層回調,如果更多步驟呢?很多新手淺嘗輒止,到這兒就望而卻步,粉轉黑。這明顯不夠成熟,最起碼你要看看它的應對解決方案吧! Node.js 約定所有Api都采用錯誤優(yōu)先的回調方式,這部分場景都是大家直接調用接口,無太多變化。而Promise是對回調地獄的思考,或者說是改良方案。目前使用非常普遍,可以說是在async函數普及之前唯一一個通用性規(guī)范,甚至 Node.js 社區(qū)都在考慮 Promise 化,可見其影響之大。 Promise最早也是在commonjs社區(qū)提出來的,當時提出了很多規(guī)范。比較接受的是promise/A規(guī)范。后來人們在這個基礎上,提出了promise/A+規(guī)范,也就是實際上現在的業(yè)內推行的規(guī)范。ES6 也是采用的這種規(guī)范。 Promise意味著[許愿|承諾]一個還沒有完成的操作,但在未來會完成的。與Promise最主要的交互方法是通過將函數傳入它的then方法從而獲取得Promise最終的值或Promise最終最拒絕(reject)的原因。要點有三個:
1)定義 每個Promise定義都是一樣的,在構造函數里傳入一個匿名函數,參數是resolve和reject,分別代表成功和失敗時候的處理。 2)調用 它的主要交互方式是通過then函數,如果Promise成功執(zhí)行resolve了,那么它就會將resolve的值傳給最近的then函數,作為它的then函數的參數。如果出錯reject,那就交給catch來捕獲異常就好了。 Promise 的最大優(yōu)勢是標準化,各類異步工具庫都按照統(tǒng)一規(guī)范實現,即使是async函數也可以無縫集成。所以用 Promise 封裝 API 通用性強,用起來簡單,學習成本低。在async函數普及之前,絕大部分應用都是采用Promise來做異步流程控制的,所以掌握Promise是Node.js學習過程中必須要掌握的重中之重。 Bluebird是 Node.js 世界里性能最好的Promise/a+規(guī)范的實現模塊,Api非常齊全,功能強大,是原生Promise外的不二選擇。 好處如下:
限于時間關系,這里就不一一列舉了,還是那句話,在學習Node.js過程中,對于Promise了解多深入都不過分。 推薦學習資料
4)終極解決方案:Async/AwaitAsync/Await是異步操作的終極解決方案,Koa 2在node 7.6發(fā)布之后,立馬發(fā)布了正式版本,并且推薦使用async函數來編寫Koa中間件。 這里給出一段Koa 2應用里的一段代碼 它做了3件事兒
是不是非常簡單,現在Eggjs里也都是這樣同步的代碼。 4.1 正常寫法 變態(tài)寫法 4.2 await + Promise 4.3 await + co + generator 要點
由上面3中基本用法可以推出Async函數要點如下:
綜上所述
小結 這部分共講了4個小點,都是極其直接的必須掌握的知識點。
這里再提一下關于Node.js源碼閱讀問題,很多人api都還沒完熟練就去閱讀源碼,這是非常不贊成的,不帶著問題去讀源碼是比較容易迷失在大量代碼中的。效果并不好。 先用明白,然后再去閱讀Node.js源碼,然后探尋libuv并發(fā)機制。很多人買了樸大的《深入淺出Node.js》一書,看了之后還是不太會用,不是書寫的不好,而是步驟不對。
我一般給大家的推薦是把Node in action讀上5遍10遍,入門干活足夠了。剩下的就是反復實踐,多寫代碼和npm模塊就好。 目前所有的書籍幾乎都有點過時了,大部分都是Node.js v0.10左右的版本的,我得新書是基于Node.js 8版本的,預計2018年3月或4月出版。別催我,真沒法更快了。 目錄 博文視點的美女編輯在苦逼的整理中,預計出版在3月之后(不要催我,我也沒法說),20章,800頁+,定價預計在130+。 Web編程要點一般,后端開發(fā)指的是 Web 應用開發(fā)中和視圖渲染無關的部分,主要是和數據庫交互為主的重業(yè)務型邏輯處理。但現在架構升級后,Node.js 承擔了前后端分離重任之后,有了更多玩法。從帶視圖的傳統(tǒng)Web應用和面向Api接口應用,到通過 RPC 調用封裝對數據庫的操作,到提供前端 Api 代理和網關,服務組裝等,統(tǒng)稱為后端開發(fā),不再是以往只有和數據庫打交道的部分才算后端。這樣,就可以讓前端工程師對開發(fā)過程可控,更好的進行調優(yōu)和性能優(yōu)化。 對 Node.js 來說,一直沒有在后端取得其合理的占有率,原因是多方面的,暫列幾條。
盡管如此,Node.js 還是盡人皆知,卷入各種是非風口,也算是在大前端浪潮中大紅大紫。原因它的定位非常明確,補足以 JavaScript 為核心的全棧體系中服務器部分。開發(fā)也是人,能夠同時掌握并精通多門語言的人畢竟不多,而且程序員的美德是“懶”,能使用 JavaScript 一門語言完成所有事兒,為什么要學更多呢? 對于 Web 應用大致分2種,帶視圖的傳統(tǒng)Web應用和面向Api接口應用,我們先看一下 Node.js Web 應用開發(fā)框架的演進時間線大致如下:
我們可以根據框架的特性進行分類
對于框架選型
Tips:個人學習求新,企業(yè)架構求穩(wěn),無非喜好與場景而已 Node.js 本來就為了做后端而設計的,這里我們再看看利益問題。Node.js 向后端延伸,必然會觸動后端開發(fā)的利益。那么 Proxy 層的事兒,前后端矛盾的交界處,后端不想變,前端又求變,那么長此以往,Api接口會變得越來越惡心。后端是愿意把Api的事兒叫前端的,對后端來說,只要你不動我的數據庫和服務就可以。 但是 Node.js 能不能做這部分呢?答案是能的,這個是和 Java、PHP 類似的,一般是和數據庫連接到一起,處理帶有業(yè)務邏輯的。目前國內大部分都是以 Java、PHP 等為主,所以要想吃到這部分并不容易。
國內這部分一直沒有做的很好,所以 Node.js 在大公司還沒有很好的被應用,安全問題、生態(tài)問題、歷史遺留問題等,還有很多人對 Node.js 的誤解。
這些對于提供Api服務來說已經足夠了,本書后面有大量篇幅講如何使用 Koa 框架來構建Api服務。 Web編程核心
迷茫時學習Node.js最好的方法Node.js 編寫的包管理器 npm 已成為開源包管理了領域最好的生態(tài),直接到2017年10月份,有模塊超過47萬,每周下載量超過32億次,每個月有超過700萬開發(fā)者使用npm。現在早已經超過60萬個模塊了。 這里就不一一舉例了,給出一個迷茫時學習Node.js最好的方法吧! 某天,我在3w咖啡整理書稿,然后小弟梁過來了,聊聊他的現狀,一副很不好的樣子,在天津我曾帶過他大半年,總不能不管,我給他的建議是:“每天看10個npm模塊” 對于學習Node.js迷茫的人來說,這是最好的方式,當你不知道如何做的時候,就要向前(錢)看,你要知道積累哪些技能對以后有好處。對于學習Node.js必經之路,一定是要掌握很多模塊用法,并從中汲取技巧、思路、設計思想的。與其不知道學什么,為什么不每天積累幾個技巧呢? 推薦一個repo即 https://github.com/parro-it/a... 小型庫集合,一天看十個不是夢! 更多討論 https://zhuanlan.zhihu.com/p/... 非科班出身如何Node.js有朋友提問 解答困惑: 1、計算機基礎薄弱該如何完善自己的知識體系? 答:追逐長尾,所見所聞不懂的都去學就好啦。我是這樣過來的,頭幾年每天14個小時+,很累,不過效果還可以。os,算法,數據結構,設計模式,編譯原理,基本也就這些重點。做到每天都有進步就好,別貪多求快。數學和英文當然也是越狠越好的! 2、如何在技術上做更深入的探索? 答:技術人只關注技術,想法創(chuàng)意通常比較少。最簡單的辦法就是抓自己的癢,比我大學時和朋友們翻譯過grails文檔,所以對翻譯有情節(jié)。為了翻譯,我用node寫了無數工具嘗試,反復對比各種翻譯工具,理解它們背后的設計。包括markdown里嵌html標簽標識中英文,然后gulp編譯成獨立文檔。甚至一度想上線賣服務。這種折騰真的很爽,甚至耽誤了不少翻譯。有時要警惕長尾,不要忘了自己的初衷 3、如何系統(tǒng)的學習node? 答:階段 1/要會用,能完成工作任務 應對方法 1/《node in action》看五遍,然后就去寫吧,別管代碼質量如何,能寫敢寫
答:如果有機會就直接上Web應用,如果沒有機會就從前端構建,工具等方面開始做,慢慢引入更潮更酷的前端技術,自然就把Node引入進來了。不要急。
答:初學者推薦Express,如果有一定經驗,推薦Koa。當然真正項目里還是推薦Eggjs和Thinkjs這樣的框架。
答: 如果你不著急,也可以等我的那本《更了不起的Node.js》,時間待定。 Part 3延伸:大前端變化那么快,如何才能做到每日精進?有朋友問現在Android開發(fā)和web前端開發(fā)哪個前景更好?我的回答是明顯是前端更好,看一下移動端發(fā)展過程 native < hybrid < rn/weex < h5 目前rn和weex的開發(fā)逐漸變得主流,組件化寫法已經由前端主導了。以前ios和android程序員占比很高,但現在就留1到2個寫插件,真是差別很大。 Web開發(fā)對移動端的沖擊非常大。當然現在Web技術也開發(fā)PC client了,比如vscode是通過electron打包的,效果還是相當不錯的。 前端可以說是最近幾年開發(fā)里最火的部分,原因很多,最主要是開發(fā)方式的變更,以今時今日的眼光來看,稱之為現代Web開發(fā)是不為過的。 先給出現代Web開發(fā)的概覽圖 每次演講我會都問大家是不是前端,回答“是”的人非常多,我會開玩笑的恭喜大家:“現在的前端就是錢端”,確實,現在前端發(fā)展異常的快,而且沒有趨向于類比java里ssh框架的那種穩(wěn)定,所以未來很長一段時間,還會增長,持續(xù)混亂,這對前端來說是把雙刃劍,一方面有很強的壓迫感,不學習就跟不上時代,另一方它也是機遇,能夠帶給更多機會,包括money。 大家都疑惑的一個問題是如何在這樣巨變的時代能夠通過學習來應變,我可以很負責的告訴大家,沒有捷徑,但通過掌握 Node.js 能夠讓你降低這個學習曲線而已,畢竟Node.js是大前端的基礎設施。大家可以看一下,前端的開發(fā)過程,模塊化,構建,輔助工具,調優(yōu),架構調整,可以說Node.js是無處不在的。 其實,輔助大前端開發(fā)只是Node.js的一個非常無心插柳的衍生功能,通過掌握Node.js能夠讓你能做的更多、獲得的更多,甚至可以說有更多自我實現的快樂,這也是我那本書書名字里“更了不起的”要去闡述的內容。 綜上種種,就是我一直提倡以 JavaScript 語言為中心的 全棧核心
只要打通這2個要點,其他就比較容易了。最怕的是哪樣都接觸點,然后就號稱自己是全棧,建議大家不要這樣做,這就好比在簡歷里寫精通一樣,基本上都會被問到尷尬。全棧是一種信仰,不是拿來吹牛逼的,而可以解決更多問題,讓自己的知識體系不留空白,享受自我實現的極致快樂。 我的全棧之路想問一下狼叔最近的業(yè)務一直都是簡單的用express搭一個后端服務,沒有其他更加深入node的業(yè)務了,這種時候應該如何自己給自己創(chuàng)應用場景呢 沒有目標就向錢看,有目標就向前看
既然無法逃避,就熱愛它,最后變成興趣
人生不只有代碼,但它能讓我快樂,終生受益 也曾懵懂,也曾迷茫,但我這人比較傻,一直信奉:“一次只做1件事兒,盡力做到極致”,短時間看這是比較傻的,但一旦你堅持下去,你就會發(fā)現技術其實是門手藝,厚積薄發(fā)。 我沒辦法說自己最擅長什么,但在什么場景下用什么技術是我擅長的?;蛘哒f,應變是我最大的本事。很多框架,新技術我都沒見過,用過,但花一點點過一下,就能拿已有的知識快速的理解它,這其實是長期學習的好處。 現在越來越忙,寫代碼的時間越來越少,技術又越發(fā)展越快,我能做好的就是每日精進,仗著這點已有的知識儲備跟年輕人比賽。我不覺得累,相反我很享受這種感覺,沒有被時代淘汰,是一件多么幸福的事兒。 從后端轉做后端的人
4階段循序漸進,build 與工具齊飛 前端開發(fā)4階段,我的感覺是按照順序,循序漸進就好。 從前端轉從前端往后端轉,api 接口非常容易學會,像 express、koa 這類框架大部分人一周就能學會,最難的是對 db、er 模型的理解,說直白點,還是業(yè)務需求落地的理解 我們來想想一般的前端有什么技能?
那么他們如果想在前端領域做的更深有哪些難點呢?
以上皆是痛點,所以比較好的辦法應該是這樣的。
從我們的經驗看,這樣是比較靠譜的。先做最簡單前后端分離,里面沒有任何和db相關,前端可以非常容易的學會,基本2周就已經非常熟練了。一般半年后,讓他們接觸【異步流程處理】和【數據庫】相關內容,學習后端代碼,就可以全棧了。 從移動端轉看一下移動端發(fā)展過程 native < hybrid < rn/weex < h5 目前rn和weex的開發(fā)逐漸變得主流,組件化寫法已經由前端主導了。以前ios和android程序員占比很高,但現在就留1到2個寫插件,真是差別很大。狼叔一直固執(zhí)的以為未來是h5的。 現在的 Native 開發(fā)是姥姥不疼舅舅不愛,非常尷尬,很明顯連培訓出的人就業(yè)不要工資混經驗就很明顯了。另外領導們也都在惦記,能不能用 H5 寫?這還算是保守的,如果直接激進的就直接上 RN 了,那么 Native開發(fā)的程序員就變了 一個寫插件的程序員...招誰惹誰了。。。。 要么忍,要么轉,沒辦法,認命吧,溫水里舒服了幾年,也該學點東西了
原生開發(fā)就是 iOS 用 OC/Swift,Android 用 java 或 scala 等,就算偶爾嵌入 webview,能玩js的機會也非常好少 所以移動端轉全棧的方法,最好是從 cordova(以前叫 phonegap)開始做 hybrid 開發(fā)。
只要入了 H5 的坑,其實就非常好辦了。
這個基本上是我走的路,從2010年寫iOS、做phonegap(當時是0.9.3)、一路走到現在的總結吧! 以前技術發(fā)展還不是那么明顯,寫 Java 的時候 學習的3種層次,跟人學最快,其次是跟書(或者博客)學,最差的是自悟。但是牛人不能遇到,遇到了也未必有精力教你,書本或者博客,別人有,但不一定寫出來,就算是寫了,可能只是點到為止。至于自悟,如果沒有深厚的積累的,還是有相當大難度的。 對于開發(fā)來說代碼是一切基礎,在掌握了一定計算機基礎后,其差別就在于代碼質量和眼界。編程沒有捷徑,能夠做到每日精進就是極好的?,F在開源代碼非常多,要能夠從中獲取自己所需的知識,也是一種本領!如果能夠堅持著每日精進,根本不需要向其他人學習的。 大家可以在 Github 隨便打開一個前端項目,里面有一半以上都是 Node.js 相關信息,各種包管理、測試、ci、輔助模塊,如果大家對這些基礎信息掌握的非常好,那么學習一個新的框架,你要比別人快好多,最重要的是學了一次,到處使用。 很多人問我怎么才能成為一個 Node.js 大神?我的回答是“在cnode論壇上堅持寫文章和開源項目2年,足矣,輕松進阿里騰訊,不用你找他們,他們自會找你的”。 從今天起,開始重視開源項目,重視 node,做到每日精進 Part 4實踐:從招聘角度來看, Node.js 開發(fā)需要具備哪些技能?招人標準先說下我的招人標準,做技術總監(jiān)時上指下派只要看好技術能力和態(tài)度即可,做CTO時要考慮團隊文化,人品和能否在公司長留,所以不同的人面試要看的點是不一樣的,我曾面過很多Node.js程序員,也見過很多面試題,匯總一下,大致有以下9個點:
補充一句:只看技能沒人品的人,千萬別招,白臉狼 主動執(zhí)行,輔助團隊 大家是選大公司還是小公司?我再知乎上回復的《在跳槽后的第三個月,收到世界500強的offer,我該怎么辦?》 1)互聯網公司優(yōu)先,流量大,人才多,機會也多,流程規(guī)范一些 2)今天的世界500強不比從前了,普華永道應該是四大之一,不知道信息化怎么樣,你只要和你現在的公司對比就好了。 3)問問自己想要什么,錢,經歷,還是時間 如果你很年輕,現在很安逸,我建議你換。如果不是很想動,那就學會所有能接觸到的知識再換。 我是降薪來的阿里,原因有三,一是有事可為,老板重用你給你機會,二是集團內部是open的,偏偏我知識面足夠可以看出它們的好處,算是另一種補償吧,三是對個人品牌是一個升級,狼叔的職業(yè)生涯到此已經足夠了,進可攻退可守,也算另一種自由吧! 錢多是個優(yōu)勢而已,還有氛圍,文化,信仰
前幾天還和 @蘇千 聊,我和 @死月絲卡蕾特 相繼入職阿里,還有cnode社區(qū)著名程序員也即將入職阿里,當時大家開玩笑說: “前端的終極歸宿是阿里,不是在阿里,就是在去阿里的路上” 另外要說的一點是pc和h5站在使用Node.js做api中間層,其最佳實踐已成型,量也是極大的。以前前端玩得還是比較弱,如果能夠緩存+控制頁面數據,獲得一個性能極大的提升也是極好的。2018年,爭取拿這個做主題演講上qcon或archsummit大會。 每天忙得很開心,這就是我現在狀態(tài)。其實,我的折騰還是在于想做些事情。如果你也想跟我一起做事,請將簡歷郵件給我 langshu.ssl@alibaba-inc.com,團隊大量招人,也可以幫忙推薦給集團其他部門。 大公司的做事方式
小公司
狼叔經常說的一句:“少抱怨,多思考,未來更美好”,大部分人都喜歡積極的人,遇到問題不怕不躲不避,要相信自己能夠解決,最多是時間問題。 還有一句是:“沒目標向錢看,有目標向前看”。歷史上很多這樣的例子,在2010年左右iOS開發(fā)剛起步,會拖拽弄個界面的就五位數工資,比做JAVA的幾年的都要多。這世界就是這樣不公平。但是你也不能不思進取,這樣也是極其危險。在2016年左右,其實iOS開發(fā)就遇到了市場飽和的問題,很多培訓出來的人都找不到工作,各家公司都在考慮換react-native或weex或者h5。 所以,當你有機會進入一個很有前途的方向,你要努力學好,并準備好下一個階段的應變。相反,如果當成找一個養(yǎng)老的地方,早晚會遇到尷尬的。比如現在很多iOS程序員被迫去學react/vue等,境遇也不太好的,更有甚者直接被開除。 優(yōu)酷-高級前端開發(fā)職位描述
職位要求
PixelLabPixelLab是與淘寶GM Lab聯合成立的專注于視頻算法方向的研發(fā)部門,主要涉及視頻的空間感知、軌跡跟蹤、圖像分割、遮擋檢測以及照片級渲染等相關技術。用于實現視頻內的內容植入與后期特效的研發(fā),屬于視頻MR的場景,主要應用于廣告植入平臺的研發(fā),方向靠譜老板人好,歡迎推薦。主要需要的崗位包括了圖像算法、3D視覺算法,渲染算法,WebGL以及并行計算等幾大方向,因為算法類招聘實在難,所以將JD的鏈接帖出來希望同事們有適合的人可以內推一下。 崗位要求: 螞蟻金服崗位要求:
我們的前端專業(yè)建設方向
聯系方式目前北京,杭州,廣州,上海,深圳,成都都在招聘,如果你也想跟我一起共事,請將簡歷郵件給我 langshu.ssl@alibaba-inc.com,團隊大量招人,也可以幫忙推薦給集團其他部門。 有機會和winter,勾股,玉伯,蘇千,樸靈、死馬、偏右,徐飛,阮一峰,天豬,裕波等大神一起工作哦。 悄悄地說,其實其他公司我也可以幫推薦。 結束語年輕時死磕,年長點讓小弟死磕,現在抓個專家一起吃飯,沒有什么是一頓飯解決不了的,不行就二頓 工程師的能力不是編碼和死磕,而是解決問題
強調30歲不是我創(chuàng)造的,大部分人都會認為30歲后事情,壓力會明顯大得多,比如家庭,孩子,房子,車子,票子,甚至是管理,權利,欲望等等吧。我感受最深的是身體不如從前和記憶力明顯下降。 狼叔說: “少抱怨,多思考,未來更美好” 大部分人體會不到堅持的樂趣,不會玩,所以抱怨多。其實玩出樂趣也是一種能力,尤其是像寫代碼這種看似無聊的事兒。最開始可能只想賺點錢,后面變成熱愛,這樣才美好。只要堅持每日精進開心就好了。 另外,時間也要好處處理,狼叔總會提菜根譚上的一句話:【閑時要有吃緊的心思,忙里要有偷閑的樂趣】。 每個人的一生中都有很多坎,類似于瓶頸,唯有苦難和堅持才能沖破,堅持會產生自信,苦難會創(chuàng)造機會。一個經過苦難還有自信的人,一定會有更美好的未來。 如果大家還有問題,可以去cnode社區(qū)發(fā)帖at我,也可以在Node全棧公眾號提問。 Part 5答疑:回答大家的問題答疑有點多,這里就不一一貼出來,如果是新用戶和比較迷茫的Node朋友去Live里聽吧。
|
|
|