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