在职ds转码心路历程&经验分享

9882
18
终于顺利入职了,准备把几个月前刚拿到offer就写好的经验分享文章发出来,希望可以帮助有类似想法的小伙伴。小白第一次跳槽,看了很多地里的帖子,收获很多,也把自己这一次的经验写出来,这一系列基本就这样结束了,工作一段时间后可能会写下在大公司工作和小公司工作的不同。
之前写过的文章
- 跳槽签好offer后的不完全指南 instant.1point3acres.cn
- 在职DS转码刷题经验分享 instant.1point3acres.cn
- 打卡贴(可以不看lol):instant.1point3acres.cn

还是想说一下,这个是我个人经历的分享,每个人有自己的职业发展选择,并不是鼓励大家转码,事实上,如果你热爱DS,真的享受每一天的工作,继续走下去也是没问题的。

---------------------------------------------------- 以下是正文------------------------------------------------------------

从去年十月初下定决心开始跳槽到刚拿到第一个offer,不知不觉大半年过去了,想把自己这半年的心路历程分享一下,也为有同样转码想法的在职ds提供一些经验和教训吧。

先介绍下自己的背景,ds为主,研究生上过算法课,但是学的不深,从来没想过做sde。毕业后在一家小公司做ds,不过阴差阳错做的活偏mle/de的结合,以写ml pipeline和infra的活为主,所以可能也不太算“转”码。但是我们组写代码的问题是对code要求不高,快两年了都没有经历过正经的code review,自己低头造轮子,也没有production的概念,在这个意义上也不算个engineer。

为什么想跳槽


一部分原因是想转码,或者说想去个对写代码要求更高的地方,接收一下正经engineer的训练,在组里一个人造轮子太迷茫了,在推陈出新之前,我得先了解陈是什么。另外组里的活太少了,老板给画的engineer大饼都没有实现,现在主要做调参侠,对我的职业发展不是很好。ds开展了新的项目,但是前期需要大量的研究时间,不需要工程的介入,所以我非常无所事事,在组里有点边缘化,只需要维护现有pipeline,对新项目没有发言权。没有挑战性的活,每天工作都没意思。于是下定决心跳槽,想去大厂看看,与其坐以待毙,不如主动出击。

为什么想转码

其实入职之前的目标一直是做ds,入职之后被分配的活是写ml pipeline,渐渐的发现自己非常喜欢和擅长写代码和工具,对于ad hoc modeling却有时候无从下手。pipeline是为整个组服务的,也是让模型进入产品化的基础,目标比较确定,看到pipeline上线并投入使用,也非常有成就感。一年多的时间成长非常快,学习了很多新技术,渐渐地发现我对具体模型的分析有时候毫无看法,而对于怎么优化产品线,怎么设计pipeline自然而然地会有想法,会主动take ownership。

转折点在去年三月份,疫情刚爆发,手头接到了些分析的任务,写了很久代码的我突然发现自己根本不会分析了,而且分析很痛苦。ds难的不是建模,而是确立问题,前期做分析,转化成模型问题的过程,这个是最难的,难在几个方面,一非常需要背景知识,对行业非常了解;二 要有自己思考的能力,没有正确答案,更需要自己有主见,有看法;三,要从数据中挖掘信息真的是挺难的事情。所以这个过程,我非但没有享受,非常痛苦,也非常怀疑自己的能力。还好,后面这个项目就停了,当我重新开始写代码的时候,就好像重新找到了感觉,也很开心。

这个事情给了我很大的触动,我就开始思考自己是不是不适合做ds,老板一对一的时候也和我讨论过我职业选择的问题,我提出想走engineer 的道路之后,他也非常支持。我主要害怕的是组里可能没有太多engineer的活,怕被炒鱿鱼,但是有他的支持,我就差不多坚定了这个方向。

之后的半年里陆陆续续做了些infra,pipeline改善的活,确定自己的方向后,我也网上报了些网课补充工程方面的知识,但是现在想想,其实还不如早点开始刷题哈哈哈。当时上过udacity和datacamp的mle,de track,也看一些cs方面的科普书,现在想来收获并不是那么大。以陶冶情操为目的的学习不太能吸收,而以跳槽为目的的学习往往有很大的动力,特别是面试来临之前。

时间线

差不多八月底开始萌生了跳槽的想法,主要是因为在组里engineering的活基本结束了。有时候也会接收些ds跑模型的活,但是只需要跑pipeline就行了。开始研究jd,看别人刷题的经验,跳槽面试的经验,当时还没有想好是转mle,还是de。不过,发现不论做什么e,都需要刷题之后,十月份正式开始刷题。从十月份到一月份,差不多第一轮刷了300道,之后开始第二轮,三月份开始投简历,学习系统设计。三月底陆陆续续有hr给面试,四月份开始店面,这周开始onsite,第一个onsite就拿到了offer,真的非常幸运。

前期走的弯路

当时研究生毕业,身边很多同学做了sde,现在想想当时头铁一定要做ds真是太naive,一直没有搞清楚自己到底喜欢什么。其实我接触ds很早了,但是一直没怎么开窍,kaggle很早就开始了,但是一直有种无从下手的感觉,这和我工作中后来遇到分析问题的感觉一模一样。就是不知道要分析什么,从哪个角度分析。这样想想,其实我一直不太适合做ds,入门很早,却一直在原地踏步。

一直坚持想做ds,可能是因为还是更喜欢data visualization的过程,和心里想象炫酷的prediction power。但是现实中往往没有那么理想,如何扯皮让自己的模型make sense 才更重要。决定转码后,自己也轻松很多,不必执念于初心,及时发现自己擅长和喜欢的更加重要。

这个不是ds劝退文,我觉得每个人都有自己喜欢和擅长的地方,只要找到并且坚定地走下去就行了。幸运的是,两年以来,我还是给了很大的自由在做de/mle,也算是逐渐地认清自己到底喜欢什么。

边工作边准备
边工作边准备跳槽,真的身心俱疲。但是一旦下定决心,还是挺容易坚持的。放弃了很多娱乐的时间,工作上也不再拘泥于没事做,心安理得地划水,见缝插针的学习。

我前面说还不如早点刷题的原因就是,看那些网课当然是有好处的,但是没有压力和目标支持下,知识进入不了大脑。四月份刷过几天的题,但是很快不行了,因为没有下定决心跳槽,没有设立好时间线,也没有调查过别人的经验,很快就松懈了。所以一旦下定决心,就不要回头地走下去。

准备投简历
投什么样的岗位也是一个问题,我一开始并没有想好是做de,mle还是sde。跟一位前辈交流后,她当场指出我得早点确定好一条路,同时准备这三条是不可能,我恍然大悟(不过后面投简历的时候又不自觉的都投了。。)。就开始分析哪个更适合我且更有把握,在了解到mle bar巨高后,就放弃了,把目光瞄准了sde。问了很多sde的朋友,觉得不是不可以,另一方面,自己不想离开data这个领域,了解到去data相关组做sde也不是不行。所以基本确定投sde。

投简历的时候发现市场上和data相关engineer的大致有:
  • Mle 做模型为主,看paper做研究,有些也需要负责model落地,写pipeline等。只要看到要建模的,我一律跳过了。
  • Mle infra为主,这也是我之前不知道的地方,有一些mle是专门做pipeline和infra的,所以投了不少这些,这个岗位和自己的背景最合适;但是这个岗位一般要求工作经验很长,很多4+起,有些对工程能力要求很高。比如Lyft的要求会gRPC,和hr打电话就觉得不合适。
  • Sde 这个我不太了解,做的也可以五花八门。只有亚麻和gg给了我机会,可能还是大厂不太看相关的经验。
  • Sde-data 主要做etl,或者data infra,大数据框架为主,感觉类似于de,我也不太清楚区别,这个也拿到了些机会
  • de,主要就是etl,和上面的岗位可能有重合,考察方向主要是data warehouse,sql之类。

虽然确定了投sde,但是我发现一些sde(比如full stack)工作内容要求的我完全不会,而且兴趣也不是很大,无意中发现的有一些sde-ml infra和自己做的非常像,所以投了不少。别的方向也投,这个有点是前期的病急乱投医吧,后面自己也付出了一点代价。

投简历的情况
找工作的时候已经想好不做ds,所以ds相关的全都没有投。在地里内推板疯狂找内推,主要瞄准比较有名的startup和大公司,前期两周基本都找内推和linkedin上勾搭hr和hiring manager,一开始没有消息,后来一阵子陆陆续续收到了hr的联系。有趣的是几个面试几乎集中在几天来的,后来又安静了很久。

最终,大概精投了20多家公司的50+的岗位,开始面试后又海投了20+岗位,收到了16个hr的联系,只有两家是海投的,所以感觉还是内推+linkedin效果更好。当然等内推回应的时候很煎熬,还有linkedin不回复是常有的事情,也非常感谢内推板块,大家那么忙,还愿意抽空回简历。

所以最终拿到了:
  • Sde 两个
  • Sde-data/de 5个
  • Ml infra 8
  • Full stack ds 1个 (wish家hr挺有意思的,说觉得合适)


其中,一家小公司招一个engineer就回绝了;lyft不合适也没继续。别的都进入了下一轮。

面试情况
最终14家面试,除了一个hm纯聊天,亚麻的oa以外,其余都是coding为主的店面,挂了stripe和tiktok,twitch和hm开心的聊完,第二天说position filled;别的都拿到了onsite。

店面:coding的考察真是多种多样啊,刷题只是基础。像reddit和stripe都是practical coding,可能主要考察的是交流,写代码的习惯等等,面经还特别少,无法准备,其实也没必要准备,不需要特别的算法,主要看你思考的过程。其余还是比较正规的coding题,lc medium为主,也遇到过hard中的hard,比如snapchat。
但是难的虽然没做出最优解,面试官还是给过了,可能还是交流比较好,一直不放弃要hint,说自己的思路哈哈。店面后有些公司很快有回应,有些等了一周,甚至一周半,怀疑是不是被备胎了。

onsite:最终安排了六个onsite,想集中在三周解决,先到先得,后面陆陆续续来的onsite都暂时不安排了,实在太累。而且因为我自己作死,sde-data, ml infra考察的点都不一样,这时候才觉得自己太simple,给自己挖了巨大的坑,sde-data回考察data pipeline,spark,etl等等,而ml infra要考ml system design和system design,普通的sde要考ood/system design,要复习的太多,自己根本看不过来,把自己搞得特别累,东一拳头,西一榔头,复习到的可能还不考,时常发生。

比较幸运的是第一个onsite就拿到offer了,各方面觉得没有bug,就接了,后两周的面试全部推了。。。(不可取),所以真正也就参与了两个onsite,这方面能给的建议比较少。

最大的感触就是,de,mle,ml infra,sde考察的都是不一样的,最好早点明确方向。

经验
说点干货吧,也是自己走过来体会到的一些感触:
  • 什么时候开始都不晚,只要下定决心,就坚定地走下去;跳槽肯定是要放弃些娱乐时间的,而且双休日整段的时间更高效的复习
  • 要以open的心态来面对自己的职业道路,我真的不知道当时为啥傻傻地坚持走ds,没有考虑自身的情况
  • 越早开始越好,其实找工作的过程也是慢慢了解自己和行业的过程,看jd的过程也会发现哪个适合自己,对哪个感兴趣;等到真正开始投简历的时候,有些应对不足;不过这个可能也没办法,不真正面对的时候,自己可能也不会深入思考。(所以我在想刚入职的时候是不是就要有跳槽的心态了哈哈)
  • 积极找内推,linkedin上联系别人,不要觉得自己是在骚扰别人,别人不差你一个message;也不要自惭形秽,不要觉得自己不合适,就是要大胆地,尽可能多地展现自己的诚意和专业性。当然,态度一定好,包括找人内推,提前把信息准备好,也方便内推人
  • 平时要积累,面design相关面试的时候,真的觉得很多没法准备,没做过就是没经验,我不喜欢背东西,喜欢自然而然地流露,所以可能更需要平时的积累,如果你知道自己会面试design,工作中多从system 角度思考
  • 学会舍弃和平衡。越早确定自己是想做sde,de还是mle越好,因为真的考察的都是不同的东西,准备起来很累,不如有的放矢
  • 战线不要太长,从投简历,三月中旬有回音,到现在也一个多月了,我比较保守,一天一两个hr,陆陆续续聊了两周,然后开始店面,一天一个又陆陆续续脱了两周,其中复习了很久,一直对刷题没有自信,真正去面了才感觉其实多刷一个月(5 vs 6)也没有很大的改善了,除了越来越overfitting。很多practical coding比较需要发散性思维。当然按照自己的节奏来最重要,适合自己的最好。
  • 心态要稳,要自信,不怕失败。把面试当作学习交流的过程,也是你在体会公司文化的过程,失败不代表你这个人不行,而是不合适。不成功大不了就在原公司呆着呗。
  • Linkedin的premium感觉没啥用,一般愿意搭理你的人不会因为你不是premium而不理你,反之也是。所以我用了一个月就停了。
  • 不要太累,还是要劳逸结合,冥想,运动都有帮助,特别是现在都在家工作,心理上不要陷入死胡同,多和别人交流。
  • 简历让做sde的小伙伴看看,多用数字,体现结果,多放偏工程的项目上去。工作经历放开头。
  • 万事开头难,可以加入刷题群,或者找身边的小伙伴一起,互相监督,督促,等自己慢慢习惯了再自由发挥
  • 不是说100%准备好了才能开始投简历,我一开始计划两月份投简历,后来拖到了三月份,一直觉得自己刷题不到位;其实首先投简历到开始面试还会有一段时间,这段时间(差不多一个月不到)还有机会提高,千万不要小看厚积薄发的能力。
  • 既然决定跳槽了,工作上可以适当维持低效率工作(不被fire的前提下,毕竟工作是本钱),不要对自己划水产生负罪感,以专业的角度来思考,以对自己最有利的方式来做。
  • 跳槽路上最大的敌人是自己,不要和别人比较,完成自己的计划,只要自己比昨天懂一点都是进步。跳槽的过程挺痛苦的,容易想象别的事情简单容易快乐,可以适当放松,但是气可鼓不可泄也。
  • 面试要自信自信自信
  • bq可以早点准备起来,多想想story,怎么处理conflict,怎么trade off,怎么approach问题,很重要
  • 合理安排时间


感谢看完我的碎碎念,我知道一般接到第一个offer还应该继续,但是我基本准备从了,公司挺大的,而且专门做ml infra,和自己的兴趣更方面都挺符合,自己也很想去看看别的大公司是怎么做ml platform的,而且面试的时候觉得各方面很fit,hm对自己进去做什么也有规划。后面虽然也有做ml infra的公司,但是感觉没有这个好,de和sde的也不太想进行了,因为准备面试太累了,想赶快生活回到正常,我要求也不是很高。

最后想说,准备跳槽的过程真的挺痛苦的,再加上工作也不是很有价值,所以间歇性地会感到黑暗,没有出路,在那个时候才体会到什么是困难,成年人的世界就是充满了艰辛,当然世界上还有比跳槽更加难的事情。能做的就是在崩溃一百次之后继续站起来,刷题,复习,投简历,永远不要放弃,相信自己的付出会有收获。我一直相信痛苦的过程就是成长的过程,只要坚持下去,自己就会更强大,这一点在刷题和面试中体会最深。

当然有时候真需要一点运气,就相信越努力越幸运吧。人生奇妙的地方也在于,你觉得没希望了上天的眷顾会来一个好消息,如果没有好消息,就继续努力,前提是方向正确。
--------------------------------------------------------------------------------------------------------------------------------
最后的最后

现在回看,真的非常感谢去年下定决心跳槽并坚持下去的自己,换了个公司后,开始学习新的技术和工具,又有了朝气蓬勃的感觉。另外想说,不要只看到一个职业光鲜的一面,下决心转变之前多和别人交流,问问自己能不能受得了那个苦,一旦下定决心就坚持付出努力,肯定会有回报。希望大家都能够为自己的梦想努力,收获自己想要的offer!
  • 180
18条回复