樸靈:打破限制,從前端到全棧

非商業轉載請註明做譯者、出處,並保留本文的原始連接:http://www.ituring.com.cn/article/197773前端

樸靈,真名田永強,文藝型碼農,Node.js佈道者。現就任於阿里巴巴數據平臺,任資深工程師,著有《深刻淺出Node.js》。他活躍於CNode社區,是線下會議NodeParty的組織者,同時也是JSConf China(滬JS、京JS,以及杭JS)的組織者之一。樸靈熱愛開源,是多個Node.js模塊的做者,我的GitHub地址:http://github.com/JacksonTian叩首問路,碼夢爲生。git

圖片描述

從前端到全棧

「當時咱們團隊的Leader不會去限制工程師作什麼事情,而是說這件事是你在負責,因此你就要從前作到後。」github

問:你從何時開始編程的?編程

我高二的時候纔剛剛接觸互聯網,那時候看別人搭一個BBS我內心就特別崇拜,我很好奇這個過程是怎麼實現的。之前有一個叫「中國博客網」的網站,上面提供了能夠本身編輯模板的功能。在那個年代,腳本特效很流行,我常常把代碼拷到那個模板裏面去,測試效果。後來上大學以後我才知道,這個論壇的構建者其實就是利用了一個相似於Discuz的系統,搭這個網站並無想象中那麼複雜。後端

問:據說你在大學學的是Java,在這過程當中你的興趣點有沒有轉移?緩存

學校教了不少東西,可是個人重心一直放在前端技術上。雖然學校教了C和C++這樣的語言,可是教了以後也不告訴咱們這個東西到底有什麼用,因此我當時仍然癡迷於網頁。工做幾年之後才發現學校教的東西頗有用,因此如今再回去補。服務器

問:你是怎麼變成所謂的全棧工程師的?是你本身的興趣使然仍是工做環境給了你這樣一個機會?微信

我通常不說我是全棧工程師(笑)。我剛進大學的時候,目標其實很明確,就是想看看那些JS特效是怎麼實現的。2009年畢業以後我開始工做,就側重去作前端。那時候前端也纔剛剛興起,後來我就成了一個真正的前端工程師。前端工程師

去了淘寶以後,我碰到了Node.js這樣一個我很感興趣的東西,我用了兩年時間完成了從前端工程師到全棧工程師的演變。個人我的習慣就是,若是我對什麼感興趣,就會在這塊投入精力去研究。因此經過這一兩年的學習,我已經能夠完成所謂的後端的工做了。當時咱們那個團隊由空無和玄澄帶領,他們不會去限制工程師作什麼事,而是說這件事情是你在負責,因此你就要從前作到後。多線程

問:在你看來全棧意味着什麼?你在QCon大會上主持了這個專題以後有沒有帶給你一些新的思考?

之前我認爲全棧就是一個開發者能力的提高。若是你在某個領域很是專,有一個點很擅長,這時候別人才稱你是專家;若是你有多個點比較擅長,那別人纔有可能稱你是全棧工程師。另外,責任也很重要。一我的再也不只是負責在前端寫CSS,也不僅是在大工程裏面作一小塊東西,而是有了一個全局的視野。我之前對於全棧工程師的理解可能就是集中在工程師我的能力以及責任這兩點上,經過主持Qcon的全棧工程師專題,我以爲還有一點,就是環境對全棧的影響。

我的能力是不太好複製的,有的工程師能力強,有的工程師能力沒那麼強,這種狀況下你對能力稍微弱一點的工程師作這種要求,是很難達到目標的。Coding的分享給我帶來了這個想法:基礎設施建設對全棧的影響也是很大的。若是你不能幫助一個工程師成長,那就應該在環境上作出改變,你要去打造適合這樣的人才成長的環境才行,這樣纔是正向循環。

問:淘寶如今使用Node.js的範圍有沒有擴大,主站有沒有在用?

主站也有在用。如今幾乎每一個BU都在用Node作嘗試,無論它作的是大系統仍是小系統。我看到有不少團隊嚐到了甜頭,但我也看到有不少團隊不肯作改變,不肯去嘗試新技術。

問:方便說一下你如今的工做內容是什麼嗎?

我最近半年在社區都不怎麼活躍,是由於我作的內容剛剛開始,如今纔有了一些進展,未來咱們有計劃把咱們作的東西對外產品化。我如今的主要工做就是改Node.js和V8。在Node.js上改動我會直接接到Io.js的倉庫裏面,如今已經提了不少。

我能夠舉個例子解釋一下咱們如今作的事情。在Node.js社區上有一些性能調優的工具,好比Chrome上有個CPU調優工具,它能夠幫你找出哪段代碼運行得比較慢。咱們在這個基礎上作了更多的工做,咱們作的這個性能調優的工具不只要知道慢,還要知道爲何慢。用個人工具掃過以後,我就知道怎麼去改,其實如今我打的不少補丁都是經過這個工具發現的。形成性能慢的緣由可能有不少,咱們儘可能去發掘這些問題。

另一件我在作的事情就是幫助公司內的一些Node開發者。好比,這些開發者可能作業務開發時沒有什麼問題,可是運維或者運行的時候就會出現問題。咱們工做幾年來,並無由於使用Node.js而形成什麼故障,高手寫代碼不太容易出現問題。可是對於每一個工程師來講要求是不同的,我如今的工做重點就是:出問題的時候可以立刻解決。線上代碼慢的緣由是什麼,爲何會有內存泄露,咱們作了一些工具來解決這件事。

雖然用一個新技術的時候可能感受很爽,可是這個技術會帶來什麼後果或者反作用,可能對於不少人來講都是沒底的。爲了讓阿里的技術環境可以更健康地發展,咱們的工做就是要讓你們知道,咱們不怕這樣的問題出現,能出現咱們也能解決。如今咱們努力在公司之內創造更好的環境,在將來咱們有計劃把這些東西推出來,但願國內其餘用Node.js的公司也能從咱們的工做中獲得一些好處,獨樂樂不如衆樂樂。咱們但願本身可以作更多的事情,有朝一日能成爲Io.js或者Node.js項目裏面的核心貢獻者,而後去影響它。

問:淘寶UED正在實踐先後端分離,應該也有其餘團隊在作相似的事情,你怎麼看?

我我的沒有直接參與這樣的事情。我以爲先後端分離是否能完成的核心在於服務化的程度。若是系統都是面向服務去設計的,那麼在這個過程當中解耦可能很容易完成。因此當你真正作一個前端應用層的東西時,就不須要Java的同窗來參與幫你寫模板,而這個應用層多是跟業務相關的。

這裏的一個概念就是產品應該有兩個部分:一個部分是系統層,另外一個部分是應用層。應用層的需求可能每天變,可是這種改動基本上不怎麼影響底層系統的穩定性。系統層應該是趨向於穩定的,除非業務模型上有一些大的變化的時候纔會去改動。而日常的平常迭代,也就是應用層,會有頻繁的發佈和改動。

若是把兩層東西都混在一塊兒的話,整個系統就會很龐大,界限不清晰。後端的人會干預前端的東西,前端有需求的時候可能後端的同窗也不能理解。在這過程當中我以爲能夠把應用層獨立出來,讓前端的同窗可以在中間有一個緩衝地帶,既能適應應用層的頻繁發佈和需求改動,又能讓後端穩定。

問:JavaScript有不少框架和庫,對於初級學習者來講,怎麼能在這些資源中選擇適合本身的來建立我的技術棧?

我以爲JavaScript最核心、最源頭的東西就是它的規範。固然,若是你純粹去讀規範的話也沒有什麼目的性,但那是一個核心。當你遇到困惑的時候就不妨去規範上找一找,一般你都能找到答案。這對於我來講是核武器同樣的東西,通常不能用的(笑)。

另外,ECMAScript不算是純粹的API,它定義的實現就不能更改,對於那些沒定義的實現,你要去看那些API是怎麼去作的。我基本上主要靠這兩個東西。

他眼中的Node

「有一個圈子,有一個社區,其實你會收穫不少東西。"

問:能不能簡要介紹一下Node生態環境的發展示狀?

這個話題其實我已經好久再也不提了,由於現狀已經太好了。前幾年的時候模塊有幾個了、有幾千個了,而後過了一年這個數字就上萬了,再過一年就蹦到十萬以上了。

我是蠻喜歡這樣一個形態的,在跨過一個相對比較低的起點以後,你們可能都有能力來完成一個模塊。可是,每一個工程師的能力有強有弱,每一個人的意識都是不一樣的,因此這個生態環境又是特別真實的。這裏面的東西多,水平良莠不齊,但你會發如今不少狀況下,若是一個模塊是活躍的,它就一直是活躍的;若是它的質量很差,它就永遠都是質量很差的。說不定幾年之後,你會發現愈來愈多的模塊都是以不斷迭代更新的狀態生存的,老是有最好的模塊來適應當下最須要的事情。

問:我以前聽你在採訪裏說,你當時推廣Node的初衷是由於你看到國內外對Node的理解存在很大差距,如今還有沒有這種差距?

如今仍是有。我以爲最大的差距就是在國內推一個技術的時候,總會有不少人來黑。這些人可能也沒有什麼前提,無論怎麼樣,就是嘴巴爽了再說。另外,國內外環境還有一個差距,就是在國內你們主動刷新本身知識的能力還不是太強。你會發現有一些工程師可能已經能完成當前的工做了,可是他在持續學習上可能不會投入太多。

問:你認爲前端工程師和後端工程師誰更應該學習Node.js?誰學習Node獲益會更多?

其實不管什麼工程師學習Node均可以有收穫,可是我以爲前端工程師的收穫會更大。

爲何要有前端這個工種?我不知道國外是否是這樣,可是國內不少人會說前端工程師就是寫HTML和CSS的,這種工做就像流水線同樣,已經被限定在一個劃定的圈裏面去發展。當前端工程師發展到某一個階段的時候,他會發現這個圈子對他是一個限制。我以爲前端工程師須要打破這個圈子,打破以後就會發現更開闊的視野。當咱們想要解決一個問題的時候,就不僅是再用已有的熟悉的辦法來解決,而是發現視野之外的、可以更好地解決問題的方法。反過來講,若是你老是不想去了解服務器端的一些技術,老是用前端的方法來解決問題,那成本可能很高,作出來的方案也可能不理想。

先後端有Node.js鏈接之後,你就會發現本身的工具鏈已經完成了一次革命。不少工程師可能會用Java或Ruby來寫一些工具,可是前端工程師不熟悉Java,也不熟悉Ruby,他要去完成目標的時候就會特別困難。如今Node.js出來之後,你就發現不少工具直接用Node.js就能夠寫了,好比說CoffeScript,還有一些像LESS,Sass之類的工具。前端工程師用本身熟悉的東西就可以改良本身的工具,這是第一步。改良工具之後視野就會放開,你會發現還有不少其餘東西能夠放手去作。

問:你怎麼看LinkedIn放棄Node和Scala?

作任何一件事情都會有最適合的方法。我以爲像LinkedIn這麼大的系統,實際上是一種很複雜、很複合的模式。咱們在淘寶推廣Node.js的時候,也不可能去用Node把那些最底層最核心的東西替換掉,這是不現實的。若是說在某個系統裏面,Node.js不能勝任某些工做,那就不要用它好了。

聽說LinkedIn也並無徹底放棄Node,只是某一部分棄用。我以爲Node.js是有它擅長的地方的,只要可以在適合的地方去用好就好了。

問:Io.js和Node.js分離開來,是由於Node更新太慢形成的嗎?

大部分緣由可能在於,雖然Joyent公司高管對這個項目還算重視,可是他們對開發進度沒有實質的幫助。

從2014年7月份開始轉崗之後,個人工做重點就是Node.js的內核,因此我對Node.js和Io.js的提交列表和PR都是比較熟悉的。我發現當我提交一個補丁上去的時候,在Node.js下面的處理速度特別慢。我剛進去的時候看到的PR列表大概只有兩百多個,如今Io.js分出去之後PR列表更長了。那些在這個項目上作貢獻的人,基本上80%已經不在這家公司了。因此如今出力的人並非來自這家公司,而是社區的一些開發者。若是這家公司只想享受商標帶來的好處,貢獻者們就不會贊成,因此他們就獨立出來了。

目前來講我本身是比較喜歡Io.js這個項目的。我跟他們提一個問題上去,很快就會有反應。他們的態度也更開放,就是說無論你的貢獻是大是小,只要對這個項目有好處的,他們都會接受。而且他們對新事物的接受速度也更快,好比如今Node.js的V8版本處於3.2,而Io.js裏面的V8已是4.2了。若是更新慢的話,ES6的一些特性就沒辦法引進來。由於Io.js中有這些新的特性,因此開發者就更願意進入這個項目。

可是Io.js也給我形成了一些困擾。之前一個版本發佈至少也要一兩個月,可是如今的版本發佈速度已是以周爲單位的了,幾乎每週都能出一版。他們更新速度太快逼着我要去作不少工做,須要不停地打版本。話說回來,實際上企業內部升級版本的速度要求不是太快,升級一個大版本之後,若是不須要接下來小版本的功能,就能夠先忍忍。

問:你以爲Node陣營的分裂是一件好事嗎?

我以爲是好事。我記得好久之前就有人特別想給Node.js的異步IO所有加上Promise,若是不分裂,這件事情永遠不可能。雖然如今的Io.js也不能完成這件事,可是隻有分裂纔有更多的可能性,才能產生更好的東西。

問:不少大公司好比Paypal,從Java轉換到Node.js很是成功,在後端Node.js會取代Java嗎?

不太可能,Node.js仍是在應用層上更有優點。不管是咱們在系統層所作的嘗試,仍是如今已有的案例,都沒有可以證實Node.js可以取代Java。我舉個簡單的例子,如今沒有人能拿Node.js來完成緩存或者涉及到集羣的大計算,可是Java已經可以作到了。

可是Node.js在應用層上是有優點的,它的最初設計目的就是要優化IO和CPU的關係。之前的IO都是要阻塞CPU計算的,Node把全部IO相關的東西所有從主線程上剝離之後,主線程就變得比較高效。而咱們在Java裏面去實現異步是比較麻煩的,可能須要啓用多線程。雖然Java也有框架去作這件事,可是對已有的開發者來講,因爲他們對原有的模式已經很熟悉,因此不會願意去作改變。應用層就應該可以快速運行而且面向不少系統。我能夠用Node.js快速地開發,調用各個系統。

問:剛纔你也提到,有些人認爲Node.js在設計上最大的失敗就是它的API是基於Callback,而不是基於Promise的,你贊成嗎?

當時的狀況就是那樣,ES6沒有出來,Generator也沒有出來,若是讓Node.js創始人Ryan Dahl去作這件事,他不只要去改上層的東西,還要去改JavaScript。可是如今的狀況已經有變化了, ES6已經出來了,它裏面有一個東西叫Generator,運行過程當中咱們讓程序調用棧停下來,而後在某個時間再從新把它喚起來。新的框架Koa就可以利用好這個特性,寫程序的時候你會發現程序已經順序執行了,可是背後的實質仍是異步。我以爲這些變化未來可能會慢慢影響Node.js自己的設計,甚至未來Io.js的API可能也會慢慢去改。

另外,之因此當時會有Callback這樣的設計,就是由於當時的Callback特別適合異步調用。這樣作的緣由也跟當時選JavaScript有很大的關係。Ryan Dahl去調研過Java、Ruby之類的語言,他發現這些語言提供的API有很重的歷史負擔。這時候若是給開發者提供新的API,你們也不會去用,由於這會改變他們的思惟模式。他在設計這個模型的過程當中,發現事件循環裏面有阻塞IO的話就會致使效率急劇降低。而JavaScript特別適合完成這項工做,它不主動提供同步的API給你,因此阻塞的方式就不存在。

問:今年你還會不會舉辦京JS或者杭JS?

今年舉辦的會叫深JS。咱們今年沒有主動去辦會,而是由以前咱們的一個合做方去承接了這件事。他們是上海的一家外企,對JS社區有比較高的熱情,過去三年舉辦的會他們都幫助咱們作了不少事情,此次交給他們辦也是瓜熟蒂落的。

問:之後你還會再舉辦這樣的活動嗎?你在這幾回辦會的過程當中遇到過什麼困難?

咱們之後不排除仍然會舉辦這樣的活動。有一次在北京辦會,咱們三我的都身在外地,全部的事情都是經過遠程操做,在外地辦會感到資源上的限制。另外的一個困難在於溝通,好比怎麼去邀請國外的講師或者跟咱們國外的主辦方溝通,中西方的文化差別會形成一些困擾。

我以爲辦會最重要的仍是內容,對內容的挑選和審覈,講師怎麼邀請,主題要怎麼規劃。不能某個主題今年講,明年講,後年講,有的公司可能出於商業目的有這樣的需求,但有些東西是不能去妥協的。

問:縱然有這麼多困難,可是你仍是一直在堅持作這件事,舉辦這樣的活動對社區來講最大的收穫是什麼?

其實在辦活動這件事上,我有一個老師叫周裕波,我在上海工做的時候就遇到過他,他常常會辦一些前端的活動。對於我的開發者而言,他們不多願意主動出來組織這些活動,但周裕波作到了,我以爲我應該也能爲Node作一些事情。當時我看到Node沒有這樣的氛圍,國內的不少開發者都不肯意出來,當時的社區也關注不到這個東西,因此我就辦了不少次NodeParty。

這個過程其實收益仍是不少的。首先我對這個社區更加了解了,跟不少高手都很熟悉。另外,我接觸了不少贊助商,各類資源其實都是你們互相須要的。沒作過這件事的人可能會以爲很是難,但作了之後你會發現沒有想象中那麼難。由於你老是會獲得一些幫助,來自各個方面的幫助,你在經濟上也沒有什麼損失,還會結交一些的朋友。有一個圈子,有一個社區,其實你會收穫不少東西。


更多精彩,加入圖靈訪談微信!

圖片描述

相關文章
相關標籤/搜索