【大佬经验录】天猪——Egg.js核心开发者

大家好,我们会在今后的文章中,给大家分享一些前端大佬的成长经验,希望能帮助处于迷茫中的同学找到自己的方向。

今天的分享选自知乎上《从事前端开发的你,如今过的怎么样了?》的一篇回答。

原文的作者是天猪,想必做 Node.js 开发的小伙伴都知道他,他是 Egg.jscnpm 的核心开发者。作为一位奔四的前端开发者,他的成长经历是怎么样的,对我们有哪些建议呢?大家一块来看看吧。

前言

上个月看到我的偶像张云龙的回复后,勾起了不少思绪,于是也写了一点,不过恰逢工作交接阶段,就犯懒了,直到今天才翻出来写完。

初见时的惊艳

我和前端的第一次亲密接触比较早,大概是高二的时候(99 年),我所在的三线城市有了网吧,给我带来的冲击力很大。

记得那时候资讯很缺乏,只能从学校图书馆借几本电脑报年度合集,一遍又一遍的看。上机的时间也很少,一方面是自己的零花钱很难支撑 12 块/小时的费用,另一方面电脑当时在家长眼里还是玩物丧志的代表。

不过当时高中最要好的朋友家里有电脑,会时不时跟我分享一些知识,也是通过他,当时接触了一个现在看来很简陋的个人主页的搭建平台(Q点网),虽然它很快的死去了,但也让我认识了 HTML,被那『所见即所得』所惊艳。

慢慢学会了一些电脑的维护技巧,也玩了一会冰河伪装黑客(为了破解网管系统蹭时间),ICQ 和 OICQ 也开始注册了(我曾手拥 N 个 6 位数的 QQ 号)。接着有缘认识了一个师妹,家里开网吧的,就偶尔逃课跑去那边帮他们维护电脑,从而也可以免费上网。这时开始接触了 FrontPage 以及网页三剑客(Dreamweaver、Fireworks、Flash),在 三国系列、小柴人系列 等的影响下,也学着做一些 MV 来哄女孩子注意。


大学阶段

虽然身处北邮,但并不是科班生,而是本科首届数学系(当时没前人能告诉我数学的重要性),还好北邮有计算机的通识培训,于是整个人都偏科在这上面了。

这时候的信息输入渠道也只有书,经常去图书馆借一本又一本厚厚的书来啃,什么 XSLT、XHTML、ASP 乱七八糟的书都借来啃,除了 PHP (看第一章的时候发现字符串拼接用的是 “.” 然后果断放弃)。

直到大三的时候,才和宿舍的人合买了一台电脑按时间分配使用,然后和几个同学开始参与学校的计算机社团,以及接外面的一些活。

记得我的第一桶金是 dotnet 刚出来的时候,刚好那个暑假因为非典回不去就自学了下。那时候经常会混迹在 CSDN,通过看别人的讨论,以及回答别人的疑问。有一天有个人在问如何用它处理图片,我回复了下思路,然后他突然找我说要付费让我帮他搞完。最后发现是中关村的一个程序员,当时还过去他们办公室交货,赚了 500 大洋。(对,那时候得用 U 盘)


第一段经历:通讯行业

懵懵懂懂的毕业了,什么都不会,各高校招聘会都拿不到什么 Offer。就一个在上地那边的什么 Adobe 的公司收了我,要坐很久的地铁才能到。第一天培训后,我就感觉有点不对了,更像是外包的技术售后答疑。然后第三天就跑路。

因为是南方人,所以就回广州找工作,去南方人才市场蹭了几次人才招聘会,一样的懵懂,偶然间进了一家通信行业的乙方企业,做自动拨测的,也许是看中我北邮的背景吧(虽然啥都没学到),好像当时月薪才 2000,还在晚上下班的时候有幸旁观见识了广州的飞车党抢包。

于是开始了 Java 之旅,混迹于 JavaEye,同时对前端还一如既往的关注,其实那时候还没有『前端』这个岗位,连『重构工程师』都没,还是叫『前台』。日常工作也是前后端都做,有一段时间管控台还用 Flex 来做。

在社区认识了大漠穷秋等人,一起搞起了 ExtJS,国内的 3 和 4 的中文文档还是我们当时一起翻译的。

那时候的学习方式就是,整天混在论坛,看到别人问的问题,就去回答,如果是不懂的,就自己写 demo 或翻源码的方式去驱动学习。记得曾霸面了当时的腾讯广研,跟面试官说不喜欢 PHP,以及 ext-core 秒杀 jQuery,然后就没然后了(逃~)

就是 CSS 一直没找到感觉, 大漠老师也没教会我用 CSS 画机器猫就退圈了。


初识 Node.js

2011 年,正在沉浸于用 ExtJSFlash 为电信 ERP 系统打工的我,时不时会写一些小工具来帮自己偷懒,但一直没找到合适的工具,苟且于 GroovySwing。有一天无意间刷 OSChina 资讯时看到 Node.js 的新闻,当时的第一反应是:『又一个 jQuery 轮子?切~~』,幸运的是基于『多少看一下反正不要钱,闲着也是闲着』的想法,点击了进去,于是发现了一个新的世界,真香~

记得当时微信公众平台刚出来,我的第一个练手项目就是 node-webot,也是第一次参与开源,然后跟朴灵老师有个浅浅的交集。


结束第一份工作

在第一家小公司足足待了 8 年,做过很多事,成为了一个救火队长,让自己的知识面横向扩充了很多,有在移动花果山冰冷的机房扛过服务器、打过网线,也写过从后端到前端的所有代码,甚至也看过《人人都是产品经理》,短暂做过一年需求分析师。

印象最深的还是中午和一群小伙伴一起玩三国杀。还有当时团队里面有一个老大魔方很厉害,好像参加过世界的盲拧大赛,在他的影响下,我学会了魔方,在讨论技术问题的时候,会下意识地肌肉记忆转魔方。

这段经历给我带来的一个变化就是上下游串联能力很快,我也不知道具体怎么描述这种能力,只是之后在 UC 的时候,会发现每次讨论需求的时候,我总是能很快的从产品需求思考出前后端每个环节的关键串联点,那时在身边没发现有类似能力的人。

当然,后来去蚂蚁之后发现这类的人比比皆是,很多 P6+ 都具备这样的能力,记得当年有个讨论很多的那个问题『是在小公司当救火队员,还是在大公司当螺丝钉?』

我的体会是:小厂的救火队员难道就不是螺丝钉了?做着螺丝钉的命,操着老板的心,被人忽悠了还在帮数钱。在那时候的大厂,即使你是边缘螺丝钉,那也能有一个好的背书,以及有优秀的人去让你跟着背影成长。

穷则思变,且加上身边能跟我在一个频道讨论技术的人几乎没有,感到寂寞了。一个偶然的机会,出去面了几家。先拿到华为的 offer,好像当时定岗 15 还是啥的,但要去深圳,就没接。

最后 UC 面的是 Java 岗位,笔试题感觉做的一般。但跟当时的面试官即部门经理聊的还行,他就让我补做一份 JavaScript 的题,感觉还是做的一般,当时的我,连变量提升都不知道(羞),然而还是拿到的 offer,只能说运气使然,天降贵人。当时的月薪是 1.2w。

每年校招的时候,看到现在优秀的年轻人,可以直接在一个很高的起点开始,除了羡慕还是羡慕,我足足花了 8 年的时间,才能和他们在一个平台喝咖啡。


第二份经历:UC

2013 年,入职了 UC。此时的业界,已经有了前端岗位,归属于设计部门,也叫重构工程师。前端开始进入富应用时代,但还非常的刀耕火种。

入职后才发现,UC 九游当时只有一个前端是写端内的 JS 的,然后设计部门 UED 那边有几个同学负责切图和写 CSS。很快我就负责起了九游的前端团队,UED 那边的重构工程师也都划给我了。这个阶段团队的主要技术投资在 Hybird APP 和 管控台 上。

2014 年,在 UC 遇到了 云龙,虽然不在一个部门,但还是有幸能和他一起探索 UC 的前端工程化,基于 FIS 之上实现了 Scrat,那是一段很快乐的时光。FIS 的实现本身虽然比较粗糙,是基于正则表达式而不是 AST 的,但它的工程化思维却非常的前沿。

曾和 云龙 结对编程过,他当时还不会写单测,每次构建工具升级是写个脚本把所有应用拉下来构建后 diff,还是我手把手教会的,哈哈。当时他背后有个 3D 打印机,还给我女儿打了个雪宝,我们经常在 IM 上聊技术到半夜。

现在很多人聊起 Node.js,第一印象可能是:『一个自不量力的想抢 Java 饭碗的语言』,但其实 命令行工具 才是 Node.js 最初落地及最大的应用场景,它给前端领域带来了巨大的变革:Grunt 的出现让前端有了自己的构建工具,Babel 的出现让我们停滞已久的标准化重焕生机,Webpack 的出现让前端工程化有了基石,前端基建进入新石器时代。

而我,在这个阶段,遇到第一个贵人,吃到了前端工程化这波红利,快速的成长了起来。


全栈工程师

2014 年的时候,在 拉勾 上挖人,反被钓鱼,面了阿里,一二面非常顺利,到 HR 面的时候,我第一次见识了什么叫 阿里 HR,果不其然的被压力面试法怼,失败了。后面还被捞了推荐给 玉伯,第一次跟偶像通话,不过当时的我显然不够格去蚂蚁体验技术部。然而没过两个月,随着 UC 被阿里收购,我戏剧性的被动的完成了毕业时的目标之一,曲线救国成了一名阿里人,时值阿里游戏的前端负责人。

同年 6 月 21 日的 JSConf CN 大会上,赫门分享了《淘宝前后端分离实践》,吹响了国内前端“前后端分层”的号角,BFF 的基石也正是 Node.js 这一武器。

挺佩服 朴灵、苏千、死马 他们,为了国内 Node.js 生态的发展(OS: 为了更好的招人),筹办了好几届 JSConf CN,可惜后面交给商业化公司运营后变味了。那个时代 JSConf 可是国内顶流的前端大会,现在很多前端大拿都是那时候面基互相认识的,那时候的分享也没那么多戾气,更多的是会去学习和思考分享者基于什么背景下做了怎么样的思考从而产出了什么。

2015 年,阿里游戏的业务发展也开始需要引入 BFF,在做技术调研的时候,我刚学了两天的 Express,然后突然想起找了苏千请教蚂蚁的 BFF 经验,恰逢他那边正准备拉起一个泛阿里层面的共建,于是受邀过去杭州一起共建。

那时候的背景是:有一定的共建基础,为了在阿里落地 Node.js,苏千等前辈写了很多 SDK 来接入后端中间件服务。然后逐渐发展到需要把 N 个插件结合团队的基建封装为开箱即用的框架,那时蚂蚁有了 Chair 框架,淘宝有 Midway,ICBU 也有自己的框架。

于是苏千就号召大家一起共建一套框架吧,很快成立了民间的 Node.js 虚拟工作组,聚集了来自蚂蚁、淘宝、ICBC、UC 等等 BU 的接口人进行共建,我有幸作为 UC 的代表来到了杭州,核心成员一起闭关了一周,产出了 EggJS,寓意是希望帮助各团队架构师孕育出适合团队业务场景的上层框架,找到各 BU 之间的最大交集,并提供灵活的扩展定制机制。随着它的完善,阿里 Node.js 生态有了三驾马车( EggJS 框架、TNPM 包管理、AliNode 性能分析)的护航。

那时的 UC 的电脑配置才刚刚开始支持 Mac,我是游戏那边第一个领取了 Mac mini 的。然后我就把它和键盘直接打包,飞去杭州,在过安检的时候还被小姐姐追问这是啥。过去杭州后,直接借了一台显示器,然后就开始了一周的不明觉厉的旁观大佬们讨论。

很快,各 BU 负责人回去之后就开始基于 Egg 封装适合自己团队的上层框架,仅仅半年时间,Egg 就已经成为了阿里的基础核心框架。现在回过头看,只能说是天时地利人和,很难再复刻。(后面有机会可以展开讲讲这一段历史)

半年后,苏千准备在 JSConf 正式开源 Egg,我就莫名其妙的被推出为讲师,还记得 9.2 那个晚上在酒店,我们还在猛改 PPT,我那时是真的搞不懂里面的很多细节,心慌的很。我的分享是首日的第二个 Topic,人生第一次对外分享就是一千多人的会场,分享的内容还是一个我不算熟悉的东西,又是在超帅的尤雨溪 的 Vue 分享之后,简直慌了一逼。

再往后,我慢慢的在 Egg 项目中发挥作用,很怀念当年的那段时间,大家是如此激情的参与开源,经常在半夜一两点的时候在 GitHub Issue 上讨论问题。我对开源精神的追求,文档的写作能力都是在那段时间慢慢的被培养了出来,值得暗自骄傲的是 Egg 的文档在国内的口碑还不错。记得当时有一个统计,我是阿里所有开源项目中在社区 Comment 回复数最多的,仅次于 bot。

在移动互联网的浪巅下,前端肆意地探索着自己的边界,从 PC 到 H5,从 WebView 到 APP,从 Browser 到 Server,这是属于前端的大航海时代,一时间人人都是全栈工程师。这是一个全栈爆发的时代,这是一个活力四射的时代。我们冲锋陷阵有了不少突破,但我们也留下了很多历史债。

在这个阶段,我同样抓住了第二波前端红利,在 苏千、贯高 等同学的帮助下,继续快速的成长,在 UC 那几年,我基本是一年晋升一级。

这个阶段,我开始高频度的在知乎做技术科普,运营了一个专栏 《Node.js 从小工坊走向企业级开发》,也发现自己擅长把一个技术知识点比较通俗易懂的表达出来。

很大的一个内在驱动力在于,我经历过很长一段时间的小公司生涯,深知其中疾苦,我希望能给后来的同学们带来一点什么,尽我能做的事。同时我也发现,用自己的语言来组织和表达一个技术点,才是真正吃透了它。

关于 Egg 被黑是 KPI 项目这个,我一直不认同,如上所述,我们根本不是一个实体团队,不可能有对应的 KPI。我们的绩效收益更多是因为建设了 Egg 并投入到我们的实际业务中,对前端的研发效能产生了价值,而不是什么开源影响力之类的。

自此,Egg 成为了我的牵绊,是徽章,也是枷锁。无比怀念当年的小伙伴们。


第三段经历:蚂蚁

2017 年,因为阿里游戏 APP 和 营销平台 带来的价值,以及在集团内部跨 BU 的技术支持和影响力,成功晋升 P8(被国内唯二的 2 个前端 P10 虐过),前端组逐渐壮大到 30 多人,我也直接汇报给了总经理室。

2018 年,玉伯出差广州,一起喝了个下午茶,聊了聊语雀和蚂蚁的一些事,很受宠若惊,那个 Egg、语雀、Basement、云凤蝶诞生的地方,我真的能参与其中?我是否能胜任?当时很担心异地团队的稳定性,考虑了很久,后来经过这几个月陆续的跟蚂蚁几位 Egg 同学的沟通,最终决定还是想把自己的技术深挖一下,毕竟做 Node.js 的人,不去国内 Node.js 最前沿的地方看一看,会后悔的,于是年底的时候,我正式报到,成立了蚂蚁体验技术部的广州分部,就我们 2 个人。

那一年真的很辛苦,虽然团队当时很提倡异步协作,分布在杭州、广州、北京、成都等多个城市,我们也非常习惯基于 Issue 的异步协作。但毕竟刚进入一个新的组织,有些事没有背靠背的沟通会很累,于是一年间直接飞成了银卡,平均一个月在杭州待 2 周,也无数次遇到起飞必延误的魔咒。

本来我的定位是二号位的,结果 贯高 先一步转独立 IC,只好接过担子,开始了 Chair 三代目的生涯,并完成了广州团队的组建,有一帮非常棒的同学一起做一些长期主义的事。

在蚂蚁期间,主导了云通未来战役的子项目 Serverless For Frontend,我们让 Chair 进入了一个新的阶段,成为了前后端都认可的标准应用类型,我们和基础设施团队打通并建立了紧密的协作机制,得到了后端基础团队的认同,并有多次大战役的合作,我们坐到了那个桌子上了。我们自信的说在国内我们绝对是第一梯队之一,甚至有一定的代差感。

但可惜我们是在错误的时间做正确的事,虽然过程中有很多不错的能力产出,有效的提升了用户体验,可惜 SFF 在蚂蚁特色的 Serverless 基建上陪跑了三年,到我离开之前才看到一丝曙光。

在这个阶段,内部和外部的环境其实也发生了巨大的变化,我们不再追求人人都是全栈工程师,前端领域目前已经足够广大,术业有专攻,我们的目标是把部分前端培养成全栈,成为前端新基建的护航者,让一线前端可以无感的没有额外负担的享受到这些能力,从而给业务带来创新。

蚂蚁体验技术部真的很棒,有非常多优秀的年轻人,实名羡慕他们有个很高的起点,他们的很多想法让我自叹不如。


拥抱变化

在蚂蚁期间,最大的感受就是拥抱变化,几乎每半年就调整一次组织结构和规范,换过 4,5 个老板,方向和精力也多次调整。在这几年里,整个人的精神压力也非常的巨大,很明显的一个表现就是 Egg 社区我几乎没有精力,也不敢投入太多精力,当然还有一部分原因是当年一起奋斗的核心开发者们也都纷纷找到了自己的事业重心,只剩下我这个留守孤儿,曾有一段时间不敢打开 GitHub,感觉愧对那帮兄弟。

2022 年,随着大环境的变化,我们也很突然的拥抱了最大的变化,一开始很错愕,但很快也释怀了,只是可惜还差几个月达成十年成就。在这三年间,虽然很累,但也是我的第三次成长,极大的开拓了我的眼界和思考深度。由于这段经历刚刚发生,所以暂时不能分享太多,就这样吧。

不知不觉我已经奔四了,精力也有点跟不上了,还好好奇心和激情还有一些,我的未来还是会继续探索 Node.js 对前端效能的护航,但我一直不觉得我是 Node.js 的布道师,我只是一个参与者和记录者,就如同我常说的:

我坚信 Node.js 对前端领域的价值,是当下不可或缺的基础设施,或许未来前端的变革使得一切工程问题从根本上得到解决,但不管怎样,我只是希望当下能认真记录自己以及同行者们在这个领域的所见所想,与正在经历前端工业化演进并被此过程困扰的同学交流心得,让大家有所参考从而迈出自己的路。


当下的我

有一个为家庭付出很多的媳妇,一个乖巧可爱省心的女儿,一只又怂又懒又胖的喵。

有车有房无贷,身体虽然开始发福但还好没啥大毛病,工作也跟自己的兴趣方向有重合。

平时的爱好就是写写开源,看看网文,在知乎偶尔做点技术科普寻求精神粮食,不怎么玩游戏。

财运一般般,就像知乎一个问题说的,给自己买个 AirPods 都要犹豫半天,只实现了超市自由。


给后浪们的建议

回顾这一路的过程,我能走到今天,有个人的奋斗,也有时代的红利和贵人的提携。

譬如我在参与前端工程化和 Egg 之前,其实对这两块都是完全一无所知的,虽然说一大部分原因是因为大佬们很 Nice 照顾我,但另一方面还是在于我当时的积极参与,愿意投入激情去长期的参与。

保持好奇心,不要闭门造车,要和同行们多交流。多总结,多思考,多分享,只有把知识用你自己的语言表达出来,才是真正学会了,而且还会引起思想的碰撞,二次成长。

不要对大佬们太过敬畏,搞开源的人往往是很 Open 的,有困惑可以找他们多交流,当然前提是需要先有自己的独立思考和尝试。而且他们往往会有一些小的 Idea 想搞但没有精力,像我就有很多开源的小玩意但没精力搞。找他们聊一聊说不定就既能帮他实现落地,又能从这个过程中向他学习到很多东西。

最后,给后浪们的一点建议是:每个时代都有每个时代的红利,需要时刻做好准备,它就会在不经意间追上你。你们的起点和资源远高于我们当年,这其实也属于你们的时代红利之一,请不要浪费。至少你看我蹉跎了很多年的时间,才有机会和你们这些年轻人坐在同一个平台喝咖啡。