我的十年回顾
January 1, 2020
十年前,我还是个刚从高中毕业、刚进大学一年级的新生。那时我才17岁,没有工作,没有任何行业人脉,说实话什么都不懂。现在你正在读我的博客!如果那时的我知道这一切,一定会感到自豪。
我曾在不同的播客里零零散散地讲过自己的故事。现在,似乎是时候把那些最让我难忘的片段写下来。
每个人的故事都是独一无二的,无法直接复制。我非常幸运,出生在中产家庭,外貌也很符合“程序员”的刻板印象。很多人愿意给我机会。当然,我也希望分享我的经历能帮助大家对比各自的成长轨迹。即使我们的处境大不相同,至少你可能会觉得其中一些故事有趣。
2010
我出生在俄罗斯,2009年在那里高中毕业。在俄罗斯,如果你考试成绩够好,高等教育是免费的。我尝试报考了几所大学,尤其希望能进一所常常在编程竞赛中获奖的学校(当时觉得这很酷)。
然而,结果是我的数学成绩不够理想。能选的与编程相关的学校并不多。在剩下的选项里,我挑了一所会给学生发Macbook的大学。(还记得那种白色塑料壳、带GarageBand的Macbook吗?当时觉得太棒了。)
2010年夏天,我刚结束在那里的一年学习。结果发现,课程里还要再过两年才会有编程相关内容。大部分时间都在学线性代数、物理和其他我并不感兴趣的科目。刚开始一切还好,但我渐渐开始松懈,尤其是那些要早起的课经常逃掉。知识上的漏洞越积越多,回想起大一,最深的印象就是那种觉得自己一事无成的焦虑。
即便是我擅长的科目,事情也没按计划进行。我们的英语课非常基础,我跟老师口头沟通后基本都没去上。但等到期末考试时,老师却不让我交卷,除非我花钱跟她补课。这让我对高等教育产生了怨气和怀疑。
除了学习不佳,我还处在人生第一段认真的恋爱中——但也不太顺利。我很不开心,但当时以为只要继续忍耐、努力“修复”就能解决。不幸的是,我还没学会及时止损,直到几年后才走出来。
说点积极的。2010年对我职业发展来说是激动人心的一年。我找到了人生第一份软件开发的工作!事情是这样发生的:
学校附近有个小场地,经常举办各种活动。那是个“孵化器”——当然不是硅谷那种,而是俄罗斯本地的小型孵化器。我也不知道他们到底“孵化”了什么企业。不过有一次他们举办了一个关于软件开发的讲座,我因为渴望这类内容就去听了。当时我现实中一个程序员朋友都没有,也不知道有“技术聚会”这种东西!
现在我已经不记得讲座内容了。但我知道主讲人是家俄美外包公司的高管。我从12岁就开始编程,于是主动去问他们是否在招人。他给了我一个邮箱,我做完他们的测试题,几周后就拿到了工作。
2010年夏天,我开始了第一份工作,年薪1.8万美元(没错,就是1.8万,不是18万)。在发达国家这点钱不算什么,但在俄罗斯房租也很便宜。我立刻搬出了妈妈家,每月花150美元租了个房间。非常兴奋。拿到第一笔工资后,我买了一部iPhone,被它的界面惊艳到了。
夏天过去,第二学年开始了。但我没去上课。现在有人付钱让我做真正的工作,我对坐在教室听讲和做作业彻底失去了兴趣。我不再去上课,也没参加期中考试,把Macbook还了回去。之后唯一一次回学校,是五年后去取我的文件。
插一句,我并不是说大学没用,或者你应该退学。对我来说这是对的选择,但我知道即使遇到困难我也可以依靠家人(后面会提到),而且我已经有了工作。
由于我的背景(从小编程的男孩),别人默认觉得我很懂行。那些不符合这种刻板印象的人,往往需要学历来获得被认可的“专业能力”。这也是现实。
2011
我的工作主要是修复一些更便宜外包公司留下的烂代码。自己也没什么行业经验,为了尝试各种新技术,我把每个项目都过度设计。甚至把微软研究院的实验项目用在生产环境里。对此我很抱歉。当然,也做过一些正经的好项目。
第一个有意思的项目还涉及出差。客户是纽约的一个投资集团。我至今对投资一无所知,但他们有个邮件系统接收订单,订单需要多级审批。他们有个服务负责管理,但极其不稳定,没人搞得清怎么回事。我的任务是去纽约现场工作一个月,把这个服务修好。
这服务是更便宜外包公司的承包商写的。九年过去我还记得他的名字。最让我印象深刻的是一段三万行的函数。为了搞懂它,我把代码打印出来,铺满桌子,用铅笔做标注。结果发现其实就是同一段代码,换了条件重复了五十遍。估计是按代码行数算钱的吧。
那一个月我加了大量日志,搞清楚服务在生产环境到底做了什么,然后从头重写了一遍,稳定了许多。和非技术公司合作的体验很奇特。比如,我不能直接推送bug修复,必须先写Word文档说明改动内容,再让IT部门主管签字。那才叫“代码评审”呢。
快结束时,我晚上去酒吧看了场演出。第二天早上9点要给客户做一个月工作的汇报。不幸的是,我睡过头,下午1点才醒。经理帮我道了歉,我自己则羞愧难当。
工作上并没有因此受到惩罚。项目总体很成功,客户也知道我是个头发乱糟糟的怪俄罗斯人。但我知道自己出丑了,也不再想做“企业级项目”。工作变成了负担。
我回到了俄罗斯圣彼得堡。夏天的天空几乎不会黑下来。某个夜晚,我在几家酒吧间游荡,心里隐隐不安。早上7点,突然灵光一现。我吃了份沙威玛,坐地铁去公司,等HR上班,然后辞了职。
朋友正计划去克里米亚(那时还没被吞并),问我要不要一起。我带上帐篷和一部能待机一周的老诺基亚,去露营了两周。大部分时间都在迷迷糊糊的另类状态中,几乎记不得什么,只记得两件事。
有一次,有人拿刀威胁我,说要杀我。第二天那人就消失了,大家又若无其事地继续玩。还有一次,我傻乎乎地一个人游泳绕过悬崖,差点淹死。幸好海里有块石头,我爬上去昏睡了大约一个小时。
这次旅行像是硬件重启,把我的职业倦怠治好了,重新有了写代码的动力。(但别说是我教你用“差点死”来治倦怠啊。)
唯一的问题是……我的技能已经过时了!糟糕。
你看,我主要写桌面软件。现在还有人听说桌面软件吗?这玩意儿早就没人做了。要么做后端,要么做移动端,要么做前端。我对这些都一无所知,也没有工作,只好搬回妈妈家住。(谢谢妈妈!)
很快,我在社交网络上看到一条帖子。一个从硅谷回国的俄罗斯人发的,他在找愿意免费帮他做项目的人,作为交换,他会免费教我们Web开发。当时我觉得挺划算。
我加入了这个项目。很快发现其实没什么“教学”,就是给了我们一些网上教程,大家互相帮忙学。幸运的是,我可以在妈妈家白吃白住一阵子,慢慢学会了Git、Python基础、Django、一些CSS和JavaScript,还有用Bash部署代码。你好,Web世界。
九年过去,我对这个项目的感受依然复杂。一方面,我们是在免费帮他做项目。另一方面,我们有root权限,能直接上线自己的代码,犯错也能学到东西,这种学习结构很有用。我们随时可以退出,也没花钱,项目本身也有点社会价值(和教育有关)。这让我想起了开源。
我依然很感激这个人搭建了这个临时“训练营”,也做了我的导师。但我并不想暗示“免费打工”是个好练习方式。我只是讲述自己的经历,不是在给建议。
我做了个仪表盘,可以追踪自己的学习成就。导师建议我把它当产品推销给办课程的公司。我短暂尝试了一下“创业”,但其实根本不知道自己在做什么产品,对不同客户说不同的方案。最后,我用同一个引擎给不同客户做了几个完全不同的网站,总共赚了200美元。浪费了几个月时间,也耽误了朋友们的时间,最后羞愧地关掉了项目。唯一的收获是我成了一名Web开发者。
但我还是没有工作。
2012
作为一个20岁的Web开发者,我只想去一个地方工作——俄罗斯一家社交媒体公司。全国人民都在用他们的产品,界面很精致,团队也被认为很酷,几乎是精英。
他们的高管经常发文说工程师薪水高,团队小而精,技术挑战多,大家都很开心。在俄罗斯技术圈里,很多人都知道他们的名字。
导师帮我引荐了他们的CTO,我拿到一个JavaScript的家庭作业,要做一个类似他们网站的输入框,可以选好友发消息。我花了两周做,所有浏览器都像素级还原,缓存和防抖逻辑也做得很像。
现场面试却是一场灾难。很明显我没有他们那种规模的经验。不过他们说如果我“理解他们的产品”,愿意再给我一次机会。于是又给了我一个家庭作业:为他们的社交网站设计一个未登录页面,要展示一部功能手机的图片——因为很多人不知道他们的移动网站在便宜手机上也能用。
我花了一周设计这个页面,做了很多细节,甚至还藏了彩蛋。自以为很棒。但我找不到好看的功能机图片,只好用了漂亮的iPhone图,觉得美观极了。
结果当然是被拒了。我居然忽略了唯一的硬性要求——怎么会这么迟钝?我哭了几个小时,因为真的不想去别的地方工作。还住在妈妈家,一分钱没赚。
那时我开始严重怀疑自己的能力,很多东西都觉得像“魔法”。甚至开始怀疑退学是不是错了。我在iTunes U上报了个iOS开发课程,还在Coursera上报了编译原理和机器学习两门课,也许能让我成为“真正的程序员”。
一个人学这些课程很孤独。我组织了个小型聚会,和Web开发“训练营”的几个人一起,在导师的联合办公空间看网课。
大约一个月后,我收到一封邮件。有人想招开发,听说了我,是从聚会里一个人那里听来的。那时我得了单核细胞增多症,没理这封邮件,但对方一直发邮件催,想和我Skype聊聊。
Roman Mazurenko不是典型的创业者。他热衷于DIY出版,和朋友们一起,几年间让莫斯科变得很酷。他办派对,上时尚杂志。我不知道会遇到什么样的人,但Roman很平易近人,聊起来很有趣。他梦想做一个DIY出版平台,就像这个概念视频里那样。我得搬去莫斯科,边学iOS开发边做项目。(顺便说,视频里的人不是Roman,是他朋友,App其实是用Flash做的假动画。Roman很擅长制造“烟雾弹”。)
我答应了。
编译原理和机器学习的课程没学完,但学到的足够让我明白这些并不是“魔法”。之后我也就不再感兴趣了。
2013
到2013年,我的年薪涨到3万美元——比上一份工作几乎翻倍。虽然在美国不高,但在俄罗斯算不错了。我还和Stampsy谈了点期权(剧透一下:最后完全没价值)。
我们团队有五个开发、两个设计师。最开始做iPad应用,但没人真正懂iOS。我记得有队友第一次实现出我们需要的动画时,我如释重负。之前我还以为我们完蛋了。
有几个月我几乎住在办公室。回头看,这种生活工作平衡很糟糕,也不健康。但那几个月学到的东西,比前两年还多,我并不后悔。
后来我搬出了办公室,和Roman合租。我的房间一个月要1000美元,是莫斯科唯一我喜欢的区域,离办公室步行五分钟。
我们觉得自己写的一些代码可能对别人有用,于是开始把它们发到GitHub上。没指望什么大场面,哪怕有几个人贡献都很开心。那段时间我参与的最火项目有30颗星,对我们来说已经是“大新闻”了。
团队里的设计师给我介绍了Bret Victor的演讲,尤其是Inventing on Principle。我觉得那是个非常棒的演讲,真的非常棒。
四月,我们发布了做了很久的iPad应用。苹果主动联系团队,索要素材要在App Store推荐。我们高兴坏了。应用被推荐了好几周,开始有用户用了。
但很快我们就发现产品没有市场需求。App是用来做杂志排版的,但没人会在iPad上有漂亮内容,而且iPad摄像头画质很差。产品完全说不通。我们怎么就没早点发现?
我的感情也走到尽头。我们其实并不合适,只是害怕孤独才勉强在一起。终于分手了。
有几个月没和共同圈子的朋友联系,专注于工作。但我发现很想念其中一个朋友。写信给她,她也说很想我。于是约好一起旅行。
我感冒了,临近出发那天越来越难受,但还是希望能坚持。火车从莫斯科到圣彼得堡时,我明显发烧了。她还是让我去她家,给我泡茶、递上暖袜,我们接吻了。我搬了进去。
2014
对我来说,2014年是React之年。
短暂的存在危机后,我们放弃了iPad应用,决定转做Web应用。这意味着我得重新认真学JavaScript。我们用Backbone做了个原型,但交互部分写起来很痛苦。
同事最初看到React时不以为然。几个月后,他说React其实还不错。我决定试试React。讽刺的是,第一个从Backbone迁移到React的组件是点赞按钮。
效果非常好,真的非常好。和我见过的任何东西都不一样。
团队很快就接受了React。接下来一年,我们逐步把所有UI都迁移到React,同时不断加新功能。React和单向数据流的原则让我们开发更快,bug也更少。
我们开启了私测,一些摄影师很喜欢用它做视觉故事。产品介于Medium、Pinterest和Tumblr之间。虽然没大火,但也不像iPad应用那样彻底失败。
唯一的问题是,当时React几乎没有生态。刚开始时,只有一个路由库(还不是React Router),我们根本不会用,于是自己做了一个。后来React Router出来了,我们采用并加了产品需要的功能。
没有适合我们需求的拖拽方案,于是我把同事的库移植到了React。我还写了个辅助库来管理文档标题,又写了另一个库来规范化API响应。React IRC频道的Jing Chen给了我核心思路,效果很好!没想到几年后,Twitter会用这个库重写新网站并维护它。
我也想为React本身做贡献。联系了Paul O’Shannessy,问有没有我能做的PR。我几天内完成了第一个任务,但几个月后才合并。大项目节奏慢嘛。我对响应慢很沮丧,于是把精力投入到生态建设。回头看,这反而更有影响力。
2014年,我第一次做了公开演讲。在办公室讲了场React的讲座,讲了两个小时,至今还惊讶大多数人居然都听到了最后。
后来报名去柏林的BerlinJS做分享,主题是“React和Flux”。没练习,讲到一半就超时了。大家翻白眼,我终于学到教训。从那以后,每次讲座我都会彩排三到十五遍。
2014年,我第一次收到Facebook招聘的邮件。但我错过了,几个月后才看到。后来还是聊了,但发现要去美国工作很难,因为我经验年限不够,还没大学文凭。哎。
2014年还有个对我特别重要的项目。像我生命中很多重要事一样,纯属偶然。我在把应用从require.js迁移到webpack以支持代码分割,读到webpack有个奇怪的“热模块替换”功能,可以编辑CSS时页面不刷新。在webpack里,JS也可以这样。
我很困惑,于是在StackOverflow提问。webpack还很新,作者本人回复了我,给了我足够的信息,让我想到可以把这个功能和React结合,做出像Bret Victor演讲里那样的效果。
我编辑了React源码,加了一堆全局变量,写了个极其粗糙的概念验证。决定不睡觉直到搞定,早上7点终于有了可以发推的demo。以前没人关注我的推特,这次有了点赞和转发,那20个转发让我很受鼓舞,知道不是只有我觉得这很酷。这个demo本来只是玩票,工作太忙没时间继续做,于是请了假,把原型完善了。
再声明一次,我不是说你“必须”熬夜或假期加班。我不美化“拼命”,很多人没这么做也有很棒的事业。其实如果我时间管理更好,完全可以在正常工作时间里挤出这些不被打扰的时间,或者学会在被打断的情况下也能推进项目。我只是讲述自己的故事,假装一切都在40小时工作周内完成是不真实的。
2015
我们的产品结束了私测,开始增长,但速度很慢,公司资金快烧完了,融资也很难。我自己也越来越想专心做开源项目。
我还想做人生第一场大会演讲。本来想讲热重载,但知道ReactConf上已经有人提过,怕大家没兴趣。于是我在演讲提案里加了点“时光旅行”的噱头——还是受Bret的演示启发。提案被接受了,几个月我都没太在意。
四月,工资拖了好几周才发到。我意识到该找新工作了。找到一家用我项目的公司,他们愿意赞助我做几个月。
女友问我要不要结婚。我说本来想三十多岁再结。她问:“为什么?”我也说不出理由,于是很快买了戒指结了婚。婚礼只花了100美元。
演讲截止日期临近,但我完全不知道怎么实现“时光旅行”。知道Elm有类似功能,但我不敢看,怕发现JS根本做不了。
当时有很多Flux库。我试过几个,尤其是Andrew Clark的Flummox,隐约觉得如果让热重载和Flux结合,时光旅行也能实现。Sunil的gist让我想到一个点子:用reducer函数替代store的Flux变体。我已经想好了名字。而且我真的需要它来做演示!
我赶在演讲前实现了Redux,做出了时光旅行的demo。第一次彩排是在Skype上,紧张得满头大汗,语速飞快。彩排结束问主办方我的讲座怎么样,他说“嗯……大家喜欢你”,我理解为“很糟糕”的委婉说法。
我请创业公司认识的设计师帮我美化幻灯片,加了动画和过渡。越做越精致,我也越冷静自信。总共练习了十几遍。
我飞到巴黎参加人生第一场技术大会。那大概是我人生最开心的一天。第一次见到推特上的头像变成真人。周围都是UI极客和偶像,感觉像进了霍格沃茨。
我的演讲差点没能成行。早上发现笔记本怎么都连不上投影仪,只剩几小时。Christopher Chedeau好心借我他的电脑,我把演示环境转移过去(除了Sublime授权,视频里你可能注意到了)。
一开始demo还跑不起来,因为Node版本不同。大会WiFi很烂,根本下不了新Node。幸好我找到npm命令重编了二进制,救了我的demo。最终演讲很成功。
现场见到了很多推特上认识的人。其中有Jing Chen,记得她是React IRC频道的老朋友,特意去打招呼。她问我FB招聘有没有联系过,我说美国签证办不下来。Jing问我有没有兴趣去伦敦办公室,我才知道FB在伦敦也有团队!我打电话问老婆愿不愿意搬去伦敦,本以为她会拒绝,结果她立刻答应了。我也答应了面试。
大会上有四个FB的人,Jing直接在酒店安排了完整面试。流程和常规一样,只不过在巴黎,大家都热得一身汗。
一切发生得太突然,我既没时间准备,也没时间紧张。有一题我卡住了,连交换数组两个元素都写不出来,急得让Jing先别看。她说“我知道你会交换两个元素”,这让我有信心完成了答案,最终通过了面试。也许不是高分通过,但拿到了offer。
我的演讲很火。Andrew Clark已经弃用Flummox(当时最流行的Flux库),转而和我一起维护Redux。大家开始在生产环境用Redux。新手被README搞晕了,因为那是写给早期用户的,默认大家都懂背景。我还没找到新工作,离拿到英国签证还有几个月。
我开了Patreon众筹,想撑几个月,专门写Redux文档、做小示例、录免费教学视频。每月筹到约5000美元,比我之前任何工资都高。Egghead寄了麦克风设备,我录了“Redux入门”课程。现在自己都不敢看,但当时很受欢迎,版税每月有3000美元,持续了很久——虽然课程是免费的。
FB负责了绝大部分移民手续。我们只需填表,我考了英语、做了体检。FB还帮我们搬家,包括把猫从俄罗斯运到英国(花了约5000美元)。我被聘为工程师4级,初始年薪10万美元,股票12.5万美元分四年发放,还有1.8万美元签约金,搬家时很有帮助。(顺便说,英国技术薪资比美国低。)
2015年11月底,我们抵达伦敦。之前从没来过伦敦。下飞机打了辆黑色出租车,花了十分钟才搞明白怎么关暖风,热得一身汗,窗户都看不清。关掉风扇后,窗子终于清晰了,我们俩都瞪大了眼。伦敦真美。
第二天,Roman Mazurenko被一名粗心司机撞死。他刚拿到美国签证,回莫斯科取材料。他曾说莫斯科有点像魔鬼,永远不让你离开。我再也见不到我的朋友了,不是在2015年,也不会再有以后。
Roman以某种数字方式和AI纪念留在了世上。我知道他一定会喜欢自己在App Store只有2.5星评分的讽刺。
2016
新工作,新城市,新国家,不同的语言,陌生的口音,大公司,入职培训,会议室,项目,团队,文件,表格。妈的,操,操他妈的,天哪!
头几个月我几乎记不清了。一直处于高度紧张状态,努力听懂别人说什么却没有字幕。经理到底在说啥?一遍又一遍让人重复是不是很失礼?能不能拼出来?
什么?我要打电话给苏格兰的女士申请国民保险号?电话里一句都听不懂。国民保险到底是什么?为什么我的税号是“零”,工资比预期低?原来这里真的要交税?生病了怎么办?NHS又是什么?
2016年第一次去美国(入职培训),我一天没吃饭,喝了很多咖啡,结果在给同事解释热重载原理时,直接惊慌发作。叫了救护车,账单800美元(幸好FB付了,至少我没印象自己付过)。
搬家本身已经很折腾了,虽然公司处理了大部分难题。我以为所有入职流程都做完了,结果忘了去警察局登记(和去邮局登记搞混了,这也要做)。几个月后才发现,差点影响签证。好在目前没出问题。
本来我应该加入伦敦的React Native团队。通常新员工可以先轮岗再选组,但我没有这个自由,被预分配了。不过我对React Native兴趣不大,和Tom Occhino(当时React团队负责人)聊后,他建议我可以作为唯一的英国成员加入React Core(美国团队)。我已经习惯远程开源协作,于是同意了。
2016年React大火,但每个人都自己搞“脚手架”,有打包器、监视器、编译器等等。React几乎成了模块化JavaScript、ES6和各种复杂工具的代名词。Christopher Chedeau建议做个命令行工具,帮大家快速上手React。我们几周内做出了第一个版本,发布了Create React App。
2017
Egghead课程持续带来稳定的额外收入。我花钱点外卖、买衣服都不眨眼。
直到2017年我才意识到这些收入属于海外版税,需要纳税,结果欠了女王三万美元税款。哎。像个成年人一样,我请了会计。把这烂摊子收拾好后,存款又清零了。
工作上,2017年我们几乎重写了整个React。你们现在看到的就是React 16。Sophie在这里讲了我们的故事。
除了税务,生活没什么大事。还在适应新环境,和官僚打交道不再害羞,能自如打电话,看电影不用字幕,学会了NHS和私人保险的流程。也不再做业余项目了。
2018–2019
过去两年过得很快。现在离得还太近,还看不清哪些才是最重要的。
工作上,项目依然充满挑战。如果你关注React,应该知道我们做过的一些事,还在继续努力。我作为工程师成长了很多,还有很多要学。伦敦团队也壮大了——我不再是一个人。
偶尔有人认出我。很受宠若惊。有次在桑拿房被认出来,对方还开始抱怨React。请别这样。
我升职了。开了这个博客做副业。还有另一个副项目快要上线,这两年一直在琢磨。认识了更多网友,头像变成了真人,很有趣。
我一直知道自己喜欢做UI。最初迷上了Visual Basic。这十年,我一直在做UI,然后做UI开发工具,然后讲解和传播这些东西。但现在我意识到,“解释”事物的动力对我来说和“构建”一样重要,甚至可能更重要。
希望下一个十年能做更多这样的事。
或者说,是这个十年?
欢迎来到二十年代。
Pay what you like