【CSDN 編者按】大學(xué)因?qū)W費(fèi)而輟學(xué),最困難時(shí)睡在公園長椅,有遠(yuǎn)見的母親讓他走上了編程之路,溫柔智慧的妻子用愛與信任激勵(lì)著他秉承初心、奮勇前行。編程十余年,他已在GitHub開源三百多個(gè)項(xiàng)目,項(xiàng)目總Star數(shù)位居全球TOP 20。從后端成功轉(zhuǎn)型為前端,成為Deno核心代碼貢獻(xiàn)者的迷渡(網(wǎng)絡(luò)ID:justjavac)在《新程序員004》之「我是程序員」板塊分享了他這一路的成長與感悟。同時(shí),也給新一代開發(fā)者留下了寄語:“學(xué)歷代表過去,能力代表現(xiàn)在,學(xué)習(xí)能力代表未來”。
作者 | 迷渡 責(zé)編 | 張紅月
出品 | 《新程序員》編輯部
2009年,Node.js&Deno之父Ryan Dahl首次在JSConf EU上介紹Node.js,從那時(shí)起,他便成為我崇拜的技術(shù)偶像。
2019年,我收到了一封來自Ryan Dahl的郵件,信中他說來中國了,想約我一起喝杯咖啡,談?wù)凞eno以后的發(fā)展方向。我激動(dòng)的一晚上沒有睡好,第二天一大早便坐高鐵從天津趕到北京赴約(見圖1)。
圖 1 Node.js&Deno之父Ryan Dahl與justjavac的合照
回顧十多年的編程生涯,我在大學(xué)時(shí)因?yàn)閷W(xué)費(fèi)而輟學(xué),最困難的時(shí)候也曾經(jīng)睡過天津人民公園的長椅,后來在百腦匯找了份電腦維修工作,業(yè)余時(shí)間學(xué)習(xí)了計(jì)算機(jī)相關(guān)的所有課程。結(jié)婚之后在老婆的督促下開始努力,經(jīng)過十余年的付出,終于迎來了自己的Aha時(shí)刻:技術(shù)文章全網(wǎng)訪問量破千萬,如今被Node.js之父單獨(dú)約見并一起開發(fā)下一代類Node.js平臺(tái)——Deno。
本文節(jié)選自《新程序員004》,掃描上方二維碼即可訂閱
學(xué)生時(shí)代編程啟蒙
初中時(shí),我開始接觸電腦,使用的第一門語言是BASIC。那時(shí)我所在的初中是我們縣僅有的幾個(gè)開設(shè)計(jì)算機(jī)課程的學(xué)校之一,當(dāng)時(shí)電腦還是奢侈品,進(jìn)入微機(jī)室上課需要穿鞋套。每個(gè)學(xué)期的計(jì)算機(jī)課程很少,兩周才上一節(jié)課。還總會(huì)出現(xiàn)“今天微機(jī)課老師有事,這節(jié)課改成數(shù)學(xué)/語文課”的情況。課程內(nèi)容也很簡單,就是一些計(jì)算機(jī)的正確開關(guān)機(jī)、拼音打字、五筆打字、常用操作,并沒有安排編程課。但微機(jī)教科書最后兩章是BASIC編程入門,于是我在學(xué)完計(jì)算機(jī)基本操作之后就開始自學(xué)BASIC編程,編寫的第一個(gè)程序是計(jì)算從0累加到100的總和。
在初三時(shí),我的父親給我買了一臺(tái)二手電腦。我在這臺(tái)電腦上編的第一個(gè)程序是VBA,主要是使用VBA腳本在Excel中處理了我整個(gè)初三上半年的成績。閑暇之余,也會(huì)玩一些游戲,如《紅色警戒》。
到了高中,學(xué)校的電腦課程主要圍繞WPS和一些軟件操作教程。彼時(shí)的我從計(jì)算機(jī)雜志里面扣下來一張3.5寸軟盤,在電腦上安裝了Pascal編譯器,也進(jìn)行了一些簡單的編程嘗試。不過家里的電腦最主要的用途還是用來玩游戲,放假時(shí),我經(jīng)常邀請(qǐng)同桌一起來家里玩《雷電》。但是好景不長,沒過多久這臺(tái)電腦平白無故的就壞了,也一直沒修。到現(xiàn)在我也不知道這臺(tái)電腦到底是年久失修壞的還是“人為的故意”損壞??傊钡礁呖冀Y(jié)束,我再也沒有寫過程序。
人生的兩個(gè)轉(zhuǎn)折點(diǎn):選擇與放棄
當(dāng)填報(bào)志愿那天來臨時(shí),我的媽媽做了一個(gè)影響我直到現(xiàn)在的決定,這也是我人生的第一個(gè)拐點(diǎn)。當(dāng)時(shí)我還在猶豫填報(bào)什么專業(yè)的時(shí)候,母親對(duì)我說:“現(xiàn)在比爾·蓋茨是世界首富,學(xué)編程以后肯定吃香,報(bào)計(jì)算機(jī)編程專業(yè)吧”,于是我大學(xué)選擇了軟件工程專業(yè)。
萬萬沒想到媽媽的話一語成讖,我果然步了比爾·蓋茨的后塵——但是并沒有像比爾·蓋茨一樣成為世界首富,而是像比爾·蓋茨一樣輟學(xué)了,當(dāng)然這些都是后話了。
還記得2009年對(duì)我來說是最尷尬的一年,那年我花掉了家里給我本來應(yīng)該交下學(xué)期學(xué)費(fèi)的錢,買了一臺(tái)高配的筆記本。當(dāng)我打算用一年時(shí)間打工賺學(xué)費(fèi)時(shí),卻被現(xiàn)實(shí)無情地打敗了。我和3個(gè)同學(xué)一起在網(wǎng)上找了一個(gè)飯店服務(wù)生的工作,面試完之后HR告訴我們上崗需要穿西裝。我之前從來沒有穿過西裝,正當(dāng)我猶豫要不要買一件的時(shí)候,卻接到了公司的電話,其它3個(gè)同學(xué)都應(yīng)聘上了,我落榜了。
后來,我靜下心來回歸到了正常的大學(xué)學(xué)習(xí)與生活中。大學(xué)期間,我學(xué)習(xí)的主要課程是C、C++、C#、Delphi,也在圖書館里自學(xué)了Java、PHP、Python。個(gè)人而言,我最喜歡的語言是Java和C,于是我給自己取了一個(gè)網(wǎng)名叫justjavac。我接觸的第一個(gè)開源軟件是FireFox,這也是我頭像的由來,我很欣賞FireFox挑戰(zhàn)IE瀏覽器權(quán)威的故事。
隨著Node.js的發(fā)布,Ryan Dahl成了我的榜樣和偶像,我做夢(mèng)都幻想自己將來能成為像Ryan Dahl一樣的軟件工程師。
于是,我開始關(guān)注國外的最新技術(shù)以及開源相關(guān)的動(dòng)態(tài)。就這樣大學(xué)過去了一年,我鼓起勇氣向開源軟件Tomcat的Servlet組件提交了個(gè)人的第一個(gè)代碼補(bǔ)丁。那時(shí)候GitHub還沒有誕生,我在查閱了很多向開源軟件貢獻(xiàn)代碼的資料后,將代碼補(bǔ)丁以郵件的形式發(fā)給了Tomcat維護(hù)者,經(jīng)過幾輪的討論,我的補(bǔ)丁被拒絕了。雖然這次參與開源失敗了,但這是我邁向開源的第一步。
大學(xué)期間,我也開始了第一次創(chuàng)業(yè)之旅。我的第一個(gè)創(chuàng)業(yè)合伙人叫徐來,他的座右銘“但行好事,莫問前程”深深的影響了我。他是我大學(xué)的班長兼舍友,當(dāng)大部分同學(xué)都找到實(shí)習(xí)工作的時(shí)候,只有我在宿舍里寫寫程序,而他則在外面接一些做軟件的私活,并讓我和他一起做。后來他對(duì)我說要成立一家公司,詢問我是否感興趣一起干。那天,我們聊了很多,也聊得很投機(jī)。人生中的第一次創(chuàng)業(yè)便從這時(shí)展開。
沒過多久,我就用到了大學(xué)自學(xué)過的幾乎所有編程語言,儼然成為了一名“全能”工程師,而徐來也支持并認(rèn)可我做的每一次技術(shù)選型。創(chuàng)業(yè)比打工要辛苦多了,最久一次工作時(shí)間是一個(gè)月只休息了一天,但一想到是為了自己而拼搏,也就不覺得累了。
大學(xué)的時(shí)光總是美好而短暫,很快就到了畢業(yè)的日子。臨近畢業(yè)的前幾天,老師找到我說,如果能夠補(bǔ)齊此前拖欠的學(xué)費(fèi),可以給我補(bǔ)發(fā)畢業(yè)證和學(xué)位證。然而在人生的第二個(gè)拐點(diǎn),我做了一個(gè)錯(cuò)誤的決定。當(dāng)時(shí)只是想著“既然我根本就沒怎么去上課,為什么還要補(bǔ)交學(xué)費(fèi)呢?”于是我拒絕了老師的要求,實(shí)則最主要的原因是當(dāng)下確實(shí)沒有錢,也因此沒有拿到畢業(yè)證。
一萬小時(shí)定律
從學(xué)校離開的兩年后,我結(jié)婚了。結(jié)婚前的一個(gè)月,一直期待婚姻的我第一次有了恐婚心理。那時(shí)的我一無所有:沒錢、沒房、沒車,甚至也沒有給老婆買鉆戒、拍婚紗照。
我們最初租了一間60多平米的房子,生活的大部分花銷都是由老婆負(fù)責(zé),我平時(shí)就是靠編程獲得寥寥可數(shù)的工資,即使如此,老婆依然很支持我做的任何事情和決定?;楹笪页司幊讨猓查_始寫寫博客、在社區(qū)回答一些問題。
不過,有一年的結(jié)婚紀(jì)念日,我的老婆突然和我談心時(shí)說道:“你知不知道之前咱們租房時(shí),有一次我切著切著菜,把菜都扔地上了,在沙發(fā)上坐了一會(huì)兒才又繼續(xù)切。你知道為什么嗎?我在想,我要一輩子過這種日子嗎?后來我想通了,既然我當(dāng)初嫁給了你,就算跟你過一輩子這種日子,我也愿意”。
這段話深深地觸痛了我,我不應(yīng)該辜負(fù)一個(gè)深深愛著我的人,我應(yīng)該做些改變。
不久后我在網(wǎng)上看到了一句話:一萬小時(shí)定律,任何一個(gè)人只要在某個(gè)領(lǐng)域精益求精地鉆研一萬小時(shí),那么他就能成為這個(gè)領(lǐng)域的專家。聽上去有點(diǎn)像心靈雞湯,但是不管它是“真雞湯”還是“毒雞湯”,我都喝定了。那晚我和老婆聊到很晚,我告訴她,“一萬小時(shí)是多久?如果一個(gè)技術(shù)我每天鉆研5小時(shí),一年365天,那么一萬小時(shí)差不多就是5年。而5年后我才三十歲左右,別人三十歲可能已經(jīng)遇到中年危機(jī)了,而我三十歲能成為一個(gè)領(lǐng)域的專家。不過專家這個(gè)詞比較虛,現(xiàn)實(shí)一點(diǎn)的說法就是雖然我現(xiàn)在一年賺不到3萬,但是我一定要30歲的時(shí)候年薪30萬”。
自此以后,我便把主要精力都放在了JavaScript 上,而且還更加深入的研究了 JavaScript的執(zhí)行原理以及Chrome、V8、Node.js的底層機(jī)制。為了研究網(wǎng)頁上的 JavaScript庫,我開發(fā)并開源了一個(gè)Chrome插件LibrarySniffer(原 ChromeSnifferPlus),安裝這個(gè)插件后,使用Chrome瀏覽任何網(wǎng)頁時(shí)都會(huì)在插件頁顯示出當(dāng)前頁面用到了哪些JavaScript庫。
2014年,在我辦了一張雙幣信用卡并支付了5美元的費(fèi)用后 ,LibrarySniffer終于在 Chrome Web Store上架了。同年我又開發(fā)了另一個(gè)插件ReplaceGoogleCDN,將國外的通過CDN直接引入的JavaScript資源替換為國內(nèi)的鏡像資源,可以達(dá)到2-50倍的加速效果。第二年,LibrarySniffer收到了一名巴西程序員提交的葡萄牙語言包,這也是我的開源項(xiàng)目第一次受到外國開發(fā)者的關(guān)注。
結(jié)識(shí)狼叔,深入Node.js后端
我以為LibrarySniffer能受到國外程序員關(guān)注是我的巔峰,沒想到這僅僅只是開始。一個(gè)月后我收到了某個(gè)活動(dòng)的邀請(qǐng)函,讓我去他們公司做技術(shù)交流。該公司創(chuàng)始人說要上線一個(gè)新品,特邀我去做技術(shù)分享,如圖2所示。
圖 2 我的首次分享
之后,我也經(jīng)常參加業(yè)界的一些開發(fā)者大會(huì)。還記得在天津舉辦的一場(chǎng)200人的開發(fā)者大會(huì)上,我在做完JavaScript前端相關(guān)主題演講后,結(jié)識(shí)了阿里巴巴技術(shù)專家、國內(nèi)知名Node.js技術(shù)布道者、《狼書:更了不起的Node.js》作者i5ting(狼叔)。
想必很多經(jīng)常逛Node.js中文社區(qū)的開發(fā)者即使沒聽說過創(chuàng)始人alsotang,也一定聽說過 i5ting。當(dāng)?shù)弥鞘逡苍谔旖騽?chuàng)業(yè)時(shí),我還是吃了一驚。天津被稱為互聯(lián)網(wǎng)的沙漠,而狼叔帶領(lǐng)的Node.js團(tuán)隊(duì)可謂沙漠里面的一顆明珠。我經(jīng)常使用Node.js,不過只是作為工具,真正生產(chǎn)環(huán)境里的后端服務(wù)依然是使用PHP或者Java。
我和狼叔深入聊了聊Node.js后端,隨后狼叔更是邀請(qǐng)我去參觀他們公司的技術(shù)團(tuán)隊(duì)。狼叔對(duì)我說,你研究V8那么深,其實(shí)對(duì)前端的作用不是非常大,但是對(duì)于Node.js后端則很有用。聽完狼叔的勸告,我也開始在公司中引入Node.js作為后端服務(wù),遇到問題則直接呼叫狼叔這個(gè)“免費(fèi)的顧問”,幾乎都可以解決。
誰曾想天有不測(cè)風(fēng)云,一心研究Node.js的狼叔被合伙人給坑了。我約狼叔出來一起吃飯,心態(tài)佛系的狼叔也沒有怨天尤人,只是說了句“程序員斗不過商人”。這句話我太有同感了,因?yàn)槲业诙蝿?chuàng)業(yè)時(shí)也是被合伙人給坑了。我安慰他說,你雖然離開天津了,但是我繼續(xù)留在天津扛下Node.js的大旗。狼叔笑道:“就算我不走,你也是天津 Node.js屆的扛把子”。
狼叔比我小,平時(shí)他喊我哥,我喊他叔。在隨后的幾年里,每當(dāng)狼叔來天津都會(huì)和我一起敘敘舊,而我如果去到了狼叔所在的城市也會(huì)找他一起聊聊天。最近幾年,我在維護(hù) Deno的過程中也向狼叔請(qǐng)教了很多Node.js的知識(shí)點(diǎn)。
圖3 左起依次是umijs作者sorrycc(云謙)、i5ting(狼叔)、justjavac(迷渡)
成為Deno核心代碼貢獻(xiàn)者
2017年,我收到騰訊TFC前端大會(huì)的邀請(qǐng),去分享V8、JavaScript相關(guān)內(nèi)容,這是我第一次被BAT大廠邀請(qǐng)。會(huì)后知名前端開發(fā)者winter曾問我,“你在天津哪家公司任職,為什么會(huì)用到這么深入的V8場(chǎng)景”。我回應(yīng)道,“其實(shí)我們公司根本用不到這些,研究V8純粹是我的個(gè)人興趣”。當(dāng)他問為什么不去騰訊、阿里、字節(jié)跳動(dòng)時(shí),我回答說,比較戀家,娶了個(gè)天津老婆,所以也就不想去北上廣了。
圖4 上排中間 winter(寒冬),中排中間 justjavac(迷渡)
2018年,Ryan Dahl向社區(qū)宣布正在開發(fā)另一個(gè)JavaScript/TypeScript運(yùn)行時(shí)平臺(tái)——Deno。我第一時(shí)間下載了源碼并編譯了一個(gè)可執(zhí)行文件,我在使用后發(fā)現(xiàn)Deno的Bug還非常多,畢竟才剛開發(fā)不久。彼時(shí)網(wǎng)上對(duì)Deno也存在兩種截然不同的態(tài)度,一種是崇拜,另一種是質(zhì)疑,甚至出現(xiàn)了Deno的issue被垃圾信息充斥的局面。但是,只顧在 issue上發(fā)泄不滿解決不了任何問題。彼時(shí),我便在思考,既然Deno問題這么多,為什么不幫它改進(jìn)呢?于是,我開始了Deno開發(fā)之旅。
起初我也僅僅是幫Deno改一下Bug,但當(dāng)我得知Deno是想做一個(gè)兼容瀏覽器及Web API平臺(tái)后,我便新建了一個(gè)開源項(xiàng)目,為Deno開發(fā)WPT(Web-Platform-Tests Suite,Web平臺(tái)測(cè)試套件),然后幫助Deno實(shí)現(xiàn)和改進(jìn)了url、console、encode/decode、timmer等API。
隨著越來越多的開發(fā)者開始使用Deno,新問題不斷涌現(xiàn)。由于TypeScript的整套工具鏈都是基于Node.js開發(fā),這就導(dǎo)致了當(dāng)使用VSCode開發(fā)Deno時(shí)會(huì)出現(xiàn)波浪線標(biāo)紅警告,于是我開發(fā)了一個(gè) VSCode擴(kuò)展和一個(gè)TypeScript Service Plugin來解決這個(gè)問題,很快這個(gè)擴(kuò)展便受到了國內(nèi)外很多社區(qū)的推薦,甚至得到Deno之父Ryan Dahl的關(guān)注。
2019年,Ryan Dahl和我見面時(shí)也當(dāng)面感謝我為Deno開發(fā)了這個(gè)擴(kuò)展。與此同時(shí),另一位開發(fā)者axetroy(鐵手) 也一直為這個(gè)擴(kuò)展添加功能。后來我老婆懷孕了,我對(duì)社區(qū)的參與也少了很多,于是axetroy基于我的代碼新建了一個(gè)項(xiàng)目繼續(xù)開發(fā)并完善這個(gè)擴(kuò)展。
在Deno發(fā)布1.0正式版的當(dāng)天,我聯(lián)系Ryan Dahl并希望把該擴(kuò)展放到Deno的官方倉庫。我目前最遺憾的一件事就是由于當(dāng)時(shí)選擇了直接把我的項(xiàng)目復(fù)制到官方倉庫而導(dǎo)致了axetroy代碼沒有合并進(jìn)來。
后來,我又搭建了Deno中國加速鏡像服務(wù),讓國內(nèi)開發(fā)者更加方便地學(xué)習(xí)和使用 Deno。將deno.dev域名送給Ryan Dahl 作為Deno Deploy的官方域名。開發(fā)了Deno的多版本管理工具dvm(Deno Version Manager)。
這幾年我不斷被各種技術(shù)研討會(huì)、組織、企業(yè)、個(gè)人邀請(qǐng)去做Deno技術(shù)演講。
然而我并沒有止步于Deno,2020年華為開源了HarmonyOS(鴻蒙)系統(tǒng),當(dāng)我得知鴻蒙系統(tǒng)也是用了一個(gè)輕量級(jí)JavaScript引擎時(shí)頓時(shí)來了興致,當(dāng)晚便下載了鴻蒙的源碼開始研究,并寫了一篇逐行分析鴻蒙JavaScript框架源碼的文章,還為鴻蒙修復(fù)了多個(gè)bug,不久后收到了鴻蒙團(tuán)隊(duì)寄來的一個(gè)開發(fā)版,從此以后再也不用在模擬器上調(diào)試了,而可以直接使用真機(jī)了。
總結(jié)
自我第一次參與開源到現(xiàn)在十余年,已經(jīng)在GitHub上開源300多個(gè)項(xiàng)目,根據(jù)第三方數(shù)據(jù)統(tǒng)計(jì)目前獲得的總Star數(shù)排名全球前20。我感覺自己非常幸運(yùn),從后端轉(zhuǎn)型到前端后就趕上了JavaScript的飛速發(fā)展,也見證了HTML5、ES6、CSS3等技術(shù)的發(fā)展歷程。最后想送給每位開發(fā)者一句話“學(xué)歷代表過去,能力代表現(xiàn)在,學(xué)習(xí)能力代表未來”。
二十年前,《新程序員》創(chuàng)刊時(shí),我們要全面關(guān)注軟件人的成長。今天,我們依然初心不變:在一行行代碼的背后,是一顆顆鮮活的開發(fā)者想要改變世界的雄心壯志。
因此,《新程序員004》從 C++之父 Bjarne Stroustrup、C# 之父 Anders Hejlsberg、MySQL 之父 Michael “Monty” Widenius、PostgreSQL 全球開發(fā)組聯(lián)合創(chuàng)始人 Bruce Momjian 等程序員祖師爺,到阿里巴巴副總裁賈揚(yáng)清、指令集創(chuàng)始人兼董事長潘愛民、Vue.js 作者尤雨溪……48 位技術(shù)大咖,共創(chuàng)我們的程序人生、我們的技術(shù)時(shí)代?!缎鲁绦騿T004》已全面上市,歡迎訂閱!