Lambda Academy

分享我的一些学习故事

February 28, 2019

《我如何零基础转行成为一个自信的前端》在掘金重新发表之后,又收到了一些反馈,相当多朋友说那篇文章帮到了他们。能帮到人,体现自己的价值,我很高兴。现在再分享一些我学习的故事,也许会对你有些启发。

其实我要讲的故事只是很普通的发散学习方法,大部分学习者应该都有这种体验。我只是从我的知识积累路径,展示我是怎样被驱动着一点一点积累学习的。接下来我还是会提到一些资源和大的概念,有些我只是略了解,有些我能钻很深。不是为了掉书袋,我不懂的我会说我不懂,我懂的我能解释清楚。

故事一

刚进阿里的时候,花了很久时间学习阿里的技术栈。其中 BFF (Backend for frontend) 我还是第一次接触,所以我花了些时间学了些相关的知识。当时我连 RPC 协议都还是第一次听说,然后边学边和师兄们讨论 BFF 和 Serverless 这些架构问题。其实我只是从宏观上了解一下,并没什么很深的见解。好在师兄们耐心,没有嫌弃我。

我在找资料时找到了 Netflix 的实践案例。其实这是不可避免的,Netflix 在这方面探索走在最前面。然后 Netflix 对自家的技术非常开放,你能经常在各种地方看到他们工程师的分享(Netflix UI 工程团队对于函数响应式编程的推崇,让我产生了好奇,然后不算挣扎地入了门)。下面是我找到的三个 Netflix 的分享:

Why Netflix Rolled Its Own Node.js Functions-as-a-Service for its API Platform - The New Stack

这篇文章介绍了为什么 Netflix 要转向 FaaS。之前 Netflix 采取的是 BFF 架构。这种架构的好处是客户端不需要和提供服务的后端直接通信,以满足各种客户端快速迭代的需求。但同时由于 BFF 和客户端 UI 层的高度耦合,BFF 只能由 UI 工程师来维护,这无疑增加了 UI 工程师的工作量。UI 工程师(前端,客户端)是被雇来写 UI 的,却要维护服务端,这显然没有做到人力资源的最优配置。FaaS (Functions As A Service) 的提出就是为了解决这个问题。

Going FaaSter: Function as a Service at Netflix - YouTube

在这个演讲里,Netflix 工程师肖雨浓介绍了 FaaS 在 Netflix 的实践。之前我和师兄讨论时,有提到云函数不好 debug,但 Netflix 不仅解决了这个问题,甚至更进一步把整个开发环境,从开发 debug,live reloading,单元测试,发布构建等都解决了。

Netflix: What Happens When You Press Play? - High Scalability -

这一篇更好懂一点,作者从小白的视角,解释了当你在 Netflix 上点击播放按钮之后发生了什么。Netflix 内容传输整个链路都有涉及。虽然面向小白,但是有些细节应该对有经验的工程师也有启发。比如 Netflix 为什么要自己建 CDN,为什么把 CDN 放到 ISP 那里。

故事二:

之前关注过我的朋友应该知道我很喜欢用 Ramda。目前的团队没有使用 Ramda,一开始我很不适应。当时我想我能不能自己手写几个 Ramda 函数自己用(其实也是不可以的,别人要维护,但我当时也想挑战下)。大部分函数挺好写,但是写到我最喜欢的 lens 时卡住了。去看 Ramda 源码,感觉太黑魔法了看不懂。然后我就去找了些文章读,去了解 lens 的思想。

Lenses and Virtual DOM Support Open Closed 这篇文章介绍了 Lens 在操作 Virtual DOM 的用处,角度比较新。

Functional Lenses, How Do They Work 这篇文章介绍了 Lens 的原理和实现。看懂差不多能自己写个简单的 lens 了,但不够完整。

只看两篇还是不够的,应该还有再深入的。于是找到了这三篇:

Functional lenses in JavaScript 介绍了 lens 的原理和使用。

Functional lenses in JavaScript - Isos 同一个作者写的,更近一步,介绍 Isomorphic Lens, 到这里就需要理解抽象代数里面的 isomorphism 是什么鬼。看源码再查下资料不算太难理解。

Functional lenses in JavaScript - Traversables 这篇再深入一点,介绍 lens 在 Traversable 数据类型里面的应用。

作者没有亲自解释什么是 Traversable,而是给了个链接 Fantas, Eel, and Specification 12: Traversable · Tom Harding 跟着这个链接,你能发现这篇文章的作者还有一系列文章在解释 Fantasy Land Specification 里面的各种 ADT。于是又打开了一扇知识的大门……

看了这些文章之后,我写出的 lens 够用,但是没法实现 isomorphic lens,实在没办法又去逆向 Ramda 源码了,这次终于看懂了,写出了自己的版本。当时还发文章分享过:Lens 原理及应用

故事三

有一次在看 Redux Thunk 的相关文档时,很偶然跟着链接跟到了 Stack Overflow 的一个热门答案。有答主在回答里推 Redux Saga,并说了 Redux Saga 的好处。其中有一部分引起了我的好奇:

Imperative VS declarative:

  • DOM: jQuery is imperative / React is declarative
  • Monads: IO is imperative / Free is declarative
  • Redux effects: redux-thunk is imperative / redux-saga is declarative

啥?IO Monad 也是指令式的?Monad 我懂,Free Monad 又是什么鬼?还有比 Monad 高一阶的抽象?然后我去找资料了解了。

首先就是可爱的 Dr. Boolean 老师,在三个 YouTube 视频里介绍了 Free Monad 的 JS 实现。在这个实现版本里,Dr. Boolean 用了一个叫 daggy 的库,这个库引起了我的注意。查了一下资料,其实它是给 JS 提供 Tagged Union 类型的。这个概念我之前了解过,但是已经淡忘了,然后我又去查了。

很多语言,比如 TypeScript 和 Rust 都提供了 Sum Type。看文档,这似乎是个很简单的功能,但其实它背后有很深的数学理论,在语言层面也可以挖很深。我找到了这篇文章 Better JS Cases with Sum Types 刚好作者是我比较喜欢的一个老师,之前在 YouTube 听他解释过 lambda 演算和组合子。这篇文章钻的很深,值得花几个星期去消化。

然后跟着兔子洞接着钻。我看到文章评论区有人在问 Gabriel Lebec 老师函数式编程学习资源,然后 Gabriel 推荐了一个视频 Domain Modeling Made Functional 然后我就很偶然闯进了一个全新的知识领域 — 领域驱动设计。这个视频让我很震撼,我当时还写文章总结过

第三个故事最能体现 发散-无序-偶然-意外发现 的知识积累路径。从 Redux thunk,到 Free Monad,到 Union Type,到领域驱动设计。这些知识相差很远,而又线性地出现在我的知识路径里。

知识整理

我每周这样杂乱地吸收知识,学习容易失去主线。这也是比较困扰我的一个地方。我的一个方法是在家里的白板上无序记录下我正在学的知识,每天早上看一眼,提醒一下我前几天学了什么,有空了再回忆复习一下。

下图是我几周之前写在白板上的内容。当时准备回家过年,离开房间之前拍了张照片。当时要是知道我会把这些内容分享出来,就好好写字了……

上面的内容有些标题太大,其实我只是了解了一点而已。比如 ML 和 TensorFlow,我只是当时在 Udemy 学习 Machine Learning in JavaScript,而我并不能确定我机器学习到底入门了没有。Clojure 我只是了解了 LISP 里面的递归数据类型和 Cons 构造,当时想用 JS 实现,需要用到数据结构共享的知识。

我并不是自律狂魔

我总是会给人一种错觉,就是我很自律。要是我本性真有这么自律,我就不会走这么艰难的路了,也不会高考复读才考个二本。我靠的都是习惯。

其实人类农业文明才几千年,在漫长的进化过程中,人脑是朝着更适应狩猎繁殖等任务去进化的。写代码,学 CS,克制自己的本能冲动,并不符合人类本性。这些关于人类本性的共识是任何严肃的关于习惯和自律行为研究的起点。

我也有习惯系统失效的时候,这时候我就并不显得那么自律了。

一两个月前,我决定认真学下数学。然后决定搞个一百天计划,每天打卡记录。我把打卡记录订在留言板上,每天出门就看得到。如下图:

当时还发朋友圈装逼立 flag,配文 Make it visual, make it a ritual. 一副大干一场的样子。然而你们可以看到。我一开始是 1 月 26 日开始这个计划的,坚持了两天就从入门到放弃了。我就不多总结原因了,就是没计划好,失败了。而不是怪自己懒。然后我又想资源重复利用,继续用这个表记录学习 CS 吧。也是每天在 edx 上学两小时本科 CS 课程。你们可以看到,我把时间改到 2月 18 日了,然而这次更惨,一天都没坚持。

这只是我习惯系统失效了,不是因为我自不自律。我会从外界找原因:1. 下班太晚了,晚上太累,没精力去规划明天的事情。2. 我为了省电,客厅里没开电暖,所以我总是避开在那里待太久,所以我经常看不到留言板……

就分享这些故事。可以看到其实学习资源真的很好找。积累的多了,你知道哪些公司会分享什么技术,你关注的领域有哪些专家,跟着这些行业专家,你又能继续扩展你的知识面。


【重点】 蚂蚁金服保险体验与社区技术组招高级前端开发工程师。我所在的团队,队友们个个都是独当一面。学霸很多,我天天跟着他们学习。(坐在我右手边的同学是清华医学博士。可能是因为玩过手术刀,这位大神撸代码行云流水,全 Vim 撸到底)我们开发了很有社会公益价值的相互宝,接下来会有更多激动人心的产品。有兴趣的同学联系我 ray.hl@alipay.com


Lambda Academy

Lei Huang

这个博客我主要分享函数式编程和前端开发。我还有一个英文网站