掘金 AMA:聽前端娛樂圈的老人 & Facebook 實習生 -- 黃玄說他的前端 & 美國故事

第十五期 AMA 掘金團隊請來了來自前端娛樂圈的老人 & Facebook 實習生 & CS 研究生美國在讀-- Hux黃玄作了爲期三天的 Ask Me Anything (AMA) 活動(活動已結束)。前端

咱們在此精選了一些來自用戶的提問及黃玄的回答。python

關於黃玄

社區小夥伴精選提問--非技術直接相關類

阿里交互設計轉飛豬前端的契機?當初作了多少準備? ─ @ALISONLY

阿里交互設計轉飛豬前端的契機?當初作了多少準備程序員

當時由於人在北京因此交互實習選擇在北京而非杭州,惋惜北京那時並無太多好的交互設計團隊,因此被安排的工做很是沒有挑戰性,因而動了轉前端的念頭。我經過內部的旺旺聯繫了以前知道的 拔赤,他在聽到個人聲音後打印和我聊一下,最後贊成了我轉崗到航旅前端團隊的申請,分在了他親自帶隊的無線團隊下面。web

當初其實並無作太多準備,能夠說是天時地利人和吧。那時前端技術門檻確實比較低,本身只是剛剛看過一些高程,能用 jQuery 寫一些頁面的水平。並且那時懂交互在前端中的地位我以爲比如今更高一些,畢竟那時候大部分前端仍是 「UED」的思惟,而如今則更接近大部分純開發團隊。那時無線前端(Mobile Web)興起,拔赤的團隊恰好在拓張缺人的狀態,我也比較主動,畢竟已經以交互方式進了阿里,因此獲得了這個機會。面試

你是如何在前端領域下沉澱下來的?學習心得是什麼? ─ @Calpa

你是如何在前端領域下沉澱下來的?學習心得是什麼?算法

這是一個很難回答的好問題,實話說得話,我並無以爲我在前端領域下沉澱下來了。數據庫

這幾年工做學習下來,我愈發以爲前端領域有着很是強的複合與交叉性:編程

前端技術主要依賴其宿主平臺的發展,而即便是後者也只處於計算機科學的應用層面,註定受網絡、圖形學、編程語言、系統等更基礎領域的發展的交叉推進。 前端技術的自身發展(層展示象)則更像是上述衆多因素的一個快照,旨在以提升生產力爲目的知足「某特定時代儘量多的特定需求」的軟件工程產物,容易有技術斷層。 前端技術的廣義定義與工種需求主要受產品、市場、設備形態、人機交互方式的影響,廣義來看不只包括 iOS/Android,更是包括了 wearable、VR/AR/體感外設等,這就致使會有徹底不一樣的技術棧需求出現。設計模式

因此我我的的愚見是,可能只能在前端所涉及的這些更細分的領域(包括但不限於我所能列出的這些)才能沉澱一些「跨越不一樣時代的前端技術棧」的東西,而不能期待直接在前端有所沉澱。數組

如何跟上前端的更新步伐,如何取捨一些技術,如何評估本身所處的階段欠缺,如何評估本身的薪資。 -@前端小屌絲

前端初學者,如何跟上前端的更新步伐,如何取捨一些技術,如何評估本身所處的階段欠缺,如何評估本身的薪資。

關於「如何跟上前端的更新步伐」:前端的快速更新既是真的也是假的,真是由於「層出不窮的業務需求」以及「活躍的開源社區」。假是由於「萬變不離其宗」,其實也只有「應用組織方式」、「編程語言與範式」、「web 平臺 API」等有比較突破性的變化。

關於「如何取捨一些技術」:不管使用的是什麼技術,往上走必然會走到一個更高的抽象層面,這個時候全部「變化的表象」就 merge 成了「更不變的基礎」: Domain-specific (領域特定) 的有一大堆 spec 規範(TC39 的 ECMAScript、IEFF 的 HTTP、W3C/whatwg 的HTML/CSS/WebAPI)和框架的「特徵」(MVC/MVP/MVVM/Flux、數據流、狀態管理、廣義的「髒檢查」、廣義的「髒更新」等等)

計算機科學來講有「編程語言理論」(類型系統、運行時、OOP/FP/FRP 等範式)、「系統」(好比 GUI 併發、網絡 IO 的並行與併發、各類緩存)、「圖形學」(渲染/動畫/可視化的實現與性能優化)、「軟件工程」、「數據庫」、「安全」…… 所謂「條條大路通羅馬」,有句話叫「有造輪子的能力和不造輪子的覺悟」,我以爲對不少技術則能夠抱着「有學輪子的能力和不學輪子的覺悟」來看待。

關於「如何評估本身所處的階段欠缺」:能夠閱讀一下有關「前端領域有着很是強的複合與交叉性」以及「成長」的其餘回答,思考一下本身離想成爲的「那種角色」還欠缺什麼?

關於「如何評估本身的薪資」:不是我擅長的……看脈脈?

對選什麼方向考研有一些迷惑 -@某某某同窗

您好,我是大二軟件學生,想問問前端讀研推薦什麼研究方向,在國內大學對前端重視程度大多不高,我如今的一個老師(他是博士)對前端的評價是「簡單,只用作一個頁面」 由此,我對選什麼方向考研有一些迷惑,但願獲得解答,謝謝👻

「前端讀研推薦什麼研究方向」:「前端」自身顯然不是一個能夠進行「(學術)研究 」的領域,但願我關於「前端的複合與交叉性」的其餘回答能給你一個更全面的理解。

「老師(他是博士)對前端的評價是「簡單,只用作一個頁面」」:評價「前端」「「簡單,只用作一個頁面」」顯示又是過於草率的。但站在一個(假定)「計算機科學」博士的角度來講,大部分「前端在實際業務中所要解決的複雜問題」在他眼裏「極可能都不是一個所謂的前端問題」,因此這是能夠理解的言論。

「方向」:= 「對於應屆生想作前端領域的工做有什麼樣的學習建議和找工做的建議」

有哪些計算機基礎知識讓你以爲在工做中依然可以受益 -@2014_

有哪些計算機基礎知識讓你以爲在工做中依然可以受益,但願可以推薦幾本書

這是此次 AMA 裏我最喜歡的一道問題 ;)

關於「基礎」、「成長」、「深刻」的問題不少同窗都在問,我想直接在這個回答下面總結一下我本身的感想。

「在特定領域內工做與學習」能夠被認爲是一種 Top-down (從技術棧的應用層向更下)或者說 Just-in-time 的學習方式,不少非科班前端(或者任何以爲基礎不夠用的時候)的學習路徑可能都會是好比 「JS -> JS 中存在的編程語言特性與模式」 「JS Callback -> EventLoop -> 併發模型」 「JS -> Babal +| V8 -> 編譯原理、編程語言運行時/虛擬機」 「React + Redux/Flux -> Immutability/FP」 「Flow/TS/ReasonML -> 類型系統」 「CSS -> 瀏覽器渲染引擎 -> 圖形學」 「Ajax -> HTTP -> TCP/QUIC -> 計算機網絡」 「實時通信 -> Web Socket -> Socket」 「寫 UI -> 寫更好的 UI -> UX(用戶體驗)」 這樣的路徑。這種方式是不可缺乏而且在不少時候更加快速實用得,但這種方式可能會因爲對「共性更強的基礎知識」的欠缺比較容易出現「以爲永遠都在跟進新東西」的感受,而且缺少「創新」所須要的視野。

我在「如何取捨一些技術」裏提過:不管使用的是什麼技術,往根上走必然會走到一個更高的抽象層面,這個時候全部「變化的表象」就 merge 成了「更不變的基礎」。(這裏請想象一顆樹,根是最 generic/abstract 的基礎(你也能夠理解成基類或者類型理論裏的 Top type,好比 OO 語言中的 Object),越往葉子節點是越 specific/derived 的技術(你能夠理解爲派生類)

而「CS 基礎的學習」相比之下則更像一種 Bottom-up(以技術棧比喻)或者說 Ahead-of-time 的學習方式,你能夠從一種「更高層次抽象」的方式去理解新技術,而且更容易「子類型化」出新的東西。

React 從架構上來講,實際上是愈來愈接近一個編程語言虛擬機的,而從設計模式來講,是愈來愈接近 Haskell/OCaml 這樣的函數式編程語言。這些都不是「原有的前端領域內知識」可能天然演化出來的。 這也從另外一個側面回答了爲何中國不少技術團隊創新能力不如國際團隊,即便只限定在前端框架領域,大部分在技術模型上有突破性的框架也都來自國際團隊:Knockout/Rx 來自微軟,React 來自 FB,Angular 來自 Google…

因此不少同窗問的如何「基礎」和「前端有什麼深刻的方向」也均可以從這個角度來回答,好比說我相對了解比較多的「編程語言」領域,「哪一門語言對前端將來發展或是學習上有很大幫助」?

從 JavaScript 來講,JavaScript 是一門比較雜交的語言,其發明與發展過程一直到目前爲止也主要是「借鑑」其餘語言的特性。這些特性一般在「原有的上下文」下有着更好的表達,另外大部分這些特性技術(OOP、FP、類型、運行時)自己的或學術或業界的發展也都是貢獻在這些語言而非 JS。因此說「基礎」能夠是「學習 JS 發明與發展中過往或正在借鑑的語言」,「深刻」能夠是「瞭解這些語言的發展、瞭解 TC 39 的動向、瞭解將來可能影響 JS 去向的語言、影響或貢獻 JS 語言的發展」等。 舉例來講:

  • Scheme 做爲 JS 的最主要本源之一,學習 scheme 或相似的 Lisp 方言會讓你對 lambda 算子、first-class function、CPS、closure 這些函數式編程概念有更純粹的理解,並對這些概念在 JS 中的運用有更本質的理解。
  • Java/python 或相似的 class-based OO 語言會讓你對 ES6 以及將來 ES 的 class、field、property、(private、static)有幫助;
  • Java/OCaml/Haskell...等任何一門強類型語言會讓你理解「類型有什麼做用」、「類型安全是什麼」對 TypeScript/Flow/Reason 的各類概念和設計有一樣幫助;(好比讓你更容易理解 subtying、variance、只讀只寫的關係等)
  • Rust/Swift/Kotlin/OCaml/Haskell 等嘗試用某種靜態分析機制約束異常(好比 option type 或 checked exception)、異步(好比 Promise、async/await)等「效果」的編程語言能讓你對 JS 的將來、或是 React 這樣的框架 API 設計有幫助;
  • Rust/C++ 能讓你對一切跟指針和內存有關的概念有無可替代的幫助;
  • 學習任何一種與 JS Event Loop 不一樣的併發(或更好的支持可能的並行)模型的語言會讓你對「同步異步」、線程進程、阻塞非阻塞有超過「能理解他們的字面意思和比喻」的理解…對 Web Worker、Sharedworker、sharedbuffer 這些 Web API 有幫助;
  • 學習 assembly、JVM bytecode、stack machine 會對 web assembly 有幫助;
  • 學習任何一門編譯到 JS 的語言都會讓你對 JS 「有什麼缺陷」這件事有幫助; ……

在「你是如何在前端領域下沉澱下來的?學習心得是什麼?」說過得這裏就不重複了,前端的複合性體如今他對衆多計算機科學(和其餘學科)領域都有依賴,而不是說「層展示象」就徹底替代計算機科學的基礎做用了……

我自身讀過的書並不足以推薦太多書籍,可是參考美國大學的課程教材(也就是那些知名大學教授編寫的經典書籍)絕對足矣。好比 編程語言相關的 SICP、TAPL、PAPL、Software Foundation、虎書、龍書… 計算機網絡的 Top-down approach 體系結構的 CSAPP …… 這些教材都是「大部頭」,相比於大多「行業內的工具書」要嚴肅嚴謹得多,而且有大量「習題」,能夠說能啃下來任何一本的任何一個章節都會有一種「被刷新」的感受。 除了書籍以外,若是但願對某個領域有很是理論化或前沿、試驗性的瞭解,能夠嘗試觀看、閱讀學術會議與期刊的 presentation 與論文,其實不少都很是有趣。

以上。

碰了這麼多語言, 最喜歡哪個? -@題葉

碰了這麼多語言, 最喜歡哪個? 還喜歡 JavaScript 嗎?

碰得多了,反而很難挑出「最喜歡」的了。

  • Rust 語法現代友好,內存管理方式倒是與 C++ 的 RAII 最爲接近,然而其內核則幾乎就是一門 ML 方言…?
  • Haskell 常常以 ML 方言被說起,然而其核心抽象方式 Type Class 卻更新 Java 等 OO 語言的 Interface 與代界多態…?
  • Java 老是做爲 OOP 語言的典範,其泛型(參數化多態)是由兩個函數式編程教父(Haskell、Scala)設計的…?
  • JavaScript、Python、Java 到底誰更誰走得更近?從語法來講 Py 好像最不一樣,從類型來講只有 Java 是靜態類型,從內核來講 JS 的內核則無限接近 Scheme + Self?
  • OCaml 的 Module、Haskell 的 forall 的一種、Java 的 wildcard、Scala 的 existential,都是一個叫作存在類型的東西?
  • 有沒有 Subtyping?Variance 怎樣纔不會像 Java 數組那樣不安全?有沒有 Coercion?
  • 有沒有分清 Void 與 Unit?有沒有 Null?有沒有 Option? 保障 null safety? higher-kinded, higher-ranked?
  • Immutability vs. Mutablity?
  • Pure?Pure vs. Total?

客觀的類似和差別性老是存在的。 雖然我很認同王垠說得「語言不是工具,而是材料」而且認爲「使用的語言會大大影響程序員的 mindset 與解決問題的方式(數據結構、算法、組織……)」,但「看山不是山」後「看山仍是山」,這些差別也使得編程語言有着不一樣的擅長於不擅長。

JavaScript 仍然是一門優秀的 動態類型 GC 語言、尤爲是其 scheme 內核的特質使得 JS 與 Py 尤其不一樣,造就了其特有的利用回調(CPS)的併發模型,直接影響了全部 web API 的設計與 Node 的出現,也奠基了其將來對函數式編程的優秀支持…而 TC39 在升級過程當中大量吸納包括 Python 在內的語言同時又使其語法更加現代化。

若是必定要說一個,我如今「最喜歡的『編程語言』」是「lambda 算子」。拋開語言之間 insignificant 的差別,大部分這些特性在學術界都是使用 lambda 算子來進行「形式化」描述得,能夠說是一門「自選 feature」的語言了,當屬 「the mother language of all programming languages」 。

社區小夥伴精選提問--純技術

想聽ReasonML在facebook的實際應用的經驗? ─ @DB維一(s.y)

想聽ReasonML在facebook的實際應用的經驗

這個問題就大了…不知道您具體關心的是哪一點? 從使用狀況來講,據我所知像 Messenger.com 幾乎徹底 ReasonML 化,Ads 有大量基礎設施使用 ReasonML,Instagram 等其餘產品有小部分功能在使用。 從使用體驗來講,主要帶來的優點仍是其背靠 OCaml 的類型系統:幾乎不須要顯式寫類型的類型推斷、遠超 Flow/TS 的速度、以及與 Flow/TS 最主要的區別,徹底 「sound」 的類型檢查。這表明着用 ReasonML 編寫的代碼在運行時有着絕對的可靠性。缺點是較 Flow/TS 更高的遷移門檻。

感謝回答,還有幾個問題想了解下。 1,遷移的過程當中除了學習語言自己和給其餘library寫binding以外還有其餘可能會遇到的阻礙嗎; 2,在開發效率上相比flow和ts是提升了仍是下降了;

  1. 主要就是這兩個阻礙了,另外關於「寫 binding」能夠看一下 genType!至關於自動化了 Reason <-> TS/Flow 的 interop
  2. 這個主要是「人」的問題,我以爲很難有一個指標去硬性得衡量。好比說 TS vs JS,花時間寫 type 與省時間 debug type error,如何衡量誰的效率更高呢?

pwa除去service worker,和普通h5,有什麼區別呢? -@一條沒有夢想的鹹魚

請教一下,pwa除去service worker,和普通h5,有什麼區別呢。大家在開發pwa遇到過那些優化或困難呢

PWA 較完整的介紹仍是能夠看我以前寫的大長文「下一代 Web 應用模型 —— Progressive Web App」huangxuan.me/2017/02/09/…

Technically,我不知道「普通 h5」的邊界究竟是什麼。可是 PWA 除開 SW 以外,最主要的是在 「更好的、跨平臺的『類第一公民能力』」,好比單獨的應用窗口與 icon、推送通知等等。

PWA 能夠帶來的「優化」與「困難」主要仍是在 SW 的運用上:

SW 能夠作的「優化」能夠說很是有想象空間:「想象一下給你一個可控的用戶端的緩存你能作什麼?」而緩存能夠說是解決 IO 性能問題的一種通用手段,具體解決哪一部分 IO 、IO 資源如何分配,這些都要具體問題具體分析了。

SW 所帶來的「困難」一是與其餘特性的「interop(互交互)」,好比我以前寫的「餓了麼的 PWA 升級實踐」中提到的瀏覽器多頁渲染模型的性能問題:huangxuan.me/2017/07/12/… 二是其自己帶來的「複雜度」,好比緩存更新策略、緩存使用策略、工程問題等等。

特選:關於國內外的那些事

但願介紹一下美國大公司前端的招人流程和內容 -@Hc_Zzz

但願介紹一下美國大公司前端的招人流程和內容

主要的差別仍是在技術面試的內容上,國內更偏重領域/業務相關的知識,重點看你能不能幹活。美國這邊「基本的數據結構算法」仍然是必考甚至最重要的內容。總得來講,不管你是科班仍是「野路子」,美國這邊的內容要更偏重計算機科學素養而非幹活能力一些。

關於在美國留學初期的經濟收入,和美國的消費。 -@明非

關於在美國留學初期的經濟收入,和美國的消費。

Hi 明非 ;)

留學的經濟問題確實比較頭疼,我本身主要是從幾個角度「緩解」,但大頭仍是靠家裏和之前的積累來支撐,很難作到收支平衡:

  1. 獎學金 —— 理工科即便是研究生也仍是有學校提供獎學金的,我選擇的學校給了我半獎,並且據我所知(以前微博上流傳過),有的學校招有經驗的工程師兼職給他們幹活是能夠給到全獎的。
  2. TA/RA —— 教學助理和研究助理。按小時給工資,基本上在 10刀 - 30刀/每小時工做這樣,解決平常開銷足夠
  3. 實習/Coop —— 利用暑假或者某個學期使用 OPT 去公司實習,這個期間是不用交學費的,硅谷工資的實習收入大約有全職員工的 60%-80%。

美國的消費很大程度上取決於你生活的城市,村裏和城裏的差距能夠參見二線城市 vs 北上廣,差別比較大。基本的消費水平因人而異可是基本隨便搜索一下就能夠估計出來。

你好,你以爲目前中美CS研究生的水平差別大嗎,體如今什麼方面呢?-@ChakkeiLam

你好,你以爲目前中美CS研究生的水平差別大嗎,體如今什麼方面呢?

說實話我沒有在國內上過 CS,也不瞭解中國 CS 研究生( 只能說我以爲美國這邊 CS 研究生很是偏重「科學」和「學術」,這點國內可能有必定缺陷

畢業三年的非科班還有機會去fb等大廠嗎 -@1003

畢業三年的非科班還有機會去fb等大廠嗎

永遠都有機會,出國工做主要須要解決的問題是:

  1. 簽證(一般經過留學而後申請 H1B、跨國公司工做一年 L1 遷到總部 如輪子哥)
  2. 英語
  3. 技術(白板面試) 不少國內程序員以爲 3 是最難的,其實 3 反而是最最最最最簡單的。

本期 AMA 黃玄同窗也回答了不少其餘的技術、非技術問題,歡迎去他的 AMA 下面交流技術喲,傳送門

相關文章
相關標籤/搜索