大家好,我是大彬。
今年互联网寒冬,整个就业市场哀鸿遍野,有关于当前形势下计算机硕士如何找工作的问题。有一些还在学校的小伙伴也是比较发愁。今天看到一篇非常不错的文章,分享给大家。
在阅读之前,有一些前提需要说明:
文章分为观点篇和方法篇。
BigMoyan https://zhuanlan.zhihu.com/p/567878099
BigMoyan 的自述:无需知道太多,总之是有比较多面试经验(包括面试别人和被面试)的人就是了,我们还是从道理上看观点是否有益
0x00:招聘方希望从校招招到什么样的同学
不管是眼下的寒冬还是前些年的盛世,大厂的对校招同学的期望从未变过:我们始终想招具有快速成长潜力的同学。这是核心逻辑和第一优先级,因此这也就规定了你的目标:成为一个具有快速成长潜力的人,并在面试中表现出来。
对校招来说,招聘方不应期望从实验室刚出来的同学有什么业务洞察或特别的工程能力,也不应期望校招同学能达到来则能用的状态(即使能达到,也未必是最合适),一则不现实,二则给校招的钱也确实不配有这么多要求。
我知道你目前的水平也就那样,但谁TM不是从那个状态过来的呢?只要你能证明你值得培养,培养的出来,培养出来后真的能扛得了事儿,那就划算。
0x01:八股文和代码:耗时最多,其实最不重要
很多同学把准备面试、准备找工作等价于刷leetcode,背八股文。按照我的面试经验,这些耗时很大的工作往往是面试中最不重要的一环。
当然该准备还是要准备,常识性的东西答不上来,leetcode easy都写不出来,那也过于离谱。但说他最不重要是因为,一些八股文问题和代码问题,答不上来也不一定会怎么样。
开玩笑,你真当你的面试官随手都能AC一个leetcode hard吗?很可能连medium都A不了。很多搞AI算法的,代码题能磕磕绊绊写个DP就不错了。算法工程师的代码问题,往往只是看一下你很基础的思考方式和代码风格,确认下你多少还是个正经搞CS的,那就成了。
基本上我觉得能比较顺畅的过easy题,有medium题目的思路,有点计算复杂度的概念,能讲出问题的分析思路,编程语言层面上的理解到位,相关工具能够正确使用,那就够。
比起你已经知道的东西,证明“我能快速学会”更重要。
注意是“证明我能快速学会”,而不是“号称我能快速学会”。
例如,一个问题或一种概念你不了解,但你能够根据你已经有的知识猜测或推断出它是什么,应该具有什么样的性质,你能给出应该用什么关键词去检索能够获取的相关知识,能够设计什么实验来验证你的猜想。
0x02:关于paper:重要但是也没你想的那么重要
你以为你的顶会paper是用来证明自己的在某个领域的专业程度,以找到对口岗位的。
其实不是,它的唯一作用是证明“你在上一份工作中绩效表现优秀”,从而让公司觉得你接下来还会表现优秀。
因为如果你能做出世界级的创新工作,你应该不会来找工作。如果你像其他同学一样投简历找工作,大概率你的paper成色也就那样
可能在某一个细分领域的某一个技术点上有了不错的改进,但对公司来说有什么意义呢?
更不要提大部分的工作跟产业实践完全不能对口了,搞遥感图像的也要找工作,搞蛋白质结构的也要找工作,搞医学图像的也要找工作。你说一篇医学图像的顶会paper对淘宝抖音和拼多多有什么意义?
这个认识,大家是要有的。paper有一两个差不多的够证明自己就行了,这玩意边际效益递减,特别是你的paper是明显的一个系列、前后关联很大的时候(非常常见,一个好的会议文章改巴改巴投个期刊)。
0x03:人人都爱自驱
一线leaders有一次培训讨论一个问题:你最希望下属具有的素质是什么?排名第一就是自驱,这几乎是所有人的共识。
你需要证明你是一个自驱的人。你的paper可能是导师安排,师兄引导,薪火相传的结果,很多实验室在某些领域积累深厚,paper都是成系列的,在这种实验室,一个中人之姿也能做出不错的成绩,当然我认为这没什么,能考进这种实验室说明你也是很有水平的。
但脱离那个环境你还行吗?你能不能独自寻找问题,迎接挑战,持续自驱的做出成绩?
竞赛、开源代码建设、以及任何具有一定挑战性的,非标的经历都有助于帮助你证明这一点。例如你虽然本职工作是做AI方面的研究,但喜欢打游戏,因此自己尝试做了一个游戏还搞得有模有样。这个经历跟你要找的工作可能毫无关系,但他证明了你是自驱的,你总能通过持续的自我驱动去学习、研究、尝试,达到你的目标。
一个员工最牛逼的状态是“包的住事儿”,这样你的领导就可以做甩手掌柜。领导不管你,你也能搞定,这当然需要相当的能力,但起点至少是你能够主动动起来。
0x04:聪明vs勤奋
中国人是很推崇天道酬勤的,勤奋也是我很欣赏的一种天分。
但是很遗憾,聪明,而不是勤奋,是大厂面试中你最需要展现的特质。勤奋很容易伪装,很难持久,勤奋而无出色成果,则勤奋反而是减分项。
大厂的程序员是一份比较高端的工作,很多人从情绪出发,会对这个说法很不屑,但客观看,实际上一线大厂的骨干技术,所需要的综合能力是比较高的,它不能或很少能通过简单的勤奋达成。
越是高端的岗位,越是需要聪明,如果招聘方的目标是把你培养成骨干,那你是不是聪明就是一个很重要的考量维度。
聪明有很多种,我们常规认为的数理上的聪明未必是最重要的,实际上我认为,对公司来讲最重要的聪明是洞察力。越到后期的面试,越高级的面试官,越不会考察你代码写的怎么样,八股文背的怎么样。给你一个开放问题,你能不能理解出题人想要考察的方向,能不能正确建模问题,思考出合乎逻辑的解决方案,能不能正确评估方案的优缺点和瓶颈,能不能对后续迭代有一些想法?
洞察力最明显的一种体现就是建模和迁移能力,如果针对面试官的问题,你能回答出这两句话:
这个问题本质上是一个XXX问题 这个XXX问题与YYY问题的思路是相通的,我们可以基于YYY问题上的研究成果设计XXX问题的解决方案如下 那这会是很好的状态。
除了洞察,还有很多类型的聪明也很受欢迎。例如快速学习,归纳总结,逻辑推导。你可能需要reveiw一下,如果一定要说你自己很聪明的话,你哪里聪明?
0x05:沟通:一直都很重要
沟通。同样是越靠后的面试越重要。讲话啰嗦,词不达意,语言理解不畅,任何一个让面试官觉得“沟通不舒服”的点都可能直接导致你拿不到offer。
我要说的是,即使在hc相对宽松的前几年,也是如此,并不是因为hc紧了面试官吹毛求疵。
你的面试官大概率都是你以后工作的同事和领导,沟通顺滑与否直接决定你们未来的合作情况。大厂的算法员工都是非常昂贵的,所以团队其实不大,管理也相对精细,组织结构上相对大一些的团队,实际上也是分很多小方向支持各类业务。
人少,事多,所以一个人就要当一个人的用,你是个沟通黑洞,可能相关的一片业务就全完犊子。甚至因为你沟通能力的问题,整个团队都会受到效率影响,这是个非常致命的问题。
那些“做技术工作只要把技术搞好了就行”的想法是显而易见的谬误。我目前尚未见过任何一个人搞技术能搞到离了你公司不转业务停摆的,也许有,但肯定不是校招的各位。
公司的工作环境是合作和竞争,是团队作战。这个世界上没有真空中的球形程序员,有的只是一个个既要写代码,又要想算法,既要对接产品经理,又要对领导做汇报,既要管理下属和同事,又要管理领导和合作伙伴的真实的程序员。
越是HC收紧,招聘方越是要精打细算,你又能搞算法,又能搞工程,又能作为接口人去跨团队合作,那你性价比就很高。
0x06:性格:不是玄学
面试是很看匹配度的,所谓匹配度,一是你的自身素质和背景与当前的岗位需求是否匹配,二是你的性格特质与团队是否匹配。
很多时候后者的占比更重要。
我们曾经面试过一个纸面上非常优秀的候选人,名校毕业,paper有分量,在多个大厂有实习经历且实习期间都做出了很好的成果,实际面试后聪明度、理解力、工程能力样样拿得出手。
按理说这么优秀,offer肯定是稳的,但最后还是被毙了,原因主要是工作风格和价值观方面的,这种原因有点敏感,容易引起争论我就不详细讲了。但事实就是,你确实可能因为这种看起来很玄学的原因跟offer失之交臂。
总体而言,积极但有分寸,阳光但不幼稚,思想开放不偏激,有灵活度又不失原则的风格是比较能够获得认可,跟大部分团队匹配度都不差的。
简而言之,需要你思想正面,听话好带,讲道理能讲通。我们不必谈这是否是资本家控制劳苦大众的手段——也不必这么上纲上线。只谈一下换位思考,你是否也希望你的伙伴和队友是这样的人?
我们倒不必为了一个offer就强迫自己改头换面或者去做伪装,双向选择的事情。但我的确认为这样的性格对个人成长是有好处的,如果你也认为这是一种更好的状态,那去磨练自己的性格也是准备面试的一部分。
0x07:实习经历:关键实习经历很有帮助
我们一开始就说了,招聘方不应指望校招同学有多强的业务洞察和工程实践能力。
但如果你有呢?显然是一个加分项。
当然本身拿到有足够成色的实习offer也是比较难的,也算是实力证明的一部分,如果用实习经历作为找工作的关键要素,颇有点循环论证的意思,所以这里就不多讲大厂实习了。
实习经历需要下面两个点至少占一个:
实习的工作本身很难很有挑战性,你通过实习参与了实际的产业实践,了解了公司工作的套路方法、工具链,并且对业务有了一定认识和洞察。实习的工作本身未必特别难,但你做出了有特色的成果。如果你的实习经历让面试官觉得“这不就是XXXX这样搞一下就好了”?那多半不会在面试中体现出什么价值。
此外,与专业或工作领域无关的实习经历没有任何用处,是减分项,最好写都不要写。你告诉我你一个计算机硕士暑假去实习做电话客服,我会觉得你有病。关于简历上什么加分什么扣分,后面再细说。
最后,如果你的实习经历与团队需求高度吻合,恭喜你,很加分,但可遇不可求。
0x08:请回答下面的问题或练习
方法论是虚的,你需要有一些手段来诊断自己的准备情况,不妨请一位已经工作的有经验者作为你的模拟面试官,尝试回答下面的问题
上文讲了一些我关于校招同学找工作的观点。聊做参考。
也看了一些大家的反馈,其实主要的反馈点在于,很多人认为今年这个形势,你leetcode做不出hard连面试资格都没有(因为非常卷)。这里我无法向你做什么保证,因为每个公司在这方面要求确实会有所不同,但有几个点我还是愿意分享一下:
但见仁见智,这些认识未必对,但相对于求职者的反馈,我更希望看到更多面试官的反馈,来分享你们团队对算法同学的代码能力有何种要求。
毕竟选择知乎这样一个平台来分享,当然是相信大家的水平,相信评论区要比正文更精彩。
这一篇务实一点,讲一下具体应该怎么准备找工作,同样有几点要写在前头:
0x00:硬实力:算法基础与CS基础
开篇先打脸,尽管在上一篇中我已经讲了,八股文用处不太大,但那是对八股文和代码问题不太大同学而言的,所要指出的是,如果你的八股文水平和代码水平已经尚可,就不要花太多时间再进一步精益求精了。
现在来定义什么叫八股文尚可(其实是很优秀了):
0x01:硬实力:代码题
继续来自我打脸,上一篇仍然讲了代码题并非那么重要,但同样,如果你从来没做过代码题,那必然也是过于离谱导致无法通过面试的。
如果你不是ACM选手,只是单纯为了准备招聘而练习代码,那我认为代码的程度,以leetcode medium为上限即可,追求过于高的代码水平边际收益不高(除非你要面试谷歌这种)
具体练习也有讲究,我认为以下面两类问题为比较重要:
以下问题无需花时间练习:
练习代码题请注意如下几点:
0x02:硬实力:paper
没什么好说的,这不是临时抱佛脚能抱来的东西,这里只提一点:
0x03:硬实力:实习
如有可能,应该积极寻求大厂相似岗位的实习,如果不清楚自己要找什么工作,应积极寻求大厂的算法实习,不要太在意具体做什么。
绝对避免做无意义的实习,所谓无意义,指的是这段实习经历不能写在简历上,写上了就扣分。
找实习的面试准备与应届生面试准备大体相同,但有一点例外:
这一点跟你老板的风格相关,因此这引出了对准研究生的一个建议:
0x04:准备简历
首先,找到建议你“简历最好控制在一页”的人,打一顿。
这种狗屁说法由来已久,以至于现在已经很难知道出处。我猜原因可能是纸质的简历页数多了容易丢,但互联网目前已经很难看到纸质简历了。
但可以确定的是,它确实是狗屁说法。你的简历不需要控制在一页,简明扼要把你的主要情况表现出来即可,经历过于牛逼的整个三四页也没问题。
下面是一份简历准备的注意事项,以下各项在简历上有顺序关系
简历准备的核心要义,有以下几点:
0x05:面试:讲解项目
这一条是面试最重要的部分,而且不管是几面都要陈述的。之所以不放在硬实力的部分,是因为相对于“有一个不错的项目”,”讲一个不错的项目“更重要。
而”讲一个不错的项目“有时候并不需要”有一个不错的项目“作为前提。
对照你的简历,找到一个相对而言比较好的项目,所谓比较好的项目:
列入如下内容,如果可能,准备文本:
讲解项目要达到下面的程度:
特别是第一条,有的同学把项目的重点总是放在算法细节上,这对于方向跟你一致、背景跟你相似的面试官而言是合适的,但对大部分面试官不合适。我如果连你构建的场景和问题都没有代入,基本上就不用谈对你的算法有什么看法了,更无法理解其中的精妙之处。如果我对你所说的名词没有一个基本认知,连算法都无从谈起。
算法的精妙需要大量的背景和前序知识铺垫,带着面试官进入场景,分析问题,让你的solution自然而然浮现,这是比较好的状态。
第二条的练习方式上一篇文章也有提,就是找比较有经验的人去挑战你,给你的解决方案提供一个alternative的方案,你来对面试官的方案做评价。
讲得清楚才说明理解的到位,讲不清楚,就是没理解。
0x06:面试:开放问题
开放问题实际上是AI算法岗位要面试的重点,由于是开放问题,反而不好做准备,所以这里是比较见功夫的。开放问题主要考察这些内容:
所谓业务问题的抽象,指的是你能不能抓住主要矛盾,忽略次要矛盾,把一个产品经理提来的,笼统的需求转换为一个算法问题。
所谓可行性评估,指的是对于这个算法问题,你所需要的资源是否是可接受的,你所需要的前置算法是否是存在或满足需求的。
所谓沟通,就是对你所不掌握的情况,你是否会主动确认,在整个解决问题的过程中,与面试官有良性互动。
开放问题还有一个特点,就是如果你答的不错,你自己是知道的,有一种”我的思路很对头“的感觉。
我曾经遇到的一个比较好的开放问题是:某业务希望以发满减红包的形式促进用户回流,问如何设计红包的金额方案在给定预算下拉尽量多的用户回来。
大家可以试试,这个问题我也没有答案,所以不用问我了,自己思考自己评估即可。
另外一个有参考答案的开放问题见苏神的博客 “熵”不起:从熵、最大熵原理到最大熵模型(二) - 科学空间|Scientific Spaces 中提到的快餐店消费分布的估算问题,虽然这不是真实的业务问题,但也绝不是脑筋急转弯。
btw, @苏剑林 的博客建议所有算法工程师全篇通读,记得多多打赏,在我所认识的同龄人里,这位所展现出来的聪明度和勤奋度是首屈一指的。
0x07:面试:应对挑战
挑战包括对项目的挑战,也包括一些意外情况,这里没有套路和技巧了,只有一些方法论。
0x08:尾声
这篇小总结乃是翻某个知乎问题的回答,看了大家哀鸿遍野的感叹,所做的一点个人的小总结。其实我并不参加今年校招,所总结的未必正确。其中有些建议,似更加适合低年级的同学,因为仓促之间难见提升。有些知易行难,因为常年养成的说话做事习惯本性难移,即使想伪装也伪装不来。
真是事到临头才准备,那所能临时补救的,可能也就是八股文和代码题了,在这上面用功倒也无可厚非。
一个算法工程师应该是什么样?我以为这个角色应该是产品中最懂算法的,码农中最懂业务的,科学家中最懂工程的,工程师里最懂理论的。这样一个处在交界地中的角色,既能够有深刻的业务洞察明晰价值,又有足够的工程能力应付落地,又有足够的科学素养调研推导,从而成为一个“擅长理解问题和解决问题”的人。解决业务问题若成为算法工程师之核心价值,那这样的人选该有什么样的素质和天分,该以什么样的题目和形式进行考核,也就不问而知了。