如何破解你的下一次软件开发人员工作面试:一份可操作的指南
我最近在找工作,经历了50多场面试,收到了5个很棒的offer,其中3个来自印度的独角兽公司。在这个竞争激烈的市场中,我经历了求职的阶段,我想分享我通过这些面试获得的经验和知识。我相信我的经验对很多正在寻找第一份工作或跳槽到理想公司的人都很有帮助。
在开始之前,我想澄清一下,这篇文章并非一篇快速找工作的小贴士。在这个竞争激烈的市场中,想要成功通过面试并非易事,你需要付出艰苦的努力,并花费数月时间进行准备。这是事实。
在本文中,我想帮助您了解后端软件开发人员工作面试中对您的期望,并帮助您在准备过程中为自己制定计划。
本文涵盖以下内容:
- 当前的软件开发人员就业市场
- 你需要准备的不同面试环节
- 如何准备在线编程/机器编码
- 如何准备解决问题回合
- 如何准备系统设计轮
- 如何准备招聘经理轮
- 如何为文化契合度做准备
- 为什么换工作很重要
- 收到多个 offer 后做出明智的决定
- 每个人在求职过程中都会经历的挣扎
- 面试准备资源
1. 当前的软件开发人员就业市场
如今,软件正在席卷全球,行业内各个领域对优秀开发人员的需求巨大。软件是目前热门的就业市场之一,并且至少在未来几十年内都将保持这种势头!
尽管如今科技行业人才济济,但寻找并聘用优秀的软件开发人员仍然非常困难。所以,如果你能不断掌握技能,并紧跟新技术的步伐,你就会一直受到青睐。
根据美国劳工统计局 (BLS) 的数据,到 2029 年,软件开发人员的需求预计将增长 22%。相比之下,所有职业的平均预期增长率约为 4%。而且,技术娴熟的软件开发人员的薪资高于平均水平,并且在整个职业生涯中拥有许多绝佳的机会。
因此,如果您一直在考虑换工作,那么现在就是正确的市场和正确的时机。
你可以成为后端开发人员、前端开发人员或全栈开发人员。他们在技能、薪资等方面都拥有平等的成长机会。
我的整个职业生涯都从事后端开发人员的工作。因此,我将主要讨论如何顺利胜任后端开发人员职位的面试流程、准备工作、技巧等。但其中大部分内容几乎适用于所有这三个职位。
2. 你需要准备的不同面试环节
您需要经历的轮次取决于您的经验水平。对于后端开发人员职位,您需要经历的标准轮次如下:
- 在线编码/机器编码
- 问题解决(算法和数据结构)
- 高级设计/低级设计
- 招聘经理/文化契合度
每轮评估的方式取决于您申请的职位和您的经验水平。
例如,如果你面试的是初级开发人员,那么在线/机器编码轮次、问题解决轮次和 LLD 轮次会更受重视。虽然 HLD 和 LLD 轮次需要一些设计知识,但对于初级开发人员来说,这些知识并不那么重要。而如果你申请的是更高级的职位,那么所有轮次以及你的领导能力都很重要。
现在让我们详细讨论一下每一轮中您可以期待什么以及如何为它们做准备。
3. 如何准备在线编程/机器编程
在线编码:
许多公司在决定是否录用你之前,都会考察你的编程能力。他们主要想知道你是否能够编写代码来解决某个特定的问题。在这一轮面试中,你会在 HackerRank 等在线平台上接受限时测试,你需要为一定数量的问题编写代码。下一节将详细介绍如何准备这一轮面试。
机器编码:
如今,机器编程面试越来越流行,各大公司都希望了解你的实际应用编程能力。在这一轮面试中,你会收到一系列要求,并需要在 1.5 到 2 小时内完成代码的设计和编写。
您不需要使用任何数据库来存储和检索数据。只需存储在内存中即可完成此轮。
评估代码的主要因素是:
- 工作解决方案(已完成的需求数量)
- 代码模块化
- OOP原则
- 设计模式
- 可重构性
- 关注点分离
- 并发处理等
在这一轮中,一个可行的解决方案至关重要。即使你的代码结构良好,并且遵循了所有 OOP 和 SOLID 原则,如果没有可行的解决方案,你很可能会被拒绝。所以,首先要专注于完成需求(流程)。但也要考虑所有其他因素。
处理这一轮的最佳方法是花 5-10 分钟思考可能需要的实体、类、继承和组合。也花一些时间思考如何构建代码。
想出一个可行的解决方案很容易,但要找到一个符合上述所有因素的解决方案却很难。准备这一轮的最佳方法是(使用计时器)练习一些标准问题,例如:
- 停车场
- 发布-订阅排队系统
- 日志系统
- 数据库管理系统
- 出租车预订系统等
像单例模式、适配器模式、策略模式这样的设计模式是本轮面试中最常用、最值得了解的。并发性也是另一个重要的考量因素。你的代码是否能够处理并发请求,并且不会出现任何不一致的情况。
有时面试官会提出很多要求,这些要求在有限的时间内不可能完成。这是意料之中的事,你不必惊慌。只需专注于逐一完成要求即可。
完成解决方案后,面试官会用大约 30 分钟的时间来讨论你的代码。面试官可能会问更多关于代码不同部分如何改进的问题。所以,如果你知道自己可以写得更好,现在正是讨论的好时机。
4. 如何准备问题解决环节
大多数公司喜欢问算法和数据结构的问题来评估你的解决问题的能力。这并非检验候选人是否优秀的理想方法,但这是我们目前业内最好的工具。
大多数人会在投递求职申请前一两个月为这一轮做准备。常用的练习平台有:LeetCode、HackerRank、CodeChef、CodeWars、SPOJ、CodingGame、CoderByte 等。我个人使用 LeetCode,非常喜欢它的问题质量和论坛讨论。选择一个平台,坚持使用就好。
你应该主要练习以下主题的问题:
- 数组
- 字符串
- 链表
- 树木
- 堆
- 图表
- 回溯
- 记忆化
- 双指针
- 前缀/后缀总和
- 位操作
- 动态规划等
有些人在这次练习中非常沮丧。主要是因为他们做了好多题还是想不出答案。
这一轮练习的最佳方法是每天练习2-3道题。每道题大约花15-30分钟。如果你能找到最优解,那就太棒了!但如果做不到,那就努力真正理解答案。一段时间后,你会开始发现一些规律,并能将这些规律应用到其他类似的题目上。那时你就知道你走对了路。
在撰写本文时,我已经拥有 6 年以上的工作经验。尽管我并非刚毕业,并且在日常工作中从未使用过这些概念,但我仍然有望在这一轮中找到最优解决方案。
最近找工作的时候,我注意到,我这个级别的面试问题难度比应届生要低。我知道有些同事总共有2-3年的工作经验,在这一轮面试中,他们被问到的问题更复杂。但话说回来,谁也说不准。无论你的经验水平如何,都应该做好最坏的打算,为所有可能遇到的问题做好准备。
5. 如何准备系统设计轮次
系统设计对于任何软件开发人员来说都是一项重要技能。随着职业生涯经验的积累,你需要设计出具有鲁棒性、容错性、分布式和高度可扩展性的复杂系统。
由于缺乏构建大型系统的经验,很多工程师在这一轮面试中举步维艰。请记住,系统设计面试轮是开放式的,构建系统没有唯一正确的方法。面试可能会根据讨论内容和面试官希望你涵盖的领域进行任何方向的讨论。你可能会与不同的面试官就同一个问题进行不同的对话。
示例问题如下:Build a chat service like WhatsApp.
当然,你不可能在短短一小时内构建出像 WhatsApp 这样复杂的系统,因为 WhatsApp 的顶级工程师花了数年时间才设计、构建和扩展了它。这一轮面试的重点是考察你如何根据有限的需求确定需求范围并设计解决方案(包括高层和底层)。许多面试官会故意让问题陈述保持开放性。
应该如何对待这一轮
- 提出大量问题来澄清要求并设定讨论范围。
- 在思考解决方案时,请同时考虑功能性需求和非功能性需求。
- 功能需求是面试官希望你设计系统的用例。
- 非功能性需求包括一致性、数据持久性、可扩展性等。
系统设计通常分为两轮:
- 低级设计(LLD)
- 高级设计(HLD)
高层设计:
这一轮主要考察您根据给定要求构建和设计高级组件的能力。
例如,给定一个问题陈述Design a chat service like WhatsApp
,您需要提出所需的不同微服务,发布-订阅机制(如果需要),队列,数据库,缓存等。面试官将询问数据如何在设计中流经不同的微服务,容错,重试机制等。您还可能会遇到有关非功能性需求的问题,例如可扩展性,数据一致性,并发性等。
构建一个分布式可扩展系统非常困难。在设计架构时,你需要考虑不同的场景。
需要准备的常见问题:
- 设计类似 TinyURL 的 URL 缩短服务
- 设计类似 WhatsApp 的聊天服务
- 设计社交媒体网站,如 Twitter、Facebook、Instagram 等。
- 设计类似 Uber 的出租车预订服务
- 设计 API 速率限制器
为准备 HLD 轮次,您应该了解以下不同概念:
- 分布式系统的主要特征
- 负载均衡
- 缓存
- 数据分区
- 索引
- 代理
- 冗余和复制
- SQL 与 NoSQL
- CAP定理
- 一致性哈希
- 长轮询 vs WebSocket vs 服务器发送事件
和其他轮次一样,你也应该为 HLD 轮次做好准备。以下课程对我最有用,也是备考此轮次的最佳课程之一:educative.io的“Grokking the System Design Interview”(系统设计面试
入门) 。
低级设计:
本轮主要考察你设计HLD底层组件的能力。根据问题陈述,你需要设计一个包含不同实体、类和属性、继承、组合、设计模式、数据库、表和模式等的设计方案。
你不可能在一轮面试中涵盖所有这些问题。面试官可能会根据讨论的进展对其中任何一个感兴趣。
需要准备的常见问题:
- 设计一个停车场
- 设计电影预订系统
- 设计一个汽车租赁系统
- 设计数据库管理系统
- 设计一个类似 StackOverflow 的系统
为准备 LLD 面试你应该学习的不同概念:
- UML
- 用例图
- 类图
- 数据库设计
- 序列图
- 活动图
- 关注点分离
- OOP 原则
- SOLID 原则等
在准备这次面试中,对我帮助最大的课程是:Grokking the Object Oriented Design Interview
6. 如何准备招聘经理轮
招聘经理的面试通常并不难,但绝对是重要的一轮。你很可能在这一轮遇到你未来的经理。但并非所有公司都是如此。有些公司会让任何经理参加这一轮,然后再决定你加入哪个团队。
这一轮主要关注了解你的态度、以前的项目、挑战、优势和劣势、学习新技术的灵活性以及你与团队的合作情况等。
有些公司的招聘经理非常精通技术,他们可能会想讨论你的项目细节,以了解你是否真正了解简历中的内容。因此,彻底了解你目前和之前的项目至关重要。任何一轮面试都可能被问到关于你项目的问题。所以,做好准备吧。
如果你对公司、项目、员工发展等有任何疑问,现在正是提问的好时机。提出真诚且好的问题肯定会给面试官留下深刻印象。所以,花点时间准备一份面试时可以问的实用问题清单吧。
8. 如何准备文化契合回合
这通常由人力资源主管(或在某些情况下由招聘经理本人进行,作为 HM 轮次的一部分进行)来了解您的态度以及您是否适合该公司。
如果之前几轮都顺利的话,这一轮就只是走个过场而已。别太自负,你的答案应该很优秀。
8. 为什么换工作很重要?
我有近7年的工作经验,下个月(2021年5月)我就要开始我的第四家公司工作了。在职业生涯的初期,尝试和在不同的公司和领域工作非常重要。我强烈建议在职业生涯的前10年里,每2-3年换一次工作。
这样做的主要好处是:
-
在薪酬方面,你不会落后于市场标准。这个行业发展非常迅速,如果你在同一家公司待得太久,你很可能会离开。例如,在过去5-7年里,初级工程师的薪水涨了100%(至少在印度是这样)。
-
你将有机会参与不同的产品,从而涉足不同的领域。拥有不同领域的经验,从长远来看,无疑会帮助你成为一名更优秀的软件开发人员。
9. 每个人在求职过程中都会经历的挣扎
找新工作或换工作并不容易。如今竞争非常激烈,尤其是在开发人员职位上。随着远程办公越来越流行,越来越多的人为了同一份工作而跨越不同地点竞争。
不过嘿!你不必担心。
如果你能为自己制定一个计划,并认真准备几个月,即使是最难的面试也能搞定。我不太聪明,但在开始申请面试前的两三个月里,我确实计划周全,并且非常专注。结果,我已经成功面试了5家公司(到目前为止!),而且它们都是很棒的公司,我曾经认为这些公司根本进不去。
还要记住,即使经过数月的辛勤努力和准备,你在求职阶段仍会遇到困难和倦怠。在你最终获得成功之前,你可能需要经历很多次拒绝。
所以不要失去动力,不要灰心放弃!
找工作找了一半的时候,我非常沮丧,讨厌每天起床去面试,因为即使面试表现不错,也拿不到任何工作机会。我一度觉得自己一个工作机会都拿不到!
这很正常。每个人都会经历这种感觉。坚强起来,相信自己。事情最终都会发生的。
10. 收到多个 offer 后,做出明智的决定
求职过程通常持续几个月,从开始申请到收到第一份工作邀请,不要就此停止。
我深知经过数月的努力和无数次的拒绝后,终于拿到了工作邀请是什么感觉。你会想放弃找工作,直接加入那家已经给你offer的公司。千万别犯这种错误。要高度集中精力,尽可能多地争取offer。
收到多个录用通知后,不妨在领英上与这些公司的员工交流。虽然你可以在面试过程中询问有关公司和职位的问题,但与领英上的现任员工交流,能让你更好地了解公司、文化、工作量、发展前景等。发送联系请求,并与相关人员交流。在决定加入任何公司之前,务必先弄清楚所有问题。
11. 面试准备资源
以下是帮助我找工作的免费和付费课程的列表:
- 技术傻瓜 Narendra L
- Gaurav Sen 的系统设计
- 低级设计 | Code Mate
- 理解系统设计面试
- 理解面向对象设计面试
- 杰出开发商
- Educative Unlimited(访问 educative.io 上的 165+ 门课程)
本文最初发表在我的博客上。您可以在这里找到。
文章来源:https://dev.to/sunilc_/how-to-crack-your-next-software-developer-job-interview-an-actionable-guide-4jn2