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