从辍学到成为Deno核心代码贡献者,我的十年编程生涯

【CSDN 编者按】大学因学费而辍学,最困难时睡在公园长椅,有远见的母亲让他走上了编程之路,温柔智慧的妻子用爱与信任激励着他秉承初心、奋勇前行。编程十余年,他已在GitHub开源三百多个项目,项目总Star数位居全球TOP 20。从后端成功转型为前端,成为Deno核心代码贡献者的迷渡(网络ID:justjavac)在《新程序员004》之「我是程序员」板块分享了他这一路的成长与感悟。同时,也给新一代开发者留下了寄语:“学历代表过去,能力代表现在,学习能力代表未来”。

作者 | 迷渡       责编 | 张红月

出品 | 《新程序员》编辑部

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。

本文节选自《新程序员004》,扫描上方二维码即可订阅

学生时代编程启蒙

初中时,我开始接触电脑,使用的第一门语言是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等技术的发展历程。最后想送给每位开发者一句话“学历代表过去,能力代表现在,学习能力代表未来”。

本文文字及图片出自 CSDN

余下全文(1/3)
分享这篇文章:

请关注我们:

发表评论

邮箱地址不会被公开。 必填项已用*标注