Dan Abramov(React 核心开发,Redux 作者) 谈他不懂的技术
人只要找到自己的热情所在,不用样样都懂也能创造美好的东西。宽阔的视野的确有助于开拓创新,但是专注更容易给人带来细节上的感动。
Dan Abramov简介:
和我差不多大,好像是94年的吧。偶然看到了他的经历,很感动,是一个学习的好榜样。
俄罗斯人,10 年的时候,大一刚刚结束就辍学了,在一家软件公司上班,开始编程工作。当然在此之前,已经有了多年的编程经验,他第一年拿到的薪水是$18k每年。
11 年,暗黑时刻,被辞退。于是努力学习,尝试各种新鲜技术,包括 Git, basics of Python, Django, a bit of CSS and JavaScript, and some Bash。
12 年,找工作遇到了很多挫折,想要去的公司也没有去成功。很迷茫,学习各种知识,包括 Compilers and Machine Learning courses. 后来去到了莫斯科一家做 ios 开发的公司。
13 年,$30k 每年。在那家做 ios 的公司做得很认真,但是产品并没有卖得很好。
14 年,是他的 React 元年, 他的一个同事最早知道了 React,并把 React 介绍给了他,他于是做了一些尝试和探索。从此开始入坑,当时 React 生态还很不健全,他研究了“hot module replacement”机制,并且发布了推特,慢慢地有了一些影响力。他也第一次得到了 Facebook 公司的 recruiter 招聘信,但是他没有太多理会。他开始从这一年起,参加技术大会,做技术分享,了解到要想布道,也要有非常好的演讲准备和演讲技巧。他在假期的时候,也不忘记敲代码,这也是他能够成功的原因。
15 年,继续在开源的路上越走越远,继续支持 React 生态的发展,积极参加技术大会,在技术大会和推特上认识了好多技术牛人,互相学习。写下了 Redux,后来通过一个技术牛人,得以进入 Facebook 伦敦部门(由于某些原因,无法获得美国签证,只能去伦敦了)
16 年,正是进入 React core team,成为 React 的核心开发团队成员。这是美国以外唯一一个远程 core team member。 后来鉴于当时社区有大量第三方的脚手架,核心团队自己搭了一个标准典范脚手架,也就是著名的 Creat React App.
17 年,为了 React 16.0 这个版本,重写 React.
18-19 年,获得晋升,伦敦团队日益壮大,自己也有了几个 side project,有了更大的影响力。
总结起来,我觉得这个故事真的很励志了,让我最大的感受是他的坚持,不断地学习和探索。以及他对于开源这件事的态度,正是开源,扩大了他的影响力,很顺利的进入了 Facebook,被招安了,也挺好。
Dan 开了一个自己的博客,介绍一些关于 React 的底层的基础知识,他喜欢把看起来深奥的问题用浅显的语言解释清楚,所以他是我很喜欢的一个大神。
最近他写了一篇文章,(Things I Don’t Know as of 2018),起因是有一些程序员认为他作为一个在社区比较出名的大牛应该懂得技术和框架应该非常多,所以他在这篇文章中列出了在计算机开发的领域,他不是很了解的部分。这篇文章在 Twitter 上非常火。我看了以后特意来翻译一下。
他还说到,目前的码农界,人们总是有一个不现实的期望,他们希望一个有经验的开发者可以融会贯通各种技术,尤其是我们大家都特别推崇的那种 roadmap,就是什么成长路线图,比如说这个 (goodjack/developer-roadmap-chinese) 我在想这种玩意儿,很多人看过一次一般都会心中骂个娘,然后再也不看了。他除了给你挫败感之外没有更多的成果。
下面就是 Dan 自己说他自己没有掌握的一部分知识,看完了你也许会大跌眼镜,你心里面会暗自嘀咕:一个连 *** 都不会的,还是大神吗?还不如我自己呢。好,那我们现在就来看看这个列表(以下都切换为 Dan 的第一人称):
- Unix Bash 命令:我可以使用 ls 和 cd浏览文件系统,我明白管道的概念,但是只是用过最简单的例子,我不知道怎样使用 xargs 创建复杂的管道,我没有系统的学习过 bash,所以我只会写最简单的(同时还有各种的 bug) shell 脚本
- **底层语言:**我知道汇编语言让你在内存中存储数据,然后在不同的代码块进行 jump,就这么多。我写过几行C语言代码,知道什么是 指针。但是我不了解使用 malloc或者其他的工具进行内存管理,从来没有用过 Rust。
- **网络基础:**我知道电脑有对应的 IP 地址,知道 DNS 用来解析域名。但是我不了解 TCP/IP 协议是如何进行工作的细节。
- **容器:**我不知道怎么用 Docker 和 K8S (这两个东西有没有关系我也不清楚),我自己的理解就是它可以让我启动一个单独的,可预测的虚拟环境,听起来很棒但是我从来没玩过。
- Serverless 无服务器:- 听起来很棒,但是没玩过。我不知道这种方式怎么就能改变后端的开发流程了。
- **微服务:**我自己的理解是 很多 API 的接口可以进行互相访问,我不知道这种方式实际的优势和劣势,因为我没玩过。。。
- Python: 说起 Python 我有点难受,我之前使用 Python 工作过几年。但是很多底层的内容,比如 import 模块到底是怎么工作的,对于我来说,我都没搞清楚。
- **Node 后端:**我知道怎样运行 Node,使用过 一些 API(比如 fs)来构建项目,可以搭建一个 Express server。但是我从来没有用 Node 连接过一个数据库,也不清楚到底怎样写后端的代码。我也不知道 Next (一个 React 前后端同构的框架)怎么玩,我只用它搭建过一个 ‘Hello World’而已。
- **原生平台:**之前的某个时间点我试过去学习 Objective C,但是最后没学成。我也没学过 Swift 和 Java。
- **算法:**我在状态很好的情况下,花一整天的时间可以搞定冒泡排序 和 快速排序。我也可能实现一个简单的图的遍历。我能理解 大 O 表示法,但是我理解的深度也就到“不要往循环里面再嵌套循环”。( 太诚实了。。)
- **函数式编程:**除非你把 Javascript 算进去,我对任何传统的函数式编程语言都不熟悉,我很难读懂 LISP 系(比如 Clojure),Haskell 系(比如说 Elm),或者是 ML 系(比如说 OCaml)的代码。
- **CSS:**不懂 Flexbox 和 Grid,我喜欢 Float …
- CSS 方法论(太拗口了):我曾经用过 BEM,但是这就是我了解的全部了。没玩过 OOCSS 和其他类型的东西。
- SCSS / Sass: 没学过。(大神你是认真的吗? )
- CORS:每次遇到这些错误都有点懵逼,我知道我要加一些 headers 来修复他们,但是每次都要浪费很多时间。
- HTTPS / SSL : 没有自己设置过,除了知道有私钥和公钥之外,不懂其中原理。
- GraphQL: 我能读懂 GraghQL 的 query,但是我不知道怎样解释 nodes 和 edges,不知道什么时候使用 fragments,不知道分页是什么原理。
- Sockets:在我的脑袋里,我就知道它们是 计算机 使用 request response 的模型进行互联。
- Streams:除了用过 Rx Observables,我没怎么用过 Stream,我用过一两次 node.js 的原生 Stream 模块,但是 它的 error handling 让我抓狂。
- Electron: 没玩过
- TypeScript:我了解 types 的概念,能读懂里面的 type 类型,但是我没写过。有几次我心血来潮想玩玩,但是每次都遇到问题。(这点我比大神强。。。)
- 部署 和 devops:我会使用 FTP 传输文件,还会杀死某些进程,仅此而已。(大神你这真的不是自黑嘛。)
- **图:**不管是 canvas,SVG,WebGL 或者是其他低级别的图,我都没怎么大量使用过,我能弄懂个大体意思,但是细节不太了解。
还有很多东西我不懂,这里就不列出来了。
讨论这些可能有点奇怪,我在吹嘘自己的无知吗?写这篇文章想表达的是:
- 就算你最喜欢的程序员也有很多不懂的东西。
- 不论你的水平怎样,不同时期信息很有很大差异。
- 尽管每个人都有知识缺陷,但是经验丰富的术业有专攻。
我知道我自己的知识缺陷,但是当我需要它们的时候我可以比较快的掌握它们。
这些缺陷不会让我的知识和经验贬值,我可以做好很多事情,比如说:当我需要某些技术的时候学会它们。
我特别喜欢这篇文章,在这个全民浮躁的时代,知乎每天给我推送的是:裁员,程序员大了以后什么出路, 互联网寒冬,女生有一双好腿有什么感觉,年薪百万是什么感受,贩卖焦虑,贩卖浮夸。我还能看到这么一篇真诚的文章直击内心,让人欣慰。