写在前面
是的,今年的秋招确实是肉眼可见的难度增加:缩招、裁员、毕业生人数爆炸,这些关键字已然成为2023届秋招的代名词。竞争激烈,算法岗入坑的难度更是直线上升。卡第一学历、卡名校、卡重点实验室……这些“基本操作”早已司空见惯。
在卷成麻花的2022年,一个没有上述背景、没有名校撑腰的普通科班小硕能入坑中大厂的CV算法岗吗?
我的回答是:能,但是很难、很卷,且容错率较低。因为CV算法岗的竞争对手基本都在985分段,且动不动就是某C9高校的重点实验室。
因为身边的人不走算法岗,所以全程基本靠自己摸索,期间遇到了各种困难、走了许多弯路。为了记录这段有意义的经历,同时给自己一样出身普通的师弟们(实验室没有师妹)提供CV算法岗的就业思路,将本人的整个秋招的真实历程分享给大家。【长文警告↓↓↓】
导读
本篇文章主要分为以下几个章节:
- 【背景】,【历程】主要介绍了本人秋招前的状态,以及从研究生入学到秋招的过程。
- 【需要掌握的技能】从硬实力、软实力两个方面介绍秋招时可以增加自己竞争力的点。由于每个人的基础情况不同,CV算法岗也有较多细分方向,本章节仅供参考,大佬请直接略过。
- 【总结】秋招的一些小的建议。
补充说明:
- 阅读文章之前,请务必了解“幸存者偏差”这一概念,CV算法岗的秋招形式严峻,请保持理智。
- 本文的“普通”一词是指本科双非、硕士非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三种颜色 ,或许这就是缘分吧。
需要掌握的技能
硬实力篇
- 基础知识
入坑算法岗的基本功。推荐李航老师的《统计学习方法》以及周志华老师的西瓜书。入门深度学习推荐斯坦福《CS231N》课程(在B站上可以找到中文字幕版)。不太推荐一上来啃《深度学习》(花书),对小白不友好,但是后期可以当工具书使用。
确定了自己的研究 / 学习的方向后,可以在各类博客上找到对应方向大牛整理的paper list,选取一些经典必看的论文,并在Github中找到对应的源码阅读【一定要看源码,一定要看源码,一定要看源码】,面试的时候,资深的面试官经常会问一些细节问题,而只有你理解了源码是怎么实现的前提下,应对这些问题才能游刃有余。在学习时,要及时总结和整理,将论文里的知识精炼成自己笔记的过程,其实就相当于模拟回答面试官问题的过程。整理的东西多了,就变成的所谓的“八股文”,相较于开发,算法的面经更灵活,面试的问题也因人而异,一份属于自己的“八股”很重要,同时它也是实习和秋招面试前最有价值的复习资料。
- 实习
如果导师允许的话,【一定要尽早出去实习,一定要尽早出去实习,一定要尽早出去实习】。实习经历越丰富、实习公司的层次越高、实习的时间越久,你的竞争力越强。曾经有HR和我说过,CV算法岗的普通分段同学很少能进流程,如果没有实习经历,自己大概率会被淘汰。
PS:实验室不给实习的同学,也不要灰心,实习不是入职算法岗的必要条件,但是如果你但凡有机会实习,一定要好好把握。
- 项目
冷知识:在简历和面试中把自己的论文以项目的形式描述,面试官会更感兴趣。
“如果你发表的不是顶会,那么我更希望你用项目的形式叙述你的作品。”这是面试时一位面试官的原话。所以在这里,我把自己的论文归类为项目,且当我把论文以项目的形式更新到简历中,后面的面试会问到这部分工作的频率明显增加。
很多人觉得自己的项目可能不是那么出彩,觉得拿不出手。在这里完全可以打消这个顾虑,我们投的又不是天才少年计划,所以只要能把自己的项目讲明白,言之有理,都可以作为一个加分项。在面试前,一定要梳理好自己的项目,例如解决的问题、应用场景、创新点、难点、数据是怎么处理的、badcase是怎么优化的、后面还能改进的地方……讲项目的时候一定要自信、有条理,建议面试前可以多试讲几次录个音。
- 比赛
打比赛有两种策略:
第一种策略:运气好,碰到了自己熟悉方向的比赛,在比赛中尽可能刷高自己的名次。
第二种策略:只有自己感到陌生的方向(不过也是CV类比赛),用最快的时间上手该方向,然后尽可能深入,争取比赛中较好的排名。
我当时的运气并不好,没有遇到自己熟悉方向的比赛,所以选择了第二种策略。花了一个多月的时间,利用下班时间和周末的空当去打了场kaggle比赛,因为第一次参赛加上精力和水平有限,以一枚kaggle的铜牌收场(让各位路过的大佬见笑了)。但是面试时,向面试官展现快速上手陌生领域工作的能力,同时把自己的创新点以及解决问题的思路、所采用的方法都讲清楚,也是一个不错的加分项。
- 编程能力
老生常谈的问题,无论是笔试和面试,手撕代码都是不可或缺的一个环节,最有效提升自己编程能力的手段就是刷题。
因为自己在考研时就有深入学习过数据结构,且本科在打一些编程比赛时也有系统地练习过一段时间,所以基础还算比较扎实。如果编程基础比较差的话,推荐B站上一个up主分享的录播视频:LeetCode刷题班(C++)。这套课程时长在40多个小时,解题思路也符合普通选手的段位(基本没有花里胡哨的风骚解法),同时课程的深度和广度足以应对大部分的笔试和面试。
除了上述视频中的题目,力扣的《剑指offer》《热题Top100》系列也是很经典的题目。如果想按章节刷题,《代码随想录》也是不错的选择。一些高频题型或者自己第一遍没吃透的题目,最好再二刷三刷加深理解。自己的刷题量在300道左右(后期没有刷新的题目,而是二刷甚至三刷把算法吃透),属于中规中矩的水平,笔试中的hard题写起来有些吃力,但是面试中手撕代码基本都能A。
软技能篇
本章节是自己在实习中和组内大佬们工作、相处中总结出的一些内容,可能对大家的实习转正有帮助,也是我认为自己能拿到转正意向的一些重要因素。(因人而异,仅供参考)
- 表达能力
【搞CV,做出来的是东西,但东西是给人做的】认清这一点很重要,不要只沉浸在创作的过程中,要能把自己的想法、实现方式清晰明确地表达出来,别人才知道你这段时间在做什么,做出了什么。
千万不要自己明明做出了一些成果,却因为支支吾吾表达不清楚,让大家觉得你很水。要时刻牢记:无论我做了什么,只要是我自己做出来的,都能够给人讲明白。
- 沟通能力
【清晰地回答问题 & 高效地提问问题】,有效沟通主要体现在这两个方面。
大部分人都能做到前者,回答问题前,先大概想一下应该从哪些点来回答提问者的问题,不要想一出说一出,这样别人会认为你的逻辑很混乱。
这里重点介绍后者。首先,要明确什么问题可以问。举个例子,项目环境怎么搭建,或者百度上/公司内部文档能搜到的问题,自己费点心思解决就好。如果自己尝试解决但解决不了,那这种问题就很适合问。其次,问问题要有自己的思考,如果遇到一个不懂的问题,可以先说一下自己尝试解决这个问题的方法,以及自己的理解,然后指出到底哪里的细节不懂,这种情况对方一般很乐意解答。最后,问问题选准时机,如果你觉得这个问题对方需要花时间才解释清楚,就找个对方有空的时候(平时可以多观察一下你的mentor,看他一般啥时候不忙),因为有时候对方回答的比较敷衍可能确实是因为没有时间。
- 反馈能力
【自己完成的每一个阶段,都最好让别人心里有数】当手里有团队分配的任务时,最好定期向mentor反馈进度。这样你走的每一步都是可控的,如果你的想法不可行,可以得到及时纠正;如果发现当前的结果和预期有偏差,也可以及时发现问题所在。千万不要自己捣鼓来捣鼓去,到了deadline发现自己一点进展也没有,最后汇报工作时,你尴尬、你的mentor也尴尬。
- 自驱力
【主动探索问题的解决方式】在公司里,会发现大佬们的时间都很宝贵:没有人会像学校里的老板一样有时间整天盯着你干活,也不会有人时刻指点你这个项目该怎么做。优胜劣汰的环境下,只能靠自我驱动。
在几乎不靠别人帮助的前提下,自己主动提出正确、可行的解决方案,同时想办法用代码实现并取得成果 – 这本身就是一件可以证明自己能力的行为,同时积极主动解决问题的态度也更容易给人留下深刻印象。
- 逻辑思维能力
【思考问题尽可能清晰且有条理】简单来说,就是把每份任务都当做一个小论文去对待,做到像论文一样思路清晰、有条理,做每一件事都有自己的思考,有自己的路子。这个能力在研究生阶段或多或少都能得到锻炼,在这里就不再赘述了。
- 规划能力
【把一个大目标拆分为具体环节的能力】明确自己的目标以后,有清晰、可行的规划。
例如,为了完成秋招这一大目标,我把两年的时间拆成了多个阶段(详见历程章节)去实现目标;为了提升自己的竞争力,把CV算法工程师所需要的能力拆分成硬实力和软技能两大类,然后每个大类再拆分成具体的环节,逐一提升自己的能力。
- 执行力
【下了决心就马上去做,不拖泥带水】有些人之所以是思想上的巨人,行动上的弱者,主要是因为缺乏执行力(仅用于描述一些客观存在的人群,请勿对号入座)。克服懒、拖延这两个坏毛病,这一点自然而然就能做到。
总结
没有伞的孩子,必须努力奔跑。互联网的大环境变差,普通玩家的体验越来越糟糕,只有掌握过硬的本领,才能在凛冽的寒冬中生存,在恶劣的大环境中也能游刃有余。
要有自己的判断力,别人认为困难的事情,未必自己做不成。经常研究别人的凉经只会增加自己的精神内耗。
打铁还需自身硬。基础不牢,地动山摇。
能实习,尽早出去实习;不给实习,尽量争取实习;实在不能实习,取长补短弥补自己的实习经历空缺。
如果不能在某一方面做到出类拔萃,那么根据木桶原理,请尽可能做到面面俱到,包括但不限于硬实力和软实力。
秋招对于大部分人来说都不是一帆风顺的,要做好心理准备。自己也遇到了很多心态爆炸的经历(没写进去是因为太搞人心态),但能坚持熬过去就上岸了。
参考资料
https://www.bilibili.com/read/cv22243657/
https://zhuanlan.zhihu.com/p/576729164/