Coder Social home page Coder Social logo

my-decade-in-review-zhcn's Introduction

Original Blog

My Decade in Review - Dan Abramov

Why I Wrote This

受到 Dan 的这篇文章鼓舞良多,一度支撑我继续在 web developer 这条路上走下去,因此想要翻译一下它。

实际上,Dan 的原博客已经有一篇社区同僚翻译的中文版了。But I just want to do it with no reason :)

Content

我的十年回顾

我的十年要从大学新生那一年开始讲起,那时的我 17 岁,刚刚高中毕业,还没有工作。跟现在的行业没有任何关系,什么也不知道。但现在你正在看我的博客!我为此感到自豪。

我曾经在不同的渠道中零零散散地讲过一些我的故事的碎片,感觉现在也是时候一些对我来说值得回忆的部分了。

每个人的故事都是独一无二且不可复制的。我出生于一个中上层的家庭,这使得受益良多,也让我看起来更像一个典型的程序员,因此人们更愿意给我机会。尽管如此,我还是希望我们之间经历的差异的碰撞能够带来一些帮助。纵使我们的过往的环境有着天差地别,但至少你应该能从我的故事中找到一些令人开心的元素。

2010 年

我生出在俄罗斯,并于 2009 年从那里的高中毕业了。

在俄罗斯,如果你在考试中足够优秀,高中教育对你来说是免费的。

我尝试着申请了一些大学,当时的我特别希望能进到一所同学之间会经常进行编程比赛的大学(当时的我觉得这是一件很酷的事件)。

结果,我发现自己的数学成绩并不是那么足够让我进入这样的大学之中。所以,对于当时我的来说,编程并没有那么多的选择余地。在剩下的选择中,我选择了一个一所会给它的学生发 Macbook 的大学(还记得外壳是白色塑料自带库乐队的那一款吗?那是最好的 Macbook)。

到 2010 年的夏天,我在那儿结束了第一年的学习。但我发现,在接下来两年的课程中,并不会有很多的编程课。取而代之的是,有很多的线性代数、物理,和一些我不太感兴趣的东西。刚开始还好,但到后来,我逐渐开始偷懒,甚至在一些需要我早起的课程中逃课,我的知识裂口因为逐渐变得越来越大。到现在,我能想起来关于大学第一年的感觉,就只剩下无尽的焦虑和认为自己是个彻头彻尾的失败者。

甚至在一些我掌握得比较好的课程中,事情也并不如我预期的一般发展的好。例如我们的英语课非常的基础,那时我得到了我们英语老师的口头批准允许我跳过这些课程。但到了期末考试的时候,我被拒绝参加,除非我给我的任课老师支付数小时的“补课费用”。这些经历让我对所谓的高等教育充满了质疑和愤慨。

除了作为一个“叛逆”的学生之外,我那时也正处于第一段恋情当中,但这段恋情也不如我期望中般的好。当时的我并不开心,但我错误地认为我只要能持续的保持不开心就能够“修复”这短感情。不幸的是,我并不在足够的聪明在接下来的几年中从一段并不好的感情中脱离出来。

译者注:老冷暴力渣男了 :)

现在来说说光明的一面:从职业上来说,2010 年对我来说也是尤其令人激动的一年!我得到了我的第一份工作——软件工程师,下面讲讲它是怎么发生的。

当时我的大学会举办很多小的集会,其中有一个集会是关于“商业孵化”的。需要提醒你的是,这里指的“商业孵化”不是你想象中的硅谷的那种“商业孵化”,而是在发生在俄罗斯的很小的一个集会。当时的集会中,他们会讨论关于软件开发的东西,而当时的我非常渴望得到有关的内容,因为我决定去参加看看。在此之前,我在现实生活中根本不认识任何真正的程序员,也不知道有这种聚会的存在!

我已经不记得当时大家讨论的内容了,但那时我认识了一个哥们儿,他是一个做美国软件外包的俄罗斯公司的管理层。我从 12 岁就开始编程了,所以当时我鼓起勇气跟他搭讪,问他们公司是否在招人?他给了我一个邮箱,我通过了他们的所有测试题,在几周之后我就收到了 offer。

我在 2020 年的夏天开始了我的第一份工作,当时的工资是 1w8 美元一年(是的,就是 1w8,不是 18w)。这在发达国家仿佛不值得一提,但再一次地,那是在俄罗斯,那儿的物价房租也很便宜。我在当时就立刻从我妈的公寓里搬了出来并且租了一个 150 美元每个月的公寓。当时的我十分激动。我用我的第一份工资买了一台 iPhone,并且对它的 UI 所震惊。

夏天他来了又走了,大学的第二学年开始,但入学的人群中没有我。当时的我真正做着真正的工作,并且人们为我的工作付给我薪水,我失去了最后一点去做那些无聊的练习和课程的冲动。我并没有去上学,并且连期中考试也么有参加。我把我的 Macbook 退了回去,当我再次出现在那所大学里的时候已经是五年之后了,我去领那些属于我的文件。

跑题一下,我并不是在说大学的教育是没有用的,也并没有鼓励大家辍学。但在当时对我个人来说,那个决定是正确的。因为我知道当我出现困难的时候,我的家庭是我坚实的后盾(后面会细说),并且我也已经有了一份工作了。

我有着看起来就有知识的特质(在很早的时候就开始编程),确保人们不会因为我的背景看不起我。但如果你没有获得一个严肃的学位的话,人们往往会给你套用一系列的标签。所以,努力去获取能让你看起厉害的经历吧。

2010 年就是这样了。

2011 年

我的大部分工作都是在为便宜的外包项目做一些修复的工作。因为没有相关的行业经验,我尝试着去过度工程化每一个经手的项目,我把行业内那些我能上手的、领先的、比较酷的技术都用在了工作中,我甚至直接把微软还在调研阶段的项目直接用在了我们的生产环境。现在想来有些抱歉,但在当时我的工作完成得还算不错。

我第一个十分感兴趣的项目来源于一次出差。

当时我们有一个客户是纽约的投资机构,直至今日我依然对投资没有什么很多的了解。但总的来说,他们有一个邮件系统。他们的用户可以通过给他们发送邮件订单,然后这些邮件订单会根据不同的登记经过不同的人的批准。那么他们就有一个系统来管理这些东西,但当时他们用来管理的系统相当的脆弱,而且完全没有能搞懂那个系统是怎么运作的。我当时接到的工作认识就是需要去纽约驻场开发一个月,来修复这个系统。

那个服务是由一个更廉价的外包公司的契约工写的,九年过去了,我依然清晰的记得那个老哥的名字。至今令我记忆犹新的是那个系统中有一个函数,它的代码有 3000 多行。为了搞清楚这个函数做了什么事情,我把这个函数的代码打印到了纸上,在桌子上铺开这些纸张,然后用铅笔来给这些代码写注释。后来发现那就是同一段代码在不同的执行条件下,执行了 50 遍!我猜当时他一定是根据代码行数来获得薪酬的吧。。。

我花了一个月的时间,不断地在那个产品的服务上添加屎一样的 log,试图去搞明白那个服务到底做了什么事情。然后一点一点地重写那个服务,试图让它不那么脆弱。

和一个非科技公司一起合作确实不是一段那么顺畅的体验。

举个例子:我连发布一个 bugfix 都需要专门写一个文档来描述它,并且得到相关的 IT 部门的签字确认。现在,大家都用 Code Review 来代替它了。

在我临近结束出差的那个晚上,我去酒吧里听了一场音乐会。第二天上午我本应该向我的客户汇报我一个与以来的工作,并且我们预约的会议时间是九点钟。不幸的是,我喝了酒,并且睡过了头,知道下午 1 点才醒过来。我的项目经理已经为我道了歉,我苦逼而又尴尬的回家了。

但那个小的插曲最终没有影响到我的工作,这个项目总的来说算是成功了。我的客户最终对我的印象就是一个奇怪的从来不洗头的俄罗斯小哥吧。但我自己深知我欺骗了我自己,因为我也不期望能得到更多的“企业项目”了,工作逐渐沦为了一些杂活儿。

在那之后,我回到了俄罗斯的圣彼得堡。那儿的夏天,仿佛天永远也不会变黑,一整个晚上,我都在“寻找自我”。我从一个酒吧到另一个酒吧,带着一种不舒服的感觉。

到了大概上午七点的时候,我的脑海种的灯泡仿佛一下就灭掉了一样。我吃了一个沙瓦玛(中东最著名的街边小吃),坐地铁到了公司,等着 HR 来上班,然后辞掉了我的工作。

我的朋友本来计划要去克里米亚玩儿的,于是问我要不要加入他们。于是我当即收拾了一个帐篷,和一个老诺基亚手机并把他冲足了一周的电。

我们在迷雾般的思维中度过了两周的时间,其中大部分的时间里都是赤身裸体的。关于那段旅程,我已经忘记大部分的事情了,除了两件事。

又一次,一个人用小刀来威胁我,他说他会杀了我。但第二天他就走了,就像什么也没有发生过一样。

另一次,我很愚蠢的独自去一个悬崖附近游泳并且差点淹死了。我被海里的一块礁石所救,我爬上了它,然后晕过去了大概一个小时。

这次旅行就像是硬件重启一样,我就像被重新补充了燃料一样,又准备好重新继续写代码了(但别说我告诉你,为了补充燃料差点死掉了哈哈)。

但仅剩的问题是,我的技能好像都是不相关的!呀!

你看,我在大多数时间里都在写桌面端软件。有人听说过桌面端软件吗?这在现在几乎都不存在了!要么你转后端开发,要么你做移动端开发,要么就是前端开发。我甚至不了解他们中的任何一个!所以还是不得不搬回家跟我妈一起住(谢啦!老妈)。

不久之后,我在社交媒体上看到一篇文章。那是一个从硅谷回到俄罗斯的俄罗斯老哥写的。他当时正在招一些能够免费帮他的项目进行开发的人,作为回报的是,他会免费教一些网页开发技能。对于那个时候的我来说,听起来还算不错。

于是我加入了那个项目。但没过多久我就发现,那个项目其实没有什么东西可以学的,我们只得到了一些网上扒来的免费教程的。剩下的时间里,我们大多时候都在互相帮助着学习。

不过幸运的是,我的经济状况能够支撑着我过一段时间那样的生活(因为我跟我妈住在一起)。我学到了 Git、基本的 Python、Django、一点点 CSS 和 JavaScript,还有一点点的部署知识。也就是在那个时候,我正式接触了 web。

九年过去了,我依然不确定自己对于那个项目是什么样的感情。一方面来说,我们免费帮他打工。另一方面来说,我们能够得到完全的 root 权限。能够将自己的变更推送到生产环境上,并从中看到自己的错误真的是一件很令人激动的事情。

那给了我们一个大概的学习框架,并且你不需要付出任何额外的东西,还可以随时退出。由于那个项目是有关教育的,产生了一定的社会影响力。这也在我心中种下了开源的种子。

我依然对这个临时创建了“训练营”的老哥抱有感激之心,但总体来说,我还是不认同在免费工作中磨练自己的技能是个好主意。我并不试图在这篇回忆这种传播任何观点,只是在讲我自己的故事。

我做了一个可视化仪表盘,来让大家可以追踪自己的学习进度。当时我的导师建议我可以向一些拥有自己课程的公司推销这个产品。我短暂的尝试“创业”经历有点尴尬,我根本不了解自己创造出来的产品,我向不同的人来推销不同的产品。本质上来说,我用同一个引擎为不同的客户搭建了几个完全不同的网站。在这个过程中我大概赚了 200 刀。我在这上面浪费了好几个月的时间,这期间我朋友还尝试着要来帮我。但我觉得挺丢人的,最后停止了它们。但这也是我成为网页开发者的一线曙光。

我依然没有工作。

2012 年

作为一个 20 岁的网页开发者,在俄罗斯只有一个公司是我真正向往的,那是一个俄罗斯的社交媒体公司。几乎所有在俄罗斯的人都用他们的产品,他们的产品都相当的精致。而且他们的团队也十分酷,几乎都是精英。

他们的高管总是发帖子报道他们的工程师薪资是多么的高,小团队的工程师似乎对技术挑战和公司如何对待他们感到开心。在俄罗斯的科技圈子,许多人都知道他们的名字。

我的导师把我介绍给他们的 CTO,我因此得到了一个在家完成的 JavaScript 练习。那大概是一个他们一个小功能的克隆版,你能够快速选择一个你的朋友来给他发消息。

我花了大概两个星期来写这个程序,完成后的程序几户是在所有浏览器下都做到了像素级的复刻。我在每一个需要防抖和缓存地方都用心地照顾到了。

但后来的现场面试几乎就是翻车现场,老实说,当时我的经验根本没能到那个层次。但是,他们说他们还是愿意再给我一个机会,如果我“足够了解他们的产品”的话。

他们给了我一个在家里完成的测试——设计一个他们社交网站的离线状态,并且他们希望能展示一张 feature phone 的图片,许多人甚至不知道移动端网站能够运行在那么便宜的手机上。

我再次花了一周的时间来设计那个页面,我为那个页面做了许多的小细节,甚至还埋了一个小彩蛋在里面,我为那个作品感到骄傲。然而,我在设计的过程中找不到任何一张 feature phone 的照片嵌进去能让我的作品看起来不丑的。所以,我找了一张精致的 iPhone 图片取代了原本 feature phone 的位置。至少从审美上来说是令人愉悦的,我想。

并不令人意外的,我再次被拒绝了。我真就忽视了唯一一个硬性要求,为什么我就这么轴呢?我哭了整整几个小时因为我真的不想在其他任何公司工作。我依然跟我妈妈住在一起,并且没有在赚一分钱。

那个时候,我很认真地怀疑我自己的能力。许多东西在我看起来是很“神奇”的,我开始思考最后或许放弃吧。我在 iTunes 大学上报名了一期 iOS 开发的课程,于此同时,我还报名了另外两门课程:编译器和机器学习。当时我想,可能这些课会让我看起来更像一个“真正的程序员”吧。

然后我开始孤单地上课,然后我偶然又从之前的“网页开发训练营”中组织了一小撮人加入我的学习。我们会聚集在一起,在我导师的线上协作平台上一起学习不同的网上资源。

大概过了一个月吧,我收到了一封邮件。有人正想要招一个开发者,参加过我的小聚会的一个人向他推荐了我。我当时依旧沉浸在悲伤之中并忽略那那封邮件,但那哥们儿一直给我发邮件,试图和我视频。

Roman Mazurenko 并不是一个典型的创业者,他很热衷于发布一些自己的产品。在和一些朋友一起经过数年的努力后,他莫名其妙地让莫斯科变得酷了起来。他组织了一些趴体,也登上了一些时尚杂志。

我对于这次会面并没有什么期待的,但 Roman 非常的接地气并且跟他聊天很有趣。他的梦想是搭建一个 DIY 的发布平台,像视频里的一样。如果我参加的话,我不得的搬到莫斯科去,并忙着学习 iOS 开发。

插一嘴,那个视频里的老哥不是 Roman,而是我们的一个朋友。并且视频里的 app 里的动效是假的——用 flash 合成的——Roman 很善于放烟雾弹。

我答应了他。

最后,我并没有完成我的编译器和机器学习的课程。我学习了足够多的关于这两个方面的知识,并且知道了它们并不是什么“魔法”。在那之后,我就丧失了所有的学习它们的兴趣。

2013 年

来到 2013 年,那一年里我的收入是 3w 美元一年。几乎是我上一份工作的两倍。尽管还是低于美国标准,但在当时的俄罗斯已经是非常体面的收入了。同时我还协商得到了一些 Stampsy 的股份(⚠️ 剧透警告:最后发现一点用都没有)。

当时我们的团队有五名开发者和两个设计师。我们决定从开发 iPad 应用开始,但我们之中没有任何一个人有开发 iOS 的经验。我还记得我的队友第一次实现了一个我们需要的动效在应用上,我送了一口气。在那之前,我以为我们注定要失败了。

大概有几个月的时间,我几乎就住在了我们的办公室里。回顾那段时光,我并不为了当时了疯狂工作而感到骄傲,因为那不健康。但是,在那几个月里,我学到的东西比我之前两年穴到的东西都要多,我并不为此感到后悔。

最终,我从办公室里搬了出来。我开始和 Roman 住在同一个平层种,我的房间在当时大概要花我 1k 刀每个月,那是一个超级宽敞的平层。那几乎是我在莫克斯中唯一喜欢的地方了,而且从家里走到办公室只要 5 分钟的时间!

我们认为我们写的一些代码可能会队其他人有所帮助,因为我们决定好好打磨一下这些代码并把它们放到 GitHub 上。我们最开始并没有想到什么伟大的事业,但后来发现还是得到了一些非常好的贡献代码。我们当时发布上去的最流行的库大概有 30 个 star 的样子,对当时的我来说,那已经很多了。

我们团队中的一个设计师把我推荐上了 Bret Victor 的采访——关于原则上的发明。 我认为那是一段很好的采访,非常好。

四月来了,我们把我们一直在做的应用发布上了应用商店。苹果官方联系上了我们团队,并且向我们索要了一些资源,想要把这个应用放到 App Store 的推荐上去。我们喜出望外!那个应用在推荐上面待了几周的样子,人们开始逐渐使用它。

我们的兴奋很快开始衰减,因为我们开始意识到我们的产品根本就没有一个精准的市场定位!这个 App 是被设计来创造一些精美的杂志一样的布局的,但根本就不会有人在 iPad 上有什么精美的内容。并且,iPad 的摄像头的拍摄质量可以称得上是灾难。这个产品根本就行不通,为什么我们从来没有意识到这一点?

我的个人感情最后也分手了,我们并不是那么的适合,在一起仅仅是为了害怕孤独。我们最终分手了。

大概有几个月吧,我没有跟任何我俩共同圈子的人交流,一心扑在了工作上。但我意识到我开始想念一个特别的朋友,我开始给她写信,她说她也想我。我开始规划一趟去找她的旅程。

我感冒了。但随着旅途的开始时间越来越近,我也感觉到越来越糟糕,但我固执地认为在那时间我会变好的。当我搭乘的列车从莫斯科到达圣彼得堡的时候,我清晰地感觉到自己发烧了。但她说无论如何也请我到她家里去一趟。她为了做了热茶,给我穿了温暖的袜子,然后我们亲吻了。我沉沦了。

2014 年

2014 年是 React 的元年。

经过了一个短暂的生存危机,我们决定放弃 iPad 应用并转向 webapp。那意味着我必须开始学习 JavaScript,这次是真的。我们用 Backbone 造了一个还不错的原型,但交互部分真的是痛苦一般的编程体验。

我同事一开始注意到了 React 但是并没有决定使用它,但过了几个月之后,他跑来告诉我 React 事实上没那么糟糕。我决定给 React 一个机会,讽刺地说,我第一个从 Backbone 迁移到 React 上的是一个像按钮一样的玩意儿。

结果那个按钮运行得很好,真的很好。就想我从来没有见过的东西一样。

React 对于团队来说并不是什么难以推销的东西了,在接下来的一年中,我们逐渐将我们所有的 UI 迁移到了 React 来,并且使用 React 开发新的功能。React 中单一数据流的原则让我们开发得更快乐,而且 bug 更少了。

我们开始一个私有的测试版项目,一些摄影师们喜欢用它来创造一些虚拟的故事。那是一个介于 Medium、Pinterest 和 Tumblr 之间的应用。那个应用没有产生多少的交易,但也不像上一个 iPad 应用一样彻底的失败。

那时候 React 唯一的问题就是几乎没有相关的生态系统。当我们刚开始的时候,仅仅只有一个 router 库(而且还不是 React Router),并且我们还搞不懂怎么用那玩意儿。所以我们自己造了一个轮子,当 React Router 出来以后,我们停止了自己的轮子,并且将我们需要的特性加入到了 React Router 当中。

当时没有我们需要的拖动释放的解决方案,因此我将我同事的库迁移到了 React 上。同时我又写了几个工具:其中一个是用来来管理文档的标题的,其中一个是用来标准化 API 响应的。来自 React IRC Channel(React 相关的聊天室)Jing Chen 贡献出了核心的想法,然后它成功了!

我也想向 React 贡献一些自己的代码,于是我找到 Paul O'Shanness。然后问他有没有什么 PR 是我可以帮忙的。我在几天之后完成我的第一个任务,但它知道几个月之后才被合并到 master 分支上。大项目的发布流程就是这样。我对缓慢的响应感到懊恼,所以我将精力转移到了它的生态系统当中。现在看来,当时的决定是更有效的。

2014 年,我也做了一些公开的演讲。我在我们的办公室做了一系列关于 React 的演讲,那个演讲大概持续了两个小时。现在想来,我为绝大多数人坐到了最后感到吃惊。

在那之后,我报名参加了一个 BerlinJS 大会的演讲。我的主题是“React 和 Flux”。我并没有练习我的演讲,当我演讲的时间耗尽的时候,我才做完一半的演讲。从那以后,我每次都会为我的演讲彩排,少的话 3 次,多的话 15 次。

2014 年,我收到了来自 FaceBook 招聘官的第一封邮件。我把这封邮件遗漏在了我的收件箱中,知道几个月后才发现它,但我们最终还是聊上了。结果发现,他问我是否有兴趣去美国工作,但那并没有那么容易,因为我没有足够的工作经验并且我从大学辍学了。Oops!

我在 2014 年开始的项目里面有一个对我来说特别亲切,几乎可以说是我人生中最重要的事情之一,这并不经常发生。我将我们的 App 从 require.js 迁移到 webpack 上,为了开启代码分割。当时我还看到一个很炫酷的特性,叫“模块热更新”。该特性允许你修改项目的 css 代码而不用重新刷新页面。在 webpack 中,他被允许作用于 JavaScript。

我对这个特性是怎么工作的十分好奇,所以我在 StackOverflow 上面询问关于这个特性的原理。在当时,webpack 还是一个非常新的东西,webpack 的作者注意到了我的问题,并且作出了他的解答。他的解答给了我足够多的信息。本着我之前提到的 Bret Victor 的演技中的精神,我开始思考是否能将这个特性引入到 React 中。

我用了非常 hacky 的技巧,通过修改 React 的源码,并添加了一大堆全局变量,来试图证明这个概念的正确性。我决定在这个东西不生效之前就不去睡觉,我一直写代码到 7 点,直到有了第一个能发推特的 demo。在那之前,没人关心我的推特账户,但我依旧收到了一堆“喜欢”和“转发”,并且那 20 个的转发也验证了这个概念巨大的正确性。我知道我不是唯一一个对此感到十分激动的人。如果当时的我不能持续地把这个特性加入到我的工作中,我知道这会成为一个废弃的概念。于是我请了一个假,并且将这个特性的原型完成了。

一个快速的声明:我并不是说你“需要”在假期或者晚上工作。我并不鼓吹赶工,这个世界上依然有许多人并没有那么做又完美地完成了他们的工作。事实上,如果我对更了解时间管理的话,我也许能够在我的工作日挤出更多的连续的时间来做这些事情。我之所以分享这些东西是因为我正在讲述我的故事,并且我也不想假装我一周只需要工作 40 个小时就可以完成这些所有的工作。

2015 年

我们的产品对内发了一个版本,我们的用户在增长,缓慢而线性的。我们的公司几乎花光了前期的投资,并且挣扎着想要筹集更多的资金。而我则把更多的精力放在了我的开源项目上。

与此同时,我也想做我的第一场大会演讲。自然的,我想讲关于热更新的主题,但我知道已经有人在 ReactConf 大会的演讲中提到过热更新了,我讲这个并不会让人们感到印象深刻。我决定在我的热更新主题上添加一点“调味料”——“时间旅行”。

同样是,是被 Bret 的 demo 所鼓舞的。我的提案得到了通过,接下来有几个月的时间让我来准备它。

在四月份的时候,我的薪资倍拖延了几周。最终我还是受到了我的薪资,但我知道是时候找新的工作了。我找到了一些正在使用我的库的公司,并且他们同意了资助我的工作几个月的时间。

我女朋友问我想不想要结婚,我说我想在我 30 岁的时候再结婚。她问我为什么,我确实找不到一个可以说服双方继续等待的理由。所以我们买了戒指,并且结婚了。我们的婚礼大概就花了 100 美元。

我的演讲的日子就要来临了,但我依然对实现“时间旅行”完全没有什么概念。我知道 Elm 里面有相似的特性,但我害怕去仔细看它。因为我怕我看了之后发现在 JS 中并不能被很好的实现出来。

在那个时候,社区里有很多 Flux 的库。我使用过其中的一些,其中特别突出的是 Andrew Clark 写的 Flummox,当时我有一种隐隐的感觉如果我把热更新加到这个库上面去,我就可以实现时间旅行。

Sunil 的主旨让我萌生出一个想法:一个用 reducer 函数替代 store 的 Flux 模式的变种。而且我心中已经对它有了一个非常简短的名字,我真的需要它来完成我的演讲!

我及时地实现了 Redux,并将它应用在了我的时间旅行 demo 上。我第一次演讲的彩排是在 Skype 上。彩排当时,我不停地出汗,话也讲不清楚,并且匆匆地就讲完了所有的东西。在彩排结束之后,我问组织方我刚才的演讲怎么样。他说:“嗯...人们挺喜欢你的。“

这就是委婉地在说我刚才的演讲很糟糕。

我从刚刚离职的创业公司中找了一个设计师朋友,让他帮我把我的 ppt 设计得更好看。我给它添加了动效和过场。当我的演讲准备的越充分,我就看起来越自信和沉着。我练习了数十次。

我飞去了巴黎进行我的第一个技术演讲,那几乎是我人生中最开心的一天了。我人生中的第一次,将我的脸摆在大银幕上的头像旁边。那里有些 UI 狂热者和我的粉丝围绕在我的身边,感觉就像去霍格华滋。

我的演讲差点就泡汤了,那天早上,我发现我的笔记本链接不上投影仪了,而当时离我的开场只剩下几个小时了。CHristopher Chedeau 很大方地把他的笔记本借给我了,然后我把我的演示 demo 传到了那个手机上(除了 Sublime 的证书之外,如果你看过那场演讲,你就会知道我在讲什么)。

一开始,我的 demo 在 Christopher 的电脑上跑不起来,因为我们本地的 node 版本不一致。当时会场的 Wi-Fi 又很烂,烂到不能够让我再下载一个新的 node 版本。幸运的是,我找到一个 npm 命令来重新编译我的 demo。它生效了,我用 Christopher 的电脑完成了我的演讲,演讲效果很好。

我遇到了许多已经在 Twitter 上认识我的观众,其中一个就是 Jing Chen。我依然记得她是 IRC React 交流频道的一员,并且过去跟他打了招呼。她问我之前是不是有 FaceBook 的招聘官联系我了,我说是,但我没有拿到美国的签证,所以没法去美国上班。Jing 然后问我是否有兴趣在伦敦办公室工作,当时我完全不知道居然在伦敦有办公室!我当即打电话给我的妻子,问她是否愿意去伦敦生活。我以为她会不喜欢这个想法,结果她立马就答应了。所以我答应了参加面试。

当时有四位来自 FB 的人参加了大会,Jing 在大会的酒店里帮我安排了一场面试。其实就是一场常规的面试流程,但那是在巴黎,外面很热,每个人都很温柔。

一切都发生得如此自然,让我没有时间准备,也没有时间紧张。面试过程中有一刻我紧张坏了,因为当时我无法写出任何一行代码去交换数组中两个元素的位置。我问 Jing 能否给我一些时间,她对我说:“我知道你能够做到”。

那给了我极大的鼓舞,我完成了那个片段,并且顺利地通过了面试。

我也许通过地不那么完美,但我最终得到了 offer。

我的演讲很快变得大热,Andrew Clark 甚至放弃维护当时最火的 Flummox 来加入我一起维护 Redux。人们开始将 Redux 运用到生产环境上,新的学习者们开始对 README 文件感到困惑,因为那是在早年期间建立在人们有相关背景和一定编程能力上写的。当时我并没有全职工作,并且英国的签证下来也还需要几个月的时间。

我发起了一个赞助,来支撑我接下来几个月的工作——尤其是在重构 Redux 文档,创建一些小的教程 app 和录制一些免费的视频教程。我筹集了大概五千美元每月的赞助,在那个时候,那笔赞助已经比我过往拿过的所有工资都要高了。我录制了我的一些“从 Redux 入门”系列的课程,现在看来真是尴尬到流泪。但当时一下就火了起来,也让我当时赚了不少的钱(大概三千美金每个月),尽管那个课程是免费的。

FaceBook 帮我处理了大部分的移民手续,我和我妻子只需要填一些表格就行,同时我还去做了一些英语测试和健康检查。FaceBook 在安顿我们方面,也做足了工作,甚至还包括把我的猫从俄罗斯运到英国(大概花了 5 千美元)。我被雇佣为 Level4(译者:大概为国内的 P7),基础薪资为 10w 美元每年,并且有初始期权大概价值 12.5w 美元分四年发放。同时,还给我发了大概 1w8 美元的补贴,来帮助我在英国当地安顿下来(顺带一提,在英国的研发薪资比在美国的同等级要低一些)。

我们在 2015 年 11 月的时候抵达了伦敦,在此之前,我们从未到过伦敦。我们从机场打了一个黑色出租车,我仍然记得刚上出租车的时候,我们不知道怎样关掉车上的加热器。车上变得越来越热,我们开始出汗,热气使得车窗蒙上了一层水雾。大概过了十多分钟,我们终于关掉了加热,窗子上的水雾逐渐散开,我们的视野逐渐变得透亮,伦敦的美映入眼帘。

在那之后第二天,Roman Mazurenko 在一场车祸中去世了。彼时的他刚刚拿到美国签证,去到莫斯科拿他的一些文件。他曾经跟我说过莫斯科有一种邪恶般的力量,让你无法离开那个地方。我再也见不到我的老朋友了,2015 年是这样,现在及将来亦如此。

Roman 的好友们为他做了一个数字化的来生,我觉得他应该会喜欢这个软件。因为他一定会喜欢这个软件在 App Store 上的 2.5 分的讽刺意味。

2016 年

新的工作,新的城市,新的国家,不同的语言,不熟悉的口音。大公司,入职流程,会议,项目,团队,文件,表单等等一大堆东西向我涌来!

我机会不记得头几个月我是怎么度过的了,我承受着持续的压力,试图去搞懂在没有字幕的情况下人们到底在说什么。我经理刚刚跟我交代了什么???我如果再去让他再说一遍会不会很不礼貌?让他拼一下刚刚说的单词呢??

啥?我需要打电话给一个在苏格兰的女士,来取得我的国家保险号码?她的东西我一句话都没听懂!国家保险又是什么鬼?为什么我的税号那一栏上的号码是 0?我拿到手的工资为什么比我想象的要少??等一下!在英国工作的人们真的会交税吗!如果我病了我该怎么办?NHS 又是什么?

2016 年我第一次去美国的时候,我整整一天忘记吃东西了(一部分时间是在飞机上),喝了超级多的咖啡。我带着焦虑尝试着给我美国的同事解释“热更新”的原理的时候,我的恐慌发作了。同事给我叫了救护车,我后来收到了一张 800 美元的账单(这里要再次感谢 Facebook,它帮我付清了这个医疗账单,我不需要自己掏钱)。

重新在另一个地方安置是一个很折磨的过程,不过好在公司帮我处理了绝大部分的麻烦事儿。当时的我自认为完成了所有的居住手续,但我忘记在警方那儿登记注册了(令人感到困惑的是,我们需要去邮局来做这件事情,但我们已经在邮局做过另外的注册手续了)。我们在几个月之后才发现我们缺失了这件事情,然后我们被告知这可能会影响我们的签证。不过幸运的是,这件事的影响并不大。

在最开始,我应该被发配到 React Native 的伦敦团队。因为通常来说,我们招聘了一个人之后,他会先通过一个训练营,然后会由他自己选择一个团队加入。但当时的我并没有这个自由,因为我在此之前就被预定了。然后,我对 React Native 并没有什么特殊的感觉。我找到 Tom Occhino 进行了一段谈话(他是那个时候 React 团队的老大),他建议我加入 React 核心团队,但这个团队 Base 在美国,而我作为远程成员 Base 在伦敦。我之前在开源项目的工作经历几乎都是远程的,因为我接受了这个建议。

在 2016 年中,React 有了爆发般的增长,但感觉每个团队都在造自己的轮子:打包工具、监视工具、编译器等...React 在这一年得以和 JS 模块化、ES6 齐名。

Christopher Chedeau 建议我们自己造一个 React 的脚手架原型,于是我们花了几个星期,发布了 Create React App 的第一个版本。

2017 年

两年期的教学视频仍在不断地给我带来稿酬收入,我并没有多想,把这些额外的钱用来点外卖和买新衣服上了。

直到 2017 年,我忽然意识到,这些额外的版税应该算作是国外收入进行纳税。然后我发现我欠女王大概 3w 刀的税...唉,终于,我像一个每一个英国人一样,请了一个会计,拯救了我一团乱麻的税务问题。

工作上,我们花了整个 2017 年来从零重写 React。你可能已经知道了,结果就是推出 React 16. Sophie 在这里讲了整个故事,包括我们是怎么做的。

除了税的事情之外,我们的个人生活并没有发生更大的事情。我依然在适应在英国的生活,在跟政府打交道的事情中,我也没那么紧张了。我也能够在电话中不那么紧张了。我开始尝试看电影不带字幕,我学会了如何和 NHS 打交道并且有了私人的保险。同时我也停止了一些副业的项目。

2018 年 - 2019 年

过去的两年时间飞逝,大概是离它们太近了,我不太分得清什么是重要的事情。

在职业上,我们的工作需求变得越来越重。如果你知道 React 的变化和更新,你就会知道我们干了什么。我逐渐成长为一个工程师,但依旧还有很多要学习的。我们的伦敦团队逐渐变大了——我不再是一个人了。

在外面,人们偶然会认出我来。这令我有些感到不好意思,甚至有人会在蒸桑拿的时候认出我来并且开始抱怨 React。请你不要成为那哥们儿。

我升职了,我开始写博客作为我的副业。同时我也有另一个副业项目正在规划中(其实已经考虑了两年怎么更好地去完成这个项目了)。我从互联网上认识了更多的人,换了更多的头像。

这些都很有趣。

我一直都知道我喜欢写 UI 界面。从被 VB 吸引开始,我花了十多年的事件在写 UI 界面上,然后开始写建造 UI 的工具。然后开始跟人们谈论并解释它,但现在我意识到了:我喜欢去解释一样东西就像我喜欢建造那些东西一样。也可能,解释一样东西对我来说更重要。

我期待着在下一个十年能做更多的事情。

或者,我应该说是这一个十年。

欢迎来到20年。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.