“因为你,我愿意成为一个更好的人,不想成为你的包袱,因此发奋努力,只是为了想要证明我足以与你相配。” —— 《侧耳倾听》
大家好,我是张舒迪,花名圣司(取自吉卜力的动画《侧耳倾听》),2014年校招应届进入阿里巴巴担任前端开发,目前在飞猪技术部负责「用户前端和数字化经营平台团队」。
一路走来虽然时常会反思自己成长道路的关键节点,以及判断和选择,但很少会落到纸上,一方面因为自认尚算年轻,阅历不多;另一方面人生没有大起大落、跌宕起伏的经历,缺乏故事感,不过是平凡人过着平凡的生活。这次很荣幸收到邀稿,借这个机会,梳理一下进入互联网行业、成为一名前端开发道路上的那些转折点,于我个人而言是个内观的机会;如果能给在看本文的你引起一些共鸣、带来一些输入,那更是甚好。
少年时代:心之所向,一苇以航
“我相信自己,生来如同璀璨的夏日之花,不凋不败,妖冶如火,承受心跳的负荷和呼吸的累赘,乐此不疲。” —— 《生如夏花》 泰戈尔
贵州省安顺市,虹山湖环湖路(图片来源 旅行迹)
“你是怎么接触前端的?” 我面试时时常会这样问候选人。
我在西南一个小城市长大,父母都是坐办公室的公务员,所以我得以较早地接触电脑。90年代还在读小学的时候,父亲单位有台四通打字机,除了最基本的文本输入外,还提供了不少搜索、替换这样的功能,书本上带着墨香的文字以数字化的方式呈现,增删改查无需斑驳的修正带,仿佛有了生命一般,于是开始伸着两个食指学着敲起了键盘。出于兴趣,下课会带上一本「我们爱科学」杂志早早去 “接父亲下班”,噼里啪啦把里面有意思的文章和连载的科幻小说敲成电子版,学着做简单的文字排版,再打印出来带到学校分给小伙伴,乐此不疲。
初中阶段学校开设了微机课,电脑教室为了防尘,需要脱鞋光脚进去,这也是绝大部分同学为数不多可以接触到计算机的机会。经典的 win98,每人会配发一张 3.5 寸的软盘用以备份资料,课上老师除了教一些办公软件的基本操作,大部分时候让学生自由探索。那段时期也是我最早的编程启蒙,在老师的指导下接触了 Basic 和 Pascal,会做一些简单的编程题目,也对类似 “数组第一位下标为什么是 0 而不是 1”、“x = x+3
这样的等式为什么能成立” 这样的问题感到好奇。
2001 年家里买了第一台电脑,用于文字处理及娱乐,装了「猫」可以上网,每次联网滴滴当当的声音现在还记忆犹新。假期玩了很多游戏,开始思考像《仙剑奇侠传》这样的游戏是怎么做出来的?在一个交流群里第一次接触到「RPG Maker」—— 一款入门级的游戏制作软件,除了可视化的贴图、角色、地图、事件、触发器等编辑能力外,还支持基于 Ruby 的脚本开发,能实现从简单的角色对白字幕、自定义货币,到复杂的 ARPG 甚至第一人称射击游戏开发。从此课余爱好变成了逛各种 RM 开发论坛,尝试着画地图、捏人物、做剧情,依葫芦画瓢写 Ruby 代码,做自己的游戏,并打包发布到论坛上分享交流;当时国内最大的 RM 社区是幻想森林和 66RPG,我在幻森当版主,认识了一波热爱游戏开发的小伙伴,其中不少人现在还在行业中摸爬滚打,有的已成中流砥柱。刚刚随手搜了一下,幻想森林虽然还在,最新帖子却基本停留在 2016年;66RPG 则早已更名「橙光」,专注于原创 IP 的 AVG 游戏制作与发行,一阵唏嘘感慨。
RPG Maker XP RGSS (Ruby Game Script System)(图片来源 RM官网)
这段「游戏开发」经历断断续续持续了 2 年多,创造一个虚拟世界带来的兴奋感逐渐转变为对计算机世界的热爱,并开始驱使我立志报考相关专业,憧憬未来能够进入这个行业一窥究竟,并能有所作为。现在回头看少年时代的这段经历,兴趣是最好的老师,在国内应试教育的大背景下,学校、家庭能够给到我学业之外自由探索的环境与空间,这么早就找到自己的兴趣点与未来方向,我感到无比幸运。
我的大学:二八年华,如丧青春
“我年轻时候喜欢说如来,就是如同要来,还没来,但终归会来。如丧,就是如同要丧,还未丧,但终归会丧。” —— 《如丧》 高晓松
故事不会总按预设的剧本往下演,不然人生该多无趣啊。07 年高考,浙大计算机系落榜,被调剂到北邮的工业设计专业,工科院校、通信背景、设计专业,感觉老天爷给我开了个玩笑,如鲠在喉;两个月暑假过得无比煎熬,每天都在去留间反复纠结,最后思量再三接受了调剂。三个原因:1)北邮也有计算机系,大一结束绩点 Top 4% 的学生有一次转系的机会,努努力可以曲线救国;2)学校有浓厚的互联网氛围,师兄师姐给了不少鼓励;3)从没去过一线城市,对北京的向往。9月入学,由于要筹划转系,大一一年又过起了白天泡画室、晚上泡自习室的苦行僧生活,然而天不遂人愿,年末综合绩点专业第 4,又一次与计算机学院擦肩而过。
北邮工业设计专业画室(2008)
我从小学开始一直是 A 等生,接连而来的高考失利/转系失败,打击不可谓不大,加之生活上也出现一些问题,整个人跌入谷底,负能量满满;那时候年轻比较文艺,会在博客上写矫情的文字与诗歌,一个人跑到景山望着故宫出神,翘课、也不参加班级活动。这样浑浑噩噩的状态持续了几个月,拯救我的是书本和音乐,是路遥的《平凡的世界》、克里希那穆提的《重新认识你自己》、张国荣的《我》、杨千嬅的《再见二丁目》……生而为人,本无所谓功过成败、高低贵贱,正是每段旅程与经历、每次跃起与沉沦、每分收获与成长塑造了一个个独一无二的个体,凑近看都那么平凡却又那么不凡;尝试品味自己的人生旅程,自我欣赏并自我和解,会发现当下所经历的就是生活本身;推己及人,曾经感觉拥挤不堪的校园、做事毛糙的同学、能力平庸的老师都开始显得立体而高大起来。
“I am what I am,我永远都爱这样的我。快乐是,快乐的方式不止一种,最荣幸是,谁都是造物者的光荣。不用闪躲,为我喜欢的生活而活,不用粉墨,就站在光明的角落。我就是我,是颜色不一样的烟火,天空海阔,要做最坚强的泡沫;我喜欢我,让蔷薇开出一种结果,孤独的沙漠里,一样盛放的赤裸裸。” —— 《我》 张国荣
生命的韧性就在于,无论被打趴多少次,只要你全情投入,自驱的力量总能一次次再把你拉起来。调整状态,抱着与其怨天尤人,不如活在当下的想法,开始尝试把生活重新拉回正轨,继续追寻梦想:
- 确定跨专业考研的长期目标,开始自学&旁听计算机系课程,同时开始刷 OJ(那时候北邮的 OJ 做得是真不错);
- 包揽了本专业几乎所有团队课设大作业的编程相关工作,做 Flash ActionScript & Flex 开发,折腾 J2SE、LAMP,帮忙维护基于 .net 的院系官网,总之只要编程相关工作我都干;
- 进入校学生会科技部,开始混社团,一路做到副部长,主要承担各类大型活动开闭幕视频的制作工作,涉及一些 AE 粒子特效脚本的开发,这应该也是第一次与 JavaScript 结缘,除此之外 PS、PR、AU、CorelDraw 这些软件也玩得贼溜;
- 由于本身专业的缘故,接触了 3DMax 和 AutoCAD,凭借手艺课余接了几个外包项目。
部分被保留下来的大一素描作业(2009)
大三下半年又开始一边在专业教室赶大作业,一边泡自习室、逛王道论坛备考的日子;期间靠专业排名拿到本专业保研名额,没做太多思考便放弃了,算是一个小插曲吧。年底怀着惴惴不安的心情再次走进考场,初试、复试、面试,次年初结果公布,如愿进入北航计算机学院,师从院长,算是又一次人生转轨,了了一桩心愿。
北航硕士新生报道,怀念那时的一头秀发(2011)
顺境享受掌声,逆境享受人生,这段持续四年的曲折经历给我带来莫大的力量与精神财富,教会我诸多道理,也很大程度奠定了我日后的事业观与人生观:
- 追寻热爱:支撑自己向前的应该是源自内心的热爱,对当下的热爱,对生活的热爱,也是对爱与美的追求,这种热爱很少是与生俱来的,更多时候需要自我暗示;一如写这篇文章,刚动笔也枯燥不堪,尝试说服自己沉进去,文字从笔下缓缓流淌的感觉却也让人感到平静;
- 日拱一卒:人会高估短期的成果,却低估长期的成就,每天哪怕花 10 分钟看 5 页书,一年就是 6~7本;每天解一个 leetcode 题目,一年你能超过 95% 的人。其实走得慢不要紧,关键要走得久,时间长了自然能走很远;
- 接纳失败:“那些没能将我击倒的,都使我更加强大”,挫折来得早一点,跌得狠一点不一定是坏事,与自己和解,从情绪中跳脱出来,逆境更能激发人的思考,也更能锻炼人的韧性;
- 留条后路:人生不是非黑即白,避免情绪化决策,给自己留条后路;我参加考研没影响保研,不喜欢设计专业也拿到了 Top 2% 的校级优秀毕设,临毕业参加校招面了一些互联网公司的产品岗位,多几个选择总不是坏事;类比到现在流行的裸辞,是不是也可以更平滑一些?先换行业再换岗位?先做副业再做主业?
转型前端:意料之外,情理之中
“生活中多数东西,最好与普通之间的差距不超过两倍,好比说纽约的出租车司机,最棒的司机与普通司机之间的差距大概是 30%;最棒的 CD 机与普通 CD 机的差距有多大?20%?这种差距很少超过两倍。但是在软件行业,还有硬件行业,这种差距有可能超过 15 倍,甚至 100 倍,这种现象很罕见,能进入这个行业,我感到很幸运。” —— 《遗失的访谈》 史蒂夫·乔布斯
北航六系 “软国重”,笔者硕士阶段所在实验室(2011)
如果说上阶段是兴趣驱使进入 CS 世界,那接下来闯入前端领域则纯属误打误撞了。
我硕士主要研究方向是基于浮动车(Floating Vehicle)的智能交通系统(ITS,Intelligent Transportation System),简单说就是通过各类车辆实时定位数据、城市路网数据、地感线圈/摄像头等传感器数据,动态计算路况、识别事故、预测拥堵、控制信号灯等,领域属于智慧城市,技术上偏 GIS 和海量时空大数据处理。
专业方向与前端也有一定关联性,主要是基于 Web 地图的数据展示,例如和北京市交通委合作的公交到站预测项目,除了预测算法本身,还基于 Tomcat + PHP + Angular + BMap
搭了 PC 的数据展示平台,这也是第一次接触到 MVVM 框架,第一次认识到原来前端还能这么玩。这个项目的研究成果支持了北京市第一套公交到站实时预测系统,通过多个 App 向社会发布到站预测信息,算是个民生工程。
那时候不知道国内互联网公司里前端是个独立方向,直到研二在一家国企实习,由于成员离职被临时调剂到前端岗顶包,承担了一小部分 Web 应用和绝大部分前端开发工作,主要是基于 VMWare VCloud 和 VSphere 搭建虚拟机 Web 可视化终端,类似 WebVNC。当时公司的技术栈是 RoR + JQuery + Bootstrap
,三个月时间搭建了完整的虚机管控、可视化及配套功能模组,开始被 Web 开发这种所见即所得的爽快感吸引。
最后促使我决策进入前端领域的,是两个机缘巧合:
- 毕业季拿到了阿里 Java 研发的 offer,入职前部门组织了一次圆桌,新人可以跟后端、前端、客户端、测试等岗位 TL 作直接的沟通,并在入职后转到任意方向。跟拔赤(也是我现在的主管)聊了一下前端技术的现状与未来发展,聊到 PWA,他演示了一个 Wap 页面怎么通过添加到桌面的方式变成一个 Web App,B/S 无需安装、互联互通的体验让人印象深刻,聊到类比 PC 时代 B/S 逐步替代 C/S 的案例也十分生动,跟其他几个 TL 更偏业务分享、工作内容、培训方案的交流相比,一个领域未来的可能性无疑更让人神往。
- 那段时间有幸读了 Paul Graham 的《黑客与画家》,对我触动很大的反倒是书名,本科设计、硕士计算机,中二地感觉自己像极了左手画笔、右手键盘的「黑客与画家」,而前端恰好是视觉交互设计与计算机的交叉学科,更能发挥我的优势。最后,这次圆桌与这本书将我引入了前端的世界,职场生涯就这样从挂着研发工程师 title 写前端代码开始了。
入职阿里,转型前端(2014)
现在再回头看,这段经历也让我受益良多,以为踏错的那些「弯路」,都在某个时间点串成一线,共同组成了人生,沿途足迹清晰可见,没有白走一步:
- 活在当下:四年的工业设计学习生涯,教会我的不只是怎么切图,更是对好产品的审美,作为前端开发有这样一段经历弥足珍贵;小到每个项目、大到每个人生阶段,我们很难预见当下的经历对未来的影响,因此认真对待每件身边事,尊重每段人生经历独特的价值,历久必会弥新;
- 不给自己设限:学理科考上大学,也能坐在画室折腾素描/水粉/石膏/三大构成;本科四年一身机械+设计的本领,硕士也能跟一帮 CS 大拿聊聊设计模式与系统架构;折腾两年半大数据&算法,进到公司也可以靠前端手艺吃饭;所以别给自己设限,能力不只是经历决定的,也有意识与胆量;
- “模仿” 身边最优秀的人:接触一个全新的领域,学习一门全新的技能,最快也是最好的方式,便是模仿身边这个领域最优秀的人;没做过工程化/可视化/低代码化?看看集团对应领域的同学在做什么/想什么;没牵过虚拟项目?看看身边做得最好的虚拟组组长是怎么做的,多久组织一次会议,怎么制定项目组目标,怎么驱动项目组同学;
- 坚持阅读:书本能够提供的不只是经验与知识,有时候是灵光一闪、虎躯一震,有时候则是更平和而充实的内心,与自己的和解;尝试带着意义感去品味,音乐、电影、诗歌、话剧、动漫、游戏…亦复如是。
我在飞猪做前端:因势利导,顺势而为
“譬之若寒暑之序,时至而事生之。圣人不能为时,而能以事适时。事适於时者,其功大。” —— 《吕氏春秋》 “得时无怠,时不再来,天予不取,反为之灾。” —— 《国语·越语》
双十一前端会场玩法项目组(2014)
14年进入阿里之后的开局其实并不好。
大环境上正逢 “All in 无线” 的高潮,前端从 Mobile first 到 Mobile only,资源开始大幅从 PC 往 H5 倾斜;进入公司毕竟是个新兵蛋子,按当时「新人做老业务,老人做新业务」的分配方式,我负责了国内机票 PC 业务,1)14 年还需要写 YUI 代码、调 IE6 兼容性、走前后端统一部署,非常边缘;2)由于阿里本硕校招生无差别定级策略,跟我同一天入职同样是 P5 的小兄弟小我整整 3 岁,起跑线堪忧;3)刚转岗残缺的前端知识体系完全写不出工整而高效的代码,基本盘被吊打;如此种种,瞬间让我感受到身处一线互联网公司的巨大压力。
出于危机感和自救本能,开始找出路,接了一个多月需求后,我发现其实业务研发本身工作量并不大,但因为代码历史包袱太重(6年数万行老代码,first commit by 癫总),架构腐化严重,改动往往牵一发动全身,效率奇低。当时想法很简单,重构提升研发效率,节约出来的时间去做 H5 业务,还是得紧跟无线大潮,别与时代脱钩。
与主管 @舒克 聊了想法,之后三个月时间断断续续一边老代码正常承接业务,一边抽晚上和周末的时间做重构,一份需求做两遍。年末顺利上线,藉由这个项目我成了比 PD 还了解这块业务的开发,顺便输出了一次前端架构分享和 BU 40% 的 PC 组件,研发提效/架构升级/物料输出,大大超出主管原本只需要维稳的期望。藉由这个项目,15年初顺利晋升,也如愿开始接触无线领域,感恩。
我把这段经历称为「对现状不满,就尝试把自己 “做没”」。如果负责了一个边缘业务,可以尝试从这些方面去思考:
- 调整心态:认可合理性,少抱怨(脏活累活也是活,总得有人干);
- 发挥优势:更低的预期意味着更容易超出预期(“他做边缘业务都能有这么多产出”);
- 寻找痛点:主导并落地解决方案(实在没痛点,尝试一下智能化方向把自己 “做没”?或者挤时间参与一下工程化基建?);
- 纳投名状:需要证明自己的能力,也需要韬光养晦等待机会;
- 专业为先:前端是相对垂直的技术体系,业务价值不高不代表技术价值不高,不要放弃思考与改变。
航旅北京前端团队 outing 合影(2015)
随着 PC 业务工作量逐步减轻,15年我的主要精力逐渐转移到无线 H5 上来,负责了一些体量偏小的新业务,比如签证、用车,练手性质偏多。坦白说那个时期的 H5 开发是比较枯燥的,一方面业务复杂度不高,逻辑尽可能往服务端下沉,端侧少了很多抽象封装、继承拓展、设计模式的需要,带来的代码爽感大大降低;另一方面屏幕变小了,精细化要求也变高了,视觉交互上的细节问题被极速放大;加之真机调试相较 Chrome devtools 的原始感,往往一个 px 偏移或动画卡顿的调整就能耗进去几个小时。
到了一个新的环境,最先要做的还是破局,从大环境上看,那段时期业界都在攻坚性能体验的课题,围绕 Hybrid 架构各类技术方案如雨后春笋。而旅行行业的特殊性在于,用户有大量在旅行途中使用 App 的场景,国内景区要么人满为患,通信基站负荷过重导致网络降级;要么各类自然风景区、高速路/铁路沿线直接没有信号覆盖,没办法查询电子票根,更不能享受各类行中服务;同时动画滥用、Webkit BUG 也导致 CPU 彪高、耗电量增加,在类似神农架这种缺少充电手段的场景非常致命。因此相比其他行业,性能体验对于旅行业务的影响面更大也更深远。
明确性能作为突破方向后,开始找突破口。当时架构组性能优化手段集中在容器架构层面,如iDNS/SPDY 改造解决网络传输问题、离线化体系解决资源加载问题、脚手架模板优化解决 JS 阻塞渲染问题,鲜有目光聚焦在前端业务优化层面。这一方面导致跑分与体感指标存在差异,另一方面业务上基础库未预加载、combo 失效、图片未压缩、错误的构建配置等问题都可能将底层优化积累的优势损失殆尽;加之性能数据上报链路和配套度量体系不够完善,指标对业务开发同学日常工作的指导意义不足。
抓住问题之后,我从手上小业务开始逐步落地全链路的性能体验优化方案:
- 重新定义性能质量标准,从最初的页面秒开率,转为 三端(飞猪、手淘、支付宝)、四网(2G、3G、4G、wifi)、五维度的度量模型,在白屏、DOM Ready、Onload 等通用评估标准之外定义了「页面可见时间」与「可交互时间」等体感指标;
- 重构数据采集上报链路,维护基础库 Base 及 tracker 模组,制定业务埋点规范并推进埋点上报率、准确性治理;
- 和 @舒克 搭档搭建数据分析平台「鱼眼」,打通 ODPS、Node 工程、数据清洗及可视化链路,提供页面性能、接口性能、JS/接口异常、在离线分析、红黑榜等度量分析报表;
- 工程化链路升级,从 dns-prefetch 到 mtop-prefetch,从 SSR、静态资源缓存,到数据、DOM 结构、占位符多级缓存,一毫秒一毫秒、一 kb 一 kb 打磨业务实现细节,优化加载性能;
- 构建泛性能体验相关最佳实践,包括帧率、CPU、内存、电量等指标优化,及全链路 Tap 化、转场动画优化、长列表滚动优化等体验优化。
“‘自己’这个东西往往是看不见的,你要撞上一些别的什么东西,反弹回来,才会了解‘自己’。所以,跟很强的东西、可怕的东西、水准很高的东西相碰撞,然后才知道‘自己’是什么,这才是自我。因此,交不同类型的朋友,看不同类的书,去不同的地方,在碰撞中不断反思自己!” —— 山本耀司
藉由一些业务优化上拿到的结果,15年中进入架构组开始承担「性能体验虚拟小组」组长的工作,着力提升整个飞猪 H5 业务的性能体验,包括已有经验向团队的输出以及 Hybrid 基建改造。经过几个月的持续迭代,当年双十一拿到超过 93% 的页面秒开率,体感指标优于手淘,各项体验/能耗指标也大幅提升。
随后 Native 化渲染方案兴起,开始推进 ReactNative 体系建设,持续了大半年时间,期间打通整个工程研发、运行时、配套工具与组件库链路,并上线了 3 个业务。但总的来说这段实践经历不算成功:1)技术基建重视程度足够,但缺少对业务价值的衡量,业务方感知弱;2)脸皮薄,推动力不足,问题修复拖了一个又一个版本;3)稳定性问题,RN 最初面向独立 App 场景的定位与成熟客户端水土不服,投入产出比低。彼时集团 Weex 开始崭露头角,相较 RN 更适合阿里的业务土壤,基建随即开始往 Weex 方向倾斜。
之后经历了团队调整,我被调到营销组顶替已离职 TL 开始带团队,再之后不到 2 个月时间又迎来了入职以来最大的「变化」,在此先卖个关子。回头看架构组这段经历,也同样教给我很多:
- 技术与业务的围城:做业务就像在浅水区游泳,你知道有个底在那里,起雾下雨了、倦了累了、抽筋儿了,双腿往下一伸就能站起来,支持好业务至少不会有太差的结果,当然如果没有 130% 的自我加压,也很难有超出期望的结果;而做技术尤其是基础技术,更像是在深水区甚至大江大海中扑腾,没有兜底、没有退路,哪怕狂风大作、巨浪滔天,一旦出发必须游到岸边才能停下休息,而很多时候你并不知道岸有多远,很容易迷失。业务线同学羡慕基础线同学有广阔的天地可以遨游,殊不知很多时候是幸存者偏差,看见的都是靠岸的人,那些还在前行的、迷失的、甚至葬身海底的人,你却不会知道他的名字;
- 印象即事实:职场是个小社会,在别人眼中的印象需要有意识去管理,好的印象会让周围人对你有更高期待,从而驱使你继续前行;而差的印象则可能带来旁人的不信任,乃至破罐破摔的心态;回望在阿里这些年的发展,第一印象法则帮到了我,机票重构项目的顺利上线带给我的不只是 “我也能做好前端” 自信心,也有主管和协作方的信任与更大的成长机会;
- 收起羽毛与玻璃心:写得了一手好代码不一定当得了一个好 PM。15年我负责飞猪域名切换及全站 HTTPS 化改造工作,项目涉及 10+ BU 过百参与者,在推进过程中,从最开始纠结中午 1点半发旺旺是不是可能吵着别人睡觉,到半夜 1点联系 PE 解决域名配置问题;从凡是求人就是 “你好师兄打扰了” 的书生气,到顶着 P5 Title 跨 BG Push P9 大佬出解决方案;从被动执行到主动推动,被逼着磨厚了脸皮。工作这些年,看过不少新人(玻璃心)或老人(自尊心,爱惜羽毛)这一关过不去,遇事不敢问、不敢说,惧怕后果,技术同学折在非技术问题上实在可惜;胸怀是委屈撑大的,收起羽毛与玻璃心,跳出墨菲定律的怪圈,其实结果远没有想象中的那么坏;
- 魔鬼都在细节中:性能体验、研发效率与稳定性是前端三驾马车,围绕这些大方向很多技术规划都是类似的,但落到执行结果上千差万别;类比为什么每个公司都在公布自己的战略方向,却鲜有人能执行到位或抄得到位?因为顶层设计之下,对每个细节一点一滴的执行与积累存在差异,而这些差异聚合在一起决定了成败,互联网行业尤其如此。
北京→杭州:纵身一跃,逐风而行
“你是否和我一样,一路走来我好匆忙,模糊了来时的方向,清晰了北京的茫茫。你是否也和我一样,找到了梦开始的地方,日复一日谈着理想,年复一年的那条小巷。他们说远方是大海,那里会有海风吹来,看着海鸥自由自在,不要让我的梦醒来。” —— 《海风》 郝云
从北京到杭州、从技术架构到业务支撑、从一线开发到团队 TL,2016 年是充满变化的一年。
飞猪的前身叫做航旅事业部,最初是从淘宝北京研发中心旅行相关业务分拆出来的,因此当时绝大部分研发团队都在北京。当年为响应集团京杭双中心战略,需要成立杭州研发中心,一线同学可以自行选择是否转 base 到杭州,同时基本明确了未来资源向杭州倾斜的策略。我当时面临的情况是,生活上在北京待了近 10 年,在这里娶了妻、安了家、积累了不少人脉,也早已熟悉了这里的气候与氛围;工作上刚刚从一线开发成为 TL,接手营销团队并做完了财年规划,准备放开手脚大干一场。事业与生活对抗的焦虑感在团队内蔓延。与家里人思量再三,考虑未来发展,决定响应号召转 base 到杭州,自此开始了 4 年多的双城生活。
离京前欢送会,北京前端团队合影(2016)
7月份到杭州之后,先做了一段流媒体、直播业务,这期间有个小插曲,直播底层能力由淘系支持,由于优先级问题需求一直排不上,这种跨 BU 项目推进的痛苦相信很多人都经历过。我当时手上就这一件事,退无可退,索性把工位搬到对方团队坐了两周,软磨硬泡,直至参与对方的项目去写代码作资源置换。最终项目如期上线,而我也借这个机会学习了一下淘系的工程化基础设施和研发流程,收获颇丰。拿结果有时需要非常手段或另辟蹊径,找不到方法的时候问问自己是不是被逼得还不够狠。
16年底组织架构再次调整,开始接手 8 个人的杭州度假前端团队,以及 30+ KISSY 存量项目。
当时在中台化大背景下,大量基建收口共建;飞猪是阿里一个业务 BU,而我们是飞猪的一个业务团队,在集团中台(研发框架、搭建平台等设施)与飞猪架构组(工程化、基础组件等基建)之上,向下探索是重复建设,单纯支持好业务开发又缺少沉淀(相信现在不少团队也有类似问题);加之接连的组织架构和方向调整,士气不高,第一要务是明确团队定位和方向,一起赢一场大仗。
我的选择是坚决往上走,到业务最前线去找机会,底层基建不争不抢。由于历史原因,飞猪当时是行业化的组队方式,分交通、酒店、度假等业务线分别有独立的运营、产品、技术等职能团队;对于前端研发来说,这也意味着每个行业诸如频道、搜索、详情、下单等页面都需要独立开发一套,带来诸多问题:
- 前端行业化组队收益有限:行业化本质是在解决供应链差异性问题(如机票,基于 GDS 的运价体系结合全球库存分销体系,构成了非常深的行业壁垒),垂直化组队模式有助于底层业务模型抽象,但行业间 C 端表达层面区别并不大(价格/库存等行业业务语义差异极大的字段到端上都是数字),端同学垂直分工带来的收益十分有限;
- 难以在行业间形成合力:行业数据模型不统一、定制化功能不收口导致端侧重复建设,研发效率较低,同时面向多行业串联打通的场景无法高效支撑;
- 难以保障端侧体验一致性:行业化过程中由于视觉交互规范不互通,相似场景产生多套方案,端侧体验难以保障一致性(如机票搜索筛选面板固底而汽车票固顶,同样是 OD 类商品产生了两种交互形式);
- 不利于人的成长:行业化组队方式前端同学同时负责一条业务线的全链路业务,而类似频道的纯展示页面与类似订单填写页的表单页面本身依赖的技术方案差异性大,难以抽象复用,也因此很难有更体系化的产出。
抓住上面这些问题,紧靠业务上横向打通的大方向,技术策略定为「打破三个壁垒」:
- 打破前端与设计师的壁垒:拉通 PD 和 UED,构建蜂鸟设计中台体系,提供跨行业一致的视觉交互规范,以及五端一致的配套组件库(H5、Weex、Rax、Android、iOS);形成「行业提报-信息收口-规范升级-沟通决策-落地实施」的标准化链路,保障规范稳定持续;
- 打破端与云的壁垒:拉通后端,构建 BFF 层(Node/Java),面向各个业务领域抽象视图层模型,对下屏蔽业务差异,对上提供一致的数据结构;
- 打破端与端的壁垒:拉通各个业务前端团队,面向各领域 BFF 构建领域驱动的前端业务框架,并以业务组件形式封装行业实现,支持面向各类场景的功能组合与插拔。
在此基础上,结合集团中台化方向,逐步沉淀出度假业务导购域(泰坦+奥恩)、搜索域(猪搜+TUS)、详情域(travelDetail+TUD)以及交易域(tripbuy+奥创)解决方案。
18年整个飞猪的平台化战役打响,我负责了其中导购与端侧两部分的平台化工作,本质上是度假已有实践经验结合各行业特点向整个飞猪的输出。双十一前顺利完成改造切流,平稳度过流量洪峰。这次改造对于业务团队来说,价值体现在几个方面:
- 解决研发效率瓶颈问题,支持跨行业物料互通,统一商品/交易,也为后续支持全域氛围控制、结构化表达、全域投放、资源位互通等打下基础;
- 为业务团队一线开发同学打开思路,在基础架构与上层业务之间明确了业务架构层,各域可以更聚焦作领域解决方案的演进,也为日后频道批量生产、搜索卡片动态化、详情域 DX 动态模板化、交易域新奥创迁移等项目打下基础;
- 推动团队完成组织架构调整,从按行业化纵切的组队方式,改为按领域横切,职能更加聚焦。
双十一前夜动员会,有幸和老逍同框(2017)
今天回过头再看京杭调整这次旋涡对不同个体的影响,现在 4 年过去了,选择纵身一跃转战杭州的同学,与选择留守北京在聚光灯外坚守的同学,都收获了不错的成长,也拿到了结果;把时间的尺度拉长,并不存在决策的好坏,关键在于能否坚持。这段经历带给我的:
- 谋前不惧,谋后不悔:做决策最忌讳的是不作为与左右摇摆,正确决策>错误决策>不决策,在全面评估、权衡利弊之后,没有最优解的情况下,相信直觉是个不错的选择;坚持与选择同样重要,路都是越走越宽的,早决策早出发,把时间用来奔跑而非等待;
- 横向跨端,纵向跨栈:前端是应用架构最上层,浏览器屏蔽了硬件层、虚拟层、OS 层、框架层的绝大部分细节,架构很轻薄,因而也容易面临瓶颈问题;因此横向跨端的大前端体系,或纵向跨栈的全栈开发工程师体系是个人职业发展的必由之路,面对问题打开思路能够发现更多解法;
- 小处着手,大处着眼:从 PC 首页改版 PM,到 HTTPS 改造/域名切换牵头上百人虚拟团队;从 H5 小业务的性能优化方案,到「性能体验虚拟小组」负责人;从度假业务架构升级,到推进飞猪平台化建设,我的经历很多都是从一件小事开始积累量变,在某个时间点借势质变。规划不用开始就做得很大,重要的是从身边小事做起并做到极致,过程中不断涌现的新问题会带来深度与壁垒;脚踏实地的同时仰望星空,看看有什么设施可以复用,手上方案又可以解决别人什么问题,加以时日技术体系与产品自然能长起来;
- 定目标,画大图:我从一线开发到 TL 的跃迁是从画大图开始的,相比一人吃饱全家不饿的爽快感,团队协同需要做到一张图、一场仗;好的大图首先要考虑面向的受众与要定义的问题域,摒除不相关信息的干扰,其次要能结合规划突出重点,另外还要明确表达分工及相互间的关联关系;大图务虚的表象背后,是对一个领域运筹帷幄的能力与信心;
- 塑造团队,使众人行:打造一个奋进、卓越的团队需要对权利与责任有更清晰的认识,带好一个一线团队由浅入深可以拆分为四个阶段,1)活水之源:昨日因今日果,招聘要凭良心;2)换位思考:眼里要有事更要有人,多做 1v1 沟通,培养同理心(我懂你)、信任感(你懂我)与利他心态(能成事);3)榜样作用:我说你听,我做你看,你说我听,你做我看,带领团队赢一场大仗;4)使命与愿景:沉淀共同的文化、目标与路径,攀更高的山,看更美的风景。
我在飞猪做导购:谋定后动,知止有得
“梁丘据谓晏子曰:‘吾至死不及夫子矣!’晏子曰:‘婴闻之,为者常成,行者常至。婴非有异于人也。常为而不置,常行而不休者,故难及也?’” —— 《晏子春秋》
18年底,平台化战役一期结束后,伴随组织架构调整,我所负责团队的业务范围从垂直的度假业务,转型横向大导购方向,专注于购前链路的流量获取与高效转化。同时组建 Java 导购和无线服务端团队,开始从纯前端职能团队,向混合栈业务团队转变,2年时间团队规模也从最初的 8 个人慢慢发展到 30+ 人。从前端到导购的变化带来了诸多挑战:
第一个挑战,是可对话,具备跨职能平等沟通的能力。接手后端团队后最先涌来的是一堆新的技术或业务名词、知识体系,印象很深的是一次开会与酒店团队聊 DUMP 数据对接方案,双方一线同学你来我往,云里雾里唇枪舌剑一番没有达成一致结论,幽幽地转头看向我,我憋红了脸吐出四个字:“啥叫 DUMP?”。
类似的场景其实在工作中比比皆是:担任项目 PM,后端同步的 fgc 问题有多严重,是否需要协调其他角色协助排查?记业务会议纪要,从 CPM 切换到 CPC 模式这个 Action 应该指派给谁?跟进客户端发版,iOS abort 率万 7 是什么水平,发版是否需要延期?
接触一个全新的领域,有大量陌生的名词和知识体系需要补足,解决鸡同鸭讲的问题,然而最大的阻碍不在于新领域的壁垒,而在于我们过往的经验、资历、光环,不想示弱、害怕伤自尊,缺失放下身段与周围人请教学习、比拼技艺的勇气,这些都可能阻碍沟通,影响理解与表达,提高进入新领域的门槛,
快速具备可对话能力没有太多诀窍,重点就是放下身段,磨厚脸皮,不懂就问。每个人都会有知识盲区,抓住机会向身边任何层次/背景的人请教,收获的是自己的成长;况且刚开始就主动坦诚、积极沟通学习,也远好过死扛一段后在关键场合被打回原形(比如晋升场)。
杭州大雪,度假前端团队合影(2018)
第二个挑战,是思想跨栈,从技术/产品思维到业务思维的转变。前端技术有其特点,1)天然开源;2)交互设计强相关;3)产出物可见;这些特点带来了我们这个群体对开源与分享的热衷、对美感与细节的追求、以及对用户体验的极度关注,因此优秀的前端工程师产品 sense 多半不错,从琳琅满目的技术产品、炫酷的官网、完善而规范的文档/Demo 就可以看出。但技术/产品 sense 与业务 sense 之间仍有巨大鸿沟,以 Push 平台的 case 举例,不同思维方式考虑的点:
- 前端思维:配置页面打开速度怎么样,大表单有没有缓存机制,Push 文案在不同尺寸屏下被截断的效果,承接页兼容性如何;
- 后端思维:消息能不能准确送到,任务如何拆分与合并,线程池如何设计,海量消息高并发如何解决吞吐率和时效性问题;
- 产品思维:消息类型能不能横向扩展,推送时间是否支持自定义,数据报表能不能与触达任务无缝衔接打通;
- 业务思维:哪类 Push 拉新效果更好,什么时间发打开率更高,哪些消息面向活跃率/又有哪些是面向成交,两者比例如何拿捏。
做业务要为最终结果负责,而前端角色从技术/产品思维到业务思维的一跃有很多天然的瓶颈与鸿沟,1)过度的产品化执念导致容易陷入细节;2)缺少与业务方长时间高频度的互动,对商业模式的理解、数据的敏感度不足;3)从阿里内部看,更偏垂直专业领域的 KPI 与晋升体系一定程度上也决定了技术产品化的重要性会略高于业务结果。
从产品/技术思维到业务思维的转变,可以尝试从以下几个方面来培养:
- 培养对目标与数字的敏感度,尝试收集并形成自己的订阅报表,定期 Review,多追问指标升降背后的原因;
- 加强与业务方互动,多从业务目标视角看待每个需求,使用 STAR 法则梳理关联关系,多问几个为什么;
- 尝试结合掌握的信息去做公式拆解与沙盘推演,例如
App DAU = (MAU * 月均访问频次)/30 + 域内日均拉新 + 域外日均拉新
,目前的现状每个指标分别在什么量级,每个需求又分别服务于哪个指标,能够提升多少,提升后是否能推导出目标达成,拆解事项并梳理优先级; - 抛下过于超前的产品执念,避免陷入细节,以产出最小可行产品(MVP)为原则快速试错与迭代,区分好「锦上添花」与「雪中送碳」。
阿里五年陈授戒,梦想可贵,天生无畏(2019)
第三个挑战,是目标与定位,划定在部门中的位置与边界。飞猪采用的是大前端的团队组织形式,内部分工协作相对清晰,协调成本也比较低,因此各团队除了对接固定业务方需求外,基建分工一般更面向技术栈,如小程序一码多端(Rax/小程序)、中后台(PC/表格/表单)、互动玩法(Canvas、WebGL)、工程化架构等,这样的分工天生会有相对清晰的边界。刚开始带导购后端团队,由于更贴近业务以及横向支撑的特性,带来不少问题:1)对接业务方多,各业务方 KPI 目标存在差异,需求承接缺少主线;2)技术上各应用缺少清晰的定位与领域划分,怎么快怎么来,架构腐化快;3)边界不清、业务功能模块重复建设导致与营销、行业等协同团队踩脚的事时有发生。
因此,拆解 BU 规划,确定团队绑定的业务目标会比前端更为重要。前期重点做了几件事情:
- 确定团队的北极星指标,前期关注导购平台承载流量规模,在研发资源投入不变情况下,提升多样化业务承接能力;后期关注业务 IPVUV/成交转化,通过业务策略、算法的快速迭代试错优化流量承接效率,再通过规模化效应快速赋能全渠道提升转化。
- 围绕北极星指标确定不同阶段的核心业务方,并通过目标规划对齐确定产品技术规划与优先级;如最初的业务收口阶段,首先拉取了各个资源位渠道流量规模,然后由大至小逐步沟通推进收口,同时对于 App 首页等重点场景提供底层统一能力之上的定制化产品支撑;
- 对于技术规划中涉及到的各系统模块,与协作 BU、中台团队沟通确认是否有已有系统能够支撑并且规划能够 match,不满足条件的情况下明确定位区别与各自边界,自建支持。
进入业务深水区,很多时候需要攻坚的不只是技术难题,还有组织难题;在有限资源情况下,决策不做什么也比要做什么更重要。近两年的飞猪导购生涯,推动了导购域三个阶段的升级改造:
- 阶段一 建设飞猪物料流通大动脉(2018):解决行业物料不互通,平台能力不互通的问题,完成面向飞猪业务的选品平台(星辰)、投放平台(泰坦)、搭建平台(页匠)建设,围绕多种类型的行业物料完成统一分发链路的构建,通过一条大动脉串联了云与端。
- 阶段二 端侧资源位收口,业务承接物料加工(2019):构建资源位管理体系完成端侧资源位收口,包括主动触达渠道(如 Push)、静态资源位(如 App 闪屏)、动态资源位(如 SmartBanner);构建 LandingPage 生产体系,基于飞猪行业化物料快速批量化搭建场景频道、榜单、清单等 Landing 页。提高人货场匹配效率。
- 阶段三 构建精细化运营体系,推动运营模式转型(2020,ing):构建用户增长、人货场理解、流量调控、策略编排、商业化、数据可视化等数据化/智能化基础运营能力,实现精细化人群/场景运营,推动飞猪从面向行业运营、流量运营的模式向面向用户运营、策略运营的模式转变。同时沉淀高质量运营物料与策略,并通过人群包、数据银行、商家运营平台、生意参谋等产品渠道赋能商家优化运营能力,提升运营效率。
这段时期从前端技术层面也做了不少事情,推进 Serverless 和 H5/小程序一码多端技术体系落地,重新定义云+端的研发模式;完成基于微前端+业务 SDK 化的中后台模式落地,面向运营场景对不同产品功能原子作一体化整合;构建互动玩法体系,赋能产品与 UED 更丰富的业务表现形态。目前聚焦在前端标准对接 Flutter Engine 自绘渲染的 Web on Flutter 体系构建,以及阿里经济体的跨端研发基础设施落地,继续提升研发效率及性能体验。
两年时间导购平台逐步承接了飞猪全域超过 70% 流量,同时实现了公域推荐搜索链路 GMV 占比 5% → 15% 的增长。我个人伴随业务一路成长也有不少收获:
- 技术跨栈,职能跨栈,思想跨栈:跨栈的本质是不设限,能写 H5 也能写 Node,能做前端也能做后端,能搞定技术也能搞定业务,关键在于投入够不够果断和持久。两年导购平台建设,不同阶段涵盖了前端、工程、算法、产品、业务、UED 等不同职能角色的突破需要,随着问题复杂度的提升,个人的力量会显得羸弱,尝试跳出自身技术栈与职能角色,围绕目标协同更多角色打大仗,挑战巨大却也充满价值;
- 因势而谋,应势而动,顺势而为:“风口之上,猪都能飞”,个人成长也好,业务发展也好,借好势能保证事半功倍。导购平台从 0 做到承载飞猪全域超过 70% 的流量,抓住了人员流失的风口重抓研发提效,抓住了全域个性化的风口提供统一算法埋点能力,抓住了场景化串联行业的风口统一数据模型与选品/投放能力,抓住了平台化的风口完成大部分公域投放业务收口。磨炼对业务方向与目标的敏锐感,顺势而为;
- 从管理者,到管理者的管理者:最近两年团队规模一路成长到大概 35 人,带队精力明显不够,于是在年中拆分了二级团队,直观感受到的变化 1)信息链路变长,很多信息直接 get 不到了;2)对一线同学的产出与状态感知变得不太清晰;3)团队内部开始出现分工与边界问题;4)在「一线管理补位」与「跨级管理顾虑」间反复横跳。一些会议逐渐不再参与,负责的事情也逐步下放,在 BU 内的存在感变弱,坦白说会有短暂的焦虑,尤其是下面同学能力很强时。我也一直在调整自己的状态与精力分配,1)努力往信息与规划的上游走,多与产品业务一号位、各技术域一号位沟通,保证信息通达;2)把控宏观方向,从日常事务中抽出身来,结合业务思考未来 2~3 年的规划,跟进前期运作;3)对新履职的 TL 给空间、做兜底,退二进三;4)更多思考团队发展与人员成长的问题,使众人行。早前参加过一次管理培训,授课老师提到管理分几个阶段:不带人 - 带几个人 - 带几个管理者 - 做一号位;从第二到第三阶段不是人数变多的量变,而被类比为不带人-带人的质变,当时不理解,现在深以为然;
- 关于 Work life balance:职业成长到达一定阶段难以突破有时不是因为能力或机遇,而是源于家庭与生活,并不是说家庭不重要或者拖后腿,而正是由于家庭生活非常重要,而我们在努力工作过程中会潜意识忽视掉对家庭的参与与贡献,最后矛盾激化。其实 WLB 指的并不是 6 点还是 7 点下班,而是保证有限的家庭生活中能够全情投入(不玩手机、参与家务、制造惊喜感等等),不存在顾家就不能加班,热爱工作就无法兼顾家庭的两极分化;是否能像对待工作一样对待生活,高质量陪伴,共同谋划未来,甚至一起定一些 KPI——比如每月带孩子去一次游乐园——并努力拿到 3.75,才是 WLB 的真谛。
“人生就是一列开往坟墓的列车,路途上会有很多站,很难有人可以自始至终陪着走完。当陪你的人要下车时,即使不舍也该心存感激,然后挥手道别。” —— 《千与千寻》
本文起稿于9月中,刚起笔时笔者还在负责飞猪大导购方向,月末适逢团队调整,拖了一个多月才最终完稿;当下团队方向已然转移到飞猪的数字化运营平台体系(偏中后台)建设上来,变化不可谓不快。分分合合间,有人会留下,也有人会离开,选择本身没有对错,作为曾经一起拼搏的同路人,心怀感恩,也期待未来能够在某个路口再相逢。
飞猪大导购团队安吉团建合影(2020)
借这个机会,也简单聊聊我对 “拥抱变化” 的理解。排斥变化是人性,我们潜意识里都会惧怕未知,首先认可这一点。把人的能力成长抽象成两根曲线:
一根是真实能力曲线,代表内在部分,可以想象成一根弹簧,把它立在桌上,自顶向下俯看下去一直在绕圈,一如进入一家公司成为新人,几年时间变成老油条,换一家公司又变回新人;又如每次新技术的推陈出新,都从新手入门开始,继而写 Demo、做项目、看源码、fork 拓展,最后又被更新的技术替代。俯看每次画完一圈似乎都回到原点,但从侧面看过去,高度却一直在上升,无非是有时快一点,有时慢一点。
另一根是表象能力曲线,代表真正被别人看到的部分,可以想象成一系列不连贯的正切曲线,把每段曲线看作一段经历,向上的势能往往是缓慢增加,到达峰值后缓慢下降的过程;而每次 “拥抱变化” 就是两段曲线间的纵身一跃,对技术、环境、人的陌生看似短时间内降低了我们的表象能力,但也意味着更大的潜在势能和未来更大的空间。
“拥抱变化”这件事并不是阿里特色,无论身处何时何地都会反复经历。关键点在于如何看待并接纳 “变化”,在不确定中寻找确定性,抓住每次惊险一跃的机会去提升和突破,并在表象能力背后去感受真实能力的成长。
结语
“今天的每个人都只是约 70 亿人类中的一员,而人类又只是地球上约 100 万物种中的一个。地球只是银河系约 1000 亿颗行星中的一个,而全宇宙有约 2 万亿个星系。人的寿命只是人类历史的约 3000 分之一,而人类历史又只是地球历史的 2 万分之一。换言之,我们渺小、短命得不可思议,无论取得什么样的成就,其影响都是微不足道的。同时,我们又本能地希望有意义,希望进化,而我们只能产生一丁点儿意义。所有这些一点点的意义加起来,才是宇宙进化的推动力。” —— 《原则》 瑞·达利欧
“人固有一死,但正因为此,我们才是幸运儿。大多数人根本就不会死去,因为他们压根就没有诞生。这些潜在的、没有出生的人,数量超过了阿拉伯大沙漠中的沙粒;他们本来可能活着与我们同列,但事实上却永远也没有机会见到一丝阳光。显然,在那些没有诞生的生灵中,会有比济慈更伟大的诗人、比牛顿更伟大的科学家。我们知道这些,是因为我们的 DNA 所允许的‘可能存在的人’的数量,大大超过有机会出生的人。拥有这些罕见机会的幸运儿,就是你和我,就是生活在这世上的平淡无奇的人们。” —— 《解析彩虹》 理查德·道金斯
这篇文章是我在阿里一路成长的总纲,经验与教训都杂糅其中,如果你能看到这里,希望能有所收获,或有所启发。回头看在阿里一路的成长,校招毕业 4 年时间从 P5 到 P8,除了足够努力这个必要非充分条件外,我自知是无比的幸运,感恩这个时代,以及所处的行业与平台带来的巨大红利,感恩家人/朋友/导师/伙伴的支持。
今天团队新人越来越多,30 岁的眼睛望过去,满是自己 20 岁的影子,一样的阳光开朗、意气风发,想要成就一番事业;却也在满是荆棘的路上,一样充满汗水与泪水、挫败与迷茫。人的成长更多靠自己,环境只能催化与启发,要相信风雨之后是晴天,乌云之后有太阳,播下爱与梦想的种子,耐心等待她破土而出,生根发芽。
今年疫情、山火、洪水、蝗虫,天灾不断;灾难来临,站在社会与国家的层面 “人” 确实是太渺小了,“时代” 掸掸灰尘落到每个个体身上都是千钧重压。然而生活在这个欣欣向荣时代的我们又是如此幸运,身边每个人都充满希望,活在明天收入会更多、福利会更好、交通会更便利、物资会更丰富的预期里,坦然地认为这就是平凡得不能再平凡的人生常态,殊不知把 5000 年文明史放在坐标轴上,这样的时代甚至短到看不见;原来我们才是茫茫历史长河中的幸运儿,没有常年的饥荒、战乱、瘟疫、残酷的剥削,而是粮仓殷实、社会进步、科技发展、国泰民安。
因此,怀揣感恩的心态,享受当下的生活,你若盛开,清风自来。
我是圣司,我在飞猪前端团队,一个「胜则举杯相庆,败则拼死相救」的集体!
**
关注「Alibaba F2E」
把握阿里巴巴前端新动向