趙望野:前端工程師的困惑

ituring發表於2015-01-07

  趙望野,現任豌豆莢Front-end Team Lead。他2011年加入豌豆實驗室,曾負責豌豆莢 Windows 版的前端架構設計和主要開發工作,以及 Front-end Infrastructure 的研發工作。當豌豆莢從一家初創公司成長為一家獲得上億美元投資的企業的時候,趙望野也在他的職業道路上不斷成長著。隨著業界對前端工程師價值的逐漸認可,越來越多的人才開始進入這個領域,而趙望野卻認為這一切都“有點晚了”。他的困惑來源於變化的環境和前端工程師這個有些特殊的群體。而他,也逐漸從一個單純的工程師變成了一個以解決問題為目的的人。

 新路

“我覺得我不傻,這個公司到底靠不靠譜,我幹一陣是能夠判斷出來的。”

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

  我第一次寫程式碼應該是七八歲,因為我爸爸是哈工大的教授,所以計算機是作為年輕的科研工作者得的獎。寫程式我第一次用的是Basic,而第一次做有介面的東西,用的是Visual Basic。我是在初二的時候第一次接觸網際網路,那時候接觸了一點點Web開發。

  問: 你大學學的是什麼?跟計算機有關嗎?

  我是在中國傳媒大學上的數字媒體藝術專業,算是相關。因為本質上專業培養目標是能夠利用新媒體技術、藝術結合去做一些事情。雖然我們專業到目前為止也沒給新媒體一個準確的定義,但是網際網路肯定算是新媒體之一了。而我自己的個人興趣是做一些網路、Web開發方面的事情。

  問:你現在從事的工作都和你的專業相關嗎?

  算是相關。你很難確定某個東西到底是不是網路多媒體,因為這種交叉學科口徑很寬泛,包括我們專業課的設定,學的東西也是非常雜的。我前兩屆的學生還在學數位電路、類比電路這種純工科的課程,到我這屆就刪掉了。我這個專業比較新,我研究生的導師是這個專業的創始人,2002年是第一屆,所以我入學的時候還沒有畢業生。這個專業到底應該是幹什麼的、怎麼發展,也是在一個逐漸摸索的過程。但本質上,我現在做的這個其實算是Web前端,就是UI,那UI算不算網路多媒體呢?我覺得是算的。

  問:其實你現在用的很多技術都不是在學校學的吧?

  對。我覺得這是一個普通現象,不只是前端,甚至很多的後端工作,比如做Windows客戶端或者做iOS客戶端開發都是。因為本科教育相對還是一個比較基礎性的教育,我覺得不會有專業去教你JavaScript,有的話也都是像選修課這樣的形式。專業基礎課大部分還是比較經典的教學語言,像C,或者是Pascal,也有可能是C++。更重要的是基礎,比如資料結構、演算法、作業系統這些。不會有一個大學專業課教你一個框架、教你一個具體的技術平臺、怎麼去做移動開發、怎麼去做Web開發。所以我覺得這應該是個普遍現象。

  問:你是怎麼加入豌豆莢的?

  在2010年年底的時候,我當時已經是研究生了,帶著我們的本科生來創新工場參觀,當時有人接待了我們,說:我們在招人,有想來實習的同學可以留個簡歷。本科生沒有一個留的,但我留下了我的簡歷,相當於我把簡歷扔給了創新工場的人力資源庫。當時大概面了兩三個專案,除了豌豆莢,剩下的我都不記得了,。我面試的時候豌豆莢還沒搬出創新工場,我入職的那一天是他們剛剛從創新工場搬出來到自己獨立的辦公室。

  問:選擇一家初創企業其實還是很有風險的,你是如何決定的?

  我覺得這首先是個個人選擇問題。第一、風險肯定是和收益並存的。第二、因為我當時也只是實習,其實對創業這事本身並沒有什麼概念。包括創業會有多大風險,到底會面臨什麼樣的困難,會有多少收益,其實並沒有一個很直觀、很明確的判斷。我周圍的師兄師姐,包括我的同學,也沒有人蔘與過創業,大家對網際網路創業這事也都不很瞭解。本質上,首先我覺得我不傻,這個公司到底靠不靠譜,我幹一陣是能夠判斷出來的,當時也是實習,對我來講風險並沒有那麼大,因為我並不是畢業找工作,所以先幹著唄。大概幹了一個Q吧,就覺得這裡還挺好的。

  豌豆莢的文化和氣場現在對於很多人來說是很有吸引力的,你去的時候,有這樣成型的文化和氣場嗎? 有,但是我覺得公司文化這件事,並不是你刻意想要一個什麼樣的文化。本質上說,早期加入的人少,跟你一起工作的人你喜不喜歡,如果你喜歡的話,說明你們的氣場是相似的,你們做事的方法、態度,包括三觀應該是一致的,慢慢地這些人聚在一起自然而然形成了這樣一個文化。但是可能到一兩百人之後,才會有意識地回來把這個東西總結一下,“我們的公司文化是什麼樣的”,才去對外傳達這樣的思想,而並不是很早的時候就說我們要一個什麼樣的東西。比如像豌豆莢的三個創始人在一起,我加入他們之後,會覺得以前這幾個人做事的方法、價值觀跟我都是相符的,我自然也喜歡他們,所以就加入這了。

 前端工程師的困惑

“如果Web技術在移動裝置上面的消亡是一個不可避免的技術潮流的話,那可能前端工程師真的要好好考慮一下怎麼去規劃自己的職業路徑了。”

  問:幾年前,很多人對前端工程師的價值並不是很認可,你覺得最近這幾年這方面有沒有改觀?

  我覺得是有改觀的,但是有點晚了。現在的情況是,大家並不是不認可前端工程師的價值,而是說這個水太渾了。前端工程師數量很多,但是這裡面真正意義上可以被稱作合格的前端工程師的數量並不多。比如我會切個圖,會拼個簡單的頁面,現在傳統行業也在做內部系統或者自己的門戶站,像這樣的程度無論從工程質量還是專案複雜度來講,簡單的培訓都可以完成。這有點像專業技能,大部分前端工程師的能力就停留在鉗工、電工這樣的水平,而並不是一個真正意義上的軟體工程師。

  我們認為合格的、符合我們用人標準的前端工程師是我能把他當成一個真真正正的軟體工程師來對待,這個數量是比較少的。大家覺得前端門檻比較低,很多人都能做,技術含量比較低,但本質上不是這樣的。

  近些年有所改善是因為網際網路泡沫破裂之後,行業開始進入了一個健康的發展狀況,競爭也進入比較正常的狀況了。任何行業都是這樣,行業健康發展的一個標誌就是很多人開始做同質化的事情。這個時候前端工程師的價值就體現出來了,因為前端工程師是最終決定你的產品能不能從80分進到100分甚至120分的人,是體現競爭力的。比如同樣我都是做一個閱讀軟體,或者SNS網站,其中一部分是產品設計師或者PM的工作怎麼樣,如果我們把變數變成一致的話,差別就在前端工程師上。他們實現的東西到底是不是使用者便於用的:介面精美,使用體驗流暢,載入速度快。前端工程師會在同質化競爭時體現出競爭力的一部分。

  如果一家初創公司不注重這一塊,不把使用體驗當作一個競爭力,那說明這家公司還是處在一個比較初期的競爭階段,因為沒有競品,他們拼市場、拼功能,當有了競品之後才會去拼產品。產品競爭力的一部分是由產品設計師和PM來決定的,另外一部分就是前端工程師,特別是對Web產品來講。

  我為什麼說這事有點晚了呢?因為現在已經進入移動互聯時代了,PC上面的Web流量大幅萎縮下降,但是卻並沒有轉到移動裝置的Web上面,而是轉到移動App上面。在移動終端上,Web技術只能作為一個補充,移動裝置並不是Web前端工程師的主戰場。所以現在很多前端工程師會比較迷茫,或者說未來怎麼發展,是不是要轉行去做Android開發,或者iOS開發,很多人會有這樣的想法。包括我們自己的前端團隊其實也在探索前端工程師在移動裝置上怎麼去發展,如果要轉型的話,怎麼轉,我們做一些什麼樣的事情是更能體現出我們價值的。

  問:到底什麼是前端?

  我覺得現在前端的概念比以前大家所普遍認識的範圍要廣。前端工程師是幹嘛的?做UI的。這個詞在英語裡面本身指的是介面, interface本身並不只是你看得見的,一個能點的按鈕叫interface,USB也是interface,火線的IEEE1394介面也叫interface,所以它指的應該是兩個系統進行資訊互動的中介。所以前端工程師做的應該是能夠把服務或系統轉換成使用者能夠接受的形式。比如我是豌豆莢的前端工程師,豌豆莢能提供什麼樣的服務,我把背後的複雜的技術系統轉換成使用者能夠接受的資訊形式。比如,我把應用搜尋或者我們現在做的應用內搜尋轉換成這樣的資訊形態交給使用者。使用者看到的就是我手機上的一個App,或者在Web上面的一個搜尋框,同時,能夠把使用者輸入的資訊,再包裝成系統能夠接受的形式傳遞回來,作為一箇中介在裡面存在。

  我們現在說的前端其實是指狹義的Web前端。我們的技術團隊其實也在探索,是不是整個做客戶端開發的,都可以叫做前端。無論Windows開發、iOS,或者做Andriod開發,平臺複雜度都要比Web高一點,但是做的事情是一樣的。比如說使用者給了我一個搜尋請求,怎麼去查我並不管,我只是把這個東西扔給後端,後端把結果返還給我,我把它做成一個互動流暢、介面精美的體驗,把這個結果包裝一下還給使用者。前端工程師的視野一定要非常開闊,純從使用者角度看可能是更偏向於PM或者設計師,純從技術的角度看可能會偏向於架構師,我覺得前端會在這裡面找一個平衡。

  問:你覺得現在前端工程師的發展路徑可以是什麼樣的?

  如果你要說三四年前,可能還是PC上面的Web會佔主導,那個時候客戶端完全沒有辦法跟這些做網際網路的公司競爭,做網際網路最主要的就是在瀏覽器裡面落地。現在這兩年,移動網際網路的發展很快,前端工程師會有點迷茫,不知道自己該幹嘛了。因為如果一個公司只做移動端的話,那很有可能前端工程師在這裡面就是一個非主導的地位,在工程團隊也會比較邊緣化。但這個題怎麼解,我們沒有辦法給出特別好的答案,因為我們自己也在探索。但我也並不覺得這是一個問題,因為如果你是一個工程師的話,就知道任何事物都有發展的自然規律,如果我們有一天認為Web技術不適合移動終端這種使用場景的話,那前端工程師就轉行幹別的吧,可以去做Andriod開發或者做iOS開發。

  問:關於Web應用和原生應用爭論,你有什麼看法?

  現在整個前端圈子裡面有一小撮人,有點像原教旨主義者,他就覺得Web是一個神聖不可侵犯的既有體系,“客戶端已死,Web永生”,他們覺得在移動裝置上面,Web終有一天會趕超原生應用。但我覺得這不是目的,Web只是一個技術手段,為什麼一定要在移動裝置上趕超原生技術呢?

  所有的工程師還是首先應該把使用者放在第一位,你要解決的是使用者的問題,而不是用一個特定的技術手段去解決使用者的問題。我見過很多人,他們到處去跟人爭辯,說Web現在發展得很快,一定會在移動裝置上大有所為的。但是沒有辦法迴避的是,Web確實效能沒有原生應用好。也有人反過來說,過幾年隨著硬體的發展,手機CPU變得更快,記憶體更大,那Web技術可能就會變得更快了,但是他們忽略了一點,Web變得更快的同時,原生技術也更快了。

  雖然我是豌豆莢的前端工程師,但首先我是豌豆莢的工程師,所以我要解決的是使用者在使用移動裝置時遇到的問題,而我的目的不是用Web技術去解決他的問題。這兩年我們也看到很多大公司成功地把自己在移動終端上面的客戶端,從混合形式轉成了純原生形式。比如Facebook,這是大家都公認的比較優秀的產品,他們曾經在早期的時候選擇用混合的技術形式做移動客戶端,但是最終放棄了,都轉成了純原生的開發。而iOS開發和Andriod開發又完全分成了兩條技術路線。

  問:還有沒有其他技術路線?

  可能會有一些比較特殊的。比如最近Google在公測的軟體叫Inbox,它選擇的一條路是,用Google的GWT和另外一個叫J2Obj-C的框架寫了一份程式碼,但他們把這份程式碼編譯成JavaScript的Web版在瀏覽器裡用。又因為程式碼是Java的,所以就可以直接在Andriod裡用,然後我再把它轉成Objective-C在iOS裡面用。但這些都跟Web沒有必然的聯絡,雖然我寫的程式碼可以在瀏覽器裡跑,但它並不是一個Web技術的解決方案。所以這些東西到底是不是前端工程師的工作範圍,未來會不會轉向這條路,其實我並不知道。如果Web技術在移動裝置上面的消亡是一個不可避免的技術潮流的話,那可能前端工程師真的要好好考慮一下怎麼去規劃自己的職業路徑了。

  問:為什麼Web前端工程師會感覺轉行很困難呢?

  我遇到過很多人以前可能是做Windows客戶端開發或者是做Server端開發的,做Windows的可能轉Server了,做Server的可能轉去做Andriod,或者轉去做iOS,並不會有特別大的困難,因為他們的基礎知識是沒有問題的,就像我剛剛說的資料結構、作業系統原理這些知識體系的基礎。但為什麼Web前端工程師現在會覺得轉行很困難呢?原因在這:他們的基礎知識有缺口。

  我們現在的實踐經驗就是:如果一個很有經驗的Web前端工程師去做Andriod或者iOS,可能在使用者體驗這塊的感覺會比較強,但技術上並沒有任何優勢,因為Web平臺的複雜度比iOS和Andriod低得多。很多公司招Windows客戶端工程師的用人標準是非五年經驗的我不招,為什麼?因為Windows平臺複雜度很高。如果你C++程式碼寫得再好,但是沒有做過Windows平臺開發,沒有那三五年的時間去摸索Windows平臺的API和特性,你是不可能做好Windows客戶端開發的。Web前端也是客戶端開發的一種,只不過是限制在瀏覽器這個技術平臺裡面,而瀏覽器這個平臺的複雜度是遠低於Andriod和iOS的。這就是為什麼很多前端工程師會覺得自己轉崗很困難的原因,本質上還是因為基礎知識的缺口。而反過來Andriod和iOS的工程師轉Web,並不會覺得很困難,他可能不知道瀏覽器有什麼API,但是不可能連Javascript這個語言都學不會。

  Web技術最主要的程式設計正規化是宣告式,所謂宣告式,就是我寫個HTML的標記,宣告我要什麼,但是這個東西在瀏覽器裡怎麼渲染,我控制不了。另外一個比較典型的宣告式正規化的語言是SQL,我只描述我要什麼,但是後面會有個很複雜的體系來按照我的描述去實現。它的好處是你很容易抽象你的需求,學習成本會比較低,但是代價就是犧牲了執行時的效率。如果你開發又簡單,執行時又快,那原生技術就沒有存在的必要了。原生技術不是宣告式的,比如介面是怎麼渲染的,你要用程式碼去控制渲染的過程,你不能簡單地說我要一個表格,它就給你個表格。而Web是這樣的,Web說我要一個表格,瀏覽器就給它個表格,你再告訴瀏覽器說我要一個5畫素的陰影,那瀏覽器就給你一個5畫素的陰影,前端工程師根本控制不了這5畫素的陰影怎麼畫上去,或者說只能在很小的範圍內控制。這其實和時間換空間,空間換時間這個簡單的哲學原理很相似,不可能兩者兼得。

 腳踏實地

“我接觸過很多前端工程師,他覺得差一畫素就差吧,但是UI質量可能差別就在這一畫素上,你差了這1畫素,就不是100分了。”

  問:對你來說一個優秀的前端工程師需要具備什麼樣的技能?或者什麼樣的知識結構?

  前端工程師應該首先是個工程師。現在很多前端工程師,包括我面試的,可能會在基礎知識上有所欠缺,基礎的資料結構、基礎的演算法、作業系統原理,這些對一個軟體工程師來講非常基礎的內容還是要知道的。如果不知道的話,你可能會成長得很快,但是很容易進入到一個瓶頸,並且這個瓶頸是無法突破的,因為你的知識結構是有殘缺的。

  其次是個人素質,比如說對細節的注意力。前端工程師做的東西,無論是自己實現的,還是按照設計師的設計稿實現的,差1畫素就是差。那這1畫素你能不能看得出來,並且把它糾正過來,這其實很多情況下取決於個人的素質和對細節的注意力和追求。因為我也接觸過很多前端工程師,他覺得差1畫素就差吧,但是UI質量可能差別就在這一畫素上,你差了這1畫素,就不是100分了。

  第三部分是你要對使用者體驗有一些基本的瞭解和判斷,什麼樣的東西體驗是好的,什麼樣的東西是體驗流暢的,怎樣能夠讓使用者更有效地去接受你想傳達的資訊。一些互動設計上的最佳實踐是一定要知道的,這不完全是設計師的事,前端工程師也要參與進來。

  問:你在面試的時候,除了這些技能之外,你還看重別的什麼嗎?

  其實我個人會比較看重一個人的視野。很多部門說我也看重視野,但是前端工程師應該尤其看重,因為前端技術更新迭代太快了,Web技術本身就非常不穩定,你今天會的東西,明天睡一覺可能就已經發生變化了。前端工程師如果視野不夠開闊,你所瞭解的東西廣度不夠的話,就很難跟得上這種進步速度。

  另外,前端是最接近使用者的這一端,你不僅要能從工程的角度,從站在你背後的產品設計師、後端工程師的角度去跟使用者交流,同時你要能站在使用者的角度,反向地跟你後面的這些設計師和後端工程師交流。比如後端工程師給我一個API,我作為使用者來說必須能判斷什麼是好用的,我才能把後端想要傳達的資訊有效地傳達給使用者,再把使用者的互動反饋給系統。前端工程師要站在兩個角度去溝通,要能夠從非常不一樣的角度去看待同一件事情。

  我看你在一個Talk裡面說過“統一的前端研發生態環境能夠自生長”,這個你們是如何實現的? 首先“自生長”是為了做Talk包裝出來的一個概念,但如果要把它說成大白話的話,所謂“研發生態環境”是指的是開發環境、測試環境、生產環境和執行環境,這是你的程式碼會跑的一些獨立的物理上隔離的環境。這時候就需要有個工具鏈,能把整個環境穿起來,儘量減少在整個研發過程中工程師的一些機械性手工操作。

  所謂“自生長”是說,因為一個工具鏈上涉及到很多的小工具,這些工具都像珠子一樣串在一起,但是每一環我都可以獨立地去替換它,“自生長”保證了這些工具都是非常原子的。如果有一個工程師覺得現在我們在整個研發過程中某一個環節不夠好,自動化流程不夠,想去優化它,那他就可以單獨針對這一小塊去優化,而不是給你一個很龐大的技術體系,想要把這個東西使用明白都得花很大的精力。

  所以所謂的“自生長”是說每個人都可以很容易地對你整個技術環節當中的一個小部分進行改進,它就能夠日趨完善。可能今天我改一點,明天你改一點,日積月累下來,整個工具鏈就會越來越完善。

  問:這個體系在你們團隊裡實現起來有沒有遇到困難?

  困難倒是沒有。但是這個東西做完了之後,我得Push大家去用,如果大家不用,就很難讓這個東西達到我所說的自趨完善的過程。豌豆莢做事的文化並不是上面給你一個任務,你就一定要去做。而是這個東西我痛了,誰痛誰驅動。我把這個解決方案給他了,他一開始可能不用,但時間久了之後,他痛得不行了,就會嘗試一下看看能不能改進痛點。所以這個過程會相對比我之前預想的緩慢。但現在基本上這個事情已經進行完了,我們現在整個前端的研發都是構建在我之前做的那套系統之上。

  問:你剛才說你很重視視野和學習的能力,那麼你是怎麼更新自己的知識、工具和技能的?

  我覺得還是要保持一個高度的關注吧,首先我訂閱了很多國外的技術部落格,包括圈子裡面比較知名的工程師,他們都有寫部落格的習慣,我會去關注他們正在做的事情,也包括一些公司的技術團隊的技術部落格。比較知名的像Google有自己的Google黑板報,當他們做了一件比較牛的事情,就會放一篇Blog出來,我會長期關注這件事。我之所以很少關注中文世界,是因為會有滯後。

  前端技術發展實在太快了。如果現在後端一些做Server的工程師,還在用兩三年前的技術方案不會有人覺得是完全不可接受。但如果現在前端工程師,比如我面試的時候,如果你不知道什麼叫前端MVC,沒聽說過Angular,Backbone這些前端MVC框架,那我覺得這是一個完全不可接受的事情。整個前端的技術體系就是逆水行舟不進則退,基本上以周甚至以天為單位更新自己的知識體系,要時刻保持關注。

  問:那你現在工作中都使用什麼樣的框架和工具?

  如果專指前端的框架的話,我們豌豆莢還是挺豐富的,我們並不像很多公司一樣會指定特定的工具,我知道有一些公司現在在用YUI,還有一些可能用Backbone或者Angular。首先我們並不指定一個團隊只能用一個框架,我們根據產品的不同選擇一個最合適的解決方案。以前我做Windows客戶端的時候,用的是Backbone,後來的海外產品,以及很多內部產品用的是Angular。我們也希望大家能多接觸不同的技術解決方案、不同的框架,去了解這些框架背後的設計哲學,解決問題的角度,這會帶來很多的啟示。我們現行還在維護的產品裡面用的就有Backbone, Angular, React,我們鼓勵解決問題,但不鼓勵用同一種姿勢不停地解決同一種問題。我們做的一些內部專案,大家會覺得比較機械,不願意做。但是如果用一種新的技術方案,在解決一個問題的同時還會學一些新東西,這也是一個不同的思路。

  問:你對自己有沒有什麼規劃?想一直做前端工程師?

  我自己其實並沒有特別明確的規劃,可能也跟我自己所處的環境有關,因為豌豆莢實在發展太快了,我五年之前也不會想到自己會發展到今天這樣。這四年在豌豆莢走過的整個成長路程,並不是一步一步規劃過來的。很多時候如果你真的潛心在工作裡面,什麼也不管,可能過了一段時間後你會發現你比自己想象的走得更遠。在網際網路這個外部環境變化比較快的行業裡面,超過三年的規劃我覺得意義都不大,因為一年以後可能整個外部環境就完全不一樣了。我自己現在可能會做一些團隊管理,包括產品的研發管理上面的事情,這也是我兩三年前完全想不到的。以前我覺得自己會一直做工程師,前端做不了,我會去做別的,但現在看來,“做事”對我來講可能更重要,技術只是一個手段,是支撐之一,還有其他的東西需要保障。

  我現在在做的產品,前端只是眾多技術體系的一部分,我想要把這件事做成,只盯著前端這一塊是不行的。以前我只做工程師的時候,一個問題來了,我的反應是這事我前端應該怎麼做,前端能做到什麼範圍,如說一個功能到底應該由前端去做還是由後端去做,我只能站在前端工程師的角度去考慮這件事。但現在我會更多考慮的是我要把這事解決了,不管是前端還是後端,首先要把這事解決了。所以思考問題的角度和整個目標會不太一樣。

  問:知乎上有相關的討論,碼農35歲以後怎麼辦?

  很多人感覺現在一些工程師牛了之後就不寫程式碼了,底下就會有一堆人站出來反駁,國內的誰誰誰,現在多少歲還在寫程式碼,但這只是個例。從整體上看,確實國內的環境相對比較浮躁,位高權重了之後就不愛寫程式碼了,這是個普遍現象。當然也有個例,但是用個例來推匯出結論是不科學的。確實國外的狀況要好很多,一是競爭環境不太一樣,生存壓力也不一樣。另外,國內技術驅動的公司不多。人寫程式碼能創造多大價值,就是你能掙多少錢和你在公司裡的地位。如果你十年如一日地寫程式碼,但是到你40歲寫的程式碼跟你30歲寫的程式碼創造的價值是一樣的,那活該嘛。寫不寫程式碼這不是決定你有多大影響力和有多少收入的根本項,關鍵是你創造多少價值。

相關文章