掘金 AMA:听前端娱乐圈的老人 & Facebook 实习生 -- 黄玄说他的前端 & 美国故事

1,626 阅读18分钟

第十五期 AMA 掘金团队请来了来自前端娱乐圈的老人 & Facebook 实习生 & CS 研究生美国在读-- Hux黄玄做了为期三天的 Ask Me Anything (AMA) 活动(活动已结束)。

我们在此精选了一些来自用户的提问及黄玄的回答。

关于黄玄

社区小伙伴精选提问--非技术直接相关类

阿里交互设计转飞猪前端的契机?当初做了多少准备? ─ @ALISONLY

阿里交互设计转飞猪前端的契机?当初做了多少准备

当时因为人在北京所以交互实习选择在北京而非杭州,可惜北京那时并没有太多好的交互设计团队,所以被安排的工作非常没有挑战性,于是动了转前端的念头。我通过内部的旺旺联系了之前知道的 拔赤,他在听到我的声音后打印和我聊一下,最后同意了我转岗到航旅前端团队的申请,分在了他亲自带队的无线团队下面。

当初其实并没有做太多准备,可以说是天时地利人和吧。那时前端技术门槛确实比较低,自己只是刚刚看过一些高程,能用 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 下面交流技术哟,传送门