【学术人生】普通段位玩家的CV算法岗上岸之路(2023届秋招)

当你初入江湖,迷茫不知道该干什么的时候,不妨去模仿前人是如何进行科研的,并从中归纳出最适合自己的道路。为此,我们推出“学术人生”专栏,介绍科研的方法与经验,为你的科研学习提供帮助,敬请关注。

写在前面

是的,今年的秋招确实是肉眼可见的难度增加:缩招、裁员、毕业生人数爆炸,这些关键字已然成为2023届秋招的代名词。竞争激烈,算法岗入坑的难度更是直线上升。卡第一学历、卡名校、卡重点实验室……这些“基本操作”早已司空见惯。

在卷成麻花的2022年,一个没有上述背景、没有名校撑腰的普通科班小硕能入坑中大厂的CV算法岗吗?

我的回答是:能,但是很难、很卷,且容错率较低。因为CV算法岗的竞争对手基本都在985分段,且动不动就是某C9高校的重点实验室。

因为身边的人不走算法岗,所以全程基本靠自己摸索,期间遇到了各种困难、走了许多弯路。为了记录这段有意义的经历,同时给自己一样出身普通的师弟们(实验室没有师妹)提供CV算法岗的就业思路,将本人的整个秋招的真实历程分享给大家。【长文警告↓↓↓】

导读:

本篇文章主要分为以下几个章节:

  • 【背景】,【历程】主要介绍了本人秋招前的状态,以及从研究生入学到秋招的过程。

  • 【需要掌握的技能】从硬实力、软实力两个方面介绍秋招时可以增加自己竞争力的点。由于每个人的基础情况不同,CV算法岗也有较多细分方向,本章节仅供参考,大佬请直接略过。

  • 【总结】秋招的一些小的建议。

补充说明:
1. 阅读文章之前,请务必了解“幸存者偏差”这一概念,CV算法岗的秋招形式严峻,请保持理智。
2. 本文的“普通”一词是指本科双非、硕士非985、非重点实验室、无顶会、投递岗位为CV算法岗的计算机科班应届研究生,并无冒犯之意。

背景

概述:

本人本科双非软件工程专业,硕士普通211的计算机技术专业,目前研究方向是计算机视觉。

秋招拿到【虹软、vivo、OPPO三家offer,均为计算机视觉类(CV)算法岗,有SP也有大白菜】(除去国企银行),和大佬们的offer没得比,但感觉基本接近自己的预期。(虽然已于9月获得虹软转正意向书,为了给自己的秋招不留遗憾,同时可以通过不同的offer明确自己在秋招大军的整体定位,所以坚持完整参与了秋招)。

具体情况:

  • 身边的环境

除了我的大大大师兄(高我三四届)拿了某中厂算法offer以外,我们实验室就再也没有人走过算法岗。包括同门在内的同届同学,也基本都是开发。师兄和同学也都劝退我走算法,改开发。

在我找到第一份算法实习之前,大部分人都认为我选择这条路是一个头铁且愚蠢的行为,且常听到阴阳怪气的言论。

每次刷知乎,总能看到“19年算法岗供大于求”、“20年算法岗诸神黄昏”、“21年算法岗灰飞烟灭”,今年又换了个四字词语 –“人间炼狱”。各路“过来人”也都是全方位劝退。

好在自己的家人比较支持我自己做决定,只不过最后选择offer的时候,家人们曾劝我躺平一个随手拿的国企,放弃自己的专业,我要真想躺平还用的着这么卷么,大无语。

总之,身边自始至终支持我走算法岗的,四舍五入就只剩自己了。没关系,意料之中罢了。

  • 自己拥有的一些条件

导师不会push我们给他发论文,且只要完成规定的任务,就允许我们自己出去找实习。【秋招上岸的关键性因素】

实验室有免费使用的入门级计算资源,虽然只是1080Ti这种级别的显卡,且当时还要和师兄一起用。但是拿来学习跑跑实验还是绰绰有余的。同时家里赞助更新了一台2060GPU的笔记本,用来本地调试也挺好使。

学校的线下课程在研一期间全部上完,研一课程结束就可以做实习早鸟。

历程

本节按照时间线的顺序,叙述了本人历时两年的秋招战线。

【初识算法】2020年9月~2020年10月

结束摆烂、确定方向阶段。研究生入学,之前联系的导师莫名其妙把我鸽 了,不得不重新找导师。

我的选择标准有两个:一是教授,二是允许实习。在本科国奖托底和自己死皮赖脸的坚持下,我现在的导师给加了一个名额,顺利入组。

导师给我明确了CV的研究方向,同时分享了一些资料(因为才学疏浅,当时没能看懂,后面就跑去B站知乎学习了),每周组会汇报自己的学习进度。也是这个时候发现自己对CV挺感兴趣的,也是初生牛犊不怕虎,确定自己走算法岗的方向。

【走出迷茫】2020年11月~2021年2月

夯实基础阶段。因为导师安排的任务主要偏学术,我也意识到:如果仅仅靠导师的指导、按部就班的学习就去找算法岗工作,是远远不够的。于是,自己找到了一位前辈指点自己系统地入门深度学习。之后制定学习计划、学习基础铺垫知识、筛选和阅读paper、debug源码、参照已开源的工作来复现未开源的论文……在完成导师布置的任务之余,花了大量时间,算是搞明白深度学习的路子了。在此期间,完成导师安排的项目、自己找一些开源的项目补充学习,可以加深自己的理解同时还能润色简历。

因为搞算法除了python的基本要求外,C++多少也要会一些。也是从这个时候,制定了刷力扣的长期计划,强迫自己学习C++,编程题也全部用C++写。刷题不求多,但重在把思维和语法熟练度锻炼好。

【稳扎稳打】2021年3月~2021年5月

备战实习阶段。过年给自己放了半个月假,开始着手找第一段实习。听了师兄的建议(当时师兄在鹅厂实习搞开发,respect),开始刷牛客面经,查漏补缺,力扣保证一周刷七题。

同时系统地整理之前学习的笔记,也是这个时候我写了知乎的第一篇博客,并立下了一年写完50篇技术博客的flag(已于2022年4月达成)。

【初露锋芒】2021年5月~2021年6月

第一段实习的投递、面试阶段。第一次投实习没有经验,先投了一些难度拉满的大厂:商汤、字节都给了面试,但是面得稀烂,商汤的面试官更是在无coding题的情况下问了我两个小时的问题,面试结束后当场自闭。

后来总结了面试失败的经验,也补上了自己面试中没有答出来的知识点。现在想想,当时的我真的是愚蠢至极,就应该先面小厂,积累面试经验,起码不至于面试过后脏了自己的大厂面评(因为秋招的时候,这两家秒挂我的简历,应该是自己作没的 )。

经历了十多场面试,也积累了足够的经验,最终自己如愿拿到了vivo AI研究院的算法岗实习offer。

【渐入佳境】2021年7月~2022年1月

第一段实习。在我的软磨硬泡下,导师先是同意我出去实习半年(美滋滋)。

入职以后,令人窒息的压力接憧而至:老大给我的研究方向是神经网络结构搜索(NAS)方向 — 一个自己从来没听说过的预研方向,与此同时,同组的实习生来自武大,还比我早来一个月,需要尽快跟进她的进度。于是,自己白天调研相关工作、复现一些论文、慢慢接手项目,晚上加班读源码、刷博客(卷到了旁边的实习生,实在抱歉)。第一个月顶着压力,总算把进度拉上来,项目步入正轨。

9月,恰好看到Kaggle有个CV新赛,恰好这时候蓝厂取消大小周,于是就报名参加了。之后差不多两个月的时间,白天赶项目,晚上和周末搞比赛。

11月,项目需要优化的模型计算量首次降低到100M以下,同时比赛也拿到了铜牌(第一次参赛,拉胯的成绩,但尽力了)。

后面的时间就是边实习边准备开题,顺利完成了实习阶段的任务,拿到了口头转正(可惜AI研究院今年不招人,靠自己重新走流程拿的影像算法部,权衡了一下,还是想待在自己熟悉且喜欢的组),与nice的同事们告别。

【一波三折】2022年2月~2022年5月

向导师争取了第二次实习的机会,开始着手准备暑期实习,同时和之前实习的武大同学合作一篇论文。但没高兴多久,上海的疫情就爆发了,几乎整个上海的实习HC都没了,与此同时学校疫情封楼,天天牢饭吃到心态爆炸,差点想转开发(庆幸自己没转)。

虽然有了一段大厂实习经历,但找第二段实习甚至更艰难:收到一堆海笔,只收到了三家面试(某周的周一面了美团,面试官很nice,面试也顺利,他还表达了希望我面试通过后早点过去实习,结果周五反手收到个感谢信☺)。磕磕绊绊拿到了第二份offer — 虹软的计算机视觉算法岗实习。

【稳中求胜】2022年5月~2022年9月初

第二段实习。这次研究方向是视线检测,因为在蓝厂的实习积累了许多项目经验,所以无论是搭环境还是上手项目都很快。

我们组所有的实习生每周都会单独开个周会,可以了解大家的进展,同时还能偷学一些技巧,因此在这边自己成长的速度很快。和我搭档的实习生是天大的,我俩都做视线方向,经常一起讨论项目中遇到的难点,如我mentor所说,1+1 > 2,无论是实习还是秋招,找个伴共同进步总好过孤军奋战。

7月~9月初,工作时间肝项目,下班以后的空闲时间刷题、刷面经,准备转正答辩,投提前批(算法提前批卡学校,基本全泡池子),投秋招,基本每天搞到11点才休息(转正名额有限,不敢做赌狗)。8月底顺利通过转正答辩,9月初拿到了虹软为数不多的转正意向书。

【冲刺终点】2022年9月~2022年10月

收获的季节。实习结束,导师召回返校,一边做导师安排的工作一边搞秋招。

总共笔试了二三十家公司,面了六七家(因为不是985、研究方向有差异,也被拒了蛮多)。最后到手虹绿蓝三家offer,于十月中旬尘埃落定。平时经常做RGB图像算法,没想到拿的offer也刚好涵盖RGB三种颜色 ,或许这就是缘分吧。

需要掌握的技能

硬实力篇

1. 基础知识

入坑算法岗的基本功。推荐李航老师的《统计学习方法》以及周志华老师的西瓜书。入门深度学习推荐斯坦福《CS231N》课程(在B站上可以找到中文字幕版)。不太推荐一上来啃《深度学习》(花书),对小白不友好,但是后期可以当工具书使用。

确定了自己的研究 / 学习的方向后,可以在各类博客上找到对应方向大牛整理的paper list,选取一些经典必看的论文,并在Github中找到对应的源码阅读【一定要看源码,一定要看源码,一定要看源码】,面试的时候,资深的面试官经常会问一些细节问题,而只有你理解了源码是怎么实现的前提下,应对这些问题才能游刃有余。在学习时,要及时总结和整理,将论文里的知识精炼成自己笔记的过程,其实就相当于模拟回答面试官问题的过程。整理的东西多了,就变成的所谓的“八股文”,相较于开发,算法的面经更灵活,面试的问题也因人而异,一份属于自己的“八股”很重要,同时它也是实习和秋招面试前最有价值的复习资料。

2. 实习

如果导师允许的话,【一定要尽早出去实习,一定要尽早出去实习,一定要尽早出去实习】。实习经历越丰富、实习公司的层次越高、实习的时间越久,你的竞争力越强。曾经有HR和我说过,CV算法岗的普通分段同学很少能进流程,如果没有实习经历,自己大概率会被淘汰。

PS:实验室不给实习的同学,也不要灰心,实习不是入职算法岗的必要条件,但是如果你但凡有机会实习,一定要好好把握。

3. 项目

冷知识:在简历和面试中把自己的论文以项目的形式描述,面试官会更感兴趣。

“如果你发表的不是顶会,那么我更希望你用项目的形式叙述你的作品。”这是面试时一位面试官的原话。所以在这里,我把自己的论文归类为项目,且当我把论文以项目的形式更新到简历中,后面的面试会问到这部分工作的频率明显增加。

很多人觉得自己的项目可能不是那么出彩,觉得拿不出手。在这里完全可以打消这个顾虑,我们投的又不是天才少年计划,所以只要能把自己的项目讲明白,言之有理,都可以作为一个加分项。在面试前,一定要梳理好自己的项目,例如解决的问题、应用场景、创新点、难点、数据是怎么处理的、badcase是怎么优化的、后面还能改进的地方……讲项目的时候一定要自信、有条理,建议面试前可以多试讲几次录个音。

4. 比赛

打比赛有两种策略:

第一种策略:运气好,碰到了自己熟悉方向的比赛,在比赛中尽可能刷高自己的名次。

第二种策略:只有自己感到陌生的方向(不过也是CV类比赛),用最快的时间上手该方向,然后尽可能深入,争取比赛中较好的排名。

我当时的运气并不好,没有遇到自己熟悉方向的比赛,所以选择了第二种策略。花了一个多月的时间,利用下班时间和周末的空当去打了场kaggle比赛,因为第一次参赛加上精力和水平有限,以一枚kaggle的铜牌收场(让各位路过的大佬见笑了)。但是面试时,向面试官展现快速上手陌生领域工作的能力,同时把自己的创新点以及解决问题的思路、所采用的方法都讲清楚,也是一个不错的加分项。

5. 编程能力

老生常谈的问题,无论是笔试和面试,手撕代码都是不可或缺的一个环节,最有效提升自己编程能力的手段就是刷题。

因为自己在考研时就有深入学习过数据结构,且本科在打一些编程比赛时也有系统地练习过一段时间,所以基础还算比较扎实。如果编程基础比较差的话,推荐B站上一个up主分享的录播视频:LeetCode刷题班(C++)。这套课程时长在40多个小时,解题思路也符合普通选手的段位(基本没有花里胡哨的风骚解法),同时课程的深度和广度足以应对大部分的笔试和面试。

除了上述视频中的题目,力扣的《剑指offer》《热题Top100》系列也是很经典的题目。如果想按章节刷题,《代码随想录》也是不错的选择。一些高频题型或者自己第一遍没吃透的题目,最好再二刷三刷加深理解。自己的刷题量在300道左右(后期没有刷新的题目,而是二刷甚至三刷把算法吃透),属于中规中矩的水平,笔试中的hard题写起来有些吃力,但是面试中手撕代码基本都能A。

软技能篇

本章节是自己在实习中和组内大佬们工作、相处中总结出的一些内容,可能对大家的实习转正有帮助,也是我认为自己能拿到转正意向的一些重要因素。(因人而异,仅供参考)

1. 表达能力

【搞CV,做出来的是东西,但东西是给人做的】认清这一点很重要,不要只沉浸在创作的过程中,要能把自己的想法、实现方式清晰明确地表达出来,别人才知道你这段时间在做什么,做出了什么。

千万不要自己明明做出了一些成果,却因为支支吾吾表达不清楚,让大家觉得你很水。要时刻牢记:无论我做了什么,只要是我自己做出来的,都能够给人讲明白。

2. 沟通能力

【清晰地回答问题 & 高效地提问问题】,有效沟通主要体现在这两个方面。

大部分人都能做到前者,回答问题前,先大概想一下应该从哪些点来回答提问者的问题,不要想一出说一出,这样别人会认为你的逻辑很混乱。

这里重点介绍后者。首先,要明确什么问题可以问。举个例子,项目环境怎么搭建,或者百度上/公司内部文档能搜到的问题,自己费点心思解决就好。如果自己尝试解决但解决不了,那这种问题就很适合问。其次,问问题要有自己的思考,如果遇到一个不懂的问题,可以先说一下自己尝试解决这个问题的方法,以及自己的理解,然后指出到底哪里的细节不懂,这种情况对方一般很乐意解答。最后,问问题选准时机,如果你觉得这个问题对方需要花时间才解释清楚,就找个对方有空的时候(平时可以多观察一下你的mentor,看他一般啥时候不忙),因为有时候对方回答的比较敷衍可能确实是因为没有时间。

3. 反馈能力

【自己完成的每一个阶段,都最好让别人心里有数】当手里有团队分配的任务时,最好定期向mentor反馈进度。这样你走的每一步都是可控的,如果你的想法不可行,可以得到及时纠正;如果发现当前的结果和预期有偏差,也可以及时发现问题所在。千万不要自己捣鼓来捣鼓去,到了deadline发现自己一点进展也没有,最后汇报工作时,你尴尬、你的mentor也尴尬。

4. 自驱力【主动探索问题的解决方式】在公司里,会发现大佬们的时间都很宝贵:没有人会像学校里的老板一样有时间整天盯着你干活,也不会有人时刻指点你这个项目该怎么做。优胜劣汰的环境下,只能靠自我驱动。

在几乎不靠别人帮助的前提下,自己主动提出正确、可行的解决方案,同时想办法用代码实现并取得成果 — 这本身就是一件可以证明自己能力的行为,同时积极主动解决问题的态度也更容易给人留下深刻印象。

5. 逻辑思维能力

【思考问题尽可能清晰且有条理】简单来说,就是把每份任务都当做一个小论文去对待,做到像论文一样思路清晰、有条理,做每一件事都有自己的思考,有自己的路子。这个能力在研究生阶段或多或少都能得到锻炼,在这里就不再赘述了。

6. 规划能力

【把一个大目标拆分为具体环节的能力】明确自己的目标以后,有清晰、可行的规划。

例如,为了完成秋招这一大目标,我把两年的时间拆成了多个阶段(详见历程章节)去实现目标;为了提升自己的竞争力,把CV算法工程师所需要的能力拆分成硬实力和软技能两大类,然后每个大类再拆分成具体的环节,逐一提升自己的能力。

7. 执行力

【下了决心就马上去做,不拖泥带水】有些人之所以是思想上的巨人,行动上的弱者,主要是因为缺乏执行力(仅用于描述一些客观存在的人群,请勿对号入座)。克服懒、拖延这两个坏毛病,这一点自然而然就能做到。

总结

1. 没有伞的孩子,必须努力奔跑。互联网的大环境变差,普通玩家的体验越来越糟糕,只有掌握过硬的本领,才能在凛冽的寒冬中生存,在恶劣的大环境中也能游刃有余。

2. 要有自己的判断力,别人认为困难的事情,未必自己做不成。经常研究别人的凉经只会增加自己的精神内耗。

3. 打铁还需自身硬。基础不牢,地动山摇。

4. 能实习,尽早出去实习;不给实习,尽量争取实习;实在不能实习,取长补短弥补自己的实习经历空缺。

5. 如果不能在某一方面做到出类拔萃,那么根据木桶原理,请尽可能做到面面俱到,包括但不限于硬实力和软实力。

6. 秋招对于大部分人来说都不是一帆风顺的,要做好心理准备。自己也遇到了很多心态爆炸的经历(没写进去是因为太搞人心态),但能坚持熬过去就上岸了。

写在最后

本文详细介绍了自己秋招上岸CV算法岗的全过程,除了自己努力的因素外,还不乏选择、运气、机遇等不确定因素的加持,仅供各位读者参考,在选择就业方向时请保持理智(大佬请随意)。预祝各位还在秋招的同学们顺利拿到自己心仪的offer。

特别感谢自己遇到的一些贵人(按时间顺序):

  1. 我本科所在学院的院长。和清华博后最近距离的一段时间,也是自己成长最迅速的一段时间。

  2. 我的研究生导师。宝藏导师,给了我两次、共计十个月的实习时间。

  3. DeepLearningGoGoGo前辈。技术扎实的大佬,自己入门深度学习的加速器。

  4. 两次实习的老大和mentor们。现实中的伯乐,把我从菜鸡堆里捞出来, 如果没有这两段丰富的实习经历加持,我应该还在秋招池子里泡澡。

此外,还要感谢vivo AI研究院和虹软nice的同事们、和我一起实习的其他实习生伙伴,以及秋招路上曾帮助过我的人。完结撒花✨。克服懒惰,花了17天时间,每天抽一个小时完成了本篇的超长经验贴,谨以纪念自己长达两年的秋招战线,希望帮助到更多还在犹豫是否入坑算法岗的同学,同时可能也是本年度封笔的文章了。如果你觉得这篇文章有帮助的话,请多多点赞转发,希望可以帮助到更多有需要的人。

来源:知乎—记忆的迷谷

地址:https://zhuanlan.zhihu.com/p/576729164

资源下载: