当前位置: 首页 > 科技观察

软件工程师求职全攻略

时间:2023-03-18 18:29:24 科技观察

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