樸靈:打破限制,從前端到全棧(圖靈訪談)

盼盼姐發表於2015-05-19

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

樸靈:打破限制,從前端到全棧(圖靈訪談)

從前端到全棧

“當時我們團隊的Leader不會去限制工程師做什麼事情,而是說這件事是你在負責,所以你就要從前做到後。”

問:你從什麼時候開始程式設計的?

我高二的時候才剛剛接觸網際網路,那時候看別人搭一個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。

這個過程其實收益還是很多的。首先我對這個社群更加了解了,跟很多高手都很熟悉。另外,我接觸了很多贊助商,各種資源其實都是大家互相需要的。沒做過這件事的人可能會覺得非常難,但做了以後你會發現沒有想象中那麼難。因為你總是會得到一些幫助,來自各個方面的幫助,你在經濟上也沒有什麼損失,還會結交一些的朋友。有一個圈子,有一個社群,其實你會收穫很多東西。


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

相關文章