作者 | Nisarg Shah

译者 | 弯月

出品 | CSDN(ID:CSDNnews)

迄今为止我没有参加过任何面试,也不知道这是幸运还是不幸。本文是根据我作为面试官在经历了 40 多场面试后,总结出来的经验,我一共发出过大约 25 个 offer。

流程总结

 

高级软件工程职位(以及其他相关角色,如数据工程和机器学习工程)的竞争非常激烈,你需要认真地准备,并勤加练习。编程面试题一般都不会出现在日常工作中。这可能是软件工程岗位的面试与其他领域最大的不同。

面试的流程大致为:

  1. 准备面试,包括刷编程考试题以及提高系统设计技能。

  2. 设法获取推荐信,或联系招聘人员,或直接去公司网站申请职位。

  3. 如果拿到回复,则需要按照以下顺序接受面试:

    a.招聘人员联系你,确定职位以及面试日期。在这个阶段也可以讨论薪资待遇。

    b.电话筛选:只有一轮面试,通常包括编程测试。

    c.现场面试:一系列的编程、设计与行为考察,一般面试你的人很可能会成为将来的同事。

    d.拿到录取通知。

  4. 比较各家的录取通知,然后逐个协商。

  5. 接受一家公司,拒绝掉其他公司。选择一个正式上班的日期。

流程的详细步骤

 

下面,我们来总结面试的各个阶段,以及我们将在每个阶段讨论的内容:

  1. 准备:在面试之前或刚递交简历时需要考虑的事情。你需要做好心理准备。

  2. 热身:面试要求的基础知识,准备编程测试。

  3. 练习:认真准备,联系公司和招聘人员。

  4. 面试:各个面试阶段的技巧。

  5. 交涉条件:最关键的一步,所有投入到准备中的时间都将在此刻体现出来。

  6. 接受录取通知:终点线。

  7. 面试结束后:关于结束当前工作的一些建议。

下面,我们就来仔细谈一谈每个阶段,以及与之相关的思维方式和面试相关活动。

准备

动机

问问自己:“我为什么要找新工作?”

你必须清楚自己寻求改变的原因。虽然不需要什么伟大或具体的目标,但既然你已决定花费大量时间准备、计划和面试,那么肯定是有原因的。你应该弄清楚这个原因。

只有找到这样的动机,你才有勇气面对被人拒绝,并努力做好各项准备。

选择编程语言

为了在编程面试中脱颖而出,你必须选择一门自己擅长的编程语言。以下是在选择编程语言的时候,需要考虑的一些事项。

  • 角色或职位特有的限制。

你需要根据申请的角色类型,选择一门最合适的语言。对于大多数软件工程角色来说,任何语言都可以。但是如果你申请的职位是 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/

我建议你从最简单的题目开始。即使你读完问题就能立即想到解决方案,也要试着去编写代码。你会惊讶于一个简单的问题可能有多少边缘情况。

通常,我会做一些简单的题目,直到觉得它们太简单。我可以通过这种练习学习如何覆盖所有的边缘情况,并且不需要太多思考。如果你觉得这一步太简单,可以直接跳过。

你想获得什么?

列出你梦寐以求的工作应具备的优点。按照优先顺序排列。以下是一些需要考虑的方面。

  • 团队文化、经理、项目、机遇

  • 薪资

  • 学习机会

  • 职业发展机会

  • 理想职位、等级

  • 业务领域(产品、基础设施、机器学习)

  • 地理位置

  • 工作与生活的平衡

  • 个人品牌建设或声誉

当然还有很多方面。当你拿到多个录取通知时,就会很难做决定,每家公司都有各自的优缺点。整理一份你参加面试的原因,以及你真正希望获得怎样的工作,可以帮助你在日后做决定。

你想去哪里?

  • 通常我会列出所有我想去的地方。不要觉得自己在异想天开。你只需要将这些公司的名字写下来,敢于尝试才能改变自己的职业发展。

  • 挨个查看你一直想去的所有公司,看看他们都有哪些空缺职位,以及他们的哪些城市在招人。

  • 即便你没有接到对方的电话或没有通过面试,也不要担心。大不了就是被对方拒绝。你可以给自己设定下限,却没人能够给你设定上限。

  • 联系身边的朋友和同事,了解他们是否满意自己的工作,是否可以推荐你去当前或以前的公司工作。

  • 了解创业生态系统的情况。

  • 了解都有哪些新公司或快速发展的公司,阅读有关这些公司的文章,选择发展目标与你有共鸣的公司。

  • 过去收到的招聘人员的电子邮件。


向着目标出发

申请工作

我建议按照以下顺序申请工作:

  1. 请求周围的好友推荐。这样,至少招聘人员会仔细看一看你的简历。

  2. 查找以前收到的招聘人员的电子邮件。

  3. 通过各个公司的招聘网页申请工作。

  4. 注册各个求职网站。

  5. 联系招聘人员。

认真地准备编程测试

如果你觉得编程测试网站上的题目太简单,就从中等难度的题目开始。模拟在面试环境中解决问题。

  • 统计时间,看看自己解决编程问题需要多长时间。尝试在 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 张脸是人脸识别的“万能钥匙”?
Logo

20年前,《新程序员》创刊时,我们的心愿是全面关注程序员成长,中国将拥有新一代世界级的程序员。20年后的今天,我们有了新的使命:助力中国IT技术人成长,成就一亿技术人!

更多推荐