從外包到React核心團(tuán)隊(duì)成員
作者 Dan Abramov,Redux作者,React Core Team成員
轉(zhuǎn)載并翻譯自Dan的博客,已獲得Dan授權(quán)
10年前,我還是一個大一新生。那年我17,沒有工作,沒有圈子,還是個前端小白。
而現(xiàn)在,你正在看我的博文,對此我非常自豪。
每個人的故事都是獨(dú)一無二的。我非常幸運(yùn)的出生在一個中產(chǎn)家庭,長了一張“程序員”的臉。
可能我們的境遇天差地別,但是希望你能與我的程序員經(jīng)歷產(chǎn)生一些共鳴,或者至少覺得有趣。
2010 失戀了,但是有了第一份工作
我出生于俄羅斯,并一直生活在那直到2019年完成高中學(xué)業(yè)。
在俄羅斯,只要你考試合格,大學(xué)學(xué)業(yè)是免費(fèi)的。當(dāng)時(shí)我特別想進(jìn)一所經(jīng)常在編程大賽中有學(xué)生獲獎的大學(xué)。
可惜我數(shù)學(xué)不太好,如果我想做與編程相關(guān)的事情,就沒有太多的選擇余地。
于是我從可選學(xué)校中選擇了一所給學(xué)生配備蘋果電腦的大學(xué)。

到2010年夏天,我上完了大一。學(xué)校不怎么教編程相關(guān)課程。相反,卻會有很多代數(shù),物理和其他我不是特別感興趣的課。
開始還行,后來我就沒啥興趣了,而且我不想早起去上這些課。
對于一些我比較拿手的課程,也是挫折滿滿。我們的英語課很基礎(chǔ),于是我和老師商量不去上課。
但當(dāng)我參加考試時(shí),老師卻不允許我交卷,除非我交錢給這個老師參加他的“補(bǔ)習(xí)班”。
這段經(jīng)歷讓我開始對高等教育系統(tǒng)充滿懷疑與不滿。
與此同時(shí),我的初戀也黃了。
到現(xiàn)在,我對大一唯一記憶只剩下焦慮和那種自己是個loser的感覺。
好在,我得到了我的第一份程序員工作!
我們大學(xué)邊上有個被叫做叫做“商業(yè)孵化器”(提醒下,這不是硅谷的那類商業(yè)孵化器—而是俄羅斯版的)的小場地,用于舉辦各類會議活動。
我真是不清楚他們會“孵化”什么類型的商業(yè)項(xiàng)目。
但是,他們接辦了一場關(guān)于軟件開發(fā)的會議。在當(dāng)時(shí)我還不認(rèn)識任何程序員,也不知道行業(yè)大會的存在。所以我對這些內(nèi)容很感興趣,就去看了看。
我已經(jīng)記不清當(dāng)時(shí)講的內(nèi)容是什么了。但我記得那個發(fā)言的人是一家跨國(俄羅斯-美國)外包公司的高管。
我從12歲開始編程,所以我主動詢問他們是否雇人。他給我一個郵箱地址,我做了些面試題,幾周之后我得到了那份工作。
2010年夏天,我開始了第一份工作。
我的工資是$18k/年(是的,是18,不是180)。
如果以發(fā)達(dá)國家來看,是在是低。但是,再一次的,這里是俄羅斯——所以房租什么的也很便宜。
我立刻搬離了我媽的公寓,并租下了月租$150的房間。我超級激動,用我的第一次工資買了一個iPhone,我很驚訝它的UI是如此的美麗。
夏天來又去,我的大學(xué)二年級開始了。這一年大學(xué)里少了我的身影。
我開始了全職工作,不再去上課,不再參加期中考試,甚至還弄丟了蘋果電腦。我唯一再去學(xué)校的時(shí)候,只是去取我的論文。
PS:我不是說大學(xué)毫無價(jià)值,或者你應(yīng)該輟學(xué)。那只是我的選擇,并且我知道如果事情不順利我可能會重新回到我媽那里住。
因?yàn)槲业谋尘埃ê茉缃佑|編程),我很享受那種看起來與生俱來很能干的感覺。其他沒有這樣背景的人通常都會學(xué)一個學(xué)位才能積累足夠的能力進(jìn)入這個行業(yè)。

我大部分工作是給外包公司的程序修bug。由于沒有行業(yè)經(jīng)驗(yàn),我過度使用了各種我能用到的新技術(shù)。
甚至將Microsoft Research projects用在最終的產(chǎn)品上。為此我感到抱歉,但我也做了一些很不錯的事情。
在我第一份工作中,我出過一次差。我們有個客戶是一個位于紐約的投資集團(tuán)。雖然我到現(xiàn)在還是不怎么懂投資,但基本上來說,當(dāng)時(shí)的需求是:他們有個電子郵件系統(tǒng)接受訂單,這些訂單都要經(jīng)過不同級別的批準(zhǔn)。
他們有個程序來管這件事,但是這個程序?qū)懙暮茉愀猓瑳]人真正知道他到底怎么工作的。我的工作就是在那家公司呆了一個月,修復(fù)這個程序。
這個程序是個廉價(jià)的外包公司寫的。九年過去了,我仍然能夠記起他的名字。
令人最為難忘的是那個13000行的函數(shù)。為了弄清楚它到底是如何工作的。我只能將他們打印出來,將打印出的紙鋪在桌上,用鉛筆在上頭注釋上。
最終我發(fā)現(xiàn),那是同一段程序片段在不同的情況下被重復(fù)寫了50遍。我猜寫程序的人一定是按程序的行數(shù)來領(lǐng)工資。
為了探索那個服務(wù)在實(shí)際產(chǎn)品中如何工作,我添加了無數(shù)的輸出日志,然后從無到有的重構(gòu)了一遍這個程序。終于,它不再那么容易崩潰了。
與一個非技術(shù)公司合作是很不容易的。比如,我不能在不寫修改文檔的情況下去修復(fù)一個bug。而且修改文檔必須有那個公司IT部門的簽字。到了這一步,還會有一些代碼審查。
出差的結(jié)尾,我去了一家酒吧待到半夜。原定第二天早上九點(diǎn)我得給客戶匯報(bào)一個月的工作成績。結(jié)果,我下午一點(diǎn)才睡醒。我既痛苦又尷尬的回了家。
我回到了圣彼得堡,那里夏天的天空永遠(yuǎn)不會黑。

在一個探尋靈魂的夜晚,帶著模糊不清的不安感,我徘徊在一個個酒吧之間。
大約到凌晨7點(diǎn),我頭頂上的一個燈泡熄滅了。我吃了一個shawarma,帶上一個賽百味去了公司,等待HR上班后辭掉了工作。
一個朋友邀請我一起去克里米亞旅游(在它被吞并之前)。我?guī)Я艘粋€帳篷和一個充一次電能用一周的諾基亞手機(jī)就上路了。
我們在沒保護(hù)的情況下搭帳篷睡了兩周。在那種迷迷糊糊的精神狀態(tài)下,除了下面兩件事,我不記得其他事了:
有一次,有人用刀子威脅會殺掉我,但是第二天他就消失了,一切重歸平常。
另一次,我獨(dú)自在懸崖邊游泳差點(diǎn)溺水身亡。最終我爬到一個湖中間的石頭上,直覺上我趴在石頭上暈過去了一小時(shí)。
對我來說,這次旅行就像一次硬重啟。我被治愈了,并再一次為寫程序做好了準(zhǔn)備。(PS:我可沒說你必須以瀕死為代價(jià)來自愈自己)
現(xiàn)在唯一的問題是:我的編程技術(shù)需要提高!
我只寫過桌面應(yīng)用程序。如今還有誰聽說過桌面應(yīng)用程序?他們早就不存在了。現(xiàn)在要么做后端,要么做移動端,要么做前端。
我完全不了解這些,而且我還是失業(yè)狀態(tài),于是我只能搬回家跟我媽住(謝謝你,老媽!)
不久之后,我在網(wǎng)上看到一篇從硅谷回來的俄國人寫的文章。他正在尋找志愿者參與他的個人項(xiàng)目,作為回報(bào)他會免費(fèi)教授開發(fā)技術(shù)。在那個時(shí)候,這對我而言是個非常不錯的買賣。
我加入了項(xiàng)目,但是很快發(fā)現(xiàn)其中根本沒有真正的教學(xué):我們只是得到了一些網(wǎng)上的教程。實(shí)際上我們只是相互學(xué)習(xí)。
幸運(yùn)的是,我可以承擔(dān)這份工作的花銷,因?yàn)槲腋覌屪∫黄稹?/p>
我學(xué)會了Git,Python基礎(chǔ),Django,一點(diǎn)點(diǎn)CSS和JavaScript,還有一點(diǎn)點(diǎn)Bash用于發(fā)布我的更改。
Web你好,我來了!
九年后,我仍不確定我應(yīng)該如何看待這段經(jīng)歷。
一方面我們免費(fèi)為他的個人項(xiàng)目工作。另一方面,我們在項(xiàng)目中有root權(quán)限,可以隨意將我們的更改發(fā)布上線。這確實(shí)非常令人激動,而且我可以從錯誤中學(xué)習(xí)到知識。
我從中找到了學(xué)習(xí)的方向,并且它沒有花我一分錢,我還能隨時(shí)走人。并且由于有教育的意義,這些項(xiàng)目還附加了些社交價(jià)值。這使我想到了開源軟件。
這個人架設(shè)了“bootcamp”且成為我的導(dǎo)師,我至今還是非常感謝他。
PS:我不是暗示免費(fèi)給人打工是個鍛煉自己的好方法。我只是在敘述我的故事。
我制作了一個dashboard程序來追蹤我們每個人的學(xué)習(xí)進(jìn)度。我的導(dǎo)師建議我可以把它打包做成產(chǎn)品賣給其它經(jīng)營網(wǎng)絡(luò)課程的公司。
我的創(chuàng)業(yè)經(jīng)歷有些丟人,我給別人演示我自己都不知道是什么的項(xiàng)目。
最終,我實(shí)現(xiàn)了一個框架,基于這個框架我?guī)筒煌挠脩舳ㄖ凭W(wǎng)站。在整個過程中,我賺到了約$200。但是卻浪費(fèi)了幾個月時(shí)間,最終我關(guān)了他。
雖然沒有什么收獲,但是它帶給了我一線希望,我可以成為了一個web程序員。
杯具的是,我仍然處于失業(yè)中。

2012 還是失業(yè)
作為一個20歲的web程序員,我只想在一個地方工作 —— 一家俄羅斯社交網(wǎng)絡(luò)公司。
每個在俄羅斯的人都使用他們的產(chǎn)品。那是個非常成熟的產(chǎn)品。并且他背后的團(tuán)隊(duì)被認(rèn)為非常“酷”。
他們公司的高管經(jīng)常發(fā)文提到他們的工程師是如何的高薪。他們小小的技術(shù)團(tuán)隊(duì)似乎對于他們面對的挑戰(zhàn)與公司的待遇都非常滿意。在俄羅斯的技術(shù)圈子里,很多人都知道他們大名。
我的導(dǎo)師將我介紹給他們的CTO,我得到了一份可以拿回家做的JavaScript考試題。
這個題里包括了克隆一個他們產(chǎn)品中的功能 —— 在給朋友發(fā)信息的時(shí)候,自動預(yù)測你想發(fā)給的用戶的名字。其中我仔細(xì)模仿了與這個功能相似的緩存與防抖算法。
在他們公司的面試是一場災(zāi)難。顯而易見,我并沒有他們那個級別的經(jīng)驗(yàn)。但是,如果我能夠“理解他們的產(chǎn)品線”,他們愿意給我一次機(jī)會。
于是,他們給了我一個可以帶回家做的考試題,題中叫我設(shè)計(jì)一個他們網(wǎng)站的登錄頁面 —— 一個可以運(yùn)行在手機(jī)上的建議登錄頁。
我花了一周時(shí)間去設(shè)計(jì)這個網(wǎng)站。許多細(xì)節(jié)上我都花了心思,甚至埋了幾個彩蛋,為此我感到很自豪。
但是,我沒找到一個看起來不太丑的手機(jī)照片。于是我放了一個漂亮的iPhone在上面。我認(rèn)為從美學(xué)上這是令人愉悅的。
我當(dāng)然被拒了。我忽略了唯一他們需要的東西(一個簡單的登錄頁)。我為什么就這么執(zhí)拗?為此我哭了幾個小時(shí)。我真的不想到其他地方工作。
現(xiàn)在我仍然住在我媽家,而且失業(yè)中,沒賺到錢。
我開始懷疑自己,反思輟學(xué)是否是好的。
我在iTunes U上注冊了iOS開發(fā)課程。除外還在Coursera上注冊了另兩門課程:編譯器與機(jī)器學(xué)習(xí)。也許那些課可以讓我成為“真正的程序員”。
獨(dú)自學(xué)習(xí)這些課程讓人感到孤單。于是我在我導(dǎo)師的共享工作空間當(dāng)中將“bootcamp”成員組織起來組團(tuán)學(xué)習(xí)。
大約學(xué)了一個月。有個一起學(xué)習(xí)的同學(xué)介紹一個創(chuàng)業(yè)公司創(chuàng)始人給我認(rèn)識。Roman Mazurenko是個不走尋常路的創(chuàng)業(yè)公司創(chuàng)始人。
他的夢想是創(chuàng)造一個DYI平臺,雖然我不知道應(yīng)該期待什么,但是與他談話非常讓人開心。
他提議我搬到莫斯科并在那里邊工作邊學(xué)習(xí)iOS開發(fā),我同意了他的提議。
最終,我也沒有完成編譯器與機(jī)器學(xué)習(xí)課程。但是,我學(xué)到了足夠的知識明白他們都不是魔法。在此之后,我就對他們失去興趣。
2013 有工作了,但是失戀了
到2013年,我的工資是$30k/年(幾乎是之前工資的一倍)。
在美國人的角度看仍然很低,但在俄羅斯是非常不錯的。我還在Stampsy得到了一點(diǎn)股份(然而這些股份最終變得一文不值)。
我們的團(tuán)隊(duì)由五個程序員與兩名設(shè)計(jì)師組成。我們從開發(fā)一個iPad的應(yīng)用開始,但是我們當(dāng)中沒有任何人對iOS有實(shí)際經(jīng)驗(yàn)。
至今我都能依稀記得,當(dāng)一個同事研究出如何寫一個我們會用到的動畫效果時(shí),我的那份釋放的感覺。直到那時(shí),我都以為我們肯定會倒霉。
我在辦公室足足住了幾個月時(shí)間。回首往事,我不會因?yàn)槲业纳?工作平衡而驕傲。
這的確很不健康。但是,我在此期間學(xué)到的東西比我之前兩年時(shí)間學(xué)到的還要多,我一點(diǎn)都不后悔。
最后,我搬進(jìn)了和Roman相同的公寓。我的房間租金是$1k/月。那是一個寬敞的公寓,地理位置我很喜歡,并且到辦公室往返的時(shí)間只有5分鐘。
我們以為我們寫的程序也許對別人也有幫助。所以我們在GitHub上開源了項(xiàng)目。那時(shí)我最受歡迎的項(xiàng)目得到過30顆星。而對于我們而言,那真是非常多。
一個我們團(tuán)隊(duì)中的設(shè)計(jì)師向我推薦了Victor的演講 —— 發(fā)明的原則。真的很棒。
到了四月,我們投入很多精力的iPad應(yīng)用上線了。蘋果公司向我們團(tuán)隊(duì)要了一些應(yīng)用的素材用于將它放到蘋果商店的精選當(dāng)中。整個團(tuán)隊(duì)都沸騰了。
它被作為精選應(yīng)用推薦了數(shù)周,真的有人開始用他了。
我們的激動情緒很快就消散了,因?yàn)槲覀円庾R到這個應(yīng)用根本沒有適合的市場。
這個應(yīng)用是用來創(chuàng)造如同雜志一類風(fēng)格的圖片排版,但是沒人會在自己的iPad里裝用于這些排版的素材,并且iPad的相機(jī)質(zhì)量也不敢恭維。
這個應(yīng)用沒有任何意義。我們?yōu)槭裁磸膩頉]有意識到這一點(diǎn)?
我的個人情感生活也分崩離析。雖然我們相互很適合,但是大多數(shù)時(shí)候只是為了逃避獨(dú)自一人的恐懼。最終,我們分手了。
在之后的幾個月,我專注工作,對于失戀,沒告訴任何人。但是當(dāng)我意識到我特別想念某個特別的朋友,我發(fā)信息給她,她告訴我她也非常想念我。于是,我安排了一次共同的旅行。
杯具的是,當(dāng)那個計(jì)劃好的旅行即將到來的時(shí)候,我感冒了。我感覺情況越來越糟糕,但我仍然希望我能好起來。
當(dāng)我乘坐的從莫斯科到圣彼得堡的火車進(jìn)站的時(shí),我的高燒仍然十分明顯。
她說無論如何還是去她家坐坐。到了她家后,她為我燒了熱茶,遞給我厚一些的襪子。
四目相對后,我們接吻,一切都好起來了。
2014 與React結(jié)緣
對我而言,2014是React的一年。
在短暫的生存危機(jī)后,我們放棄了那個iPad應(yīng)用。取而代之的是轉(zhuǎn)向web端應(yīng)用。
這也就意味著我要學(xué)JavaScript,這一次是來真格的。我們用Backbone做了一個非常不錯的程序原型,但是互動部分非常難實(shí)現(xiàn)。
我一個同事首先看到了React但很快就放棄了它。但是幾個月以后,他又跟我說,React也不是一無是處。我決定試一試。
戲虐的是,我的第一個從Backbone轉(zhuǎn)到React的組件是一個喜歡按鈕。
它工作正常。且是非常正常。我感到React與我之前看到的所有東西都不相同。
React對于我們團(tuán)隊(duì)并不難于掌握。我們在接下來的一年中伴隨發(fā)布新功能的機(jī)會,漸漸把所有的UI部件都改寫成了React。
React跟它所使用的單向數(shù)據(jù)流原則使得我們的開發(fā)更加快速并更少出錯。
我們發(fā)布了一個內(nèi)測beta版本,它是一個介于Medium,Pinterest和Tumblr之間的產(chǎn)品,攝影師可以使用這個產(chǎn)品創(chuàng)造可視化故事。
雖然它沒有吸引來很多注意力,但是不像之前的iPad應(yīng)用那樣是徹頭徹尾的失敗。
使用React唯一缺點(diǎn)就是它簡直就沒有任何生態(tài)可言。
我們剛開始用React的時(shí)候,只有一種路由(不是React-Router),沒人懂得如何使用它,我們只能自己做了一個。
我們的應(yīng)用中沒有拖放功能,于是我移植我同事的一個函數(shù)庫到React當(dāng)中。
我制作了一個幫助程序來管理文檔標(biāo)題。還寫了另一個函數(shù)庫來統(tǒng)一API的響應(yīng)。Jing Chen通過React IRC頻道給我提供了些建議。
我還不知道,在接下來的幾年中,Twitter重構(gòu)他們的網(wǎng)頁時(shí)會用到這個函數(shù)庫并且維護(hù)這個函數(shù)庫。
我也想為React做貢獻(xiàn)。我聯(lián)系了Paul O’Shannessy問他是否有pull requests我可以參與幫忙的。幾天內(nèi),我就完成了我的第一個任務(wù),但是它在數(shù)月之后才被merged。
大型項(xiàng)目的發(fā)布周期非常長。所以我決定將時(shí)間花到React的周邊上。回想起來,那個PR對我的影響很深遠(yuǎn)。
在2014年,我在我們辦公室舉辦了介紹React的講座,這是我第一次公開演講。

那個講座持續(xù)了2小時(shí),我至今都感到吃驚,因?yàn)榇蟛糠謪娜怂坪醵歼€挺高興的坐到了整個講座的最后。
事后,我申請?jiān)?code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">BerlingJS meetup上進(jìn)行一次發(fā)言,題目是“React跟Flux”。
我沒有提前練習(xí)我的演講,當(dāng)我的時(shí)間到了的時(shí),我才講了一半。有人對我翻了白眼,從那以后,我在公開演講前會排練3到15遍。
2014年我第一次收到Facebook HR的電子郵件。直到數(shù)月之后我才看到他。
最終我們還是聊了一下,由于我沒有足夠的工作年限,而且我輟學(xué)沒有文憑,所以招我到美國進(jìn)Facebook并不容易。Oops。
在2014年我著手的項(xiàng)目當(dāng)中,有個我特別喜愛的項(xiàng)目。正如我人生中很多重要的事情一樣,他們就這樣不經(jīng)意的發(fā)生了。
當(dāng)時(shí)我正在將我們的應(yīng)用從require.js轉(zhuǎn)向webpack以便實(shí)現(xiàn)代碼分割。
我讀到了一個叫做“熱模塊置換”的怪異的功能 —— 他能讓你可以編輯CSS而不需要重新加載頁面。但是在webpack,它對JavaScript同樣適用。
我非常困惑于這個功能,于是我在StackOverflow上提問。
Webpack當(dāng)時(shí)仍然非常新穎,它的開發(fā)者看到了我的問題并做出了反應(yīng)。這個回答給了我足夠的信息把這個功能加入到React中。
我寫了一個非常非常草率的驗(yàn)證原型 —— 直接修改React的源代碼,加入一堆全局變量。
我決定直到它可工作前,我都不睡覺!
到了早晨7點(diǎn)鐘,我有了一個可以發(fā)推特的演示模型。在此之前從來沒有人在意我的推文,但是這個推文受到了幾個喜歡與轉(zhuǎn)發(fā)。那20個轉(zhuǎn)推對這個點(diǎn)子是巨大的驗(yàn)證。
我于是知道,我不是唯一一個人對這個點(diǎn)子感到激動的人。這個驗(yàn)證原型只是個簡單的嘗試,我沒有額外的業(yè)余時(shí)間花在這上面。在之后的一次旅行中,我完成了它的整個原型。
免責(zé)聲明:再一次,我不是在說你“應(yīng)該”在業(yè)余時(shí)間或旅行中工作。我不是在炫耀我的勤奮,沒做任何我提到的這類事情的成功人士大有人在。
事實(shí)上,如果我能夠很好的管理時(shí)間,我很有可能在我不受干擾的工作日里擠出更多的時(shí)間來。
我分享這些是因?yàn)槲以谥v述我的經(jīng)歷,如果我說我是在我的40小時(shí)工作時(shí)間里完成的這些,那我就是在撒謊了。
2015 Facebook Offer & 結(jié)婚啦
我們發(fā)布了產(chǎn)品的內(nèi)測beta版本。我們的公司正在逐漸地耗盡投資,而我則想花越來越多的時(shí)間在開源項(xiàng)目上。
我想發(fā)表我的第一次會議演講。當(dāng)然我想講的就是我的熱加載功能,但是我知道已經(jīng)有人在ReactConf上提到過它,因此人們不會為此感到激動。
于是我決定在我的演講申請?zhí)岚咐锛狱c(diǎn)噱頭-“時(shí)間旅行”。我的提案得到了通過。
到了四月,我的工資已經(jīng)被拖欠數(shù)周。雖然最終還是發(fā)了下來,但是我已經(jīng)意識到,是時(shí)候找新工作了。
我找到了一個使用了我項(xiàng)目的公司,他們同意在之后的幾個月里贊助我的工作。
我的女友問我是否想結(jié)婚。我告訴她我想我會快40歲的時(shí)候才選擇結(jié)婚。
她問我:“為什么呢?”
我確實(shí)找不到支持我想法的有力依據(jù),于是我們迅速的買了結(jié)婚戒指領(lǐng)證結(jié)婚。我們的婚禮花掉了$100。
我的演講日期即將臨近。但是我仍然不知道到底如何實(shí)現(xiàn)“時(shí)間旅行”。
我知道Elm語言有相類似的功能,但是我非常害怕去研究他們,我擔(dān)心我的研究會最終告訴我這個功能在JavaScript上可能實(shí)現(xiàn)不了。
在這個時(shí)間節(jié)點(diǎn)上,市面上流行著非常多Flux的函數(shù)庫。我嘗試其中幾個,Andrew Clark開發(fā)的Flummox讓我眼前一亮,我模糊的感覺到與Flux結(jié)合熱加載能夠讓我實(shí)現(xiàn)時(shí)間旅行。
Sunil的gist讓我有了一個點(diǎn)子:Flux范例中用一個reducer函數(shù)取代原有的store。我已經(jīng)給他腦補(bǔ)了一個很棒的名字,我的演講真的太需要這個點(diǎn)子了!
趕在演示時(shí)間的deadline前我實(shí)現(xiàn)了Redux。
我的第一次演講排練是在Skype上,我邊出汗邊喃喃自語,整個過程完成的過快。到最后,我問大會組織者我是否有可取之處。
他說“嗯…人們挺喜歡你的”,我以為他只是在想委婉的安慰我。
我邀請了跟我一同在之前的那個創(chuàng)業(yè)公司里工作的設(shè)計(jì)師同事幫我修改PPT,加上了動畫跟過度效果。
我的幻燈片做的越好,我就在演講的時(shí)候更加冷靜與感到有信心。為此我練了十多遍。
我飛到巴黎參加我的第一個技術(shù)研討會。這也許是我人生中最幸福的一天。第一次,我對上了認(rèn)識的人的面孔。到會的有UI的高手還有我崇拜的人。
這種感覺仿佛是來到了霍格華茲魔法學(xué)院。
驚險(xiǎn)的是,我的演講差點(diǎn)胎死腹中。就在演講的當(dāng)天早晨,我發(fā)現(xiàn)我的電腦連不上投影儀。而此時(shí)只有幾個小時(shí)準(zhǔn)備了。
Christopher Chedeau非常慷慨的借給了我他的電腦,我把我的現(xiàn)場演示項(xiàng)目安裝到了他電腦上(除了Sublime的證書,你如果看了那場演講,你可能會有印象)。
在一開始,我的演示程序在Chistopher的電腦上因?yàn)?code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">Node的版本不同而運(yùn)行不了。會場的無線網(wǎng)網(wǎng)速是在糟糕,根本下載不了另一個Node的版本。
幸運(yùn)的是,我發(fā)現(xiàn)了一個npm的命令可以重新編譯Node的運(yùn)行版本。它拯救了我的演講。我最終用他的電腦順利的完成了演講。

在聽眾中我看到了很多推特上認(rèn)識的人。其中之一便是Jing Chen。
我是從React的IRC聊天頻道當(dāng)中認(rèn)識的她。我就跟她打了個招呼。
她問我FB的HR是否有聯(lián)系過我,我說我拿不到美國的簽證。Jing問我是否感興趣到他們的倫敦辦公室工作,而我還根本沒有聽說過倫敦有這么一個辦公室!
我詢問老婆看她是否愿意搬去倫敦。我以為她會很不愿意,但是她竟然很快就同意了。于是我決定參加一次面試。
在會場里有四個FB的員工,于是Jing就直接在舉辦會議的酒店安排了一個完整的面試。那是一個非常普通的面試,除了那里的人都大汗淋淋,因?yàn)檫@里是巴黎,外邊非常熱。
一切就這么悄然發(fā)生了,我既沒時(shí)間準(zhǔn)備,也沒有時(shí)間緊張。
我智障到了一個地步,以至于我無法用三行代碼調(diào)換一個數(shù)組當(dāng)中的兩個元素。
我請求Jing兩三秒內(nèi)先別看我。她說“我知道你可以調(diào)換這兩個元素的”,這句話給了我足夠的信心完成了答案,而且使我完成了面試。
也許我沒有完美的完成我的這次面試,但是我拿到了offer。
我的演講引起了很大的關(guān)注。為了支持Redux,Andrew Clark停止繼續(xù)開發(fā)Flummox(那個最受歡迎的Flux函數(shù)庫)。
新手在閱讀Redux的README時(shí)可能會非常困惑,因?yàn)樗墙o那些已經(jīng)在這個領(lǐng)域有了非常多經(jīng)驗(yàn)的人看的。
我仍然沒有工作,而且英國的簽證要等幾個月。
我在Patreon上開了幾個月賬戶來支持我的項(xiàng)目 —— 主要是幫助我寫好Redux的使用文檔,創(chuàng)建演示項(xiàng)目以及錄制免費(fèi)的教學(xué)視頻。
我籌到了大約$5k/月的資金,這個金額比我之前做的任何工作都賺錢。
來自Egghead的粉絲給我郵了麥克風(fēng)讓我錄制我的“學(xué)習(xí)Redux”課程。如今來看這些課程不盡人意,但是它們非常流行,盡管這些視頻是免費(fèi)的,但是讓我在很長一段時(shí)間賺到了很多錢(約$3k/月的版稅)。
FB接手了大部分移民簽證的問題。我跟妻子只需要填填表格,參加一下英語考試以及一些體檢。
FB做了我們搬遷新地方的大部分工作,包括把我們的貓咪從俄羅斯帶到英國(這一項(xiàng)花掉了大約$5k)。
我被按照level 4的標(biāo)準(zhǔn)被招進(jìn)來,也就是初始工資125k的原始股。
而且我還拿到了$18k的簽約獎金,它在我安家這件事上起了很大作用。(順便說一句,在英國,碼農(nóng)的工資比在美國要低一些)
我們在2015年11月到達(dá)倫敦。在此之前我們從未到過倫敦。
我們從機(jī)場乘坐了一輛黑色英式出租車,在最開始的10分鐘我不知道怎么關(guān)掉熱風(fēng),以至于我們一直出汗,看不到窗外的風(fēng)景。

當(dāng)我們終于關(guān)掉了熱風(fēng),窗子的霧氣也消散之后,我們的眼睛睜得跟盤子一樣大,倫敦實(shí)在是太美了。
就在第二天,Roman Mazurenko被一位粗心的司機(jī)撞死了。他剛剛拿到他的美國護(hù)照,只是到莫斯科來取他的文件。
他告訴我莫斯科有某種邪惡的力量不想讓你離開。我沒能再在2015見到我的這位朋友,也永遠(yuǎn)不能了。
2016 新的開始
新工作。新城市。新國家。不同的語言。不熟悉的口音。大城市。取向。會議室。項(xiàng)目。團(tuán)隊(duì)。文檔。表格。#¥%……&(&……(此處全球通用語言)
我不太記住最初幾個月是如何面對一群和我不是同一門母語的同事。我的頭兒到底在告訴我什么?是否會不禮貌,要不要再問他一次?
什么,我需要向一位蘇格蘭女士詢問我的社保號?她說的任何一個字我都聽不懂。
什么又是社保?為啥我會有一個零號的稅號,為什么我的工資比我想象的低?等一下,這里的人真的納稅么?我如果病了該怎么做?什么是NHS?
我在2016年第一次來到美國期間(入職培訓(xùn)),有時(shí)候會一整天忘記吃飯,喝非常非常多咖啡。
有一次,在給同事演示熱加載的功能的時(shí)候直接暈過去了。我被抬上了救護(hù)車并得到了一張$800的賬單(幸好,F(xiàn)B買單—或者至少,我沒有為此付款)。
盡管公司幫我解決了更換工作地點(diǎn)的大部分的問題,但還是非常讓人頭痛。我以為在入職培訓(xùn)的時(shí)已經(jīng)解決了每一個問題,但是我忘記了到警察局登記。(我把這件事與到郵局登記混淆了,那也是一件必須做的事情)
最后發(fā)現(xiàn)我發(fā)現(xiàn)我們比應(yīng)該登記的日期晚了數(shù)月,據(jù)說這樣可能影響我們的簽證。幸運(yùn)的是,至今似乎都沒有出什么事。
我最初的想法是加入倫敦的React Native團(tuán)隊(duì)。
通常而言,F(xiàn)B會雇來員工讓他們經(jīng)過短期培訓(xùn)后,再由他們自己選擇一個團(tuán)隊(duì),但是我并沒有那個自由度。我是被預(yù)定好到哪里去的。
但是,我對于React Native并不是特別感興趣。我告訴了Tom Occhino(當(dāng)時(shí)他管理著React團(tuán)隊(duì)),他建議我可以作為React Core團(tuán)隊(duì)(位于美國)的唯一駐英國成員。
因?yàn)槲以缫言陂_源項(xiàng)目中習(xí)慣遠(yuǎn)程辦公,所以我同意了。
在2016年,React徹底火爆了,但是每個人都在通過不同的打包工具研發(fā)自己的腳手架工具。
React成為模塊化JavaScript,ES6以及所有復(fù)雜工具合集的同義詞。
Christopher Chedeau建議制作一個命令行的React腳手架工具。我們很快在幾周之內(nèi)制作出了第一版,這就是Create React App。
2017 慢慢融入
作為副業(yè),Egghead上的課程持續(xù)給我?guī)戆娑愂杖搿N液敛华q豫的把他們都花在了吃穿上。
直到2017年我才意識到這些從國外來的收入是需要繳稅的,經(jīng)過計(jì)算我欠女王陛下大約$30k的稅款。
Oops,如所有的成年人一樣,我找到一個會計(jì)解決了這些問題,也用盡了我的所有積蓄。
工作方面,我們用了2017年的大部分時(shí)間全新重寫了React。你們看到的React 16就是努力的成果。
在我的個人生活當(dāng)中,除了稅務(wù)方面還發(fā)生了很多其他事情。我始終還在適應(yīng)新環(huán)境。
我在與政府機(jī)構(gòu)打交道的時(shí)已經(jīng)不那么害羞了。我可以在打與接電話的時(shí)候不那么緊張。我看電影不再需要字幕。我懂得了如何對付國家健康服務(wù)與私人保險(xiǎn)。我也停止了我的個人項(xiàng)目。
2018–2019 漸入佳境
最近的這兩年轉(zhuǎn)瞬即逝。由于才過去沒多久,我還不能看清楚其中發(fā)生的什么事情對我非常有意義。
專業(yè)領(lǐng)域當(dāng)中,我們的項(xiàng)目前所未有的火爆。如果你關(guān)注React,你會知道我們正在著手做一些東西。
我成長為一名工程師,并且仍然有那么多東西要學(xué)。我們倫敦的團(tuán)隊(duì)也發(fā)展壯大起來—我不再孤軍奮戰(zhàn)。
人們偶爾在街上會認(rèn)出我。這會使我感到不安。有個人在桑拿里認(rèn)出了我,就拉著我開始抱怨 React。請不要成為那樣的人。
我升職了。
我與更多在網(wǎng)上認(rèn)識的人線下見了面。能夠?qū)⑦@些人與他們的頭像對應(yīng)上非常有趣。
我一直知道我喜歡設(shè)計(jì)UI。我從Visual Basic入行,花了十年設(shè)計(jì)UI,然后又設(shè)計(jì)了設(shè)計(jì)這些UI的方式。然后講述它以及解釋它。
不過我現(xiàn)在剛剛意識到,解釋事情給我的動力與我創(chuàng)造它們給我的動力一樣大。
我興高采烈的展望未來,在下一個十年我將做更多的事情。
或者,我應(yīng)該說,這個十年?
歡迎來到2020。
推薦閱讀
