04 开源三大收获:异步协同、文档优先与快乐工作
希望玉伯能聊聊开源,因为他和团队折腾过 KISSY、SeaJS、Ant Design、AntV 等开源项目,KISSY、SeaJS 已经成为过去式,Ant Design、AntV 还在进程中。但说起对于开源的理解,对他触动最大的开源项目其实是 Yahoo 的 YUI3,玉伯也是在参与 YUI3 的过程中,体会开源带给他的快乐和反思。
极客时间:你最早参与开源是什么时候,是以什么方式?你对开源最开始的理解是什么样的?
玉伯:这就早了,我谈谈在阿里的时候吧。2008 年入职淘宝时就比较关注开源,当时前端有个标杆公司叫雅虎,雅虎是前端工程师的摇篮,有一批牛人。当年雅虎有一个产品叫 YUI,是前端最早的著名开源项目之一。
淘宝最早用的组件库就是 YUI,当时我们基于 YUI2 在内部封装了一个版本叫 TBra,T 代表淘宝,淘宝前端的内部开源起步于 TBra 项目,代码写得很不错,我经常去看源码设计。
最开始我对开源的理解,就是把源代码放出来,然后大家能够一起去看源代码长什么样子,是怎么实现的,还可以参与贡献,这是我对开源最初的理解。
极客时间:在参与开源社区的过程中,从最开始开放自己的源代码,往后发展,越来越深入地去参与项目甚至主导项目,然后反馈社区,它是一个更进阶的过程。深入参与到社区里,你的状态是怎样的?
玉伯:更进一步参与开源,是雅虎的 YUI3 项目,这是对我触动最大的开源项目。对我的触动点在于,当时 YUI3 的代码还没写多少,但是整个项目组就已经通过整个社区运作,共同探讨 YUI3 应该如何设计,比如应该分哪些组件,组件 API 应该怎样设计等等。设计先行,文档先行,而不是先写代码,这种开源协作,对我影响非常大。
当时有一波国外前端大牛也在里面,我就看他们用英语在探讨,我当时的英语阅读和写作能力都突飞猛进。基本上天天都会去看,一有时间就会看,同时会用英语参与回复讨论。
从参与文档讨论,后来逐步开始尝试去提交一些代码,YUI3 里面有些早期代码是我写的。这个过程很好玩,有点像打擂台。就是你提交了一个版本,对方一看这是什么啊,觉得你写得不好,然后别人会提交一版实现,把你的代码给覆盖掉了。这个时候,人的斗志就来啦,内心不服,就会想到更好的方案去实现,然后来个回马枪,把别人提交的代码再修改成自己的方案。
我现在印象很深刻的一个组件,是 AutoComplete 组件,实现起来挺复杂的,当时对里面的性能优化点、渲染性能做了很多研究。我一直对性能优化感兴趣,跟这段经历也很有关系。这是我参与开源的第二个阶段,从看源代码,到参与讨论,再到开始打擂台的一样贡献代码,年轻气盛少年狂。这个过程,现在回想起来都挺开心的。
那时候我天天盼着下班,我白天疯狂地在项目室闭关,就想尽快把业务代码的活干完,然后回到家里,快速吃个饭,就又开始疯狂地参与开源。印象中我每天晚上都干到凌晨两三点,很开心,很兴奋,好像不觉得累,睡眠质量也挺好的。
对我而言,开源就是开心的源泉,现在回想起来都很开心。
极客时间:你这种状态,当时坚持多久?
玉伯:好久的。但后来发现熬夜对身体有影响,有时上午会没什么精神,而且因为凌晨几点了还在疯狂写代码,到了早上再继续写代码会有点疲。于是上午一般会选择去开会讨论或写文档,写文档时,脑海里已经在构思代码怎么写,怎么实现。吃完午饭精神就会好很多,中午打个盹后,下午会开始疯狂写业务代码。在我离开淘宝 UED 前,基本都是这种状态。
极客时间:有没有一种可能是这样?那几年时间其实你写代码写太多了,已经在写代码这件事情上找不到更多的乐趣了,所以你更多地会去关注产品、业务管理?有这种可能性吗?
玉伯:肯定有这种可能性,但代码本身依旧很有乐趣,但 YUI3 项目的缓慢进展,让当时的自己的确有些受挫。当年 YUI3 项目搞着搞着,我觉得项目有点看不到希望了,后来越发展越不太好,内心很受挫。YUI3 项目的发展不顺利,的确让我开始思考写代码是为了什么,为什么 YUI3 的代码明明这么优秀,但社区却好像越来越不喜欢 YUI3。这块的思考,让我将精力开始转向产品思考。YUI3 是一个技术产品,作为技术产品,真正决定产品成败的,并不是代码。
写淘宝业务的前端代码时,更有体感,最终我发现淘宝的核心价值大都来自产品和运营,代码一定程度上只是实现工具。从代码实现,开始转向代码背后的技术产品设计,这是我参与开源的第三个阶段。
小结起来,我参与开源有三个阶段。第一个阶段是看代码为主,第二个阶段开始参与文档讨论和核心代码实现,第三个阶段则是从产品视角去看开源项目。决定一个开源产品成败的,往往是这个产品本身的设计理念和思路是否符合潮流,如果方向不对,代码就很容易白写。
代码是实现产品的工具,就像语言是沟通的工具一样。我们说话,本质上是沟通,语言只是沟通的一个工具。曾经有一段时间我很纠结自己有老家的口音,后来我一点都不纠结了,为什么?我发现其实在沟通这块,大家还是能够听懂稍微带点湖南口音的语言。我不会现阶段还纠结说我的语言要字正腔圆,反正大家能听懂。这是一种心态的变化。不是否定工具,而是于我而言,更看重用工具所做的事情本身。
极客时间:从你参与 YUI3 项目对你影响这么大,加上你和团队一起折腾的 KISSY、SeaJS、Ant Design、AntV 等开源项目,你觉得参与开源对你产生了哪些影响?或者说收获,可以聊聊吗?
玉伯:我第一个深度参与的开源项目是 YUI3,最大的收获有三点。一点是深度感受到了写代码是很快乐的。同时,还有一个更大的收获是,意识到代码是工具。第二点我很少对外说。
很多时候人一定要知道自己拥有的所谓能力也好技能也好,究竟是有什么用?看开之后,人会坦然。比如我不会再纠结某个代码风格更好,我会更关注用技术能实现的产品价值点在哪。
开源收获的第三点,是真正感受到了开源社区异步协同的美好体验,超级喜欢。做语雀跟这段经历也很有关系。有时会开玩笑说,给我们发旺旺、钉钉消息,我们回复会很慢,大家都不怎么想去看 IM 消息,但是给我们提一个 issue,我们立刻就会响应。异步协作文化,让我以及整个体验技术部都深受影响。
除此之外还有一个收获就是理解文档的重要性,之前跟 YUI 项目那帮人聊的时候就是靠文档。文档跟微信聊天不一样,因为很多时候是跨时区的,每一次沟通都很珍贵,我们得把自己想说的话尽可能一次表达清楚。因此写文档的能力很关键,清晰表达才能做到几个回合之间达成一致,否则就是漫无目的地闲聊。还有比如你要去做某个功能,甚至你写了一堆代码要提交,你都得先写一堆注释,去告诉他我为什么要改你的代码,我改完之后究竟好在什么地方。在这些层面上是需要通过一些文档的方式来讲清楚的。文档先行的理念对我影响很大,我们做很多事情都养成了文档先行的习惯,这和亚马逊说的“六页纸”管理方法有异曲同工之妙。
极客时间:在你自己后续的开源项目中,你怎么把前面学到的东西运用在项目上?
玉伯:我尝试过,当时做 Ant Design 之前还有一个开源项目叫做 Arale(阿拉蕾),充分践行 YUI3 的那套理念,就是文档先行,我们对外说我们开源了,打开一看,一行代码都没开始写,充分践行文档先行。当时很多人在讨论,认可文档先行的占大多数。Ant Design 开源社区这块,好多人从早期就参与了,他们全程见证了整个过程。
国内开源项目,一直有个我觉得不太好的做法,就是一定要等到代码写得差不多了才开源。很多时候怕自己代码写得太烂,一定要整到一定阶段,写到心目中最好了,才把代码放出来开源,但往往这时候别人都没有参与的机会了,对别人来说只能用。我一直觉得这种做法并不太好。
我之前跟某开源负责人讨论过这个问题,我说他们开源目的不纯,他说我是古典开源主义。他们的说法我也认的。就像做产品有古典产品主义者,这批产品经理,一开始不会怎么考虑用户增长,而是关注我想不想做,我具体想做什么,然后根据自己的想法和设计把这个产品给做出来,给用户用,这叫做古典产品主义。开源也存在这种情况。古典开源主义是一种比较纯粹的状态,开源最早的理念就是分享想法,并不是分享代码。像 W3C(World Wide Web Consortium,万维网联盟) 最开始的标准诞生,就是我有一个想法,我希望能够召集一拨人来讨论,来实现。这是我接触的开源最原始的状态,也是我最喜欢的开源阶段。
极客时间:最原始的开源你会去考古它的这些背景和发展,现在有没有什么好的资料可以来去看?
玉伯:我接触过的最早是 Linux 开源社区。Linus Torvalds 本人挺有趣,他是开源的奇迹,对项目管控得非常好。社区里有很多观点,到目前为止都是很前沿的,比如什么是好的开源项目?我们很多时候会觉得要有影响力,觉得好的开源项目是目前还活跃的、还不断有人迭代的项目。但当时我看到过一个至今记忆深刻的观点:“死了的项目才是好的开源项目”。这句话是什么意思呢?就是说已经不再迭代的开源项目,说明它做完了,没有任何 Bug 了。Unix 里面很多底层小工具,做到删无可删了,做无可做了,Bug 也没了,不需要更新迭代了。这种东西才是最好的开源果实。
这个概念延伸到产品领域,我曾经看张小龙讲微信的设计,其中讲到摇一摇这个产品,就跟 Linux 社区的理念是一脉相承的。微信摇一摇为什么可以做到不可超越,是因为已经把这个功能做到了极简化,删无可删,你只要加功能,你就输了。我觉得开源好多理念和产品也是很相像的,可以互相借鉴。
小结时刻
玉伯是开源圈里的古典开源主义,他说今天国内开源一直有一个不太好的形态——代码写得差不多了才开源。很多开源项目一定要代码写到最好了才开源,但对社区的参与者来说,别人没有参与的份了,这是不太好的。他怀念Ant Design开源的时候,有部分社区的人是全程见证它的成长的。
《大教堂与集市》中讲“只要有足够多的 beta 测试者,几乎所有的问题都会很快呈现,自然会有人把它解决”,这种笃定和相信,今天是否还能大面积看到?“集市”精神就是社区精神,人的价值感、人与人的连接就在大大小小的社区里,开源社区就是一个庞大的意义共同体,而每个开源项目小组也是意义共同体,能够找到意义共同体的人无疑是幸福的。
最后,也请你一起交流对开源的理解,以及你从参与开源过程中获得的养分吧。我们下一讲见!