跟 Anthony Fu 聊聊全职开源和他的故事

2021-12-09

Anthony Fu 是一个 Fulltime Open Sourcerer,有许多优秀的作品,是 VueVite 团队的核心成员,目前在 NuxtLab 工作,本期我们就来聊聊他的故事。


Transcript

Limboy: hi 大家好,欢迎收听 ByteTalk, ByteTalk 是一个程序员访谈节目,我是主持人 Limboy,今天请到的嘉宾是 Anthony Fu,他主要活跃在国外的开源社区。今天我们就来聊聊他的故事。欢迎 Anthony Fu。

Anthony: 大家好,我叫 Anthony Fu,我是 Vue 和 vite 的核心团队成员,同时也是一些开源项目,如 Vueuse, Slidev, UnoCSS 这些开源项目的作者。我之前在 GitHub 上做了一段时间的全职开源,那现在加入了 NuxtLab 主要参与 Nuxt 3 的开发和 Vite 的整合。

Limboy: 好的,那先来聊聊你是什么时候开始接触编程的吧。

Anthony: 这个的话其实我接触编程还挺早的,可能是在小学五年级,我是从我的同学那边了解到编程这件事情,他那时候给我展示了一些蛮酷的东西,比如说写一个什么键盘记录器,你开在后台,然后他会帮你把所有按过的键都记下来。这个东西算是我觉得特别酷的,展示完我就觉得原来还可以这样。这算是我开始接触编程的一个契机。然后后来开始接触 Flash 然后用 ActionScript 写了一些 Flash 的小游戏、小动画之类的。后来学 VisualBasic 和 C# 然后开始做一些 Windows 的开发。其实中间也是断断续续,因为学业的关系。比较算是认真开始学的话可能是从大一开始。大一的时候我那时候想要自己做一个个人网站,大家都会想要做一个自己 Blog。那时候那时候学了 Python,然后用 Python 做了一个后端,用 jQuery 写的前端,后来就是开始算是开始接触前端。再后来因为那时候 Vue 还蛮火的,然后学了 Vue ,故事差不多就是这样。因为学了 Vue 然后写了一些 Vue 的 App ,开始慢慢接触到开源。

Limboy: 那你觉得编程带给你最大的乐趣是什么?

Anthony: 我觉得对我来说可能就是类似成就感的东西,有点像是我们玩游戏,比如说我们玩吃鸡,那 100 个人里面,你最后一个人活下来,就会觉得特别爽,就是你去完成一件特别困难的事情,然后你成功了,那你会觉得很有成就感。那对我来说可能编程也是对我来说就算是一种游戏吧。今天遇到了一个特别难的问题,可能是比如说算法的问题,或者是你要解决一个事情,但是你完全没有头绪。但是你最后可能经历了很多困难之后,终于把它做出来了,那个能够给你带来的成就感,其实是非常能够驱动你去继续做这件事情。

Limboy: 那为什么会选择前端编程呢?

Anthony: 前端的话,我觉得前端有诸多好处,基本上来说就是你的 Feedback Loop 很短,稍微写几行代码,你就可以看到真正的东西。你可以在网页上看到一个按钮跳起来或者是一个什么,你从写代码下去到最后有反馈,是一个很快的过程。然后同时因为网页天然跨端,所以就变成如果你做了一个很酷炫的网站,然后你只要把它部署上去,就可以把这个链接发给你的所有的朋友。他不管是在手机电脑不管还是安卓还是 iOS 它都可以通过网页来看到。这也是另外一种成就感的来源,来自于别人使用你的东西,然后给你的一些评价之类。那我就觉得说做前端这一块能够让我做的东西更好更快地被别人看到,可以更快的分享给别人。

Limboy: 那你是什么时候开始接触开源社区的呢?

Anthony: 我最开始可能就是高中的时候看知乎,那时候很多大牛就会分享一些自己的经验。那时候好像有这么一件事情,就是说你把你的 GitHub 的首页做得特别好看,说你去参与很多贡献,对你将来找工作特别有帮助。我那时候就是一直有这么一个想法。然后我那时候一开始的时候就特别想要做一个成功的开源项目,然后通过这个可能去证明我的一些能力。之后比较好找工作。所以那时候会有意没意地把一些东西放在 GitHub 上。最开始 GitHub 你知道它是开源才是免费的。如果你要做 Private Repo 的话,是要收钱的。那时候那时候还蛮有趣,知乎上有人问说,那我怎么放我的私有仓库,但我又不想花钱,然后他们就说你就放呗,反正你开源也没有人看。如果没有人关注你,你这个东西其实跟私有的没什么区别。那最开始我做了一些小东西小工具放上去其实也没什么人看,那我其实也没那么在意。

后来我更多参与开源的话,就是一开始那时候我跟几个大学同学,想用网页做一个 App,它是一个记账的东西。我们几个朋友一起出去玩,然后比如说我们这段谁付那段谁付,我们最后旅行结束之后要把它算清楚。那这个我们要记一个叫做公账的东西。其实做公账这些事有很多解决方案。有的是说大家每个人一开始的时候,先比如说拿个 100 块钱放在公共钱包里,那钱包里有这么多钱,然后每次出去消费的时候就用公用钱包付。或者是另外一种方式说你每次谁付谁付,然后最后就算一下谁欠谁多少钱之类的东西,那差不多是这样。

我那时候跟一群朋友出去玩了之后回来,有在旅行的过程中遇到这个问题,就想说那不然我们来写一个 App 去更好地解决这个问题,说不定可以帮助到更多的人。然后那时候就用了前端的技术去做了一个 App,同时我们又想要利用我们学校朋友的同学的之间的资源,我们学校里面有一些外语科系的,比如说什么日语、韩语或者是一些小语种的。那我们就想能不能够让这些朋友来帮我们给这个 App 做翻译?这样一发布就是多语言。

如果不是学计算机的话,大家对于这种写代码这事情还是没有那么了解的。然后如果你这时候你发给他一个 JSON 然后你就要说这里面都是英文的,你帮我改成日文,那他就会不懂这个 JSON 语法,然后那时候就去找了一些 VSCode 插件,看说能不能比较直观的去做这件事情。那时候看到一个叫做应该是 VSCode Vue,然后那时候用了这个东西。它有一部分我们想要的功能,但是有一部分又没有。然后那个作者他自己的话是他没有太多精力在这个项目。同时他做完之后,就去忙他自己的事,然后他就把 issue 给关掉了,然后我就没办法给他提 issue 了,也不知道怎么参与贡献。后来想说那不然对不然我们来 fok 一个。好,我就去 Email 联系了作者,然后问他说能不能 fork 自己做一个呢?他说好,那我们就开始做这件事情,之后我就把它发布上去了。随着我们自己需求的增加,我加了一些新的功能。然后做这个项目之后,我会发到那个 reddit,还有一个 Discord channel 就是 Vue i18n ,就是跟大家介绍说我做了这件事情,加了一些觉得还蛮不错的功能。发了之后,大家说那我能不能用 React 因为那时候只是给 Vue 写的,我说好,我们就做呗。

然后把这整个项目相当于重构了一下,把它底层的一些东西做得通用化了之后,我们后来发了一个 2.0,支持了非常多的框架,基本上前端或者是有一些 PHP 什么类似的框架都可以支持。然后现在它叫 i18n-ally,如果你去搜的话,应该也可以搜的到。这算是我第一个有点成功的项目。后来蛮多人开始用的,然后也获得了一些 star,我可能会帮别人解决一些需求,或者说他们可能会想要加一些新的东西。如果你帮他解决,有些人就非常慷慨说那我就给你赞助点钱这样。那时候开了一个 paypal 收这个钱,怎么讲,收这个钱其实本身并不并没有太多,有可能就是一刀五刀之类的。但是我觉得这个事情能给我非常大的动力,就是你第一次说让别人因为你做了一个项目,让人甚至愿意掏钱。就是没有回报的掏钱去支持你做这件事情,我觉得是一个蛮大的成就感来源。一个受到别人的肯定这样的感觉。其实最开始我可能也想说。我很想要做一个成功的开源项目,但是我完全不知道要怎么做,因为你不知道别人需要什么,你也不知道你这个东西如果别人需要一个东西,你不一定做得出来。你要知道说自己能够做什么,跟别人需要什么,然后你可能要从中找一个平衡。那最开始我做这个项目其实是拿别人的想法来的,因为我是拿别人实现好的一部分,然后拿来 fork 拿来改的。这个东西就算是一个我能够更好地接触到开源,知道大家真的需要什么,也算是给我蛮大的动力去继续做开源。

Limboy: 所以是以一个记账的 App 为引子,开始进入到开源社区了。那我看你网站上有篇文章是讲 yak shaving 的这个概念,你能解释一下吗?

Anthony: 简单来说有点像是造轮子。但他其实在引申的是,假如你今天想要做一件事情,然后你在做这件事情的过程中,发现另外一件事情还需要你做,或者说你觉得这另外一件事情把它做好了可能更好。这时候你就去做另外一件事情。那你在做另外一件事情的时候,又遇到了另一件事,你一直去做了很多你觉得可能需要但是不一定需要的事情,就是你会做了很多本身不是你自己本身目标的东西,然后这样子就会导致你的整体的效率变低了。

最后你可能没有时间去完成你本应该完成的那个任务,这个东西可能常规来说不是件特别好的事情,你应该更专注于你自己想要做的事。但对我来说的话,我觉得一开始我可能也有点这样,那时候也是说想要写个博客,但是你花了特别多的时间去把你的网站弄好,但是你可能之后网站也没弄好,博客也没写成。如果想要把那个 Shaving 是从一个不太好的可能会影响你效率的事情,把它变成一个好的事情。对我来说的方式是你不用一开始就把它做那么好,也一开始不要设那么大的目标,如果你真的需要这个工具,那你就去把它写出来。你花一点时间把它写出来,写出来之后你说不定能用。然后你如果还有时间的话,可以把它包装一下,然后发到开源上,发到 GitHub 上。然后看大家需不需要这个东西,那不需要这个东西也没关系,你把你自己的事情解决了。那如果大家需要这个东西,那很棒,你成功了。可能刚好大家都遇到这样的一个痛点的事情,然后你把它做出来,那你可能就可以给别人带来价值。然后同时你可能可以把它做成一个你的项目之一,如果失败了也没关系,不要抱太高的期待。因为你这个东西本身是为了解决你自己的问题而用。刚好如果能够解决别人的问题,那就算是一个不错的收获。

Limboy: 所以还是要优先解决自己的问题,但不要陷得太深。如果能顺便解决其他人问题,那更好了。看你在网上很多的内容,它的输出主要是英文。那你在英文学习方面有什么经验吗?

Anthony: 其实说实话我英文不是特别好,可能我小学的时候不是特别喜欢念书,然后英文就特别差。我真正开始学英文可能是从初中,我小学完全不会可能小学六年级 26 个字母都念不出来。但因为我们那时候初中的时候,他会从头开始教一遍英文,但是稍微快一点。然后那时候可能我家长觉得说你英文太差了不行,你要认真一点。那算是说从初中开始学的英语,然后但是其实也不是特别好,我高考的英文成绩也不是特别好,但我觉得学习的方式可能每个人都不一样,对我来说,我觉得真正能够平常写开源或者写什么,或者是输出一些资源基本上都是用英文的。我现在能够做到这一点,对我来说我觉得可能说一个是你得敢说。

我是大一的时候认识了一个外籍的同学,一个美国人。然后那时候学校是在台湾,其实很多系统虽然有英文,可是还是以中文为主。然后那时候跟那个同学说我会帮他做很多一些学校里面的一些手续文件之类的东西。那我要帮他做翻译以后,告诉他说要怎么办,因为他中文不是特别好。我当时也是完全讲不出来,但是没办法你要硬讲,因为你得帮他,就算是做了这样的一件事情,就交了这个朋友。然后开始练习一点自己的英文,之后其实你会发现说英文,你不需要真的说你要雅思七分八分还是怎么样你才可以跟别人交流。其实你只要稍微会一点,可能小学初中学的其实就够交流了,能够表达你的意思就好。其实就是这样一个事情,让我觉得其实自己对英文也没那么害怕。然后我可能去用 Google 搜东西,基本上都用英文,Google 如果你要搜的话,英文还是准确一点,比较容易找到你想要的东西。然后很多问题,你可能去那个 stack overflow 上有更多的解决方案。

我觉得说英文其实也并不一定要学到多么好,但是主要的说你要对自己有信心,然后你要真的一直去使用它,那我也算是因为学了编程,想要做开源这个东西,然后逼着自己去学。在这个做的过程中,在看的过程中学了很多的英文,比如说你今天遇到了一个英文的文档,那你没办法,你就得把它啃下来。

Limboy: 那你现在在英文的输出上还会有什么障碍吗?

Anthony: 现在的话还好,其实我主要的压力就是我怕一些可能跟外国人的习惯不一样,比如说他们的俚语或者是说有些话你不能用,你在中文可以这么讲,英文不能这么讲,或者是不应该这么表达。因为我自己没有去过英文环境的国家,没有在那边生活过,其实这是一个我比较怕的事情,就是我怕说我今天讲了一句话,但别人理解的方式跟我想要表达的不一样。那这你其实逐渐跟别人交流之后,你也可以了解到一些,然后有些人会帮你指正出来说,你这样讲可能不一定特别好,或者是你可以去学别人,别人这么讲,差不多是这样。

Limboy: 所以用英语作为主要的沟通语言,也没有那么高的门槛,但还是要 push 自己走出舒适区。那我看你主要活跃在国外的社区,平时跟开发者互动也比较多。你对于如何在国外的编程环境下建立影响力有什么感悟么?

Anthony: 我也说不上来说,我觉得可能一开始运气成分可能比较大一点。我最开始加入了 Vue 的团队之后 Twitter 也是有意无意用一用,然后加入了 Vue 团队,我就挺兴奋的。然后就在 Twitter 上发了一个说。今天开始我要维护这个 Vue 下面这个小小的一个插件。然后我就截了一个那个尤雨溪 invite you to the Repo 那个邮件里面的截图,然后就特别兴奋,我就发了一个这个 Twitter 然后尤雨溪就看到了,然后就关注了我,还把我这个 Twitter 给转推了。然后那时候一个晚上就可能来了 300 个粉丝,差不多是这样,那时候就觉得还可以这样。然后我就开始在推特上发一些类似说我现在做什么,比如说什么可能做了一个满酷的小功能,然后录了一个小 demo 或者截一张图,发上去,跟大家介绍一下,差不多是这样子。然后有些人就觉得说你这个东西很酷之类的,然后他就帮你转推。那转推我觉得推特这个系统还是蛮酷的。如果你的内容足够好的话,就会有很多人帮你转发,然后一转发的话,你的触及面就会变得非常的大。因为你发了之后,基本上只有关注你的人才可以看得到。但是如果其中的一个人帮你转推了之后,那关注他的人就可以看得到了,差不多有点像病毒式扩散,如果你这个内容很好的话。然后开始慢慢的积累了一些粉丝。

Limboy: 那除了 Twitter 平时还会去 Reddit 等一些国外的社区去发布内容吗?

Anthony: 最开始其实会发的,因为我那时候希望能够做一些推广,那基本上能发的平台都尽量发一发,然后也会在 Discord 里面就是有个 Vue 的 channel ,去发一发。但是我觉得 reddit 的效果不是那么的好。对我来说因为 reddit 其实是一个内容导向的东西,你看到的东西基本上都是关注在内容上的,你贴一个链接贴一个标题。然后这个标题如果吸引或者是内容吸引人,那你可能会火。它就是一个以你当时当下的这个内容为主。但推特比较像是说你是以这个作者或者是以这个人为核心的,你今天做了一个东西,大家会希望看到你更多的东西,他就会去关注你。那关注你之后你就可以获得一些喜欢你作品的人,差不多是这样的感觉,你能够可以在社群里面获得更好的共鸣。但是如果你去 reddit 发的话,那基本上就是陌生人,然后大家不会知道你是谁,专门关注在这个项目本身,然后推特你同时又可以发一些非常 working in projects 的东西。

Limboy: 所以看起来是 Twitter 会更适合一些。那前面有提到尤雨溪邀请你加入 Vue 团队,这个过程大概是怎样的?

Anthony: 还是回到最开始那个分账的 App。那时候恰逢 Vue 准备要在做 Vue 3,然后那时候尤雨溪了一个 RFC 就是一开始叫 Functional API 然后现在叫 Composition API。那时候这个东西其实引发了蛮大的讨论的。有些人喜欢,有些人不是特别喜欢,然后中间做了很多权衡,有些人说你要把我 API 干掉不行之类的。那时候觉得对我们来说可能就觉得这好像听起来还是一个不错的想法。后来也是社群里面有个人,他就是把这个 API 给 backport 到了 Vue 2,然后做了一个插件,他做了这个插件之后,尤雨溪就看到了。然后一开始帮他发了一个推说现在已经有这么一个 working example 了,大家可以去试看看,或者是说可以去真实体验一下这个 API,因为有些人看了这个 API 的 proposal 会觉得这个太激进,或者是说这个太不直觉了,但是你要真的去用它之后,才能知道说它的好处在哪里。

后来尤雨溪在那个 Repo 下面开了一个 issue 就问那个项目的作者说你愿不愿意把它那个移到我们这个 Vue org 来把它变成一个官方的插件。在这个过程中你就可以成为一个 core team member ,这是我第一次知道有这么一个途径可以去进 Vue 这个团队。因为其实我自己是还蛮向往 Vue 团队的,一个我觉得可能是对尤雨溪的个人崇拜,然后另外一部分就是觉得说如果能够参与到这么大的一个开源项目,对自己也会蛮有帮助的。然后我就觉得其实这个插件要我来写,说不定我也能写出来。就是我一开始没有这个想法,这算是其中的一个小故事。然后我们就用上了插件,然后用了一些 Composition API 然后就觉得其实还挺好用。对浏览器的一些 API 做一些封装,我们觉得还不错。然后我后来就去开了一个项目叫做 VueUse 基本上是受启发于那个 react use 就是那个 react hooks 的那个工具合集,把一些常见的功能给封装一下,然后变成一些组合式的函数,可以直接调用,会比较方便一点。就是做了这么一个项目。

然后 Vue 3 差不多是 Alpha 到 Beta 的这个过程。那时候我就觉得说这个东西其实它是可以通用于 Vue 2 跟 Vue 3 的。然后如果你把这个库做成 Vue 2 跟 Vue 3 通用的话,其实可以让更多的用户去能够用到这个东西。另外一个就是如果你之后要从 Vue 2 迁移到 Vue 3 的时候,你也可以做一个过渡,就是说你可以先用上新的这些 API 去表达你的东西,然后你最后再换成 Vue 3 的时候,还是可以继续用这些东西。

后来就想了一些办法,一开始发了两个包,一个是给 Vue 2 的包,一个是给 Vue 3 的包,后来做了一个小工具叫 vue-demi 把中央这个底层的东西抽象出来,让所有库的作者都可以做一个 Vue 2/3 通用的库。做了这件事情之后,当时 Vue 3 还是 beta 。后来有中间有一次做了一个 breaking change 把那个 watch 的函数的一些参数默认参数改了。然后改了之后 Vue 2 这边的插件没有同步,然后我就开始发了一个 PR 过去,但是过了两三个月,作者好像就没有在维护了,那他可能去做别的事。但是这样的一个东西就变成说我在我我这个库是 Vue 2/3 通用的,但是现在 Vue 2/3 下面底层的东西不一样了,就会变得我这个库没办法继续发版这个感觉。我要么只能说你就只能在 Vue 3 之前这个版本用,就有点像是说被这个东西给阻碍住了。然后那个作者也一段时间没有回复,因为我觉得有些东西就是非常 straight forward ,你可能这个东西合进去发个版就好了。那就想说我说不定可以来维护这个项目。然后我就发一个 issue 说我自己 Volunteer myself to contribute this project 然后我就 at 尤雨溪,然后他也蛮快就回了,给我权限。

然后我就算是通过这样的一个方式去参与到 Vue 的团队里面,后来就变成了这个 Vue 团队成员之一,这样我自己觉得算是一个还不错的例子,当你需要一个东西的时候,这个东西才是可以给你提供特别大动力的来源。然后因为我做了一个项目依赖于这个项目,那这个项目有问题,我希望它好,那我就去维护它。然后同时我也可以获得一些 Something in return 。

Limboy: 所以还是要以自己的需求为出发点,同时抱着惠及他人的心态去开发。我看你推上说两月份开始全职做开源了,这其中的故事能讲吗?

Anthony: 其实我那时候还在读研究生,后来研究生读完了,也没那么急着找工作。另外一方面就是我觉得开源这个东西我做得挺开心的。然后那时候开了 GitHub Sponsor ,有一部分的收入我就觉得好像稍微过得拮据一点,靠这个钱也能生活,我就不太想去大公司卷,然后就想说不如干脆就来做全职开源。

这其实是一个我不知道别人,但是对我来说就是一个一直以来的梦想,可以自由工作,可以做自己喜欢的东西,然后又有一部分收入,很棒。然后那时候二月份就决定说不如我们来做开源。后来做到一定程度之后,Nux 那边来找我说要不要去他们那边工作。一方面就是我挺喜欢 Nuxt, 另外一个就是我觉得他们想要做的事情跟我想要做的事情其实很契合。后来就决定加入他们,然后加入他们也蛮幸运的,其实主要的工作内容也都是开源。

Limboy: 那你感觉的话国内和国外的开源有什么差异吗?

Anthony: 其实我觉得这还挺复杂,我是觉得国内开源,如果是大公司开源的话,可能大家更多的想要是分享一个解决方案,或者是可能有一些公司内部的系统,把它整理一下,然后拿出来做开源。那可能说我觉得对于国内的开源来说可能更多的是业务价值,但是每一个公司有自己的喜好或者是技术栈或者是一些不同的需求,这个东西我觉得还是稍微比较难通用一点。但是国外比较多的倾向于做一些比较小而专精的工具链。比如说 React 或者是说我觉得可能更基础一点,比如 TypeScript 就是一个大公司做出来,但是基本上所有项目都可以用得到的一个东西,然后它可以真的能够帮助到整个开发体验。

但是你说我今天做一个网页的框架,那就是你会包含了很多你的集成里面可能在公司里面很有用。但是可能对于小的开发者来说的是对于一些不太了解整个系统的人来说,其实没有那么容易。然后再来一个就是我觉得以英文作为主要语言还是蛮重要的,因为你其实可以让更多人参与到这个项目来。但是我觉得很多国内的开源项目的问题说他可能会以中文为主,或者他们也没有那么多精力去做英文,我觉得这是蛮可惜的。

Limboy: 那你的工作节奏大概是怎样的?我看你 GitHub 上已经有超过 1 万个 contribution 了,满满的一片绿格子。

Anthony: 对,其中很大一部分是我当时在做全职开源的时候做的,那个时候其实算是蛮有动力去一个项目的推的。然后另外一方面其实这个 contribution 的方式其实也蛮松的,虽然上面是 1 万多个 contribution 但是其实里面会有很多,你提一个 commit 也算是 contribution ,然后你开一个 issue 也算,提一个 PR 也算。因为我可能有很多项目,然后发版的时候每个发版都会有个 commit。然后这算是一个让数字看起来很大的原因之一。然后再一个说的确就我很感兴趣这个,然后也花了蛮多时间在这个上面。那我自己的工作节奏的话,我之前做开源跟现在做全职的工作都没有太多时间上的要求,反正你给你个任务,你把任务做完了差不多就好了。然后我可能白天会出去走一走,晚上或者是下午的时候开始工作。

我每天打开 GitHub 然后看一看那个通知,基本上以通知驱动,我尽可能把每一天的每天新来的通知都给他清掉,新来的 issue 可能回一下,或者是能不能解决的,能解决就把它解决掉,然后关掉。尽量把事情都在一在一天内完成,这样你就不会把之前的事情积累到第二天去。你知道如果你十天不做的话,就会有成百上千条通知等着你,没办法处理,尽可能及时的处理完,这样整体来说效率会高一点。对我来说这是一个比较舒适的工作方式。

Limboy: 所以还是不能拖延,先处理累积的任务。那顺便聊一下 Nuxt 团队的工作方式吧,应该也是 remote team 吧。

Anthony: 对,他们就是 remote 然后合作方式基本上来说一个星期开两次会,同步一下工作内容跟工作进度。然后剩下的时间基本上我们是通过 Discord 来讲交流。对于任务来说,基本上就是开 GitHub issue 然后就是 assign 然后大家在 GitHub 就能讨论,也是类似说我们叫非同步讨论,你不需要他一定得那个时候在线,反正就留个言,他醒来就会去看,只有每周开会的时候,那个时间大概会调整一个大家都比较舒适的时间。

Limboy: 看来还是蛮弹性,蛮公开的。那你觉得现在的状态跟你理想的状态接近吗。

Anthony: 其实我觉得整体来说算是有点超过我的预期了,一个是因为我其实没有想到说能够进 Vue,因为我大学的时候定了一个目标,说我大学四年里面我要做一个 Star 超过 100 的项目,然后我大学毕业的时候没有完成。但是后来在大学毕业的那个假期里,那时候做那个 i18n 的工具,然后就拿了 300 多个,有点像是我可能用了半个月的时间做到了我四年里没有达成的目标的感觉。

我那时候还蛮憧憬 Vue 的,然后我想说那不然目标就设为进入 Vue 团队,说不定可以用这个名号找一个好工作。那时候在实习,投了字节的实习,然后投完实习,等结果的那段时间,进了 Vue 团队,就还蛮奇幻的。后来去字节实习了一段时间之后,就回去继续念研究生,我那时候梦想的就是做全职开源的工作,那也算是一个对 dream job 的感觉。那时候我觉得整个生活还蛮梦幻的,一直在建立新的目标或者是梦想的时候,蛮快就达成了,我自己就觉得我很幸运。然后现在来说有一个正职的工作,然后也是做开源,但是可以有一个更稳定一点的收入。

我觉得现在的状况其实对我来说已经挺满足的,然后也有一个还算不错的粉丝群,我发东西,大家会给我很多反馈,我自己也觉得蛮开心,希望能够做更多的一些有意义的开源项目。我也希望能够做一个像 Vue 或者是 Vite 这样一个有这么大影响力,能够给社区带来特别大价值的东西。那我现在在做的东西基本还是一些小小的插件或者一些小贡献的感觉,希望有一天可以做一个做个大项目,搞个大事情。

Limboy: 我看你自己的 Project 还蛮多的,比如方便程序员使用的 PPT 工具: Slidev,它产生背景是怎样的?

Anthony: 我其实最开始做一些幻灯片的时候也用了那个 PPT 然后用了 Keynote, 反正那时候也就那样做。后来想要做这件事情,是因为我接了几个 talk 然后那些 talk 的话我讲的内容比较偏技术相关的,我可能会贴一些代码。然后我可能要做一个前后对比,说什么有了这个东西之前代码长这样,有了这个东西之后,代码长这样,是不是看起来干净很多之类的。类似这种事情,那我就发现说你要做这个事情,你在 PowerPoint 或者在 Keynote 里面都特别难做,你直接把代码贴进去,把它改成等宽置顶,虽然是可以用,但是如果你想要变得好看的话,基本上要给代码做高亮,才能让大家更好地去看懂你的代码。那这时候你有几种方式,比如说你把你的你截图下来贴上去,也可以或者是说你去丢一个高亮器。然后你再把这个高亮好的代码,它相当于是每个字给你调不同的颜色,你再把它贴到里面去,这样你还是可以做编辑。但编辑的时候你比如说你你想要改动一下,你要重新回去那个你这个高亮的服务,你要把代码贴过去就特别傻了对吧?然后如果你想要说我想要让大家只关注这么某一行代码,因为我可能要讲解就是说第一行代码干嘛,第二行代码干嘛?那这个时候你又不知道在 PPT 里面怎么做?那我当时是做了一个半透明的白色遮罩,我让那个白色白色那个方块放在代码上面,然后我就把它变成半透明。然后我让只让我想要表示的那行变成是没有遮罩的。然后可能做一些动画,可能中间过了按一下鼠标之后,它可能会那个方块的位置会变,然后你就可以让它显示不同的行,但是我就觉得这个特别原始。

然后你每换一张 PPT 之后,你的那个边距什么都很难控制。我就想说既然大家都是程序员了,然后为什么不能有一个对程序员更加友好的东西?然后我算是做前端的,对 web 技术也蛮了解的,然后就想那不然我们用 web 来做一个,就可以用我们比较喜欢的平常大家用的工具类,比如说用 markdown 来写 PPT ,然后代码高亮,就可以只用 markdown 里面那个 code block 然后我也可以去跑那个 prisma 去给代码上高亮。我甚至可以加一些组件进去。

比如说我可能今天要展示一个 Vue 的一个功能,然后我可能要想要做一个 demo 那在 PPT 你怎么办呢?你就只能你要么做一个网页,然后把它录下来,然后把它贴到上面,然后你那时候播,但是那个就不是特别的那个 interactive 然后有可能这个你录下来的视频,他可能他可能他的节奏跟你最后讲的那个节奏不一样,就变成他可能跑得比较快。然后你还没讲到那个部分,他已经跑出来。整体我觉得对我来说不是特别友好。然后那时候就有这么一个想法。后来是因为我自己觉得一个是准备 PPT 太痛苦了,不只是做这个样式上面的痛苦,那产出内容其实也很痛苦。然后想说那时候本来想要逃避,写了一段时间觉得好累,然后我不想写,就想去写代码。后来想但不然干脆把我之前这个想法把它做出来。

然后做了之后我就拿这个来写我的 PPT 然后写我的那个这个 talk 的那个,然后写一写我就觉得又不想写了,然后又就回去。我要加个功能,然后就是这样的一个反复横跳的状态。最后加了一些我自己需要的功能,也把这个 talk 给做出来。这个过程中,我又截了一些图,录一些视频说我现在在做这么个东西发到推特上,然后大家也蛮期待的。后来把它拿来当做那个 Sponsor Project 放了一段时间,说现在我做了这么一个东西,你想看的话你可以 Sponsor 我,我就给你开放代码给你看,你也可以用,算是一个激励大家来给你赞助的这么一个方式。那时候 80 个 Sponsor 了,我就说那么到 100 个的时候就把它开源。然后过了几天就 100 个,就把它开源了。这个工具就是这么来的。然后我后来准备 talk 的时候我都用这个了。

其实我中间很多东西我都变得可以复用了,我就直接把很多东西贴过来。我在写稿子的时候,因为我可能会拿一个 markdown 来写一些粗略的大纲什么的。然后我现在就直接把大纲改一改,就可以变成 PPT 了。我把大纲每一个 Section 列出来,把每一个章节都丰富一下,我的 PPT 就做完,这样我觉得蛮好。

其实有些人会问说,你为什么不要用那个?为什么不要用?你这个跟那别人有什么不一样?但其实我的想法是说其实我无所谓,我只是为了做一个我自己想要用的东西,这是一个没有想要跟别人竞争的意思。如果你喜欢的话,当然可以用这个。如果你不喜欢,那你用别人的也没关系,差不多是这样。

Limboy: 最后一个小问题,就是你对于提高编程能力的话。有没有什么经验吗?

Anthony: 我觉得是从做中学。其实我自己在做这么多项目的过程中,学到了很多东西。就像是我之前可能对就是 server render 也就是服务器端渲染完全不懂,我完全不知道他到底是在干嘛。我知道这个东西的原理,但是我完全不知道这个东西具体你要写代码怎么写。后来我那时候给 vite 做了一个 SSG 那个预渲染,然后去给我自己做那个博客做了一个引擎,然后也是中间学了一些。然后后来去 Nuxt,Nuxt 本身就是一个 SSR 的框架。然后也是这个过程中 push 我学了很多跟 SSR 相关的东西。我自己其实也没有特别去找书看还是怎么样。但你想要做出一个东西的时候,你不知道怎么办的时候,你就会想办法研究出来,包括去看别人怎么写的,这是我自己的学习方式。边做边学,然后你做的越多,就会学得越多。

Limboy: 好,今天也聊挺多的,非常感谢 Anthony Fu 能坐客本期节目,聊了很多编程、开源的方方面面。好,感谢各位的收听。这期的节目就到这里了,我们下次再见。

Anthony: 谢谢,下次再见。


Shownotes

Music

片头曲:Odd Taxi

节目收听方式

和不同的人聊天,会收获很多不同的东西,作为一个「老」程序员,我想跟不同领域的程序员们聊聊他们的故事、经历和感悟,或许也可以给正在收听的你一些启发。

欢迎在节目下方留言,如果你也有想聊的,可以邮件沟通:hi@limboy.me,一般会在两天内回复。