本期嘉宾 尤雨溪 Evan 是前端框架 Vue.js 的作者。Vue.js 是一个用于创建用户界面的开源 Web 应用框架,项目目前在 Github 上拥有 >184k 的星标数,是目前 Github 有史以来排名第四的项目,是在 Web 类别下排名第一的项目。

Evan 是江苏无锡人,在上海复旦附中毕业后,他来到美国柯盖德大学就读艺术与艺术历史,毕业后他进入帕森斯设计学院就读 MFA(艺术硕士)。两年后,Evan 毕业, 加入 Google Createive Lab。2014 年,Evan 创造了 Vue.js 的第一个版本,并且登上了 HackerNews 等知名网站的首页。之后,他加入了另外一家知名的 JavaScript 框架公司 - Meteor。到了 2016 年,Evan 开始全职工作在 Vue.js 上,而今天,Vue.js 已经是前端开发领域中的主流和标准之一

本期节目的主要内容包括:

  • 学习艺术史时的纠结,在帕森斯设计学院开始学习编程的经历
  • 进入 Google Creative Lab 的故事,创造 Vue.js 的初衷, 为什么说框架设计就是不断的取舍
  • 全职做开源项目的模式,从 2000 美元的资助,到成为全球流行的框架之一后,所面对的挑战

收听地址

- 收听节目 -

本期节目的时间线:

  • 0:04:17 典型的一天安排
  • 0:06:16 在复旦附中的生活
  • 0:07:54 在金融和艺术之间选择
  • 0:13:39 真正感兴趣的东西,学艺术曲线救国
  • 0:16:54 数字艺术
  • 0:20:11 在 Parsons 印象深刻的项目
  • 0:24:56 创造的冲动,找到“心流”,合适的工具
  • 0:29:09 毕业作品做的是什么
  • 0:32:14 进入 Parsons 的想法,纯艺术的出路太少
  • 0:34:02 崇拜的对象在学 Vue.js
  • 0:36:32 在浏览器上复现应用登上 HN 首页,加入 Google Creative Lab
  • 0:39:22 去 Facebook 面试失败
  • 0:40:15 做出让所有人容易上手的工具
  • 0:43:28 找工作与 Self promotion
  • 0:45:25 开始写 Vue.js 的背景
  • 0:53:07 第一版的开发难度
  • 0:56:13 框架设计都是一种取舍
  • 0:59:59 如何推进大型的开源项目
  • 1:04:13 社区的反对意见,不是所有时候都可以说服别人
  • 1:07:15 Meteor 的超前全栈理想
  • 1:10:00 一体化的风险:在自己的护城河里死去
  • 1:15:54 全职做 Vue 的考虑,来自 YC Startup 的 2000 美元资助
  • 1:19:57 团队的模式和规模
  • 1:26:51 社交媒体上的失真信号: 非理性的爱和非理性的恨
  • 1:32:38 对 Web 的未来畅想
  • 1:38:19 做开源的收入,拒绝投资与期望的美好人生
  • 1:41:50 快问快答
  • 1:45:17 听众问题: 给正在学习编程的同学的建议
  • 1:46:16 听众问题: 关于 Weex,WASM,大厂开源
  • 1:51:41 工作上生活上最暖心的事情

嘉宾提到的书籍/联系方式

  1. 推荐的书:《Working in Public: The Making and Maintenance of Open Source Software》
  2. 联系方式:知乎「Evan You」(https://www.zhihu.com/people/evanyou)

- 内容节选 -

从零道一:听说在大学时家人希望你去学习金融之类的专业,但你执意选择艺术史,当时的想法是怎么样的?我感觉读艺术的人都挺有个性的,你觉得自己是一个非常有个性的人吗?

Evan: 美国的本科的好处是升学的时候不需要定专业,一般是到大二再决定。刚去的时候,我就说不想决定我先学什么,先各种课上一上,这是所谓「博雅教育」的意愿,就是前两年做通识教育。像 Colgate 作为一个文理学院,有个所谓的核心课程:你在自然科学、社会科学还有艺术这些领域,每个领域至少要上两门课,硬性要求你每个领域都要去接触。虽然是这样,但当时我们一起申请去美国的小伙伴有一个社团 CUUS,Colgate 在金融界有一些传统,在业界也有不少校友。再加上我们这些美本留学生本身有就业压力,需要找一个有更高概率发 H1B 的行业。

当时的主流是学金融、数学、经济,然后大家去投行。我当时有很多小伙伴,最惨的去了雷曼兄弟。他实习完拿到了 offer,结果在毕业前雷曼兄弟就垮了,他就特别郁闷。

我上了一些经济的课以后,觉得对这个东西不是特别感兴趣,或者成为“华尔街之狼”并不是我这样的人适合的生活方式。我不是一个特别 driven 的人,对不感兴趣的事情特别没有动力。

我可能比正常人稍微有点个性,但也不算特别有个性。我大部分的人生选择还是处在循规蹈矩的范围里面。我其实是一个比较风险厌恶的人。但我人生中最大的几个决定,反而都是比较反主流的选择。

从零道一:当时虽然家人阻止你,但你还是可以自己做决定。有经历过挣扎吗?

Evan: 还是会有压力。因为我家庭不算是特别有钱,我去美国也拿了助学贷款,但是我的父母还是有很高的期望,希望我可以在美国留下来、找个工作。加上本身去美国读书,还是希望毕业之后能至少在美国的行业里积累一些经验。读完书就回去,肯定是很亏的。因为在美国希望学到的,不光是学校里的东西,更多的是进入一个行业里学习。

前两年,我在金融、数学、经济这些领域还是做了一些努力,但最终发现我没有办法强迫自己去喜欢这个东西。

当时最大的纠结,是跟随主流做一个大概率能拿到 H1B、但自己不喜欢的事情;还是选一个更符合自己的兴趣,但可能会带来就业上风险的一个选择。当时为了这个,还跟我爸争执了很久。

从零道一:现在大家可能已经普遍地意识到艺术和程序其实还挺共通的,它们都是一份有创造力的行为。你从学艺术到写程序,有没有什么 takeaway?

Evan: 我现在越来越觉得,创造的冲动是没有办法后天强行弄出来的。我们每个人先天应该都有创造的欲望。当然每个人创造欲望的强烈程度不一样,关键在于,你是否能找到一个趁手的、让自己满意的方式,把创造的欲望表达出来。

我其实一直是一个想去创造东西的人。从小到大,我一直在摸索哪一个表达手段是最适合我的。一开始以为是艺术,后来觉得会不会是设计–甚至有一段时间想做平面设计师,但是后来慢慢的发现,写程序给我带来的创造输出的感觉最强烈、最顺畅自然。我在用程序去创造东西的时候,可以很自然地进入 zone,不需要逼自己。我觉得我找到了这样的一个东西,再往这个方向去发展,是自然而然的事情。

如果我要强迫自己做个平面设计师–其实我也做过,但做平面设计的状态跟写程序的状态是不一样的。做平面设计的时候,我也自认有一定天赋,但跟 Google 的那些设计师同事相比,我们的状态完全不一样。

我在做的时候是很纠结的状态,虽然可能他们也会有纠结的时候,但这里面有一些本质的区别,我做设计的时候始终有点水流不畅的感觉。虽然最终有时候也可以做出一些还不错的东西,但是跟我写程序的时候状态完全不一样。 写程序的时候,就是我写着突然水管子开了,然后就会有 flow 的感觉。

有个叫中文叫「心流」。如果你在做一件东西的时候,可以进入到心流的状态,就找到了一个跟你的创造欲望契合的表达手段。如果你想要成为一个创造者,你需要找到这样的一个状态。

通过一些技术手段也可以进入这样的状态,但是需要投入大量时间去磨练。如果这个过程一直要依靠意志力来强迫自己,会越来越难。但如果你可以经常进入 flow 的状态,时间投入就不一定带来折磨,甚至反过来给你一种愉悦感,长时间地投入也更简单。

从零道一:加入 Google Creative Lab 是那时唯一的选择吗?

Evan: 一开始快毕业的时候,我比较倾向于去一个 Creative Agency,严格来说是属于广告行业,但是会偏向于用一些比较尖端的技术手段去做比较非传统商业广告的团队。有一个网站叫做 creativeapplications.net,你看过它上面的案例的话,大概就可以理解我当时感兴趣的业界是一些什么东西。整体上来讲处在在于纯艺术跟商业化广告中间的这样的一个范畴,结合了技术手段去作为他们的表达方式。

Creative lab 其实是他们的招聘人员直接来找的我,当时我都还没有开始想申请工作的事情,等于说正在我想要开始找工作的时候,Creative Lab 直接就找上门来了。

从零道一:你是否做了什么事情引起了这些大公司的注意?

Evan: 我当时做了一个叫 HTML5 Clear 的应用,Clear 是最早的在 iPhone 上面用手势进行 ToDo 处理的应用,它开启了用左滑右滑这些手势来进行交互的一种新的范式。我看到之后就觉得这个交互好酷,但我也不会写 iOS 应用,只会写 JavaScript。

正好那个时候 Google 在推一个叫 Chrome Experiments 的东西, 想要用来颠覆对于浏览器固有的成见。因为之前大家觉得浏览器就只是渲染文档的,大家印象里网页就是网页,就是一堆字,一堆盒子。Chrome experiments 有好多类似于直接在浏览器里做一个 3D 互动的 MV,把你整个网页上所有的东西全变成 物理特性的效果,可以掉下来互相碰撞的各种各样很酷的实验。

我看了这些之后觉得“其实 JavaScript 潜力很大啊”,决定认真学一学 JavaScript,所以就开始自学了。然后又看到 Clear 觉得很酷,想试试看能不能把它的交互在浏览器里面复现出来,就做了这么一个小 demo。做好后 demo 上了 HackerNews 的首页,很多人说没想到浏览器里也可以做出这样的交互来,也引起了一些大公司的注意。

当时 Facebook 还来问我有没有兴趣过去实习,我还特意飞去了 Facebook 总部去面试。结果去面试之后,发现我当时的 JavaScript 还是太菜了。当时我还是野路子的 JavaSript 思维,印象特别深刻的就是面试有一个白板,面试官叫我手写 JavaScript Prototype Inheritance ,我当时就懵了,搞了半天没搞出来,很理所当然那次面试就没过,也没有拿到 Facebook 实习。

不过我当时其实也没觉得是个损失。

当时除了 Facebook 还有一些其他面试的公司。后来 Creative Lab 这边有一个项目叫做 The Five,每年他们会招 5 个刚毕业的新人,组成一个理论上的团队,会有 1 个文案(Copywriter),1 个创意总监(Creative Director),1 个平面设计师,然后 1 个策略(Strategist),是一个万金油,然后再加 1 个创意技术专家(Creative Technologist),那一届创意技术就是我。这个小团队一起做一个创业项目,如果涉及技术方面就由创意技术专家来负责实现。

当时他们问我有没有兴趣来做这一届的 The Five,对于我来说,这可以说是一个 dream job,完全是百分之百符合我想要找的工作:做的领域是我感兴趣的,做的事情是我擅长的、感兴趣的,Google 也是大公司,可以给我 H1B。

对于职场新人来说,大公司有大公司的好处。所以当时我觉得这实在是运气太好了,感觉最完美的一个 dream job 直接自己跑过来了。

其实现在回想起来的话,可能我当时在找工作这方面,self promotion(自我宣传)还是有些成功,做了个小 demo,并且我当时很多代码都放 Github。现在慢慢的很多程序员也开始意识到,“个人品牌建立”对于找工作是很有帮助的一件事情。

其实当时我也没有很刻意的去往这方面去想,只是觉得作为一个创意技术专家,有一个作品集展示自己是很正常的,艺术家也要有作品集。因为我是从设计转过来的,所以我很自然的会想要去给自己创建一个作品集来展示自己,这比简历更有说服力/大家看你做过什么是最直截了当的,尤其是在创意行业。

从零道一:第一个版本的 Vue.js 的开发难度如何?当中涉及的语法,分词器,模板之类都是怎么完成的,当时是属于一个边学边做的状态吗?

Evan: 其实最早的版本是属于有些偷懒, 因为完全就是个个人的 hobby project。 HTML Parser 我是直接拿了一个现成轻量的枯的 fork 了一下,然后在它上面来做 Vue.js 特有的语法处理,因为 Vue.js 的语法是跟 HTML 是兼容的,它是基于 HTML 的词法上面再多一些扩展。

编译原理这块东西其实我也真的是边做边学的,可以说我在写第一版的 Vue 的时候,对于编译原理可以说是个小白,于 tokenizer(分词器),AST (抽象语法树)这些等等,我当时完全就是说 – “我也不不懂,我就看看能不能捣鼓出来一个东西吧“。

你如果去看 Vue2 编译器的实现,其实是非常简陋的一个东西。我们在 Vue3 里面现在稍微正经一点了,我们有自己的 Parser,然后有 Transform,有 AST, Code Generation 等等,就更像一个正经的编译器。当然从更严谨的角度来说,跟工业级别语言的编译器还是不是一个性质,因为我们的编译器是可以跑在浏览器里面的,要追求轻量,所以一些设计上的取舍。

从零道一:我想创建框架是一个重新思考某个事物如何表现,维护,还有持续发展的过程,凭空建立一套体系一定有很多非常难受的部分, 你当时是一个什么样的状态?这段期间你还去了一家当时非常火的 JavaScript 团队,叫做 Meteor,同时面对两个框架会不会很挣扎?

Evan: 可以说是慢慢的发觉,框架设计这种东西到最后都是一些取舍。 比如说最早的设计出来之后,大家老拿 Vue 和 React 去比较。其实我们在设计的时候也会意识到:有一些 React 具有的能力,确实 是 Vue1 没有的,比如灵活的用 JavaScript 表达视图结构,这就是 Virtual DOM 的一个定义。那 Vue 的话只能用模板来表达,而 React 由于它是一个数据结构,所以可以被自由的生成,而不需要一定要用一个模板字符串。

整个框架设计到今天,为什么说会 React 有 React 的市场,Vue 有 Vue 的市场,同理还有一些新兴的框架比如 Svelte。它们在数据层、组合逻辑,或者渲染层面上是选择模板还是 Virtual DOM,还是说从中取一个平衡,每一个框架都做了不同的取舍,这些不同的取舍就决定了他们所适合的用例,以及最终它们吸引的人群。

慢慢地,我领悟到了一个东西,就是说在工业上,设计一个面向大量用户的项目时,你没有办法让所有人都满意,更多的还是明确说你的 happy path,还有用户的 happy path 在哪里,然后针对 happy path 去做优化,可以说是 find your niche,然后 play your strength 这样的一种感觉。 但这也是一个相对的,这里面的平衡还是一个很有挑战性的东西,你也不希望你 niche 到最后根本就没人用对吧?

所以你还是要保持相对的灵活性,去尽可能的去兼容更多人的口味,但是你又不希望说你兼容到说为了兼容所有人的口味,最后弄出了一个所有人都不那么喜欢的一个东西。这个度在哪里?就只能通过长时间地,去思考一个一个具体的问题,去琢磨,最后你自然而然的找到你的边界。这是一个很难说你从一开始设计一个框架的时候就能明确的一个东西。

编程语言其实也是一样。你看我们还在不停地发明新的编程语言,你看当年 Ruby 跟 Python 争啊争,现在又是 Rust 跟 Go 争啊争,你永远没有办法用一个语言去满足所有人的口味,因为大家都在用这些语言做不同的事情。

从零道一:你想做 Linux 那样的仁慈独裁者模式吗?

Evan: 事实上我们现在就是这样的模式,但是我觉得 BDFL(终身仁慈独裁者)模式并不是完全的随心所欲,而在于,有一个人面对争议性的决策有最终拍板的权利,但是他也需要对社区负责任。

作为一个 100 多万人的大社区,社区内部意见不一致的时候需要有一个人可以决定如何平衡取舍。如果没有一个决策人,就会陷入无尽的扯皮当中,同时社区也无法进一步发展,有些项目采用所谓的技术指导委员会(Technical Steering Committee)机制 - 一个 6~7 个人的技术委员会投票决定。但是这种模式下的治理成本会很多:要看项目中是否有对项目技术足够了解的人,也要定义委员会成员的选举模式和任期等问题,同时会涉及委员会成员之间意见不合的处理等潜在问题。

一旦变成委员会模式后,效率必然会降低。比如说 JavaScript 这个语言所有的决定都是 TC39 来决定的, 有些新特性可能花几年都没定稿。

而像 Python 的作者 Guido 也是 BDFL,在推进项目的时候也需要面对来自社区的压力。因为 BDFL 在推进自己的想法时,面对社区表现出强烈的反对意见,如果仍然一意孤行的话,就会慢慢失去社区对你的信任。所以要表现出对社区声音的关注和负责的态度,否则如果社区认为你没有将社区利益作为根本考量的话,就会出现分裂。

从零道一:是否随着项目越做越大,责任越来越重,也会感觉丧失了一些创造的乐趣?

Evan: 会有,这个是很现实的问题,现在 Vue 更多是责任。以前写新项目只需要考虑自己,一个下午就可以写出一个很酷的点子。但现在如果要写新功能,我得先写个内部稿让团队内部先评价一下,然后再发布一个 RFC(Request for Comments, 请求意见稿)。但是有些有争议的 RFC 会受到社区里用户的强烈意见,也会在一些细节上纠结很久,就会非常耗费精力。

虽然这些意见很大程度上是有价值的,但这些讨论很多时候也会陷入一些细枝末节的僵持中。而且大家在进行技术讨论的时候,你还是会想去说服别人,希望得到大家的肯定,但是并不是所有的时候你都可以真正的说服别人,你也知道在互联网上说服别人是多么难的一个事情。

特别是一些比较有突破性的 RFC,往往也会激发比较有争议的讨论。有的时候你甚至会怀疑,就是说“这个东西,哇,居然有人有这么多意见,我这个东西到底靠不靠谱”?比如说 Vue3 在推出新的 Composition API 的时候,经历了漫长的讨论。但现在我还是觉得这个决定是正确的,顶住压力也还是要做。当有些人不喜欢你的 RFC 的时候,就需要 BDFL 这样一个能够拍板的人来决定如何取舍,想清楚所有的问题。在 RFC 通过之后,实现反而成为了相对简单的事情。

写文档也很花时间,往往一个新功能写文档的时间跟写代码的时间差不多。现在的 Vue 如果要添加一个新功能,中间要耗费的精力和时间比起刚开始做个人项目已经不可同日而语,这也是为什么现在我把它作为我的全职工作。如果我还是像当年一样,认为一个下午就可以出一个新功能,已经不太现实了。

从零道一:全职出来做 Vue.js 是自然而然的决定吗?有没有经济上的考虑?

Evan: 当然要考虑赚钱了哈哈。当时我已经看到有人通过捐助在做开源,所以我当时就开了一个 Patreon,在这个平台上大家可以捐钱给创作者,等于定期众筹。

当时我国内有一个朋友,是从 YC 出来、后来搬回国的创业公司的 CTO。他们公司还是很有情怀的,说我们有一个开源的基金,每个月给一个开源项目资助一笔钱。所以他们每个月给我两千还是三千美元,资助了我半年左右。

这笔钱给了我一点点定心丸,说我们可以试试。在离职之前,我已经把 Patreon 开起来了,到离职的时候,差不多一个月有四千美元左右。当时也还没生娃,快生了,加上有点存款,觉得不管怎么样,这点钱过日子还是够的。

当时对我来说,全职做 Vue 并不是永远没有办法再回去的状态。因为 Vue 已经有足够的知名度,即使我全职做了一段时间,发现收入没有办法维持下去,大不了就回大公司。我有信心一定可以再重新找一份大公司的工作,所以养家糊口不是个问题。

做这个选择最核心考虑的是,我全职做 Vue 带来的最大收益,是可以真正把所有的时间都用来做想做的事情–对我来说这是一个巨大的收益。

因为当时我在 Meteor 的状态已经很煎熬了,我觉得我已经不再相信它,再去天天做这个东西,就觉得很没有意义。我强迫自己去做自己不想做的事情的能力很差。

所以我当时觉得,全职做 Vue 可以根本上改变这种状态:从一个每天做不想做的事情,变成做真正想做的事情。即使比当时在 Meteor 赚得少一点,还是可以做到能够基本维持下去。 如果最终连生活的钱都赚不到的话,最坏的情况就回大公司打工就是了。

… (更多内容请参见播客)


- 往期精选 -

- 《从零道一》粉丝群 -

欢迎关注从零道一(id: goto0011),并加入听友群,入群步骤:

  1. 添加从零道一小助手微信(id: goto_helper),并备注“粉丝群”
  2. 给小助手发送 姓名+公司/学校