首页 > 非科班算法秋招历程+经验分享
头像
CH从头酷到脚
编辑于 2020-12-24 14:04
+ 关注

非科班算法秋招历程+经验分享

「临渊羡鱼,不如退而结网。

个人背景

楼主非科班,美硕,2020年底毕业。强冲算法岗,非常幸运能上岸。本文记录了自己这几个月秋招的经历和心得体会,给自己做一次梳理,也给后来的同学们一点参考。

我的秋招之路

本人从大三开始,以及硕士第一年的过程中都是想读博的,感兴趣的方向是智能交通与机器学习/优化,于是我从19年秋季开学前就提前来了学校找做相关方向的老师打工,经历了短暂地切换研究项目之后,从9月份开始跟着CS的PhD一步步地做一个CV目标检测的项目,坚持每周组会,每周推进进度,一直到今年的8月份才放下工作,全身心投入秋招。

想要留本校读博需要考过一次 Preliminary Exam(下称 Prelim),并且找到愿意带我的老板和funding,就可以顺利续上四五年的湾区生活。但是今年突如其来的疫情导致学校从3月开始全面网课,我和老师的交流仅仅局限于网络,非常不方便,学校财政的骤然缩减也给我继续读博的funding带来了很大的不确定性。很幸运的是,在联系完若干金主之后,我终于找到了合适的老板和 funding source,等到考完 Prelim 就可以继续读博了。

事与愿违的是,在五月份的 Prelim 考试中,我并没有很好地向委员会解释清楚做这项研究的意义,以及对于交通领域真正的贡献是什么。委员会很贴心地给了我第二次考试机会,让我好好准备,并且可以在暑假或者秋季学期结束前提出重考。五月底收到邮件的时候,觉得挺难过的,恰好房子合约到期,颓了两天就收拾东西搬去新公寓了。

六月七月上了一门 AI 的 Summer Session,周一到周四上课,每周还有讨论和作业,以及4个独立完成的大作业。中间依然保持了有空就做项目的习惯,依然每周组会,每周汇报。不同的是,我在一直思考,我为什么要做这个项目,这段研究经历能对我 Prelim 考试起到多大的帮助作用。进入8月的时候猛然发现自己总是低头忙碌地工作,到头来自己个人能力的增长却很有限,不知是否因为我还没进组,还是疫情使得大家的沟通变难,暑假期间自己得到的老师指导也近乎于无。我知道这不是我想要的科研生活。在和几个好友打了若干个电话之后,我决定转头转码找工作了。在梳理了一遍自己上过的所有CS课程,包括基础的编程语言,到数据结构和算法,以及机器学习凸优化等,结合自己本科以及研究生期间的几段科研,我决定自己的秋招求职方向是算法工程师

说干就干,8月2号我去买了一个月的 LeetCode 会员,从最简单的 2Sum 开始刷起。代码方面从数据结构开始刷,到各种结题技巧,动态规划等等,一边刷一边总结相似题目(可惜9月之后事情实在太多,刷题就放在一旁了)。

整个8月都在忙着刷题,刷教材,投简历。为了尽快建立面试答题的体系,我刷完了《机器学习》西瓜书、Stuart Russell 的 《Artificial Intelligence》、《百面机器学习》等,深度学习的花书用来看某些重要的知识点。我的刷书过程是连续阅读相关的好几章,然后回头做一遍总结,这样加深了一次印象,也知道自己在哪一块用语言描述的时候不够简洁清晰,能仔细梳理一遍。(PS. 1. 详细的学习路线在后文有提。2. 李航老师的《统计学习方法》据说也是算法工程师必备,可惜我并没有这本教材)

从8月底到9月中旬是各家笔试面试的高峰期,由于时差的原因,我经常凌晨4点起来参加笔试(北京时间晚上7点),6点做完倒头继续睡。同时由于秋季也已经开学,本学期三门 EECS 的硬课也实在难啃。几周下来,睡眠质量下降,白天精神状态不好只能靠咖啡硬撑。所幸的是,随着笔试和面试次数的增加,我积累了更多的临场经验,在笔试时不再强行要求自己一次 AC,很多时候可以先写出可行解,然后不断考虑各种边缘情况,能抢一分是一分。面试方面,在自我介绍和项目上逐渐做到烂熟于心,在遇到不会的问题时也把自己对于问题的理解尽量讲明白,而不会一字不答尴尬冷场。

阿里巴巴是我秋招面试的第一家公司,笔试完大概两周开始收到了面试。从一面到三面,面试的重心逐渐从机器学习和代码基础向科研项目转移。到了交叉面的时候,我交叉到了一位其他BU的算法大佬,在回答几个项目相关的问题时没有说服他,很可惜地折戟交叉面。不过每次面试之后,我都会记录面试中自己遇到的新问题,没有思考到的点。很感谢阿里给我这次面试机会,第一次秋招面阿里能冲到交叉面其实也给了我一些经验和信心。

美团是在9月初参加的笔试,不知道是不是比较幸运,那场笔试的题目都是我刷过的类型题,所以几乎全AC了。笔试两周后收到了面试,总共面了三轮技术+一轮HR,面完大概就到10月下旬了。美团给我印象很深刻的一点是,在面试到第三轮技术leader的时候,听完我的项目介绍,问了三个问题,我觉得点踩得都非常好,是我自己之前没有想到的地方。这点让我觉得大佬就是厉害,而且态度随和,好感度上升。面完HR面一周后,我给HR发微信催了一下进度,当天就收到了意向书,第二天就收到带薪offer了。

其他

腾讯和华为是我投的唯二两家开发岗,腾讯一面挂,华为后来转到算法岗了,但是已经11月中了,懒得面了。拼多多算法笔试挂,转数分的面试我拒了。字节面了推荐算法,结果一面挂。我秋招投的唯一一家国企是深交研,三轮面试,offer是CV相关的岗位。除此之外,还有几个小厂的offer,不提了。

心态调整与方向选择

  • 心态:

秋招过程中的心态调整真的很重要。我的理解是:对于没到来的笔试面试拿出严肃紧迫的心态去准备,已经结束的(不管好坏)都尽量不让他们影响自己。

有很多人都会说:没事,慢慢来,总能找到一份工作的。这种说法是用来安慰某次笔试或者面试失利的同学,但绝对不要让自己一直都有这种心态参与秋招。相比于科班出身的同学而言,非科班的同学起步已经晚了,如果想要拿到一份理想的大厂offer,就要明白自己的竞争对手是那群科班同学,自己必须付出更多的努力才能获得和别人一样的成果。如果我们不保持这种紧迫的心态,不断学习和前进的话,很多到手的机会也只会白白流失。

同时,**不要放弃任何一个机会。**在秋招进行到中后期的时候,我比较后悔的一点是自己秋招投简历投的晚,有好几家已经结束了。我第一家面的是阿里,应该先去面一些小厂积累经验,了解一下面试中会遇到的问题和套路,这样可能会更顺利一点。

关于心态的最后一点,**崩溃是常有的事情,接纳和感受这种情绪,并且学会排解它。**没有人的秋招是一帆风顺的,我也在秋招过程中遇到过想要放弃的时候。和家人聊天,和朋友互倒苦水,或者去健身房撸铁之后冲个热水澡,找到自己的排解方式,才能让自己尽快回到积极的心态中,继续远征。

  • 方向:

选定自己最有优势的方向,不轻易做选择,但是做出选择就不畏首畏尾。

很多人问我到底是找算法还是开发,算法是不是卷中卷,客户端开发是不是最容易。我在刚决定秋招找工作的时候也有过这样的困惑。我第一次投腾讯就是客户端开发,面过一轮之后,我发现面试里面非常多的问题都很底层,并没看过这些源码的我只会一些八股文。我知道如果继续走开发,我的简历是处在劣势的。所以我果断转了算法,并且对简历进行了进一步的包装。

我觉得没有必要刚开始的时候就限制死自己的方向,不要因为别人说哪个简单就去哪个了,那是别人结合自己的经历做出的判断和选择。你要根据自己的经历和目标,在发展的过程中不断思考,才能找准自己的方向。至少在互联网秋招这条路上,只要你愿意并且确实付出了比别人多的努力,就有机会和希望能够达成自己的目标。在发展和思考的过程中,不要害怕向前辈咨询,不要吝啬和同侪探讨,看看大家的想法有哪些对于自己是有帮助的,也给予别人一点帮助。

学习路线

以下是我的学习路线,如果求职方向不同,还得根据自己的需要进行调整。总体的思路是:打好基础,了解相关,掌握核心。

前提:本人非科班,湾区研究生,授课型项目,故能腾出一些精力上相关课程。

打好基础:

数据结构和算法的学习是最基础的,我学的是UCB的 CS61B Data Structure 和 CS170 Algorithms。61B 虽说是数据结构,但也会覆盖一些算法,YouTube和b站应该都有资源。CS170 是一门纯探讨算法的课程,甚至很少涉及到代码实现。对于转专业申算法岗的小伙伴,计算机网络和操作系统不是必需的课程。编程语言方面,Python 和 java/C++ 应该要掌握的,在面试时一般不会限制语言。

数学基础也是非常重要的。我本科使用的线性代数教材为同济大学的那本紫皮书,我印象里开头直接讲行列式,然后向量、矩阵,线性方程组等等。当时靠着死记硬背和努力刷题,期末拿个满分也搞不懂这些东西有啥用。这本书的体系结构我觉得设置不合理,讲课也停留在几十年前的那种填鸭式做题上。强烈推荐 MIT 的 Linear Algebra 课程,YouTube或者b站都有资源,老爷子讲得非常好,上完之后有一种豁然开朗的感觉,原来线代是这么一回事!据我所知,国内一些高校也已经开始使用 MIT 的线代教材和课程设置,比如清华和上科大等等,我觉得应该也能找到相应的中文资源。

了解相关:

机器学习相关的知识涉及的领域非常广泛,大数据,CV,NLP,推荐系统等等。作为校招生,我们不可能对于每一个领域的知识都了解非常深入,所以对于这些相关的领域要有了解,一些常用到的工具或者 packages 能使用就更好了。

掌握核心:

掌握核心指的是掌握相应岗位的核心知识和技能。一般的JD里面都会写某个岗位要求的知识和技能是什么。对于机器学习而言,从传统的 SVM 和 LR ,到神经网络,决策树,集成学习等等都是需要掌握的知识。在学习过程中,我非常不推荐以面试为导向,以网络博客和知乎为主要学习途径。这些博客中的知识真实性并没有经过检验,系统性也不够,所以还是以经典的教材为主,入门的有西瓜书、李航老师的《统计学习方法》、《深度学习》花书等。优化可以看斯坦福的《Convex Optimization》,或是UCB的《Optimization Models》。

课程方面,我主要修了EECS 227A (优化),CS 188 (AI), CS 289A (ML),顺便把吴恩达的网课刷了一遍。

进阶一些的书籍如 ESL、PRML 等,按需食用即可。一般在面试中也会问到一些比较前沿的或者业界常用的,比如GBDT等等,这个也需要自己看书补充。

一点碎碎念

本文主要讲了自己备战秋招过程中的经历和一点心得,没来得及按照不同的板块准备面经和划重点。我想再强调一下,每个人的经历和职业方向都不同,但是核心思路是一样的,建议大家前期把精力和时间放在基础知识上,这样对于后面进阶知识的学习和面经的准备都是事半功倍的。

如果你看到了这里,非常感谢你的耐心,上面的一些想法如果能对你有一点点帮助,我就非常开心了。如果你有问题与我交流,欢迎通过邮件联系我:ch_hao@berkeley.edu

「千里之行,始于足下。与君共勉。

更多模拟面试

全部评论

(3) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期精华帖

热门推荐