最近一年多在互联网行业的求职中经常出现这么一句话,叫做“面试造火箭,入职拧螺钉”,在很多人看来,自己费了好大的劲面试进了一家很不错的互联网大厂,但是进去之后发现做的事情都是一些很简单的事情,跟自己当初的想法有着非常大的区别,因此很多人都在感叹着自己是经历了造火箭的面试难度,去做着拧螺钉的活。但是为什么会出现这样的情况呢?下面我就来聊聊我在这件事情上的想法。
随着做算法的毕业生越来越多,企业对于候选人的要求也越来越高,导致很多时候一个公司的算法岗位可能也就是2个名额,却有上百名同学来竞争,对于一些一线互联网公司而言,甚至平均每一个名额就会有几百名同学投递,这也直接导致了面试难度的加大。而针对于这上百位投递的同学来讲,企业不可能每一位同学都会给到面试机会,那么这个时候就需要通过一系列的筛选机制,去剔除一些质量相对而言不是那么好的同学,因此,很多公司就会从2个方面来入手,第一个就是通过笔试题来筛选掉一部分同学,比如说一套试题的满分是100分,60分及格,那么低于60分的同学可能简历根本都到不了面试官的手里;第二个就是通过卡学历的方式来筛选掉一批,因此,我们可以经常看到在很多招聘的JD中选择要求是985的研究生毕业,或者要求有多少篇论文或比赛的经历也就是这个原因,然后剩下的简历就进入到了面试官的手里。一般来讲,在一次春招或秋招的过程中,每个岗位经过一系列的筛选之后,可能还会剩下几十名同学,那么这几十名通过就需要进入到面试环节,而这个面试过程在很多同学看来难度堪比造火箭。经历过最近两年春招和秋招的同学不难发现,近两年的招聘越来越难,而且基本上所有的公司都要经历笔试、机试甚至白板这么几个步骤,然后才能到面试官的最终面试,甚至在面试官的最终面试过程中也可能会让你在白板上手推公式和白板编码,可以说是太难了。其实之所以这么难,其根本原因在于岗位少,人数多,而大家都拼着命的往大厂去挤,因此会造成大厂人满为患的现象。而在面试的过程中,面试官实际上要考察的是应聘者以下3方面的能力。其实大部分的笔试题大家都会发现,真实难度并不是很难,基本上都是以经典的算法和数据结构基础为主,其实所考察的知识点也就是那么几个,但是在做笔试题的时候,题目中肯定不会特意的为你指明是要用什么算法来解这道题,或者说具体考察的是哪个知识点,更多的是把这些知识点揉在了一起,然后形成一道相对比较综合的题目来做。另外,大家可能也会发现,最近很多公司在笔试题的时候,无论你考的是什么岗位,所做的笔试题都是一些很基础的题目,并且这些题目和业务都没有什么关系,更多的都是大学里面的计算机基础知识,甚至还会包含一些操作系统和计算机网络等相关的知识。其实企业之所以这么设计,一方面是想照顾到大多数的同学(因为很多公司所有的开发岗都适用同一套试卷),另一方面就是想要考察同学的综合基础能力。那么为啥要考察基础题呢?实际上,在企业和在学校最大的不同就在于,在企业中我们很多时候不仅仅需要的是你对于自己所熟知的领域的掌握程度,很多时候我们更需要一些相对比较复合型的人才,因为一个真正的系统的落地,肯定也不仅仅是几个算法就能搞定的,这里面会涉及到一些与计算机底层调度相关的内容,比如说,如何去节省能存的开销,如何去优化服务使得时间复杂度更低,面对一些线上的任务,我们还会去考虑一些高并发相关的内容,而一般服务器我们都是使用Linux,这里面又会涉及到Linux服务器中关于用户最大文件限制等相关的内容,例如ulimit这个参数等,而当你服务上线前,还需要考虑到接口的调用方式和安全性问题,这些实际上和计算机网络、操作系统甚至数据结构这些基础性的内容都息息相关,因此,在一个企业中,尤其是比较大的企业中,面试时基础题是必考的。针对于这些必考的基础题来说,企业需要设置不同难度的题目来区分不同层级的学生,这也就是为什么有的题目比造火箭还要难。说白了,这些题目面试官并不是期待你一定能做出来,但是一旦做出来了,一定是在面试官眼里留下好的印象,也就是所谓的一些惊喜。编码能力可以说是所有与算法相关岗位一定会考察的一种题目类型。因为作为企业来讲,招你进来大部分就是要解决实际的业务问题,而这些业务问题都需要有一定的编码能力才可以完成,这里所说的编码能力不仅仅是大家在学校里所学习到的那些实验级的项目,更重要的是针对于实际的工程问题如何去解决。在企业面试中,考察一个人的编码能力最快也是最简单的办法就是让求职的同学现场写代码,大家会发现,现在让大家写代码并不是给你一个很具体的算法,让你去写里面的实现,而是给你一个比较有场景性的题目,然后让你去解决实际的问题,这两者从面试官的角度来讲是有本质的区别的。如果给你一个很具体的算法,让你写里面的实现,这个基本上大部分人都能够写得出来,只要提前准备一下,然后把常考的算法背一下,基本上问题都不大,比如写一个冒泡排序算法,写一个背包算法,这些都是不难的;但是如果要是只给你一个场景,并不告诉你实现需要用什么样的算法,这种难度相对来讲就要大很多了,甚至有些比较难的题目还会将两三个知识点融合在一起考,这种难度就更大了。大家在做很多笔试题的时候会发现,一般编程题都有3道甚至4道,并且每一道题的难度都不一样,呈递增的趋势,实际上,这就是企业要考察的点,企业是通过这种方式来知道一个求职者对算法的熟悉程度,以及编程的能力。因为,在规定的时间来完成这些比较难的题,确实,不是所有人都可以做到的,而真正都能做出来的,那么一定是求职者中的佼佼者。但是我想说,这里面实际上也是有一个隐藏的坑。大家虽然不能够把所有的题目都做完或者做对,但是一定要做到每一个题目都有思路,应该能够清楚的知道这个题目所考察的点,以及大致的解决思路,在这里给大家一个建议,当你觉得时间不够的时候,你可以在明知道答不完或者不能写出完整代码的题目中写清楚解题的思路,因为这也是面试官会看的一个地方。对于一个企业面试官,编程题并不是要得到一个准确的结果,更重要的是想知道你的解题的思路和过程,所以有时候,过程往往比结果更重要。在企业看来,只有具有良好的基础编程能力,才能更好更快的去学习新的知识,能够更容易去适应企业中的各种复杂的环境,而这样的人,也正是企业想要招的人。论文及算法能力对于一个AI领域的研究生同学来讲是必不可少的。这里的论文我们一般指所应聘的行业或细分领域相关的论文,这里的算法是指其业务算法。比如说,在NLP这个领域中就有很多优秀的论文和模型,比如Bert,Attention等,在面试官对求职者进行考察的时候,往往喜欢问这里面的一些实现的原理、论文的细节甚至里面的一些公式的推导。这些内容其实要想真正的掌握到很深的层次是非常难的,但是作为一名求职的同学来讲,虽然不要求理解里面的底层实现,但是对于底层的理解却是一定要有的。因为在面试官看来,只有理解到这里面的实现原理,等到进入到企业中,才能够很好的去理解业务逻辑中的应用,才能够更好的去做出相应的算法改进。另一方面,很多时候,我们在面试的时候要求手推公式,其中比较常考的一个点就是SVM和BP算法的手推,那么大家有没有想过,为什么这两个算法的手推考的这么频繁呢?为什么一定要考手推公式呢?实际上,手推公式的能力能够考察出一个同学对基础和底层的认识能力,而SVM和BP这两个算法实际上是众多算法的始祖。比如SVM算法是在解决分类,尤其是二分类问题上非常经典的一个算法,在深度学习还没有火起来的时候,大部分做分类任务都会用到SVM算法,而后面很多的算法也都是从SVM的基础上延伸而来,因此,SVM算法对于一个AI工程师来讲是必须要掌握的内容。而BP算法作为后面很多深度学习模型的基础,同样也是需要掌握的,因此,对这两个内容进行手推公式的要求,实际上并不是很过分。上面我们说了面试造火箭的问题,那么接下来我们再来聊聊为啥入职之后就要拧螺钉。昨天我在一个面试群里和同学们讨论了一下这个问题,有的同学不以为然,认为对于深度学习来讲,基本上都是在调用现成的框架,所以真正要展现编码能力或者算法能力的地方不是很多。实际上,有很多同学都有这样的想法,认为做深度学习和机器学习可能就是调用一下现成的包,然后搭建多层的模型,放到服务器上去跑,然后再上线,根本不需要什么代码能力,但是事实是这样吗?于是我和几个群里的小伙伴问了他几个很实际的问题:这个时候,大家有在想了,这个在实验室根本就接触不到,所以说我不会是正常的,这些东西都是工程上面所用到的内容,我是一个研究生,我做的事情应该和研究相关。其实我感觉,抱着这样心态的人不在少数,大家都认为自己的学历是研究生,所以就应该把主要的经历放在研究上,放在如何提高模型的效果上,但是,很多人没有看清楚的一个问题就是,大部分同学最后还是要回归到企业当中,而在企业当中,不仅仅需要你的研究能力,更需要的是与业务相关的工程化能力。面试造火箭,入职拧螺钉。这句话虽然经常被求职者拿来用,实际上站在一个企业的角度来讲更是如此。在我看来,一个企业辛辛苦苦的面试了一个同学,这个同学在面试的各个阶段都表现出了自己具有造火箭的能力,于是很高兴的将这位同学招进来,并且薪资还不低。结果,当这位同学进来之后,我们却发现他的能力只能做一些简单的事情,其实站在企业的角度来讲,这也是面试能力和入职之后所体现的能力出现了严重的不匹配,那么这个时候,又不能够把这个人辞退,那么怎么办?只能从一些基础的事情上做起,然后慢慢的成长,最后再把一块的内容交给他来做,从而达到能够承担起更重要的事情的程度。很多人在想,我感觉我的能力还不错啊,为什么你们却认为我的能力一般呢?实际上站在企业的角度来讲,当然希望能够招到一个能力不错的同学,但凡一个人能力比较强,那么谁还想招一个能力比较差的同学呢?但是我想说的是,在学校里面学的东西与实际企业中所用到的东西很多时候是脱节的。我们就拿一个最简单的数据处理来举例,在学校,我们一般都是去网上下载一些公开的数据集,而这些数据集小则几M,大则几个G,但是在企业中,往往每天生产系统中所产生的数据量就有几个G甚至几十个G了,而我们经常需要一次性处理一周或者一个月的数据,所以这样的数据量在学校是接触不到的,当我们还是去使用学生的思路来做的时候,就会发现,之前跑10个小时就能训练好的模型,现在要跑十几天,试问哪一个企业能够接受一个简单的模型需要十几天才能验证出一个结果的事实呢?我们拿比较简单的协同过滤这个算法来举例子,做过推荐系统的人都知道,协同过滤算法是推荐系统中的一个比较基础的算法,大家在做实验的时候,一般就是用作者所开源的论文来做复现,每次的效果都不错,于是乎,到了企业,大家也准备用这样的方式进行上线。可真正到了企业里,突然发现,我们用这种方法行不通,当我们使用10万个用户,100万个商品的时候,还没等协同过滤算法计算完相似度,我们就会发现内存爆掉了。于是我们加大内存,想尽各种办法去寻找内存的顶点,发现最后跑完这些需要160GB的内存,而且需要跑20个小时才能跑完,这对于老板来讲肯定是不可接受的,因为不可能因为你一个简单的协同过滤算法,就给你配一个160GB内存的机器,或者一个集群,在企业来看这是划不来的。但是实际上,真的需要这样吗?不是的。我们在企业中,针对于协同过滤算法可以优化的点太多太多了,用空间换内存,增量数据模型,增量训练,算法对角矩阵优化等等,每一个点都能够把时间复杂度和空间复杂度降低一个量级,真正到企业中,你会发现很多高级算法工程师能把160GB的内存开销降低到16GB以内,20个小时能降低到3个小时以内完成,为什么别人可以,你却不行?这实际上就是经验的问题。最后,我想告诉大家,不要再抱怨面试造火箭,入职拧螺钉了,很多时候,大家认为自己发了很多篇论文,有很多学术上的成果,但是在实际的工作中,我们要的是真正的企业落地,而企业落地与在学校真的是大不相同。因此,是企业在难为我,让我拧螺钉吗?不,说句不中听的话,是因为你的能力真的还达不到造火箭,甚至连点火箭的能力都达不到。最后给大家一个建议,面向企业编程,才能使未来的路走得更远。
获取一折本站知识星球优惠券,复制链接直接打开:
https://t.zsxq.com/662nyZF
本站qq群1003271085。
加入微信群请扫码进群(如果是博士或者准备读博士请说明):