2017-12-14 我發了一篇文章《沒用過Node.js,就別瞎逼逼》是由於有人在知乎上黑Node.js。那篇文章的反響仍是至關不錯的,甚至連著名的hax賀老都很認同,下班時讀那篇文章,居然坐車的還坐過站了。你們能夠很明顯的感到Node.js的普及度還不夠,還存不少誤解。甚至說不少小白用戶也得不到很好的學習。大神都功成身退,書也跟不上,大部分都是2013年左右的,Node.js版本都是基於v0.10左右的,如今已經v9了。想一想也是有點惋惜,使用如此普遍的Node.js被你們默認,卻沒人來科普。css
反思以後,我就想準備一個科普的Live,因而就有了《狼叔:如何正確學習 Node.js?》,相信可以對不少喜歡Node.js的朋友有所幫助。Live已完成目前1200多人,230人評價,平均4.8+,還算是一個比較成功的Live。現整理出來,但願對更多朋友有用。html
Live 簡介前端
如今,愈來愈多的科技公司和開發者開始使用 Node.js 開發各類應用。Node.js除了可以輔助大前端開發外,還能夠編寫Web應用,封裝Api,組裝RPC服務等,甚至是開發VSCode編輯器同樣的PC客戶端。和其它技術相比, Node.js 簡單易學,性能好、部署容易,可以輕鬆處理高併發場景下的大量服務器請求。Node.js 周邊的生態也很是強大,NPM(Node包管理)上有超過60萬個模塊,日下超過載量3億次。但編寫 Node.js 代碼對新人和其它語言背景的開發者來講,不是一件容易的事,在入門以前須要弄懂很多複雜的概念。vue
我身邊也有不少人問我:如何學習 Node.js ?做爲一名 Node.js 佈道者,我作過不少 Node.js 普及和推廣的工做,對它的基本概念和核心模塊都很熟悉; 此外,我還在撰寫一本名爲《更了不得的 Node.js 》的書,已經寫了 2 年,積累了很豐富的資料,本次 Live 也將爲你提供對 Node.js 更全面的解讀。java
本次 Live 主要包括如下內容,目錄node
Part 0 :Node.js簡介python
a)Node.js簡介
b)什麼是Node.js?
c)基本原理mysql
Part 1前言:學習 Node.js 的三個境界react
Part 2準備:如何學習Node.jsjquery
Part 3延伸:大前端變化那麼快,如何才能作到每日精進?
Part 4實踐:從招聘角度來看, Node.js 開發須要具有哪些技能?
Part 5答疑:回答你們的問題
本次Live主要是科普,適用新用戶和比較迷茫的Node朋友,但願你們多多理解和支持。
a)Node.js簡介
b)什麼是Node.js?
c)基本原理
Node.js 誕生於 2009 年,由 Joyent 的員工 Ryan Dahl 開發而成,以後 Joyent 公司一直扮演着 Node.js 孵化者的角色。因爲諸多緣由,Ryan 在2012年離開社區,隨後在2015年因爲 Node 貢獻者對 es6 新特性集成問題的分歧,致使分裂出iojs,並由 iojs 發佈1.0、2.0和3.0版本。因爲 iojs 的分裂最終促成了2015年Node基金會的成立,並順利發佈了4.0版本。Node.js基金會的創始成員包括 Google、Joyent、IBM、Paypal、微軟、Fidelity 和 Linux基金會,創始成員將共同掌管過去由 Joyent 一家企業掌控的 Node.js 開源項目。此後,Node.js基金會發展很是好,穩定的發佈五、六、七、8等版本,截止發稿最新版本已是8.6,長期支持版本是6.11。
Node.js 不是一門語言也不是框架,它只是基於 Google V8 引擎的 JavaScript 運行時環境,同時結合 Libuv 擴展了 JavaScript 功能,使之支持 io、fs 等只有語言纔有的特性,使得 JavaScript 可以同時具備 DOM 操做(瀏覽器)和 I/O、文件讀寫、操做數據庫(服務器端)等能力,是目前最簡單的全棧式語言。
早在2007年,Jeff Atwood 就提出了著名的 Atwood定律
任何可以用 JavaScript 實現的應用系統,最終都必將用 JavaScript 實現
目前 Node.js 在大部分領域都佔有一席之地,尤爲是 I/O 密集型的,好比 Web 開發,微服務,前端構建等。很多大型網站都是使用 Node.js 做爲後臺開發語言的,用的最多的就是使用Node.js作前端渲染和架構優化,好比 淘寶 雙11、去哪兒網 的 PC 端核心業務等。另外,有很多知名的前端庫也是使用 Node.js 開發的,好比,Webpack 是一個強大的打包器,React/Vue 是成熟的前端組件化框架。
Node.js一般被用來開發低延遲的網絡應用,也就是那些須要在服務器端環境和前端實時收集和交換數據的應用(API、即時聊天、微服務)。阿里巴巴、騰訊、Qunar、百度、PayPal、道瓊斯、沃爾瑪和 LinkedIn 都採用了 Node.js 框架搭建應用。
另外, Node.js 編寫的包管理器 npm 已成爲開源包管理了領域最好的生態,直接到2017年10月份,有模塊超過47萬,每週下載量超過32億次,每月有超過700萬開發者使用npm。
固然了,Node.js 也有一些缺點。Node.js 常常被人們吐槽的一點就是:回調太多難於控制(俗稱回調地獄)和 CPU 密集任務處理的不是很好。可是,目前異步流程技術已經取得了很是不錯的進步,從Callback、Promise 到 Async函數,能夠輕鬆的知足全部開發需求。至於 CPU 密集任務處理並不是不可解,方案有不少,好比經過系統底層語言 Rust 來擴展 Node.js,但這樣會比較麻煩。筆者堅信在合適的場景使用合適的東西,尤爲是在微服務架構下,一切都是服務,能夠作到語言無關。若是你們想使 JavaScript 作 CPU 密集任務,推薦 Node.js 的兄弟項目 fibjs,基於纖程(fiber,能夠簡單理解爲更輕量級的線程),效率很是高,兼容npm,同時沒有異步回調煩惱。
按照 Node.js官方網站主頁 的說法:
Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world.
從這段介紹來看,解讀要點以下
npm
做爲包管理器,目前 npm
是開源庫裏包管理最大的生態,功能強大,截止到2017年12月,模塊數量超過 60 萬+大多數人都認爲 Node.js 只能寫網站後臺或者前端工具,這實際上是不全面的,Node.js的目標是讓併發編程更簡單,主要應用在以網絡編程爲主的 I/O 密集型應用。它是開源的,跨平臺,而且高效(尤爲是I/O處理),包括IBM、Microsoft、Yahoo、SAP、PayPal、沃爾瑪及GoDaddy都是 Node.js 的用戶。
下面是一張 Node.js 早期的架構圖,來自 Node.js 之父 Ryan Dahl 的演講稿,在今天依然不過期,它簡要的介紹了 Node.js 是基於 Chrome V8引擎構建的,由事件循環(Event Loop)分發 I/O 任務,最終工做線程(Work Thread)將任務丟到線程池(Thread Pool)裏去執行,而事件循環只要等待執行結果就能夠了。
核心概念
Chrome
瀏覽器中被使用。Chrome V8 引擎能夠獨立運行,也能夠用來嵌入到 C/C++ 應用程序中執行。libuv
提供)libuv
提供)梳理一下
咱們再換一個維度看一下
核心
libuv
由事件循環和線程池組成,負責全部 I/O 任務的分發與執行在解決併發問題上,異步是最好的解決方案,能夠拿排隊和叫號機來理解
Node.js 其實就是幫咱們構建相似的機制。咱們在寫代碼的時候,實際上就是取號的過程,由 Event Loop 來接受處理,而真正執行操做的是具體的線程池裏的 I/O 任務。之因此說 Node.js 是單線程,就是由於在接受任務的時候是單線程的,它無需進程/線程切換上下文的成本,很是高效,但它在執行具體任務的時候是多線程的。
Node.js 公開宣稱的目標是 「旨在提供一種簡單的構建可伸縮網絡程序的方法」,毫無疑問,它確實作到了。這種作法將併發編程模型簡化了,Event Loop和具體線程池等細節被 Node.js 封裝了,繼而將異步調用 Api 寫法暴露給開發者。真是福禍相依,一方面簡化了併發編程,另外一方面在寫法上埋下了禍根,這種作法的好處是能讓更多人垂手可得的寫出高性能的程序!
在Node.js Bindings層作的事兒就是將 Chrome V8 等暴露的 C/C++
接口轉成JavaScript Api,而且結合這些 Api 編寫了 Node.js 標準庫,全部這些 Api 統稱爲 Node.js SDK,後面模塊章節會有更詳細的討論。
微軟在2016年宣佈在MIT許可協議下開放 Chakra 引擎,並以 ChakraCore
爲名在 Github 上開放了源代碼,ChakraCore
是一個完整的 JavaScript 虛擬機,它擁有着和 Chakra
幾乎相同的功能與特性。微軟向 Node.js 主分支提交代碼合併請求,讓 Node.js 用上 ChakraCore
引擎,即 nodejs/node-chakracore 項目。實際上微軟是經過建立名爲 V8 shim
的庫的賦予了 ChakraCore
處理谷歌 Chrome V8 引擎指令的能力,其原理示意圖以下
目前,Node.js 同時支持這2種 JavaScript 引擎,兩者性能和特性上各有千秋,ChakraCore
在特性上感受更潮一些,曾經是第一個支持 Async函數
的引擎,但目前 Node.js 仍是以 Chrome V8 引擎爲主, ChakraCore
版本須要單獨安裝,你們瞭解一下就好。
我總結的編程3種境界
你們能夠自測一下,本身在哪一個水平?若是是第三個階段,那麼本場Live可能不太適合你。哈哈哈
Node不是語言,不是框架,只是基於V8運行時環境。結合libuv可以經過js語法得到更好的等價於c/c++的性能。
它很簡單,異步是解決併發的最佳實踐。本節主要講如何學習Node.js,是本次Live很是核心的內容,你們要注意聽。
1)js語法必須會
犀牛書,《JavaScript權威指南》,沒事就多翻翻,看少多少遍都不爲過。
2)我的學習和技術選型都要按部就班
能夠看出個人思路,先能寫,而後再追求更好的寫法,好比面向對象。等團隊水平到必定程度了,而且穩定的時候,能夠考慮更加極致的函數式寫法。
團隊是這樣選型的,我的學習也這樣,最好是按部就班,步子邁大了很差。
3)各類高級的JavaScript友好語言
JavaScript友好語言指的是可以使用其餘語法實現,但最終編譯成js的語言。自從Node.js出現後,這種黑科技層出不窮。好比比較有名的coffee、typescript、babel(es)等。
CoffeeScript雖然也是JavaScript友好語言,但其語法借鑑ruby,崇尚極簡,對於類型和OO機制上仍是偏弱,並且這麼多年也沒發展起來,仍然是比較小衆的活着。將來比例會愈來愈少的。
顯然TypeScript會愈來愈好,TypeScript 的強大之處是要用過才知道的。
當下前端發展速度極快,以指數級的曲線增加。之前可能1年都不必定有一項新技術,如今可能每月都有。大前端,Node全棧,架構演進等等都在快速變化。能夠說,前端越複雜,有越多的不肯定性,TypeScript的機會就越大。
4)再論面向對象
面向對象想用好也不容易的,並且js裏有各類實現,真是讓人眼花繚亂。
對於es6高級特性,我是比較保守的,通常node長期支持版本lts支持的我都讓用,一些更新的特性我通常不讓使用。根本lts版本保持一致就好。
個人團隊如今是採用es6的面向對象寫法開發,後面會一點一點轉到typescript上的。熟練oo轉到ts是很是容易的。
3m安裝法
node版本發佈很是快,並且多版本共存可能性較大,推薦使用nvm來安裝node
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash $ echo 'export NVM_DIR="$HOME/.nvm"' >> ~/.zshrc $ echo '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm' >> ~/.zshrc $ source ~/.zshrc $ nvm install 0.10 $ nvm install 4 $ nvm install 6 $ nvm install 8
https://registry.npmjs.com 是node官方的源(registry),服務器在國外,下載速度較慢,推薦安裝nrm來切換源,國內的cnpm和taobao的源都很是快,固然,若是你想自建源也是支持的。
$ npm install --global nrm --registry=https://registry.npm.taobao.org $ nrm use cnpm
nrm切換完源以後,你安裝npm模塊的速度會更快。
$ npm install --global yarn
npm基本命令
名稱 | 描述 | 簡寫 |
---|---|---|
npm install xxx | 安裝xxx模塊,但不記錄到package.json裏 | npm i xxx |
npm install --save xxx | 安裝xxx模塊,而且記錄到package.json裏,字段對應的dependency,是產品環境必須依賴的模塊 | npm i -s xxx |
npm install --save-de xxx | 安裝xxx模塊,而且記錄到package.json裏,字段對應的dev-dependency,是開發環境必須依賴的模塊,好比測試類的(mocha、chai、sinon、zombie、supertest等)都在 | npm i -D xxx |
npm install --global xxx | 全局安裝xxx模塊,但不記錄到package.json裏,若是模塊裏package.json有bin配置,會自動連接,做爲cli命令 | npm i -g xxx |
配合iterm2分屏 + spectacle全屏,幾乎無敵
安裝4個必備軟件
我雖然不算vim黨,但也深愛着。janus是一個很是好用的vim集成開發環境。好比ctrl-p、nerdtree等插件都集成了,對我這種懶人足夠了。
關於Node.js的IDE和編輯器有不少選擇,對好比下
名稱 | 是否收費 | 斷點調試 | 功能 |
---|---|---|---|
Webstorm | 收費 | 支持 | 是IDE,在代碼提示、重構等方面功能很是強大,支持的各類語言、框架、模板也很是多,支持斷點調試,好處是特別智能,缺點也是特別智能 |
Sublime/TextMate | 收費 | 不支持 | 編輯器裏很是好用的,textmate主要針對mac用戶,sublime是跨平臺的,相信不少前端開發都熟悉 |
Vim/Emace | 免費 | 不支持 | 命令行下的編輯器,很是強大,難度也稍大,但更爲酷炫,並且對於服務器部署開發來講是值得一學的 |
VSCode/Atom | 免費 | 支持 | Atom比較早,功能強大,缺點稍卡頓,VSCode是微軟出的,速度快,對於Node.js 調試,重構,代碼提示等方面支持都很是好 |
Visual Studio Code是一個運行於 Mac、Windows和 Linux 之上的,針對於編寫現代 Web 和雲應用的跨平臺源代碼編輯器。它功能強大,便於調試,加上它自己也是基於 Node.js 模塊 electron
構建的,尤爲要推薦你們使用。
Visual Studio Code(如下簡稱vsc)
值得一學,我推薦VSCode編輯器!
更多調試方法,參見https://github.com/i5ting/nod...
《Node.js in action》一書裏說,Node.js 所針對的應用程序有一個專門的簡稱:DIRT。它表示數據密集型實時(data-intensive real-time)程序。由於 Node.js 自身在 I/O 上很是輕量,它善於將數據從一個管道混排或代理到另外一個管道上,這能在處理大量請求時持有不少開放的鏈接,而且只佔用一小部份內存。它的設計目標是保證響應能力,跟瀏覽器同樣。
這話不假,但在今天來看,DIRT 仍是範圍小了。其實 DIRT 本質上說的 I/O 處理的都算,但隨着大前端的發展,Node.js 已經再也不只是 I/O 處理相關,而是更加的「Node」!
Node.js 使用場景主要分爲4大類
nw.js/electron
、移動端 cordova
、HTML五、react-native
、weex
,硬件 ruff.io
等Vue
Angular
輔助開發,以及工程化演進過程(使用Gulp
/Webpack 構建 Web 開發工具)npm
上各類工具模塊,包括各類前端預編譯、構建工具 Grunt
/ Gulp
、腳手架,命令行工具,各類奇技淫巧等下面列出具體的 Node.js 的使用場景,以模塊維度劃分
分類 | 描述 | 相關模塊 |
---|---|---|
網站 | 相似於 cnodejs.org 這樣傳統的網站 |
Express / Koa |
Api | 同時提供給移動端,PC,H5 等前端使用的 HTTP Api 接口 |
Restify / HApi |
Api代理 | 爲前端提供的,主要對後端Api接口進行再處理,以便更多的適應前端開發 | Express / Koa |
IM即時聊天 | 實時應用,不少是基於 WebSocket 協議的 |
Socket.io / sockjs |
反向代理 | 提供相似於 nginx 反向代理功能,但對前端更友好 |
anyproxy / node-http-proxy / hiproxy |
前端構建工具 | 輔助前端開發,尤爲是各類預編譯,構建相關的工具,可以極大的提升前端開發效率 | Grunt / Gulp / Bower / Webpack / Fis3 / YKit |
命令行工具 | 使用命令行是很是酷的方式,前端開發自定義了不少相關工具,不管是shell命令,node腳本,仍是各類腳手架等,幾乎每一個公司小組都會本身的命令行工具集 | Cordova / Shell.js |
操做系統 | 有實現,但估計不太會有人用 | NodeOS |
跨平臺打包工具 | 使用 Web 開發技術開發PC客戶端是目前最流行的方式,會有更多前端開發工具是採用這種方式的 | PC端的electron、nw.js,好比釘釘PC客戶端、微信小程序IDE、微信客戶端,移動的Cordova,即老的Phonegap,還有更加有名的一站式開發框架Ionicframework |
P2P | 區塊鏈開發、BT客戶端 | webtorrent / ipfs |
編輯器 | Atom 和 VSCode 都是基於 electron 模塊的 |
electron |
物聯網與硬件 | ruff.io和不少硬件都支持node sdk | ruff |
Node.js 應用場景很是豐富,好比 Node.js 能夠開發操做系統,但通常我都不講的,就算說了也沒多大意義,難道你們真的會用嗎?通常,我習慣將 Node.js 應用場景氛圍7個部分。
1)初衷,server端,不想成了前端開發的基礎設施
2)命令行輔助工具,甚至能夠是運維
3)移動端:cordova,pc端:nw.js和electron
4)組件化,構建,代理
5)架構,先後端分離、api proxy
6)性能優化、反爬蟲與爬蟲
7) 全棧最便捷之路
編號 | 場景 | 說明 |
---|---|---|
1 | 反向代理 | Node.js能夠做爲nginx這樣的反向代理,雖然線上咱們不多這樣作,但它確確實實能夠這樣作。好比node-http-proxy和anyproxy等,其實使用Node.js作這種請求轉發是很是簡單的,在後面的http章節裏,有單獨的講解。 |
2 | 爬蟲 | 有大量的爬蟲模塊,好比node-crawler等,寫起來比python要簡單一些,尤爲搭配jsdom(node版本的jQuery)類庫的,對前端來講尤爲友好 |
3 | 命令行工具 | 全部輔助開發,運維,提升效率等等能夠用cli作的,使用node來開發都很是合適,是編寫命令行工具最簡單的方式,java8之後也參考了node的命令行實現 |
4 | 微服務與RPC | node裏有各類rpc支持,好比node編寫的dnode,seneca,也有跨語言支持的grpc,足夠應用了 |
5 | 微信公衆號開發 | 相關sdk,框架很是多,是快速開發的利器 |
6 | 前端流行SSR && PWA | SSR是服務器端渲染,PWA是漸進式Web應用,都是今年最火的技術。若是你們用過,必定對Node.js不陌生。好比React、Vuejs都是Node.js實現的ssr。至於pwa的service-worker也是Node.js實現的。那麼爲啥不用其餘語言實現呢?不是其餘語言不能實現,而是使用Node.js簡單、方便、學習成本低,輕鬆得到高性能,若是用其餘語言,我至少還得裝環境 |
能夠說目前你們可以看到的、用到的軟件都有 Node.js 身影,當下最流行的軟件寫法也大都是基於 Node.js 的,好比 PC 客戶端 luin/medis 採用 electron
打包,寫法採用 React + Redux。我本身一直的實踐的【Node全棧】,也正是基於這種趨勢而造成的。在將來,Node.js 的應用場景會更加的普遍,更多參見 sindresorhus/awesome-nodejs。
Node.js是爲異步而生的,它本身把複雜的事兒作了(高併發,低延時),交給用戶的只是有點難用的Callback寫法。也正是坦誠的將異步回調暴露出來,纔有更好的流程控制方面的演進。也正是這些演進,讓Node.js從DIRT(數據敏感實時應用)擴展到更多的應用場景,今天的Node.js已經不僅是能寫後端的JavaScript,已經涵蓋了全部涉及到開發的各個方面,而Node全棧更是熱門種的熱門。
直面問題纔能有更好的解決方式,Node.js的異步是整個學習Node.js過程當中重中之重。
我整理了一張圖,更直觀一些。從09年到如今,8年多的時間裏,整個Node.js社區作了大量嘗試,其中曲折足足夠寫一本書的了。你們先簡單瞭解一下。
結論:Promise是必須會的,那你爲何不順勢而爲呢?
推薦:使用Async函數 + Promise組合,以下圖所示。
其實,通常使用是不須要掌握上圖中的全部技術的。對於初學者來講,先夠用,再去深究細節。因此,精簡一下,只瞭解3個就足夠足夠用了。
結論
Node.js學習重點: Async函數與Promise
因此下面咱們會分個小部分進行講解。
a)Error-first Callback
定義錯誤優先的回調寫法只須要注意2條規則便可:
下面讓咱們看一下調用函數示例,Node.js 文檔裏最常採用下面這樣的回調方式:
function(err, res) { // process the error and result }
這裏的 callback
指的是帶有2個參數的函數:"err"和 "res"。語義上講,非空的「err」至關於程序異常;而空的「err」至關於能夠正常返回結果「res」,無任何異常。
b)EventEmitter
事件模塊是 Node.js 內置的對觀察者模式「發佈/訂閱」(publish/subscribe)的實現,經過EventEmitter
屬性,提供了一個構造函數。該構造函數的實例具備 on
方法,能夠用來監聽指定事件,並觸發回調函數。任意對象均可以發佈指定事件,被 EventEmitter
實例的 on
方法監聽到。
在node 6以後,能夠直接使用require('events')
類
var EventEmitter = require('events') var util = require('util') var MyEmitter = function () { } util.inherits(MyEmitter, EventEmitter) const myEmitter = new MyEmitter(); myEmitter.on('event', (a, b) => { console.log(a, b, this); // Prints: a b {} }); myEmitter.emit('event', 'a', 'b');
和jquery、vue裏的Event是很是相似的。並且前端本身也有EventEmitter。
c)如何更好的查Node.js文檔
API是應用程序接口Application Programming Interface的簡稱。從Node.js異步原理,咱們能夠知道,核心在於 Node.js SDK 中API調用,而後交由EventLoop(Libuv)去執行,因此咱們必定要熟悉Node.js的API操做。
Node.js的API都是異步的,同步的函數是奢求,要查API文檔,在高併發場景下慎用。
筆者推薦使用 Dash 或 Zeal 查看離線文檔,常常查看離線文檔,對Api理解會深刻不少,比IDE輔助要好,能夠有效避免離開IDE就不會寫代碼的窘境。
回調地獄
Node.js 由於採用了錯誤優先的回調風格寫法,致使sdk裏導出都是回調函數。若是組合調用的話,就會特別痛苦,常常會出現回調裏嵌套回調的問題,你們都很是厭煩這種寫法,稱之爲Callback Hell,即回調地獄。一個經典的例子來自著名的Promise模塊q文檔裏。
step1(function (value1) { step2(value1, function(value2) { step3(value2, function(value3) { step4(value3, function(value4) { // Do something with value4 }); }); }); });
這裏只是作4步,嵌套了4層回調,若是更多步驟呢?不少新手淺嘗輒止,到這兒就望而卻步,粉轉黑。這明顯不夠成熟,最起碼你要看看它的應對解決方案吧!
Node.js 約定全部Api都採用錯誤優先的回調方式,這部分場景都是你們直接調用接口,無太多變化。而Promise是對回調地獄的思考,或者說是改良方案。目前使用很是廣泛,能夠說是在async函數普及以前惟一一個通用性規範,甚至 Node.js 社區都在考慮 Promise 化,可見其影響之大。
Promise最先也是在commonjs社區提出來的,當時提出了不少規範。比較接受的是promise/A規範。後來人們在這個基礎上,提出了promise/A+規範,也就是實際上如今的業內推行的規範。ES6 也是採用的這種規範。
Promise意味着[許願|承諾]一個尚未完成的操做,但在將來會完成的。與Promise最主要的交互方法是經過將函數傳入它的then方法從而獲取得Promise最終的值或Promise最終最拒絕(reject)的緣由。要點有三個:
1)定義
var promise = new Promise(function(resolve, reject) { // do a thing, possibly async, then… if (/* everything turned out fine */) { resolve("Stuff worked!"); } else { reject(Error("It broke")); } });
每一個Promise定義都是同樣的,在構造函數裏傳入一個匿名函數,參數是resolve和reject,分別表明成功和失敗時候的處理。
2)調用
promise.then(function(text){ console.log(text)// Stuff worked! return Promise.reject(new Error('我是故意的')) }).catch(function(err){ console.log(err) })
它的主要交互方式是經過then函數,若是Promise成功執行resolve了,那麼它就會將resolve的值傳給最近的then函數,做爲它的then函數的參數。若是出錯reject,那就交給catch來捕獲異常就行了。
Promise 的最大優點是標準化,各種異步工具庫都按照統一規範實現,即便是async函數也能夠無縫集成。因此用 Promise 封裝 API 通用性強,用起來簡單,學習成本低。在async函數普及以前,絕大部分應用都是採用Promise來作異步流程控制的,因此掌握Promise是Node.js學習過程當中必需要掌握的重中之重。
Bluebird是 Node.js 世界裏性能最好的Promise/a+規範的實現模塊,Api很是齊全,功能強大,是原生Promise外的不二選擇。
好處以下:
限於時間關係,這裏就不一一列舉了,仍是那句話,在學習Node.js過程當中,對於Promise瞭解多深刻都不過度。
推薦學習資料
Async/Await是異步操做的終極解決方案,Koa 2在node 7.6發佈以後,立馬發佈了正式版本,而且推薦使用async函數來編寫Koa中間件。
這裏給出一段Koa 2應用裏的一段代碼
exports.list = async (ctx, next) => { try { let students = await Student.getAllAsync(); await ctx.render('students/index', { students : students }) } catch (err) { return ctx.api_error(err); } };
它作了3件事兒
是否是很是簡單,如今Eggjs裏也都是這樣同步的代碼。
4.1 正常寫法
const pkgConf = require('pkg-conf'); async function main(){ const config = await pkgConf('unicorn'); console.log(config.rainbow); //=> true } main();
變態寫法
const pkgConf = require('pkg-conf'); (async () => { const config = await pkgConf('unicorn'); console.log(config.rainbow); //=> true })();
4.2 await + Promise
const Promise = require('bluebird'); const fs = Promise.promisifyAll(require("fs")); async function main(){ const contents = await fs.readFileAsync("myfile.js", "utf8") console.log(contents); } main();
4.3 await + co + generator
const co = require('co'); const Promise = require('bluebird'); const fs = Promise.promisifyAll(require("fs")); async function main(){ const contents = co(function* () { var result = yield fs.readFileAsync("myfile.js", "utf8") return result; }) console.log(contents); } main();
要點
在generator裏能夠使用yield,而yield後面接的有5種可能,故而把這些能夠yield接的方式成爲yieldable,便可以yield接的。
由上面3中基本用法能夠推出Async函數要點以下:
綜上所述
小結
這部分共講了4個小點,都是極其直接的必須掌握的知識點。
這裏再提一下關於Node.js源碼閱讀問題,不少人api都還沒完熟練就去閱讀源碼,這是很是不同意的,不帶着問題去讀源碼是比較容易迷失在大量代碼中的。效果並很差。
先用明白,而後再去閱讀Node.js源碼,而後探尋libuv併發機制。不少人買了樸大的《深刻淺出Node.js》一書,看了以後仍是不太會用,不是書寫的很差,而是步驟不對。
我通常給你們的推薦是把Node in action讀上5遍10遍,入門幹活足夠了。剩下的就是反覆實踐,多寫代碼和npm模塊就好。
目前全部的書籍幾乎都有點過期了,大部分都是Node.js v0.10左右的版本的,我得新書是基於Node.js 8版本的,預計2018年3月或4月出版。別催我,真無法更快了。
目錄
博文視點的美女編輯在苦逼的整理中,預計出版在3月以後(不要催我,我也無法說),20章,800頁+,訂價預計在130+。
通常,後端開發指的是 Web 應用開發中和視圖渲染無關的部分,主要是和數據庫交互爲主的重業務型邏輯處理。但如今架構升級後,Node.js 承擔了先後端分離重任以後,有了更多玩法。從帶視圖的傳統Web應用和面向Api接口應用,到經過 RPC 調用封裝對數據庫的操做,到提供前端 Api 代理和網關,服務組裝等,統稱爲後端開發,再也不是以往只有和數據庫打交道的部分纔算後端。這樣,就可讓前端工程師對開發過程可控,更好的進行調優和性能優化。
對 Node.js 來講,一直沒有在後端取得其合理的佔有率,緣由是多方面的,暫列幾條。
儘管如此,Node.js 仍是盡人皆知,捲入各類是非風口,也算是在大前端浪潮中大紅大紫。緣由它的定位很是明確,補足以 JavaScript 爲核心的全棧體系中服務器部分。開發也是人,可以同時掌握並精通多門語言的人畢竟很少,並且程序員的美德是「懶」,能使用 JavaScript 一門語言完成全部事兒,爲何要學更多呢?
對於 Web 應用大體分2種,帶視圖的傳統Web應用和面向Api接口應用,咱們先看一下 Node.js Web 應用開發框架的演進時間線大體以下:
co
這個 Generator 執行器,並開始了Koa 項目。2013 年下半年李成銀開始 ThinkJS,參考 ThinkPHPco
和 generator實現同步邏輯,那時候 co
仍是基於 thunkfy
的,在2015年10月30日,ThinkJS發佈了首個基於 Es2015+ 特性開發的 v2.0 版本咱們能夠根據框架的特性進行分類
框架名稱 | 特性 | 點評 |
---|---|---|
Express | 簡單、實用,路由中間件等五臟俱全 | 最著名的Web框架 |
Derby.js && Meteor | 同構 | 先後端都放到一塊兒,模糊了開發便捷,看上去更簡單,實際上上對開發來講要求更高 |
Sails、Total | 面向其餘語言,Ruby、PHP等 | 借鑑業界優秀實現,也是 Node.js 成熟的一個標誌 |
MEAN.js | 面向架構 | 相似於腳手架,又指望同構,結果只是蹭了熱點 |
Hapi和Restfy | 面向Api && 微服務 | 移動互聯網時代Api的做用被放大,故而獨立分類。尤爲是對於微服務開發更是利器 |
ThinkJS | 面向新特性 | 借鑑ThinkPHP,並慢慢走出本身的一條路,對於Async函數等新特性支持,無出其右,新版v3.0是基於Koa v2.0的做爲內核的 |
Koa | 專一於異步流程改進 | 下一代Web框架 |
Egg | 基於Koa,在開發上有極大便利 | 企業級Web開發框架 |
對於框架選型
Tips:我的學習求新,企業架構求穩,無非喜愛與場景而已
Node.js 原本就爲了作後端而設計的,這裏咱們再看看利益問題。Node.js 向後端延伸,必然會觸動後端開發的利益。那麼 Proxy 層的事兒,先後端矛盾的交界處,後端不想變,前端又求變,那麼久而久之,Api接口會變得愈來愈噁心。後端是願意把Api的事兒叫前端的,對後端來講,只要你不動個人數據庫和服務就能夠。
可是 Node.js 能不能作這部分呢?答案是能的,這個是和 Java、PHP 相似的,通常是和數據庫鏈接到一塊兒,處理帶有業務邏輯的。目前國內大部分都是以 Java、PHP 等爲主,因此要想吃到這部分並不容易。
國內這部分一直沒有作的很好,因此 Node.js 在大公司尚未很好的被應用,安全問題、生態問題、歷史遺留問題等,還有不少人對 Node.js 的誤解。
MongoDB
、MySQL
、Redis
等仍是至關不錯,但其餘的數據庫支持可能沒那麼好。這些對於提供Api服務來講已經足夠了,本書後面有大量篇幅講如何使用 Koa 框架來構建Api服務。
Web編程核心
Node.js 編寫的包管理器 npm 已成爲開源包管理了領域最好的生態,直接到2017年10月份,有模塊超過47萬,每週下載量超過32億次,每月有超過700萬開發者使用npm。如今早已經超過60萬個模塊了。
這裏就不一一舉例了,給出一個迷茫時學習Node.js最好的方法吧!
某天,我在3w咖啡整理書稿,而後小弟梁過來了,聊聊他的現狀,一副很很差的樣子,在天津我曾帶過他大半年,總不能無論,我給他的建議是:「天天看10個npm模塊」
對於學習Node.js迷茫的人來講,這是最好的方式,當你不知道如何作的時候,就要向前(錢)看,你要知道積累哪些技能對之後有好處。對於學習Node.js必經之路,必定是要掌握不少模塊用法,並從中汲取技巧、思路、設計思想的。與其不知道學什麼,爲何不天天積累幾個技巧呢?
推薦一個repo即 https://github.com/parro-it/a... 小型庫集合,一天看十個不是夢!
更多討論 https://zhuanlan.zhihu.com/p/...
有朋友提問
狼叔,關注你和cnode好久了,最近有點迷茫,想請你指點下。 個人狀況是這樣的,非科班出身,從事前端工做4年,公司使用的技術棧是vue二、vue-router、vuex、webpack,目前的能力處理工做仍是比較輕鬆,可是也很明確本身有不少不足,只是對於如何提高比較迷茫。 不足: 一、非科班出身,計算機基礎薄弱 二、對當前使用的技術瞭解不夠深刻,不少東西只停留在會用的層面 三、對服務端了解較少,想學node,殊不知道如何系統的學習
解答困惑:
一、計算機基礎薄弱該如何完善本身的知識體系?
答:追逐長尾,所見所聞不懂的都去學就好啦。我是這樣過來的,頭幾年天天14個小時+,很累,不過效果還能夠。os,算法,數據結構,設計模式,編譯原理,基本也就這些重點。作到天天都有進步就好,別貪多求快。數學和英文固然也是越狠越好的!
二、如何在技術上作更深刻的探索?
答:技術人只關注技術,想法創意一般比較少。最簡單的辦法就是抓本身的癢,比我大學時和朋友們翻譯過grails文檔,因此對翻譯有情節。爲了翻譯,我用node寫了無數工具嘗試,反覆對比各類翻譯工具,理解它們背後的設計。包括markdown裏嵌html標籤標識中英文,而後gulp編譯成獨立文檔。甚至一度想上線賣服務。這種折騰真的很爽,甚至耽誤了很多翻譯。有時要警戒長尾,不要忘了本身的初衷
三、如何系統的學習node?
答:階段
1/要會用,能完成工做任務
2/寫點提升效率的工具
3/參與開源項目,甚至是node源碼
應對方法
1/《node in action》看五遍,而後就去寫吧,別管代碼質量如何,能寫敢寫
2/多用些模塊,理解它們,若是有機會就本身寫一下,萬一有不少人用你,我小弟寫過一個地區選擇加載的json數據,star數很多呢
3/給別人貢獻代碼,要去學別人的習慣,網上有git標準工做流和提pr方法,你要作的是精研該模塊代碼,關注issue,其餘就是等機會。另外樸靈的深刻淺出多讀幾遍,試着讀node源碼,你的理解會更好。推薦看看我寫的《經過開源項目去學習》https://github.com/i5ting/Stu...
4/跳出node範圍,從新審視node的應用場景,對將來你的技術選項和決策大有裨益
答:若是有機會就直接上Web應用,若是沒有機會就從前端構建,工具等方面開始作,慢慢引入更潮更酷的前端技術,天然就把Node引入進來了。不要急。
答:初學者推薦Express,若是有必定經驗,推薦Koa。固然真正項目裏仍是推薦Eggjs和Thinkjs這樣的框架。
答:
1)Node in action和了不得的Node.js是入門的絕好書籍,很是簡單,各個部分都講了,但不深刻,看了以後,基本就能用起來了
2)當你用了一段以後,你會對Node.js的運行機制好奇,爲啥呢?這時候去讀樸大的《深刻淺出Node.js》一書就可以解惑。緣由很簡單,九淺一深一書是偏向底層實現原理的書,從操做系統,併發原理,node源碼層層解讀。若是是新手讀,不免會比較鬱悶。
3)實踐類的能夠看看雷宗民(老雷)和趙坤(nswbmw)寫的書
若是你不着急,也能夠等個人那本《更了不得的Node.js》,時間待定。
有朋友問如今Android開發和web前端開發哪一個前景更好?個人回答是明顯是前端更好,看一下移動端發展過程
native < hybrid < rn/weex < h5
目前rn和weex的開發逐漸變得主流,組件化寫法已經由前端主導了。之前ios和android程序員佔比很高,但如今就留1到2個寫插件,真是差異很大。
Web開發對移動端的衝擊很是大。固然如今Web技術也開發PC client了,好比vscode是經過electron打包的,效果仍是至關不錯的。
前端能夠說是最近幾年開發裏最火的部分,緣由不少,最主要是開發方式的變動,以今時今日的眼光來看,稱之爲現代Web開發是不爲過的。
先給出現代Web開發的概覽圖
每次演講我會都問你們是否是前端,回答「是」的人很是多,我會開玩笑的恭喜你們:「如今的前端就是錢端」,確實,如今前端發展異常的快,並且沒有趨向於類比java裏ssh框架的那種穩定,因此將來很長一段時間,還會增加,持續混亂,這對前端來講是把雙刃劍,一方面有很強的壓迫感,不學習就跟不上時代,另外一方它也是機遇,可以帶給更多機會,包括money。
你們都疑惑的一個問題是如何在這樣鉅變的時代可以經過學習來應變,我能夠很負責的告訴你們,沒有捷徑,但經過掌握 Node.js 可以讓你下降這個學習曲線而已,畢竟Node.js是大前端的基礎設施。你們能夠看一下,前端的開發過程,模塊化,構建,輔助工具,調優,架構調整,能夠說Node.js是無處不在的。
其實,輔助大前端開發只是Node.js的一個很是無意插柳的衍生功能,經過掌握Node.js可以讓你能作的更多、得到的更多,甚至能夠說有更多自我實現的快樂,這也是我那本書書名字裏「更了不得的」要去闡述的內容。
綜上種種,就是我一直提倡以 JavaScript 語言爲中心的 Node全棧
概念的原因,JavaScript 覆蓋全部前端,Node.js 擅長作 I/O 密集型的後端,外加輔助開發的各類基礎設施,無疑是工做、學習和成爲快速掌握全棧技術最好的途徑。你會的越多,你能作的就更多,你的人生也將會有不同的精彩篇章。
全棧核心
只要打通這2個要點,其餘就比較容易了。最怕的是哪樣都接觸點,而後就號稱本身是全棧,建議你們不要這樣作,這就比如在簡歷裏寫精通同樣,基本上都會被問到尷尬。全棧是一種信仰,不是拿來吹牛逼的,而能夠解決更多問題,讓本身的知識體系不留空白,享受自我實現的極致快樂。
想問一下狼叔最近的業務一直都是簡單的用express搭一個後端服務,沒有其餘更加深刻node的業務了,這種時候應該如何本身給本身創應用場景呢
沒有目標就向錢看,有目標就向前看
既然沒法逃避,就熱愛它,最後變成興趣
人生不僅有代碼,但它能讓我快樂,終生受益
也曾懵懂,也曾迷茫,但我這人比較傻,一直信奉:「一次只作1件事兒,盡力作到極致」,短期看這是比較傻的,但一旦你堅持下去,你就會發現技術實際上是門手藝,厚積薄發。
我沒辦法說本身最擅長什麼,但在什麼場景下用什麼技術是我擅長的。或者說,應變是我最大的本事。不少框架,新技術我都沒見過,用過,但花一點點過一下,就能拿已有的知識快速的理解它,這實際上是長期學習的好處。
如今愈來愈忙,寫代碼的時間愈來愈少,技術又愈加展越快,我能作好的就是每日精進,仗着這點已有的知識儲備跟年輕人比賽。我不以爲累,相反我很享受這種感受,沒有被時代淘汰,是一件多麼幸福的事兒。
作後端的人
4階段按部就班,build 與工具齊飛
前端開發4階段,個人感受是按照順序,按部就班就好。
從前端日後端轉,api 接口很是容易學會,像 express、koa 這類框架大部分人一週就能學會,最難的是對 db、er 模型的理解,說直白點,仍是業務需求落地的理解
咱們來想一想通常的前端有什麼技能?
那麼他們若是想在前端領域作的更深有哪些難點呢?
以上皆是痛點,因此比較好的辦法應該是這樣的。
從咱們的經驗看,這樣是比較靠譜的。先作最簡單先後端分離,裏面沒有任何和db相關,前端能夠很是容易的學會,基本2周就已經很是熟練了。通常半年後,讓他們接觸【異步流程處理】和【數據庫】相關內容,學習後端代碼,就能夠全棧了。
看一下移動端發展過程
native < hybrid < rn/weex < h5
目前rn和weex的開發逐漸變得主流,組件化寫法已經由前端主導了。之前ios和android程序員佔比很高,但如今就留1到2個寫插件,真是差異很大。狼叔一直執拗的覺得將來是h5的。
如今的 Native 開發是姥姥不疼舅舅不愛,很是尷尬,很明顯連培訓出的人就業不要工資混經驗就很明顯了。另外領導們也都在惦記,能不能用 H5 寫?這還算是保守的,若是直接激進的就直接上 RN 了,那麼 Native開發的程序員就變了
一個寫插件的程序員...招誰惹誰了。。。。
要麼忍,要麼轉,沒辦法,認命吧,溫水裏舒服了幾年,也該學點東西了
原生開發就是 iOS 用 OC/Swift,Android 用 java 或 scala 等,就算偶爾嵌入 webview,能玩js的機會也很是好少
因此移動端轉全棧的方法,最好是從 cordova(之前叫 phonegap)開始作 hybrid 開發。
只要入了 H5 的坑,其實就很是好辦了。
這個基本上是我走的路,從2010年寫iOS、作phonegap(當時是0.9.3)、一路走到如今的總結吧!
之前技術發展還不是那麼明顯,寫 Java 的時候 Apache
的開源用的比較多,那時開源的代碼託管sourceforge
,google code
也都湊合用,自從 Git
和 GitHub
出現時候,代碼社交興起,極大的促進了開源的活躍,使得大量明星項目脫引而出。這是好事,若是沒有開源,中國的軟件水平真是要落後好多年。那麼問題也來了,如何可以在技術快速發展的今天,我的成長也能更好呢?
學習的3種層次,跟人學最快,其次是跟書(或者博客)學,最差的是自悟。可是牛人不能遇到,遇到了也未必有精力教你,書本或者博客,別人有,但不必定寫出來,就算是寫了,可能只是點到爲止。至於自悟,若是沒有深厚的積累的,仍是有至關大難度的。
對於開發來講代碼是一切基礎,在掌握了必定計算機基礎後,其差異就在於代碼質量和眼界。編程沒有捷徑,可以作到每日精進就是極好的。如今開源代碼很是多,要可以從中獲取本身所需的知識,也是一種本領!若是可以堅持着每日精進,根本不須要向其餘人學習的。
你們能夠在 Github 隨便打開一個前端項目,裏面有一半以上都是 Node.js 相關信息,各類包管理、測試、ci、輔助模塊,若是你們對這些基礎信息掌握的很是好,那麼學習一個新的框架,你要比別人快好多,最重要的是學了一次,處處使用。
不少人問我怎麼才能成爲一個 Node.js 大神?個人回答是「在cnode論壇上堅持寫文章和開源項目2年,足矣,輕鬆進阿里騰訊,不用你找他們,他們自會找你的」。
從今天起,開始重視開源項目,重視 node,作到每日精進
先說下個人招人標準,作技術總監時上指下派只要看好技術能力和態度便可,作CTO時要考慮團隊文化,人品和可否在公司長留,因此不一樣的人面試要看的點是不同的,我曾面過不少Node.js程序員,也見過不少面試題,彙總一下,大體有如下9個點:
補充一句:只看技能沒人品的人,千萬別招,白臉狼
主動執行,輔助團隊
掌握一門後端語言;熟悉用戶體驗相關知識;瞭解軟件工程。
精通瀏覽器工做原理,熟悉HTTP協議,熟悉設計模式。
掌握改善無障礙訪問的方法;掌握數據採集分析能力;熟悉可維護性問題。
經過開發、使用、推廣效率工具讓本身與團隊的效率獲得提升;
提煉可複用組件,爲類庫貢獻高質量代碼.
積極完善知識庫;
跨團隊分享技術和專業相關知識。
輔導新人技能成長;
協助主管作招聘和團隊管理工做。
我再知乎上回復的《在跳槽後的第三個月,收到世界500強的offer,我該怎麼辦?》
1)互聯網公司優先,流量大,人才多,機會也多,流程規範一些
2)今天的世界500強不比從前了,普華永道應該是四大之一,不知道信息化怎麼樣,你只要和你如今的公司對比就行了。
3)問問本身想要什麼,錢,經歷,仍是時間
若是你很年輕,如今很安逸,我建議你換。若是不是很想動,那就學會全部能接觸到的知識再換。
我是降薪來的阿里,緣由有三,一是有事可爲,老闆重用你給你機會,二是集團內部是open的,恰恰我知識面足夠能夠看出它們的好處,算是另外一種補償吧,三是對我的品牌是一個升級,狼叔的職業生涯到此已經足夠了,進可攻退可守,也算另外一種自由吧!
錢可能是個優點而已,還有氛圍,文化,信仰
前幾天還和 @蘇千 聊,我和 @死月絲卡蕾特 相繼入職阿里,還有cnode社區著名程序員也即將入職阿里,當時你們開玩笑說:
「前端的終極歸宿是阿里,不是在阿里,就是在去阿里的路上」
另外要說的一點是pc和h5站在使用Node.js作api中間層,其最佳實踐已成型,量也是極大的。之前前端玩得仍是比較弱,若是可以緩存+控制頁面數據,得到一個性能極大的提高也是極好的。2018年,爭取拿這個作主題演講上qcon或archsummit大會。
天天忙得很開心,這就是我如今狀態。其實,個人折騰仍是在於想作些事情。若是你也想跟我一塊兒作事,請將簡歷郵件給我 langshu.ssl@alibaba-inc.com,團隊大量招人,也能夠幫忙推薦給集團其餘部門。
大公司的作事方式
小公司
狼叔常常說的一句:「少抱怨,多思考,將來更美好」,大部分人都喜歡積極的人,遇到問題不怕不躲不避,要相信本身可以解決,最可能是時間問題。
還有一句是:「沒目標向錢看,有目標向前看」。歷史上不少這樣的例子,在2010年左右iOS開發剛起步,會拖拽弄個界面的就五位數工資,比作JAVA的幾年的都要多。這世界就是這樣不公平。可是你也不能不思進取,這樣也是極其危險。在2016年左右,其實iOS開發就遇到了市場飽和的問題,不少培訓出來的人都找不到工做,各家公司都在考慮換react-native或weex或者h5。
因此,當你有機會進入一個頗有前途的方向,你要努力學好,並準備好下一個階段的應變。相反,若是當成找一個養老的地方,遲早會遇到尷尬的。好比如今不少iOS程序員被迫去學react/vue等,境遇也不太好的,更有甚者直接被開除。
職位描述
職位要求
PixelLab是與淘寶GM Lab聯合成立的專一於視頻算法方向的研發部門,主要涉及視頻的空間感知、軌跡跟蹤、圖像分割、遮擋檢測以及照片級渲染等相關技術。用於實現視頻內的內容植入與後期特效的研發,屬於視頻MR的場景,主要應用於廣告植入平臺的研發,方向靠譜老闆人好,歡迎推薦。主要須要的崗位包括了圖像算法、3D視覺算法,渲染算法,WebGL以及並行計算等幾大方向,由於算法類招聘實在難,因此將JD的連接帖出來但願同事們有適合的人能夠內推一下。
崗位要求:
1) 本科及以上學歷,5年以上工做開發經驗;
2) 紮實的計算幾何基礎,熟悉常見數學工具;
3) 熟練WebGL, Canvas渲染開發,熟練Shader編寫, 熟悉Three.js, OSG.js者優先;
4) 熟練運用JavaScript語言與HTML五、CSS3等技術;
5) 熟悉主流移動瀏覽器的技術特色,有移動端H5, WebGL項目經驗者優先;
6) 有移動端WebGL開發經驗者優先;
6) 學習能力強、應變能力強,優秀的溝通能力和協調能力,執行能力強,具有較強的團隊合做精神。
崗位要求:
咱們的前端專業建設方向
目前北京,杭州,廣州,上海,深圳,成都都在招聘,若是你也想跟我一塊兒共事,請將簡歷郵件給我 langshu.ssl@alibaba-inc.com,團隊大量招人,也能夠幫忙推薦給集團其餘部門。
有機會和winter,勾股,玉伯,蘇千,樸靈、死馬、偏右,徐飛,阮一峯,天豬,裕波等大神一塊兒工做哦。
悄悄地說,其實其餘公司我也能夠幫推薦。
年輕時死磕,年長點讓小弟死磕,如今抓個專家一塊兒吃飯,沒有什麼是一頓飯解決不了的,不行就二頓
工程師的能力不是編碼和死磕,而是解決問題
強調30歲不是我創造的,大部分人都會認爲30歲後事情,壓力會明顯大得多,好比家庭,孩子,房子,車子,票子,甚至是管理,權利,慾望等等吧。我感覺最深的是身體不如從前和記憶力明顯降低。
狼叔說: 「少抱怨,多思考,將來更美好」
大部分人體會不到堅持的樂趣,不會玩,因此抱怨多。其實玩出樂趣也是一種能力,尤爲是像寫代碼這種看似無聊的事兒。最開始可能只想賺點錢,後面變成熱愛,這樣才美好。只要堅持每日精進開心就行了。
另外,時間也要好到處理,狼叔總會提菜根譚上的一句話:【閒時要有吃緊的心思,忙裏要有偷閒的樂趣】。
每一個人的一輩子中都有不少坎,相似於瓶頸,惟有苦難和堅持才能衝破,堅持會產生自信,苦難會創造機會。一個通過苦難還有自信的人,必定會有更美好的將來。
若是你們還有問題,能夠去cnode社區發帖at我,也能夠在Node全棧公衆號提問。
答疑有點多,這裏就不一一貼出來,若是是新用戶和比較迷茫的Node朋友去Live裏聽吧。