掘金 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 下面交流技术哟,传送门

相关文章
相关标签/搜索