面试与工作差距大,程序员从准备到拿Offer全攻略
Posted CSDN资讯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试与工作差距大,程序员从准备到拿Offer全攻略相关的知识,希望对你有一定的参考价值。
作者 | Nisarg Shah
译者 | 弯月
出品 | CSDN(ID:CSDNnews)
迄今为止我没有参加过任何面试,也不知道这是幸运还是不幸。本文是根据我作为面试官在经历了 40 多场面试后,总结出来的经验,我一共发出过大约 25 个 offer。
流程总结
高级软件工程职位(以及其他相关角色,如数据工程和机器学习工程)的竞争非常激烈,你需要认真地准备,并勤加练习。编程面试题一般都不会出现在日常工作中。这可能是软件工程岗位的面试与其他领域最大的不同。
面试的流程大致为:
准备面试,包括刷编程考试题以及提高系统设计技能。
设法获取推荐信,或联系招聘人员,或直接去公司网站申请职位。
如果拿到回复,则需要按照以下顺序接受面试:
a.招聘人员联系你,确定职位以及面试日期。在这个阶段也可以讨论薪资待遇。
b.电话筛选:只有一轮面试,通常包括编程测试。
c.现场面试:一系列的编程、设计与行为考察,一般面试你的人很可能会成为将来的同事。
d.拿到录取通知。
比较各家的录取通知,然后逐个协商。
接受一家公司,拒绝掉其他公司。选择一个正式上班的日期。
流程的详细步骤
下面,我们来总结面试的各个阶段,以及我们将在每个阶段讨论的内容:
准备:在面试之前或刚递交简历时需要考虑的事情。你需要做好心理准备。
热身:面试要求的基础知识,准备编程测试。
练习:认真准备,联系公司和招聘人员。
面试:各个面试阶段的技巧。
交涉条件:最关键的一步,所有投入到准备中的时间都将在此刻体现出来。
接受录取通知:终点线。
面试结束后:关于结束当前工作的一些建议。
下面,我们就来仔细谈一谈每个阶段,以及与之相关的思维方式和面试相关活动。
准备
动机
问问自己:“我为什么要找新工作?”
你必须清楚自己寻求改变的原因。虽然不需要什么伟大或具体的目标,但既然你已决定花费大量时间准备、计划和面试,那么肯定是有原因的。你应该弄清楚这个原因。
只有找到这样的动机,你才有勇气面对被人拒绝,并努力做好各项准备。
选择编程语言
为了在编程面试中脱颖而出,你必须选择一门自己擅长的编程语言。以下是在选择编程语言的时候,需要考虑的一些事项。
角色或职位特有的限制。
你需要根据申请的角色类型,选择一门最合适的语言。对于大多数软件工程角色来说,任何语言都可以。但是如果你申请的职位是 ios 开发或高频交易技术岗位,则面试中能够使用的语言可能并没有太大选择。
选择自己最擅长的编程语言。
选择自己熟悉的语言可以节省学习另一门语言的时间,减少在编程面试中出错的机会,而且万一遇到有关语言细节的问题(比如 Java 的线程或 Python 的全局解释器锁),你也不用担心。
简洁的语言
我强烈推荐你选择一种富有表现力且非常简洁的语言,即便不是你最熟悉的语言。比如,Python 比 C++ 更好。在 30分钟的编程测试中,在白板上书写代码时,实现相同逻辑的解决方案,Python 之类的语言可以大幅减少代码行数。
其次,简洁的编程语言更方便面试官理解逻辑,也能让你更快地发现小错误。
讲一个小故事:在读研究生期间,有一次参加某家热门公司的实习面试,虽然我找到了解决方案,但来不及写完代码。最后面试官坦言,这个问题太复杂了,对于没有见过该题的人,使用Java等语言在25分钟之内编写出完整的方案的确非常困难,同时他还推荐了 Python。但这家公司依然拒绝了我!从那以后,我就换成了 Python,因此我强烈推荐 Python。
你不必为了面试深入学习某种语言。在上述实习面试中,当时我最喜欢的语言是 Java,我对面试官明确地说我也使用 Python,因为它很简洁,但我不了解 Python 的细节,我很乐意编写解决方案并回答有关 Java 的问题。
争取多个offer
我强烈建议你努力争取拿到多家公司的录取通知。
多份录取通知在手,你就更有底气与对方协商更好的薪酬。通常招聘人员会收集有关其他 offer 的详细信息,以便为你争取更好的薪酬。即便你一门心思只想进一家公司,拿到另一家公司的录取通知也有助于你获得更高的薪资。
参加不同公司的面试,可以让你深入了解不同的工作文化、公司使命以及不同团队的工作内容。这是一个很难得的机会,可能会影响到你当前或未来的职业发展决定。
当手头的某个录取通知快要到期的时候,如果你还在参加面试,而手头的另一份录取通知书距离截止期限还有时间,你就可以简单地拒掉前一个。当我因到期而拒绝掉某个录取通知时,一般对方都会延长时间。
在填写申请和参加面试的过程中,你的名字会记入招聘人员的系统。即便你没有通过面试,将来他们也有可能再次联系你,这样可以方便你安排面试。有些公司会根据你过去的表现,跳过电话面试,甚至免去几轮面试。
多个录取通知在手,你就可以灵活地做出更明智的选择。也许异地的某个选择目前并不重要,但将来可能会很重要,而且你还可以灵活地选择在哪个城市工作。
更新简历
将新参加的项目和收获的经验添加到简历中。除非你申请是的研究人员,而且需要展示你所有的论文,否则请将简历压缩到一页。
如果你参加过的项目很多,一页纸装不下,则可以考虑保留哪些内容以及删除哪些内容:
关联度
突出显示与你申请的职位相关的技术与项目。对于机器学习工程职位来说,android 项目的经验没有任何帮助性。
影响力
突出显示能够展示你的职责范围、设计技能、指标完成度、项目或人员管理技能的项目。最好能包含可量化的信息。这些信息可以凸显你的技术娴熟度以及水平,比使用流行语更有成效。
时效性
虽然学校的项目也很了不起,但招聘经理对你现在所做的工作更感兴趣。
公司的项目比个人项目更好,除非你的个人项目是在开源中开发的,并且具有重大的影响或被广泛采用。原因是,企业项目有更严格的截止日期、资金风险,而人员与团队的合作也更具挑战。
可见性
展示公司以外的人可以看到的工作成果,比如向开源项目贡献代码,或发表论文、公司新闻公告等。
请注意,面试官可能会问到有关简历中包含的项目的问题。你必须做好准备,说明确切的职责,并回答有关项目的具体问题。
在准备面试的过程中,你需要不断更新简历。可能距离你上次更新简历已经过了很久了。
系统设计
系统设计需要的准备比较少,因为大多数经验都来自工作,以及阅读有关该领域最新发展的博客、文章和论文。与编程面试相比,系统设计面试的重要性取决于你申请的职位。
从准备的角度来看,最好不要一次性做好所有准备。相反,从开始准备到正式参加面试,你可以考虑:
阅读有关设计的书籍
Martin Kleppmann 的著作《Designing Data-IntensiveApplications》是一本关于如何提高设计技能的佳作。
有关面试的在线资源
donnemartin 的 System Design Primer 是一个很好的阅读资源,可以帮助你快速回顾基础设施系统的基本设计原则。
阅读有关系统设计的论文或文章
https://paperswithcode.com:AI 论文精选
https://blog.acolyer.org
The Morning Paper
技术博客
http://highscalability.com
Netflix 的博客
几乎每个科技公司都有自己的博客,你可以选择自己喜欢的阅读。
热身
刷编程题
鉴于如今编程面试的压力非常大,刷编程题成为了面试准备中最耗时的工作。因此,我建议尽快开始做准备,调整好心态,熟悉考题界面。
你可以选择一些非常流行的编程测试网站,或专门的编程面试准备网站。
Leetcode:https://leetcode.com/
Hackerrank:https://www.hackerrank.com/
CodeWars:https://www.codewars.com/
我建议你从最简单的题目开始。即使你读完问题就能立即想到解决方案,也要试着去编写代码。你会惊讶于一个简单的问题可能有多少边缘情况。
通常,我会做一些简单的题目,直到觉得它们太简单。我可以通过这种练习学习如何覆盖所有的边缘情况,并且不需要太多思考。如果你觉得这一步太简单,可以直接跳过。
你想获得什么?
列出你梦寐以求的工作应具备的优点。按照优先顺序排列。以下是一些需要考虑的方面。
团队文化、经理、项目、机遇
薪资
学习机会
职业发展机会
理想职位、等级
业务领域(产品、基础设施、机器学习)
地理位置
工作与生活的平衡
个人品牌建设或声誉
当然还有很多方面。当你拿到多个录取通知时,就会很难做决定,每家公司都有各自的优缺点。整理一份你参加面试的原因,以及你真正希望获得怎样的工作,可以帮助你在日后做决定。
你想去哪里?
通常我会列出所有我想去的地方。不要觉得自己在异想天开。你只需要将这些公司的名字写下来,敢于尝试才能改变自己的职业发展。
挨个查看你一直想去的所有公司,看看他们都有哪些空缺职位,以及他们的哪些城市在招人。
即便你没有接到对方的电话或没有通过面试,也不要担心。大不了就是被对方拒绝。你可以给自己设定下限,却没人能够给你设定上限。
联系身边的朋友和同事,了解他们是否满意自己的工作,是否可以推荐你去当前或以前的公司工作。
了解创业生态系统的情况。
了解都有哪些新公司或快速发展的公司,阅读有关这些公司的文章,选择发展目标与你有共鸣的公司。
过去收到的招聘人员的电子邮件。
向着目标出发
申请工作
我建议按照以下顺序申请工作:
请求周围的好友推荐。这样,至少招聘人员会仔细看一看你的简历。
查找以前收到的招聘人员的电子邮件。
通过各个公司的招聘网页申请工作。
注册各个求职网站。
联系招聘人员。
认真地准备编程测试
如果你觉得编程测试网站上的题目太简单,就从中等难度的题目开始。模拟在面试环境中解决问题。
统计时间,看看自己解决编程问题需要多长时间。尝试在 30 分钟内完成中等难度的题目,最高难度的题目 为 45 分钟。一般面试的时间就这么长。
刚开始的时候,需要的时间肯定更长,这很正常。你的目标是提高速度,但这需要一些练习。
说出你的解决方案,就像你在向面试官解释如何解决这个问题一样。
这一点请千万注意。
考虑各种选择。你不仅需要解释逻辑算法,而且还需要说出每个解决方案的时间和空间复杂度,任何算法都可以这样比较。
等到你想不出更好的解决方案时,再开始写代码。
不要妄想第一次尝试就能获得正确的解决方案。真正的面试没有回头路。
不要通过点击提交来确认是否做对了。我们正在模拟面试!通过阅读代码来查找错误,确保完成后的代码是正确的。我们的目标是第一次尝试无需任何修改就可以做对。
确保变量名足够简洁(为了速度),但也不能完全没有意义。
在有足够的信心后,可以尝试一次性完成代码,不要添加或修改。这主要是为白板编程面试做准备,因为你很难在白板上添加漏掉的代码,不方便阅读。出于这个原因,我喜欢在开始编写代码之前,在白板一侧快速地写下伪代码。
在任何一个问题上花费的时间都不能超过 1 个小时。如果 1 个小时后还没做出来,那就直接阅读解决方案吧。题目有很多,但我们的时间很有限。我们应该练习更多问题,而不是在没有任何帮助的情况下设法获取解决方案。随着练习的增多,逐步减少在每一道题目上花费的时间,一直减少到 30 分钟。
刚开始准备的时候,你会犯很多错误。等到你能够在第一次尝试中就找到正确答案,我建议你换到真正的白板上,目的是为了体验真正的面试环境。你的书写可能会很混乱,这样的练习会很有好处。
招聘人员的电话面试
如果某家公司对你的个人资料感兴趣,招聘人员就会和你联系,看看你是否适合他们的职责和团队。他们希望了解的信息包括:
你与团队以及职位的匹配程度;
相关的工作经历;
加入公司的动机和兴趣;
你的面试时间计划。
面试
时间安排
电话面试
你可以根据自己的时间来安排电话面试。我之前一天安排了多个电话面试,但每个面试之间应该留一些空档,防止超时。
我建议使用无线耳机,这样你的双手就可以自由打字了。事先与朋友测试网络、语音清晰度和设备。
现场面试
完全取决于你个人的喜好。
我喜欢拿出整整一周的时间来参加一场接一场的现场面试。大多数公司都允许你随意安排时间,所以我就都安排在了那一周。我认识的一些朋友不喜欢接二连三的面试,所以会错开时间。
我也会在“面试周”之间留出几天时间。不仅可以放松一下,而且还能从错误中吸取教训。不过时间不会太长,因为录取通知很快就会到期。
集中一周参加完所有的面试,这样我拿到的录取通知的截止日期也基本统一,我就可以专心考虑面试,而不用担心工作。
编程考题
在这段时间内,我建议你只练习自己不擅长的编程题,比如动态规划或基于递归的解决方案。你必须进行这样的练习。我建议不要追求完美,因为考察的并不是死记硬背。
行为问题
尽管在行为问题的面试中,大多数问题都是关于你过去的经历,但你可以实现思考一下常见的问题,这样就可以在面试中给出清晰的答案。
关于过去项目的问题
想一些最有趣、最有影响力或最具挑战性的项目。我推荐真实的工作经验,而不是个人项目,因为实际的项目更具可比性,但一定要诚实。请注意,即便是失败的项目也没关系,你可以谈谈从中学到了什么。
积极的人生经历
令人难忘的合作,高效的团队项目,跨团队的项目。
消极的人生经历
失败的合作、由于沟通不畅导致项目延期,以及与难相处的人打交道。
你希望找一份怎样的工作
你为什么想找新工作?对新工作有哪些期望?你想学什么?你为什么想加入这家公司?
工作风格、文化契合
你喜欢单独工作还是团队合作?你如何与经理、同事和下属进行一对一的交流?如何推动跨团队协作?如何规划项目时间、分配职责?你有一个框架来发现机会吗?如何激励队友?
未来的计划
你觉得N年以后自己会是什么样子?你最擅长什么?你想有哪些提升?
动机、灵感
任何能激发灵感的人、项目或想法。什么活动能让你充满活力?什么活动会让你感到疲倦?
编程面试
编程面试的时间非常有限。我们需要尽可能高效地利用这段时间来解决问题。
我喜欢简短的闲谈。首先面试官会聊一些简单的问题,如果求职者滔滔不绝地讲个不停,面试官也不会打断。但这会耽误实际写代码的时间,如果代码不正确,那么一切都等于白搭。
讲个小故事:有一次,有一位面试官看到我的简历上写着我去过加州大学洛杉矶分校,于是我们两个就这所学校和洛杉矶谈论了近 20 分钟。最后,我拿到的 offer 比我想象的差很多,主要是因为我没能出色地完成编程面试。招聘委员会只看到了事实,并不会记录这段时间内发生的事情。所以,我会再三提醒你节约时间。
关于模拟编程环境的提醒和注意事项:
仔细听编程考题。你可以自由使用白板或记事本记下要点。
想一想你应该提哪些问题,可能会遇到的边缘情况,并事前得到澄清。一些面试官问的问题比较模糊,所以记住这一步可以节省很多时间,并压缩答案的空间。
一边思考解决方案,一边与面试官交谈。
请千万记住这一点。
在考虑各种选择时,请与面试官交谈。这表明你愿意考虑新的解决方案,并考虑权衡取舍。一些面试官会根据你采取的方法给出提示,这可以避免你跑题。
此外,这也可以展现你的沟通技巧。
不要试图直接找到最有效的解决方案。从最简单、最明显的解决方案开始,然后逐步寻找更好的想法来改进算法的时间或空间复杂性。
当最终你找到一个自认为合适的解决方案时,请先讨论你选择的解决方案的时间和空间复杂度。问一问面试官对此是否满意。这是一个节省时间的技巧,因为这可以避免你将某个并不满意的解决方案写成代码。
等得到面试官口头肯定后,再开始编写代码。
每写几行,解释一下你的代码在做什么。这有助于面试官理解你的代码和思路,帮助你朝着正确的方向前进,并及时发现潜在的错误。
被拒
被拒是无法避免的。
如果你从未遭到任何拒绝,则表明你是该领域的专家,或者只是因为你的目标不够高。
面试不是一门精准对科学,其中存在大量可变因素,比如期望与工作描述、面试遇到的编程题的难度、行为与设计面试的判断方式,以及面试官的心情等等。不要因此而否定自己的职业和技术力。这其中有太多不可控变量。
不要因为被拒而气馁。你可以要求招聘人员提供反馈,有问题则改之,无则加勉。
交涉
不要心急
参加多家公司的面试,最后很可能在参加面试的同时拿到另一家公司的录取通知。
有些招聘人员会催促你尽快接受某个工作。我强烈建议你不要心急。你可以告诉他们你还有其他公司的面试,并告诉他们你什么时候能给出答案。一般我给出确切的日期后,他们都会延长录取通知的截止期限。
事实上,一些招聘人员有权在给定的时间表内发出录取通知。你需要打电话了解一下。当手握多份录取通知时,你就一点都不会担心了。如果你最终决定接受某个 offer,则请取消其他面试。
我从来没有,而且也永远不会建议违约。这会让你投入到时间和心血付之东流,而且还会被拉入黑名单。
你值得更高的薪资待遇!
一定要交涉。你从朋友那里听到的两年前的消息,肯定不同于如今的行情。
请求招聘人员提供更好的薪资待遇绝对没有坏处。他们在为你时间和知识付钱。你可以要求更高的基本工资、股票或入职奖金。此外,还可以提出搬迁费等其他福利补贴。如前所述,如果手握几个富有竞争力的 offer,会很有帮助。
请记住,一切都可以协商。
接受 offer
最后的决断
现在你已经完成了面试,所有的结果都摆在你面前,再次回想一下你希望寻找怎样的新工作。牢记这一点,然后给你手中的选择排名次。请注意,你会受到人员、项目或公司使命以及文化的影响,因此这个排名偏离最初的优先级列表也很正常。
如果你犹豫不决,则可以联系一下朋友,看看谁在那家公司或竞争对手公司工作,并获取更多信息。如果你在面试中提出的有些问题没有得到答复,则可以让招聘人员安排与未来的经理通话。
在你决定放弃某些 offer 时,就应该让招聘人员知道。而且也应该让他们知道你最终选择了哪个。
恭喜!
下一步的计划和时间安排
在你接受 offer 之后,就需要准备法律文书了。整个过程可能需要一段时间,特别是如果你持有工作签证的话。
从现在到正式开始上班,针对这段时间大致计划一下时间安排。以下是我的一些想法,按时间顺序排列:
文书工作,约 1 个月
首先是招聘公司签发法律文件,开始进入就业转移流程。然后,他们会做背景调查。这可能需要一些时间。
如果你持有工作签证,签证转移很容易出错,而且只会变得越来越难。签证转移被拒也是有可能的,所以暂时不要辞掉手头的工作。大多数工作签证的失业天数非常有限,而且纠正错误的过程很漫长。
递交辞职申请
我建议在文书工作完成后,再递交辞职申请,以防止你无法承担巨大的失业空档。
交待手头的工作,约 2 周到 1 个月,具体取决于你的角色
走前交待好手头的工作。花些时间协助别人接替你的工作。最重要的是,与你的同事好好告别,并保持联系。
休息,未知
在开始新工作之前,给自己放一个长假。利用这段时间享受生活,做一些自己喜欢的事情。
搬迁,0周到1个月
如果需要搬家,请留出这部分的时间。
总结学习
我个人喜欢记录下我面试过的公司,面试的经过,以及最后拿到的 offer 细节,并总结面试的经验教训。
最后的一点想法
随着编程面试发展的发展,大量的编程练习网站纷纷涌现,帮助求职者做练习。这会让面试官感到为难,他们不得不加深考题的难度,如此恶性循环导致如今的编程测试考题与实际工作完全脱节。
话虽如此,但似乎这个问题并无解。这就是为什么大多数公司明知这种流程并不好,却仍然在采用。
参考链接:
https://snisarg.github.io/blog/2021/08/07/tech-interview-prep.html
☞百度启动史上规模最大校园招聘;荣耀Magic3系列售价4599元起;阿里成立反职场陋习小组,无条件支持员工拒绝劝酒|极客头条☞瑞典正成为欧洲硅谷?☞听说,这 9 张脸是人脸识别的“万能钥匙”?
以上是关于面试与工作差距大,程序员从准备到拿Offer全攻略的主要内容,如果未能解决你的问题,请参考以下文章
攻略 | 程序员面试IT公司专属攻略,教你化身offer杀手