本文主要探索软件工程师在求职过程中可以使用的资源和获得的经验,以创建可用于求职的蓝图和路线图。
译者 | 李睿
审校 | 孙淑娟
Jinesh Shah是一名经验丰富的软件工程师,曾在微软公司和谷歌公司任职。不久前,他开始了长达120天的求职之旅,通过了30多次面试,并获得了多个工作机会。在Shah与其他应聘者的沟通和讨论过程中,他发现虽然有很多关于面试的信息,但一些关键细节缺失或隐藏在经验中。这包括诸如让求职者讲述自己的故事、通过系统设计表达水平或在时机成熟时协商报价等细节。
Shah记录了所有帮助他从科技公司获得薪酬报价的资源和步骤。本文是他使用的所有资源和获得经验的总结。他的目标是创建一个蓝图和路线图,可以供任求职者在求职时使用。
1.目标受众
经验丰富的软件工程师。
申请大型科技公司(即谷歌、Meta、微软、苹果、亚马逊等)的求职者
在软件开发方面具有中高级水平
2.动机
Shah表示,与他沟通的大多数求职者表示厌恶求职和面试过程。他听到的最主要的原因是:“这个过程有缺陷,我想尽快完成它。”Shah也认为面试过程是有缺陷的,但是可以通过系统的计划和持续的努力来利用有缺陷的系统来发挥自己的优势。
此外,一个明确的动机是,如果求职者遵循他描述的蓝图,那么随着工作的变化将能够:
提升薪酬水平。Shah表示,有的求职者在跳槽之后的薪酬从30%提高到200%。
提升职业水平。求职者通过讲述自己的故事并在系统设计面试中胜出, 他的目标水平将达到或高于当前的工作水平。
找一份真正感兴趣的工作。
根据Shah对其他求职者在求职过程的观察和研究,坚信如果求职者在目前的岗位上做得很好,那么会得到一份他喜欢的新工作。原因之一是目前是求职者的市场,每家大型科技公司都在招聘员工。
求职者可能需要稍花一些时间投入来遵循这一蓝图,但值得投入时间和精力。
3.面试流程概述
面试过程如下所示:
招聘人员电话沟通→视频通话→现场面试(4~6轮)→报价阶段
与招聘人员通过电话沟通
求职者通常与招聘人员通过电话沟通15~30分钟,讨论他对其应聘公司的兴趣。在与招聘人员交谈之前,求职者应该已经明确了下一份工作的目标。电话沟通旨在传达这些目标和求职者的故事,并讨论潜在的契合。
另外要记住的是,一旦招聘人员为求职者安排了面试,他们将在整个过程中成为求职者的盟友和朋友,至少在谈判开始之前。意识到他们对求职者在面试中取得成功并签署报价具有既得利益。求职者应该随时向他们寻求需要的任何帮助或资源。
在与招聘人员电话沟通之后,求职下一步过程将转到视频通话。
视频通话
视频通话面试通常是与软件工程师进行45到60分钟的视频通话,求职者需要在文本编辑器上实时分享其屏幕和代码。求职者可能会处理数据结构或算法问题。对于大多数企业来说,这一轮主要进行淘汰,因为其目的是决定是否应该邀请求职者进行现场面试。(注:求职者应该向招聘人员表达自己的期望。)
在进行视频通话面试之前,求职者应该为算法面试做好充分的准备。这次面试的目的是展示求职者的技术能力,在编码部分之后向面试官提出有见地的问题,然后进入现场面试。
现场面试
求职者的现场面试通常会进行4到6轮,但新冠疫情已将面试推向虚拟远程进行。这对求职者来说是一件好事,因为可以错开时间安排面试的轮次,这样对求职者安排时间很有利,而不是被迫请假去参加现场面试。
应聘软件工程师职位的求职者将会面临算法问题、系统设计以及行为和经验面试。求职者应该见到面试者,并向他们展示自己掌握的技术和技能。现场面试的目标是提供强有力的积极信号和数据点,以推进到报价阶段。
报价阶段
在这个阶段,求职者需要做的是确定适合自己的机会,考虑是否可以签约并加入一揽子计划。
4.时间计划表
以下是一个为期15周的时间计划表,假设求职者准备求职和面试。那么可以根据自己的情况缩短或延长这一时间表。
第1周:提升和流程理解
撰写自己的工作经历并完善简历,以表明目标水平和范围。
研究可能有兴趣应聘的公司。
了解面试过程并了解薪酬范围。
将状态更新为“开放寻找新工作”,隐私级别仅为LinkedIn上的招聘人员。
第2~4周:数据结构和算法基础
复习网络、推荐和招聘人员连接部分。
为算法准备制定一份待办事项清单,并每天将一些事情从清单中剔除。
每天解决2个算法问题。
与招聘人员交谈并开始安排第7周或第8周的电话面试。
第5~7周:系统设计基础
做好系统设计准备,并每天从清单中删除一些事情。
每天继续解决2个算法问题。
采取系统设计准备检查点,查看自己的情况。
第8~9周:视频通话和模拟面试
完成大多数公司的视频通话筛选。
在pramp.io开始系统设计和算法的模拟面试。
根据反馈继续学习系统设计。
为行为回合起草STAR示例。
开始安排现场面试。
第10周~13周:现场面试
保持冷静和专注,并祝自己好运!
在任何一轮现场面试结束一天之后,向招聘人员征求反馈意见。
第14~15周:报价阶段
查看报价阶段部分。
签署合同。
如果求职者喜欢使用清单/待办事项列表,可以在这个谷歌文档的清单格式中找到上述时间表。并制作自己的副本,并在完成时进行核对。
5. 开始求职过程
Shah的建议是按照每周的日程安排,复制Google文档并在完成时确定。
求职者的故事
既然求职者已经决定开始求职过程,那么了解一下求职者希望自己的职业是什么样的。建议起草以下问题的答案,将其称为“求职者的故事”:
你为什么加入上一家公司?
上一份工作是做什么的?
为什么要离职,为什么是现在?
你希望在新工作中继续做哪些事情?
你在新工作中还需要什么?
现在可能看起来不是这样,但以下步骤中的许多事情将取决于求职者如何回答这些问题。确定并入围公司。根据自己的故事和目标,求职者列出想面试的7~10家公司。这时可能会发现一些公司比其他公司更有趣。将这一列表分为两个类别:备份公司和目标公司。在安排现场面试时,这些列表会派上用场。
衡量水平和补偿
如果求职者不确定自己的目标水平,需要考虑在求职之前与该公司的联系人交谈以了解自己的目标水平。
制作干净整洁的简历
求职者确保制作一份干净整洁的简历。在理想情况下,简历中的大多数要点都应遵循XYZ格式。
“通过[Z]完成[Y]衡量的[X]。”
采用网络和LinkedIn
相信很多人都采用LinkedIn,并且可能拥有完善的LinkedIn个人资料。如果没有,应该做的第一件事是创建全面的LinkedIn个人资料。Shah表示,他拥有十分完善的LinkedIn个人资料,因为在他的求职过程中,30多位LinkedIn招聘人员联系他,他因此与6家公司的招聘人员进行沟通和对话。
当讨论这个话题时,建议求职者使用去掉隐私设置来启用开放机会,而确保隐私是只设置招聘人员能够看到而不是对外完全公开的。
拥有一个体面的LinkedIn个人资料的第二个原因是建立一个支持自己的网络,并且可能具有可以将求职者推荐给其感兴趣的公司的关联。推荐是引起注意和启动流程的最佳方式。紧随其后的是开始与求职者联系的招聘人员进行对话。直接申请应该是最后的手段。
招聘人员谈话技巧
这通常是求职者与招聘公司的第一次对话。如上节所述,在整个过程中,或者至少在谈判开始之前,招聘人员将是求职者的盟友或朋友。应该明白,并非所有招聘人员都是相同的,有些人比其他人更好。求职者应该记住始终保持开朗、礼貌和优雅的态度。让招聘人员提供帮助分,并与他们合作以获得想要的职位。
招聘人员可能会在这一阶段询问求职者的预期薪酬是多少。Shah建议不要这么早说出薪酬。与其相反,应将讨论重点放在确定相互匹配和平衡上。最好在报价阶段讨论薪酬。如果招聘人员要求提供,招聘人员可以告诉他们期望的最高薪酬,并确保强调知道招聘的公司是否具有竞争力并且确信可以达成协议。
面试人员的观点
如果你曾经是面试人员或者是招聘委员会成员,那么就会知道,在做出招聘决定时,经常会出现两个词:信号和数据点。
面试官的工作是获取尽可能多的信号和数据点。所以现在可能会问:“这些信号是什么?”信号是展示求职者的特定技能、知识和经验的信息。
例如,当进行面试时,面试人员会寻找以下信号:
(1)可引导性信号
这个信号说明了求职者对提示和反馈的反应如何,他们是否愿意接受反馈,以及他们是否利用反馈来改进他们的解决方案。该信号通常在问题解决和系统设计访谈期间进行分析。
(2)编码信号
这个信号说明了这个求职者的理解程度,以及他们在实际编码方面的效率。在解决问题的面试中对此进行了分析。
(3)系统设计
这个信号解释了诸如“这个求职者是否有经验并且有能力设计和领导一个大型技术系统?”之类的问题。在系统设计面试期间对此进行了分析。
(4)协作与管理信号
这个信号解释了诸如“这个求职者是否能够与团队成员一起工作或管理团队?”这样的问题。这个信号也说明了求职者在与大型团队合作或管理大型团队方面的经验。这是在行为/经验面试期间进行分析。
还有一些公司需要注意的信号。例如,像谷歌和亚马逊这样的公司会寻找一种信号来解释如何通过歧义进行导航。
现在,求职者知道面试官要在面试中寻找什么。那么在每次面试中的工作是发出信号,证明适合这个角色,并展示自己的资历。
6.数据结构、算法和解决问题的面试准备
对于求职者来说,技术面试的过程很难。想象一下,在45分钟紧张的面试中,求职者一边与面试人员交流想法,一边接受评估以实施最佳解决方案。
而好的一方面是,求职者可以通过准备和练习变得更好。准备工作包括:
了解面试期望
掌握数据结构和算法基础
学习坚持结构化的方法来进行良好的沟通
解决问题的面试期望
(1)编程语言
大多数公司在面试技术职位之前不要求求职者了解任何特定的编程语言,但熟悉一门重要的语言通常是成功的先决条件。求职不仅应该熟悉一种语言的语法,还应该熟悉一些语言的细微差别,例如内存管理的工作原理、最常用的集合或库等。
(2)数据结构
求职者将需要了解常见数据结构的内部工作原理,并能够比较和对比它们在各种应用程序中的用法。求职者需要了解常见操作和内存使用的运行时间。
(3)算法
面试并不是死记硬背;但是,了解最常见的算法可能会使解决面试人员提出的一些问题变得容易得多。了解不同类别算法的运行时间、理论限制和基本实现策略比记住任何给定算法的具体细节更重要。
(4)编码
希望被要求编写语法正确的代码,而不是伪代码。这里可能有一些遗漏的逗号或拼写错误,但是不要紧,但目标是编写尽可能接近生产就绪的代码。这是求职者展示编码能力的机会。
数据结构和算法基础
Shah的建议是先了解面试框架,然后了解基础和概念,最后深入研究算法。以下是推荐方案:
第一步是了解解决问题的框架。破解代码面试(CTCI)是最好的资源。阅读破解代码面试(CTCI)这篇文章的第1到第7章。这些章节彻底分解了解决算法面试的框架。在面试中解决任何算法问题时,利用这些章节学到的知识并应用这种方法。
通过阅读破解代码面试(CTCI)或EPI中的以下章节来复习基础。以下是Shah想到的一些主题:字符串、数组、链表、堆栈、队列、堆、树、哈希表和映射、搜索和排序、递归、动态编程、贪婪算法、图和图遍历。
深入研究算法:
如果求职才必须重新开始或有一段时间没有复习算法:
Coursera-算法,第1部分:第1部分:按照讲座进行操作,并在每次讲座后在word文档中编写算法数据结构。
Coursera-算法,第2部分:这是可选的,因为只有少数公司(如Google和Directi)期望采用高级算法概念。
如果求职者最近学习过数据结构和算法并且只是回顾了概念,那么需要学习数据结构和算法的一些文章。
Geeks for Geeks - Data Structures
Geeks for Geeks - Algorithms
数据结构、算法和编码基础的其他资源:
bigocheatsheet
Book: Beautiful code
Book: Elements of Programing Interview
Coding Interview University
Course: Udacity - Intro to Algorithms
MIT Open courseware - Introduction to Algorithms
Google Style Guides for C++, Python, Java
编码实践
在进行练习时,不要使用集成开发环境(IDE)。需要能够编写清晰、可编译的代码,而无需有关标准库类/方法名称的布局或拼写方面的帮助。建议在Word文档或纸上解决算法/数据结构问题,以模拟实际面试。
注:有些公司可能在浏览器窗口中集成了集成开发环境(IDE),但大多数公司没有,因此在标准Word文档上练习更安全。
建议如果不熟悉数据结构和算法编码,那么需要参加面试位编程课程。否则,可以练习Leetcode上的75个练习题。这个问题列表涵盖了各种主题,让求职者为任何编码面试做好准备。
另外,除了准备和练习之外,还需要每天解决一个随机编码问题。
以下是其他练习资源:
Codeforces
HackerRank
Topcoder
Google Code Jam
7.系统设计面试准备
系统设计的面试官可能是一位高级工程师,他会向求职者提出一个开放式问题,例如如何实施航班预订系统”或“如何为Instagram创建一个提要”。
求职者的目标是在60分钟内推动对话,巩固问题需求,并设计一个解决问题的系统。这是一个展示其在技术领导方面的技能、知识和经验的机会。
系统设计面试心态
在与准备进行面试的求职者进行沟通之后,Shah意识到大多数求职者的心态是,这是一种建立假设系统的练习。当求职者说 “在现实生活中不会做”之类的话时,可以看到这一点,并且最终可能会忽略他们看到的一些更重要的技术问题,认为这毕竟只是一种练习。但是,这会向面试官发出错误的信号,他们可能会认为求职者没有看到那个技术问题。
求职者需要改变这种心态。与其建立假设的系统,不如建立一个真实的系统。想象一下在面试开始时召开一个实际的工作会议。工作会议旨在通过集思广益的设计和路线图来解决给定的问题。
在1小时的面试结束之后,求职者的目标是制定一个设计路线图和计划,作为团队之间的任务进行划分。
求职者的心态上的改变将改变对待这次面试的方式。求职者将领导讨论并开发更现实的设计,而不是仅仅参与假设性讨论。
高级水平设计
(1)高级水平设计面试框架
Shah表示,他遵循将面试采访分为三个阶段的框架。
需求收集
技术设计和权衡
深入研究和更多可能的改进
(2)高级水平设计知识期望
数据库:求职者越了解关系数据库和非关系数据库的工作原理以及它们之间存在哪些权衡,就会更好地做好准备。但是,大多数公司并不具备任何特定的专业水平。
分布式计算和扩展:虽然大多数公司都有有助于扩展的内部工具,但必须了解一些基本的分布式计算概念。了解诸如面向服务的架构、减少映射、分布式缓存、负载平衡等主题,可以帮助求职者针对可能遇到的一些更复杂的分布式架构问题开发更好的设计。
互联网和网络主题:大多数公司希望他们的工程师熟悉互联网工作原理的基础知识。可能想从DNS查找和TCP/IP到套接字连接,重新了解浏览器的工作方式。他们不是在招聘网络工程师资格,而是对网络工作原理的深刻理解是一项要求。
(3)推荐学习
尝试解决系统设计面试这篇文章中的问题,然后检查他们提供的解决方案。该资源是学习和内化如何推动优秀系统设计讨论的一种非常好的方式。
如果需要更多学习,技术招聘-系统设计课程也是一个很好的资源。
(4)高级水平设计模拟面试准备检查点
在继续准备和开始模拟面试之前,需要尝试回答以下所有问题:
什么时候会选择SQLDB而不是NoSQL?
存储图像有哪些不同类型的数据存储?在选择图像数据存储时,会寻找哪些关键内容?
长轮询与网络套接字
加快重复读取调用的最佳技术是什么?
缓存的缺点
什么是CDN?什么时候应该使用CDN?
什么是CAP定理?
HDD、SSD、RAM和网络调用的相对性能如何?
什么是可用性和可靠性?您将如何为系统测量它们?
当在浏览器中打开链接时,后台会发生什么?知道TCP/IP、DNS查找这些术语的含义吗?
低级水平设计
并非所有公司都有这一轮面试,因此求职者可以了解是否有兴趣提出这些问题的公司。
求职者应该具备一些常见和有用的设计模式的工作知识,并知道如何以面向对象的方式编写软件,并适当使用继承和聚合。求职者可能不会被要求描述特定设计模式如何工作的细节,但希望能够为设计选择进行解释。
低级水平设计模拟面试准备检查点:
什么是并发?了解凝聚力和一致性吗?
至少知道如何使用以下设计模式:
策略模式
观察者模式
工厂方法
单例模式
继承与聚合
模拟面试
模拟面试是进入面试节奏的最佳方式。建议求职者每周准备一些模拟编码和系统设计面试。这将确保知道自己的跟踪方式和需要改进的领域,可以使用以下网站进行模拟面试:
Pramp:针对问题解决和高级水平设计系统设计的免费模拟面试
一般的面试技巧
到目前为止,人们应该已经了解计划通过破解代码面试(CTCI)和Grokking系统设计分享的所有技巧。如果没有足够的时间来完成它们,以下是一些关键的事情:
讲述思考过程,了解被问到的问题。在所有的面试中,面试官都会评估求职者的技术能力、如何处理问题以及如何解决问题。
如果不理解问题或需要更多信息,需要提出澄清问题。许多面试问题都被故意低估了,因为面试官希望看到求职者是如何解决这个问题的。特别是,他们希望了解哪些领域是提出的技术难题中最关键的部分。
考虑改进求职者将提出的解决方案的方法。在许多情况下,首先想到的答案并不是最完善的解决方案,可能需要一些改进。谈论对某个问题的最初想法绝对值得,但不会立即提出一个暴力解决方案,也不会花时间编写更有效的解决方案。
应该为面试官准备几个问题。当求职者在面试之前研究应聘的公司时,这将大有裨益。
8.行为和经验面试
大多数求职者都没有为这样的面试做太多准备。他们觉得面试提出的问题可能是随机的,而且将其作为所有其他待办事项的优先事项具有挑战性。但是,相信这次面试可以决定是否聘用求职者。
面试官通常希望了解两点:
你适合企业文化吗?
适合你的级别是什么?
建议准备5~6个强有力的工作示例和故事,这些示例和故事共享具有强烈积极信号的数据点。这将确保求职者可以回答面试问题,同时保持良好的信息流。这些工作示例不必花哨或复杂。最重要的是这个例子得到了面试官的认可和理解。此外,精心准备的故事引人入胜,面试官可以了解求职者的感受并与他们产生共鸣。此外,故事是说明求职者体验的好方法,这对于决定是否聘用至关重要。
这是一个示例问题,可以在其中展示与客户沟通的经验:
有多种方法可以回答上述问题。建议在回答任何与领导原则相关的问题时遵循STAR方法。STAR代表“情境-任务-行动-结果”。
准备好这些示例之后,尝试回答此处列出的行为问题以进行练习。
提示:这是准备的所有问题的清单,Shah觉得每一次行为面试和体验面试都让他有所震撼。
9.报价阶段
求职者能到这一阶段值得称赞!在收到报价后,求职者可以研究和了解其应聘的公司和团队。在做出任何决定之前,可能需要多次与公司的经理和团队成员进行沟通。
这里有一个数据点可以更清楚地说明这一点:在做出团队决定之前,Shah与谷歌公司的7位经理进行了沟通。在与他们会面后,与那些让他感兴趣的人进行了后续会议/聊天。这基本上是一个反向采访。如果经理真的聘用求职者,那是有好处的,而且招聘人员现场可以为他提供更合适的工作机会。
注:在亚马逊等一些公司,求职者只能与申请的职位的团队/招聘经理会面。这是因为招聘主要是由团队驱动的,而不是公司层面。
在与招聘经理会面之前,求职者应该做的一件事是列出大约7~10个问题,如果时间允许,可以向招聘经理问这些问题。这些问题的范围可以从一般问题到特定于团队或特定于技术的问题。这些问题应旨在收集有关团队、技术和经理的更多信息,以做出明智的决策。
协商最佳报价
一两个小时的谈判研究可以让求职者获得额外的10%~30%的加薪。我认为这绝对值得花费时间。
再次强调以下几点:
了解自己的价值和目标水平(使用levels.fyi)。
通过电子邮件协商比通过电话沟通要好。
最好的谈判者是那些准备离职的人。
接受报价
向所有相关人员发送短信致谢(甚至可以在LinkedIn上保持联系)。
让其他公司知道你已经入职。
10.最后的建议
求职者可以与招聘人员进行多次沟通。他们可以通过独特的见解和资源帮助求职者在面试中取得成功。
善待自己。面试过程压力大,在不顺或失败时很容易责怪自己。需要记住这并不是结束,还有更多的公司可以应聘。
始终保持积极和优雅的态度。
虚心学习和提问。
原文标题:The Ultimate Software Engineering Job Search Guide,作者:Jinesh Shah