🙋🏻♀️ 编者按:技术人成长是一个系统且全面的历练过程,需要持续地精进技术、锤炼心智、提升思维等等。在这个过程中,你是否也曾感到迷茫、焦虑,试图摸索一套适合自己的成长方法论? 「人物志」系列文章将持续记录蚂蚁集团终端技术人的成长故事,分享他们在成长道路上的宝贵经验与心路历程,期待能够给大家带来一些思考和启示。 第一篇带来蚂蚁集团前端工程师问崖的成长故事, 问崖来自 蚂 蚁集团体验技术部-平台前端团队,负责蚂蚁 AI 工程相关平台的前端建设,目前专注于机器学习前端推理引擎建设,会烧烤能练摊,玩机车可组队,期待未来与大家共同进步。
我是问崖,2013 年华科毕业,2014 年加入蚂蚁,入职已经 7 年多了,也是跟着蚂蚁 AI 工程平台一起成长的 7 年,感恩一路上遇到的有情有义的人和事。个人的经历并不是什么典型,平时也没怎么写过这类文章,所以这里更多是平铺直叙地分享一些个人经历,方便大家对我有更多了解,也为后续闲聊抛一些话题。
笨鸟先飞,没有天生赢家
每时每刻都是起跑线,任何时候努力都不晚
在农村长大的我,小时候就很崇拜镇上的家电维修师傅,看他们摆弄各种电子元器件就觉得很高级,没啥可玩的时候就偷偷把家里小电器拆了又装回去,收集别的小朋友玩坏玩具的零部件,再尝试组装一些小东西,小时候的快乐就是这么简单。
初中开始有了一些零花钱,存了一个月偷偷买了人生第一把电洛铁,把家里淘汰的几个黑白电视机摆一排来回折腾,当把小霸王同时接通三台电视机时,感觉要飞了。
当时唯一的学习途径就是去镇上,一边帮师傅递工具一边问这些元器件的用途。不懂瞎了折腾肯定会出事,在某个傍晚捣鼓电视机时,大拇指被显像管的高压电子管电击出几道黑纹,那是我印象最深刻的傍晚,也是那个时候顿悟知识的力量,开始好好学习。回想起来要感谢那一次被电击,不然自己很可能成了镇上师傅的徒弟,现在还在老家卖电器。
你敢买我敢拆,高中时第一个手机只在我手中坚持了半个月 💀💀💀,差点被吊起来打
高考填写志愿时,电子、电信、电气这些也理所当然成为我的优选专业,但最终还是与这几个专业无缘。
由于某些机缘,毕业后的暑假提前去未来的大学玩了一个月,一位师兄偷偷将我带进一个叫「电子电工基地」的民间组织,看到他们桌上的示波器、万用表、稳压电源、堆叠有序的元器件盒、智能小车、机械臂...,我的天,这不就是我理想的大学生活吗。
为了能混进去,那个暑假就开始狂啃模电、数电、C语言、汇编,有高中物理打底,模电数电看了个似懂非懂,而C语言和汇编简直就是天文,所以军训时裤兜里还藏着一本C语言,好在最后顺利过关,然后每天就是焊板子、编代码、烧程序。每次程序运行成功的喜悦,逐渐让我喜欢上编程(主要还是电路调试太难了),半年后我叛变了,转投到一个网红互联网的社团下,一待就是三年。
焊板子最终只能成为爱好,偶尔也会到小黄鱼捡电子垃圾,但也仅仅是初级爱好者水平
网红社团嘛,必定有很多牛人,拿过的奖项都是全球级别,有大三就拿过微软 IT 个人挑战赛全球冠军的,团队奖项更是多不胜数,最不济也是高中开始编程。所以水平有限的我,只能加入他们的外包项目组,负责为团队赚钱。
有这么多牛人还怕自己不成长吗,也就是御术常说的「宁当凤尾不做鸡头」。在这种氛围下旷课成为日常,在社团那几年什么都折腾过,Web应用、桌面应用、Windows Mobile 游戏、第一代 iPhone 游戏等,唯独没有专注写过前端,直到一位社团师兄毕业了,被迫接手一个复杂的前端应用。
沾上编程后,电脑成了我的女朋友,但学校默认 24:00~06:00 断网,非节假日晚上 19:00~21:00 寝室断电(晚自习时间),没网没电玩不转。所以后面又混了一个寝室楼栋网管,享受全年 24H 免费上网。大二开始在学院做兼职,帮忙建站和服务器维护,换来晚自习时间自己寝室不断电。过程中还有很多好玩的事情,与我们辅导员斗智斗勇,毕业后我们成为了好朋友。
最开始以为编程只是自己的一个爱好,没想到今天成为我的职业
全情投入,让自己更靠谱
创业、工作、玩,活在当下,全情投入
研究生期间,受外界各种互联网创业声音的影响,开始和同学一起搞工作室,一边找人一边找钱,幸运的是在研二搞到了一大笔钱,开始创办自己的公司,但是不是做互联网方向,这也是我后来离开的原因之一。
找人组团队我们也是历经波折,毕竟团队没有什么名气,当时为了找到合适的 UED 同学,我打着学习的幌子,找到工业实习专业的老师,混迹在他们的暑期写生队伍中,从一个陌生面孔到与他们打成一片,画画水平至今仍是鬼画符的水平,但最终找到两个非常优秀的同学加入我们。然后为了做市场调研,我们在商业街摆地摊,成本价出售,只为最真实的数据。
大家也能猜到,创业的路非常艰辛。在公司连续亏损一年多的时候,迫于各种压力,我选择了离开,此时我已经毕业大半年,只能社招渠道找工作,面试过腾讯、阿里、百度之后才知道自己的技术已经落下太多。
两个月的各种面试,最后进入了上海的一家电商公司,为了减少通勤时间,花了 1200 在公司附近租了个不到 10 平米的房间,隔壁的屋友们都比较喧闹,房间各种神曲乱飞,导致现在我也经常听着DJ 码代码,好在他们的上下班时间刚好与我错开,竟有了种闹中取静的感觉。
在上海那家电商公司的 10 个月,我的目标非常简单 -- 学习,然后面试支付宝(当时还不叫蚂蚁)。远离技术那三年前端变化太大了,各种模块化方案,Node 逐渐火热,遍地轮子。
当时那家电商公司上海团队初建,给了我们有较大的折腾空间,晚上研究蚂蚁/阿里的前端源码,写博客,翻译文章,也造了很多轮子 -- 模板编译、自动化Mock、组件库、构建工具...,白天到公司拉着一哥们吹嘘我的轮子、还有什么不足、怎么在业务中用起来,逐渐这个哥们也成为我工作后的第一个好友,后面相约一起分别去了蚂蚁和阿里。
来蚂蚁的前几年,我的周末过的非常简单,要么窝在家写代码,要么叫上好友出去自驾,通常都是出去野两天,把杭州周边能玩的地方走了个遍。
不出去玩的周末,好友也会经常来串门,通常都会给我带点早餐,一般都是他来敲门时我才起床,上来第一句话就是「昨晚上又写到很晚啊」,通常我也懒得回应,快速洗漱完,穿着裤衩就开始唆他带来的葱油面,他通常也会喷我几句「注意点形象」,有时候我也会回应一下「都是男人怕什么」,边吃边拉着他一通技术输出,吹一吹我最近再搞些什么有趣的技术,到后来居然也逐渐爱上了葱油面。
皮实一点,做好每件小事
运气就是机会碰巧撞到了你的努力
入职蚂蚁那天才知道自己不是在玉伯团队,但好歹也终于加入了蚂蚁大军,既来之则安之。
随后三个月内换了三次主管,业务上有做不完的 issue,换主管这事也无暇多想,而且当时有蚂蚁好师兄 #绝云 带着,也没有感受到很大的压力,只是没有时间造轮子了。
试用期刚过,就被拉到闭关室孵化 PAI 平台,闭关室聚集的都是各个团队的顶尖人才,每天开会听到的都是一堆不懂的名词,逻辑回归、随机森林、朴素贝叶斯、模型...,网上查到的也是一堆看不懂的解释和晦涩难懂的公式,唯有会议快结束时那十几分钟产品进展能找到一丢丢安慰。觉得自己弱爆了,跟不上大家的节奏,每天能做的就仅仅是完成分配的开发任务,这是来蚂蚁之后的第一次焦虑感爆棚。
直到第一阶段闭关结束,主管拉着我聊了很久,其中也聊到了我的焦虑,主管听了非但没有批评,反而露出了微笑,然后对我说「有焦虑挺好,适度的焦虑是成长的动力,但别太过度。埋头做事的同时,想想在自己能力范围内可以为产品/业务带来一点什么改变。另外,对前端同学来说业务落地是个漫长的过程,身边还有这么多优秀的同学,保持持续学习就好。」回来后也想了很久,前端的本质是什么?产品体验、页面性能、代码可维护性等,先把这些本质做好再说。
很快就进入第二阶段闭关,有两个关键目标,一是画布体验从可用到好用,二是对接算法团队开发的算法组件。画布是平台的核心能力,有我的师兄亲自负责,逻辑还挺复杂,我也插不进去。算法对接主要靠技术同学写 SQL 插入,而我当时的“美差”是实现算法参数面板,一个月下来就只接入了不到 20 个算法组件。
效率实在太低了,某次会上听到一个声音「能不能做一个算法接入后台」,说干就干,接下来的两周与 #完白 在白纸上画了一遍又一遍的交互,每次感觉要讨论清楚时又发现技术实现不了,好事多磨,最终我们拿出一个相对完美的产品方案。
上线后接入一个算法只需要 1 小时,方案一直沿用至今年 PAI 融合到 AIStudio。所以,当我们还不太懂业务时,也可以从产品体验/前端性能角度出发,参与到产品方案或交互细节讨论,然后利用技术快速实现,这就是「参与其中」的感觉吧,这也是我来蚂蚁后第一次感受到做好产品的成就感。
进入日常迭代期后,issue 堆积成山,每天都是翻 issue 列表,看到能修复的就顺手修掉,逐渐成为团队修复 issue 最快最多的同学,甚至有时候也去修复一些简单的后端问题,这个过程让我对 PAI 前端代码有了全面了解,也逐渐参与到画布、可视化等之前未涉猎的领域。毫不夸张地说,在当年 Lint 规范还不那么成熟时,随便拿出一段代码,我能说出代码作者。
与后端合作默契度也很重要,可以让我们快速完成/修复一些日常问题,与 #穆远 合作时,我们能做到口头约定后,各自盲写联调成功率基本都在 90% 以上,我们也是从不靠谱到逐渐靠谱,也有过争到面红耳赤的时候,不热血还叫青年吗,但之后还是需要冷静地思考。
产品迭代过程中一定会有很多脏活累活,主动帮团队承担,快速解决,自己的职责范围也就逐渐拓宽了
与此同时我也开始在用户群日常答疑,遇到不懂的问题时就请教团队同学,当好搬运工同时还能学到东西,并用文档记录下所有 QA,避免同样的问题打扰别人两次。
在一次次帮助用户解决问题过程中,逐渐与用户建立高度信任关系,后面用户会经常私信我/面聊,让我能拿到第一手信息。有了稳定的信息源,时不时还能给到 PD 一些惊喜,有些想法从 PD 嘴里帮你说出来,成功的概率通常也就高了 5 成。
在一次次接受用户/PD/UED反馈过程中,逐渐有了产品体验洁癖,为了画布上 1px 偏差会不惜花上几天时间,道理很简单,当画布放大 5 倍时就是 5px 的差距,就其是当一个平台的用户量起来之后,日常的体验细节就显得格外重要。在一些规划会议上,经常会听到体验优化专项,如果我们日常能养成一个好的体验习惯,真到体验优化专项时压力也会小很多。
不鼓励在毛坯房中雕花,但也不能沉溺于建烂毛坯房
直面变化,未来可以更好
相信相信的力量,埋下的种子在合适的时候一定会发芽
经过两年多在 PAI 团队摸爬滚打,我在 16 和 17 年分别晋升的到 P6 和 P7,但紧接着遇到我来蚂蚁之后的第一次分家 -- PAI 产品和业务调整到人工智能部,主管让我们自己选择,要么跟着产品走要么留下。
其实对我来说,没什么好选的,一定是跟着自己付出了那么多日日夜夜的产品走,难过的是要与并肩奋斗的前端战友们 #绝云 #祁涛 分开,到了人工智能部就是孤身一人。记得走那天 #绝云 对我说「也许那天我们还会走到一起」,我当时半信半疑。
到人工智能部之后,大家都很开心,因为人工智能部终于有前端了。我却因此压力很大,300 多人的部门,就我一个前端,各种业务都来找你支援一下。好在主管很大方,不限前端 HC,杭州/北京/成都都可以,记得那一年一半时间都是在面试,借着各种出差的机会约候选人见面,终于在年会宴上,我们前端坐满了一桌。
有人之后,负责的业务也在不断扩张,除了 PAI 模型研发平台,还有模型部署平台、智能客服、搜索推荐等业务平台,期间我们也从零孵化出蚂蚁 A/B 测试 -- 达尔文平台。
好景不长,前端团队刚刚稳定成型时,又面临第二次分家,AI 工程平台 和 达尔文分别调整到现在的计算智能技术部和大数据部,我和 #云冈 分别带走几个人,留下 #青壁 一个人在人工智能部。
临走的时候,我也对青壁说了同样的话「圈子就这么大,我们迟早还会在一起」,也安慰青壁「人工智能这边还有很多可做的事情,如果到时候真没有什么可做的,再想办法转岗过来」。
调整之后很长一段时间,产品建设没有什么进展,很多事情都是我们和 PD 在折腾,感觉特别没劲,第一次产生了想转岗去集团的冲动,在那边可以 5 分钟走路上班,想想还挺爽的。但也只是想想而已,连岗位都没有去了解,继续留下更多是对人的感情,辛辛苦苦面试招到这么些人,吹了那么些牛,自己却想逃避,感觉多多少少对这帮兄弟有点不负责,最终没能过自己这一关。
期间 #绝云 也去了体验技术部,在御术团队,绝云过去之后也时常来勾搭我过去,说「图编辑」方向大有可为,不过还是没能过自己这关。勾搭人这事,我们自己也没少干,#伍沉就经常跟我说「xxx 方向很适合青壁来做,我们能不能吸引一下」,但了解青壁正在做的事情后,觉得当下状态和事情挺适合他的,也就从来没开过口。
这段痛苦的时间也不长,调整之后没多久前主管(后端)觉得带前端也难的,加上有之前绝云做铺垫,我们很自然找到御术将我们收编了,之后便迎来一波又一波收编热潮,大数据前端、人工智能前端相继回归体验技术部,必须得感谢 #玉伯 等主管们的英明决策,让我们一帮老伙伴能再次相聚。
我不敢说我的选择就是最好的选择,但如今看到人工智能前端再次聚到一起,对一个经历过分分合合的人来说「足已」,未来可期。
爱你所做,专注做到极致
把一件事情做到极致胜过把一万件事做的平庸。聊一聊 X6 的一些前世姻缘
PAI 应该是集团最早使用「图编辑」技术的平台,由我的师兄 #绝云 孵化了第一版,使用了开源的 Joint.js 方案。我逐渐接手后,作为一个有血性的程序员,程序员“鄙视链”心理开始膨胀,看哪都不顺眼,都想改一改。加上 #完白 不停给画布增加新特性,交互是好交互,可难死我了,倒逼着把 Joint.js 源码各种 Hack,最后成了面条代码。
同时也在看开源界有没有更好的替代方案,事实证明师兄的选择是对的,压根没有什么完美方案,不过我还是某论坛下载一个当时还闭源的 mxGraph 源码,粗看了代码结构和 DEMO 都还不错,想着又是闭源的,肯定还不错。
于是就潜心研究起来,看到写得好的代码时,还经常拉着师兄来看看,想把师兄也拉进来一起研究,其实内心活动是「让师兄帮忙把把关,看看这个东西靠谱不」,由于源码量过于庞大,师兄又很忙,就直接被劝退了。
大概研究了一个月,就找到师兄和主管说「想结合 Joint 和 mxGraph 各自的优势,自己搞一个画布引擎」,并立下军令状,只要三个月就能解决当前引擎不能满足的需求。加上 #完白 设计的交互确实很感人,不然估计我也说服不了主管。最后虽然花了四个月落地,好在“吹牛”的后半句都达成了。
随着 PAI 平台推广,越来越多的同学找过来要源码,于是就萌生了开源的想法,又去找了主管还有 #偏右 去聊开源的想法,权衡再三,最终就仅仅放了一份源码在 gitlab,还没有文档。
因为当时的重心还是支持好业务,不想因为没有时间维护将这么好一个方向做砸了,就静待时机吧。所以后来 AntV 开始孵化 G6 时,我还挺开心的,终于有人把这个方向拎起来了,真实的内心是「到时候再有需求将让他们找 G6」。
直到三年后 G6 在图编辑和图分析场景相互牵制,都想做好都做不好,御术就提议将 PAI 的画布引擎开源,作为图编辑引擎,聊着聊着在白板上把名字也随手划了出来「X6」,X 象形连接关系,6 是图里面的六度空间分割理论,与 G6 的 6 涵义一致。
主管把名字都想好了,名字还这么霸气,那必须自燃。按照习俗,紧接着就是在 AntV 年度 KO 会上去通晒 X6 规划,然而讨论最多的不是规划本身,而是之后 G6 和 X6 的关系。记得当时我一个人在台上,下面几十号人一个问题接一个问题,聊了一个多小时,成为当年 AntV KO 场最“热闹”的环节,具体怎么回答的我都忘了,只记得当着那么多人吹了很多牛。
主管帮你把名字也取了,自己牛逼也吹了,真正开始做时才知道没那么简单。时隔多年,当年的代码已经不可用,而且当时的代码太服务于 DAG 场景,同时还要考虑 API 尽量接近 G6,与 React 生态打通等,就其实催牛逼的那些特性都需要整一遍。时间紧任务重,还要兼顾业务发展,只能挤时间写代码,所有能用上的时间都用上了,包括出去 outing 的晚上。
最终在当年的 AntV 发布日也只发布了 v0.8,文档和 DEMO 都没有准备好,后面又结合内部 AIStudio、Dataphin、DeepInsight 等重度业务场景打磨了近一年,才正式发布 v1.0 版本。
由于之前那份源码没有任何文档,还被 #苏千 喷过,所以这次在文档方面也下了苦功夫,前前后后花了 2 个多月,为了让写文档没有那么枯燥,边写文档边做 DEMO,用文档描述选项的作用时,通常都会嵌入一个可交互的选项参数面板,让用户交互式体验选项的作用。
两年下来,一共 100 多万行变更记录,其中些许提交是代码洁癖导致。现在 X6 收到的反馈和问题还有很多,我也不敢保证什么时候能修完,只能在这里继续吹牛,努力实现「真开源」。
最后
啰啰嗦嗦写了这么多,没读完也没关系,文中的每一个大标题就是我最想要说的。如果你能耐心读完,又有那么一丢丢共鸣,欢迎给我点个「在看」。最后,欢迎给我建议,我可以更好。