APP下载

“算法”offer之“解”

2021-11-25刘金翰

大学生 2021年11期
关键词:大厂面试官代码

刘金翰

我与算法的相识

我本科是学数学的,考研时班里大概分为两个方向,一部分是继续考本专业的研究生,另一部分则是跨专业考金融、计算机之类的研究生。我当时并不想一直从事基础数学的研究,又觉得跨考计算机难度大,无法将自己数学专业的优势发挥出来,所以最终选择了统计方向。一是因为感兴趣,二是因为统计方向专业课和数学的相关性很大。考研期间,我并没有透彻了解应用统计专业的就业范围。

研究生入学后,师兄师姐介绍说,统计专业的就业岗位大部分都是公务员、教师、读博等,读此专业的女生比较多,找的工作大多偏稳定一些。当然,最对口的岗位还是数据分析师和算法工程师。师兄师姐补充说,比较优秀的同学可以去尝试一下算法行业,薪资待遇特别高而且发展前景好。就是在这个时候,我才第一次知道算法工程师岗位。

读研期间,上了讨论班后,我开始真正接触到一些基础的算法。学习一种新算法的流程大致是:了解算法理论,然后用严谨的数学公式进行推导,之后需要代码化,把算法通过程序展现出来,那时候我们是用R语言和Matlab语言实现。最后,要通过数据来训练我们的模型,用合适的指标来检验模型的效果。上述完成后,反过来再去总结这个算法的优劣、可延展性及与其他同类算法对比。

我逐渐对算法有了大概认知,算法有严谨的数学理论,可以用程序实现复杂模型,训练好的模型可以很好地解决业务问题,且每年在顶级期刊都有此领域的前沿论文发表,学习资源相当丰富。我开始对算法产生了浓厚兴趣。

定下目标,精准规划

研一时,由于师兄师姐几乎没有从事算法岗的,我对算法岗所需要的必备技能,都是通过招聘信息了解到的,相对比较局限。当时,我比较确定的是,扎实的算法理论和一门编程语言,这二者是必备的。

整個研一,除了专业课和准备讨论班学习外,我都在努力学习算法理论和编程语言。编程语言方面,我选择了当时主流的一些机器学习框架所用的Python语言。对于算法的初学者而言,最大的困惑就是,我该学什么,该从哪里学?由于机器学习当时已经火一段时间了,所以面对众多的书籍、教学视频,选择变成了接下来学习的关键。

书籍方面,机器学习部分,我选择了李航老师的《统计机器学习》和周志华老师的《机器学习》。深度学习部分,我选择了入门级的《Neural Networks and Deep Learning》和人尽皆知的《Deep Learning》。

教学视频方面,我选择了吴恩达老师的系列入门视频,还有台湾林轩田和李宏毅老师的视频。为了补充CV和NLP理论,我还学习了斯坦福大学的公开课CS231n和CS224n。

Python学习方面,我推荐《Python简明教程》,这本书很基础,适合任何没有编程背景的人去学习。另外还有一本《机器学习实战》,用Python实现了许多机器学习算法,既能学习Python,还能巩固理论。

当然,我看的书远不止这些,上述提及的只是一些入门书籍。除此之外,还要多关注前沿技术,多读论文,对于不懂的地方,要刨根问底。当初学习SVM时,我不明白KKT条件从何而来,为此专门去学习了中国科学技术大学的公开课《凸优化理论》,此课程详细讲解了凸优化中的KKT条件的推导过程。

我还有一个习惯就是记笔记,由于算法学习的理论部分很繁杂,所以我并没有将每一个机器学习或者深度学习算法都完整记录下来,而是将一些我认为很重要的部分或者一些容易遗忘的疑难点记下来。比如LSTM、Transformer的结构细节,FM、FFM、DeepFM系列算法等。记笔记很费时间,但是的确为我当时查漏补缺和复习带来了极大的帮助。研一结束前,我按部就班完成了自己规划的全部内容。

没有退路,迎难而上

研二时,我有了出去实习的念头,因为我知道实习对于秋招的重要性,得开始准备简历了。刚开始我一头雾水,没人指导,只能自己一点一点地去搜寻信息。这期间我上了很多招聘类网站,社群交流里有很多人的面试经历以及背景描述,对我的帮助很大。

我总结出,一份出彩的简历里一般要具有四项内容:好的学校、顶级会议论文、大厂实习经历、竞赛Top名次。这四项中至少得有两项,才有较大机会进入面试。而且,面试还会考代码题,就是现场让你写代码,考官出题。因为之前我都不知道有此环节,所以压根没有准备过。面对算法岗位的高门槛,我是有想过放弃的,打算转数据分析岗位面试,数据分析是不用考这些的。最终,我还是选择了迎难而上。

此时,摆在我面前的两大难题,一是如何丰富自己的经历,让简历达到能够进入面试的标准,二是怎么准备写代码的面试环节。

针对第一点,我很快就做出了计划,首先就是大厂实习,还有就是发论文和竞赛。但我感觉我很难做到论文、比赛两手抓,在只能选一个的情况下,我选择了参加算法比赛这条路。

算法竞赛我主要参加了Kaggle和阿里天池这两个平台的,后期也参加过一些小平台的。比赛初期,我连题目都看不明白,通过练手Kaggle上一些已经开源的比赛(即已经结束且公开了部分解决方案的比赛),逐渐找到了感觉,同时也掌握了常规机器学习框架和深度学习框架的使用。我花费大量的时间在比赛上,阅读别人的代码,完成一个又一个已经开源的比赛。我逐渐开启了自己的竞赛之路,从2020年10月开始,直到2021年3月,我天天都在比赛,取得了一些不错的成绩,在Kaggle上拿过1%和2%,在阿里天池也进过Top10,还有其他算法平台的Top5。竞赛给我带来的,不仅是简历的丰富,还有能力的提升。每一次竞赛,从拿到问题到给出模型,加上后期指标优化,这一系列的流程让我更加熟悉如何用算法去解决实际问题。

对于第二点——写代码,让当时的我很头疼。我只有浅薄的C语言基础,早已忘记二叉树、链表、堆栈之类的数据结构,也从未了解过递归、DFS、BFS、动态规划之类的解题方法。这导致当时的我啥都要学,啥都没学明白,在LeetCode上做一道题得花半天时间,对于计算机类专业的科班生来说,这些都是基础,复习下就行了。于我一个此专业的学生而言,只能一点一点地去啃下这块硬骨头。

我总结出,一份出彩的简历里一般要具有四项内容:好的学校、顶级会议论文、大厂实习经历、竞赛T o p名次。这四项中至少得有两项,才有较大机会进入面试。

当时,我看了很多关于数据结构的书,对着书把各种数据结构的代码都写了一遍,看完算是刚刚入门了,但这还远远不够,因为还是做不出来题。考虑时间成本,后来我选择了直接通过刷题来提高自己。因为每一道题,都有大量题解,可能你死磕一下午的一道题,会在看到某个优秀题解的一瞬间恍然大悟,这样既节省了时间,又快速学习到了最优解法。不过,这种方法建议在学习初期用,因为见效快,可以建立自信,等到后期自己能力上来了,就可以不看题解去解代码题了,这样就形成了能力提升的一种正向循环。

2021年3月初,我边投实习简历,边刷LeetCode和《剑指Offer》,重复做了很多遍高频面试题。当时想的是,尽量在出到原题或者类似题时,能够快速解出来。

很快我迎来了我的第一个面试——字节跳动,从投递简历到面试,时间间隔很短,我匆匆复习了理论知识,又复盘了下比赛,就上“战场”了,结果可想而知,落败了。这是我人生中的第一次面试,太过紧张,表现很差,感觉自己话都没说明白,两道算法题只答对了一道。

我投遞了所有大厂的提前批,大部分大厂的算法岗,我都通过了简历筛选,得到了面试机会。

之后,我不再立马投简历了,而是拿出机器学习理论笔记,把每一个算法的每一处细节都搞懂,并且用自己的语言表达出来,简历上的比赛又梳理了一遍。与此同时,也没有把刷题落下。等自己感觉准备好了的时候,我开始投第二波简历,简历的投递也更有针对性,主要投递机器学习数据挖掘和搜索推荐算法。

我拿到的第一个offer是滴滴的,当时面试的难度并不低,所以通过面试给了我很大的信心,接下来的面试我都顺利通过,先后拿到了网易、腾讯、华为的算法offer。

秋招之旅

拿到实习offer后,我4月就去实习了。从校园初入职场,我体会到了互联网工作的高强度,再加上算法岗的具体工作和自己想象中有很大差距,这些让我有很强的不适应感,但好在最后坚持下来了。

当时,我面临一个所有实习生都会面临的问题,如果努力工作,可能会获得转正机会,这样就可以在秋招中提前收获offer,这应该是每一个在大厂实习的同学的期许,哪怕最后不选择这个offer,也想有个保底。但转正一般和秋招是同步进行的,而且不可能等到秋招来临再准备复习吧,所以,如果既要保证高质量的工作产出,又要抽出时间来复习,这可能会导致两头空。

我最终选择了放弃转正,全力以赴准备秋招。秋招前,我保持着高强度的刷题,对于理论和项目部分,因为面试实习时已经准备过了,所以很快就拾起来了。当时我的简历上已经有算法竞赛的Top名次、大厂实习经历、985研究生学历。

我投递了所有大厂的提前批,大部分大厂的算法岗,我都通过了简历筛选,得到了面试机会。很多同学都说秋招面试会比实习面试更难,但我感觉,相较实习面试,自己秋招面试时更加从容。基本上每一次面试,我都可以对答如流,跟面试官形成一种交流的状态,而不是你问我答。面试的大厂里,除了有个别面试因为算法题没写出来而败了,其余的基本都给我发了offer,且offer的等级都是special offer及以上的,有些公司还给了北京户口指标。

我在9月之前结束了我的秋招之旅,总结下来,我认为秋招中,有几点比较重要:

第一,搞定代码题,这是重中之重。面试算法岗,如果算法题没有写对或者没有最优解,那么基本上就败了。这需要根据自身情况制定具体计划。

第二,在掌握机器学习和深度学习理论基础之上,赋予自己的理解,这可以在面试中加不少分。比如,一个算法可以从数学统计角度去解释,或者一个算法的优化可以从业务需要的角度去解释等。只要你能说出跟别的面试者不一样的答案,且能引起面试官的共鸣,那么面试官就会觉得你理解得更深更好,而不是像其他面试者只是在重复网上的答案。

第三,沟通表达能力是一项重要的考核标准。我在面试中有个小技巧,就是把复杂的项目简单化,虽然听上去会让人觉得这个项目的技术性没那么强,但是这更利于我表达和阐述,至少让面试官听懂你在做的项目到底是什么。当然,这些都是可以随机应变的,根据面试官的反应来决定你项目的阐述方式,如果面试官很快就领会了你的项目背景和技术,那么你可以把复杂化的部分加进去,反之则不加。面试期间要保持清晰且有效的沟通。

第四,态度不容忽视,要让面试官感受到你的诚意,在许多同水平候选者横向比较时,更愿意把offer给你。

责任编辑:丁莉莎

猜你喜欢

大厂面试官代码
耿 直
广西大厂铜坑锡多金属矿床Pb同位素组成对成矿物质来源的示踪
广西大厂91、92号锡多金属矿体的成矿构造特征
应聘
创世代码
创世代码
创世代码
创世代码
我是小小面试官
IS COMPREHENSIBLE INPUT NECESSARY AND SUFFICIENT FOR SLA?