原文|Shantanu Kshire 译者|Simon
每位软件工程师都渴望以自己的技术能力创造影响。这个世界的技术巨头是技术人员的绝佳工作场所,可为数十亿用户提供体验。
在我最近的求职经历中,我参加了多轮面试,并收到了Google和Amazon的录用通知。在过去的几年中,在线社区为我的准备工作提供了极大的帮助。通过这篇文章,我将分享我的准备之旅,并回馈我所学到的东西。
SWE面试流程
这个过程通常由公司招聘人员列出的潜在候选人名单开始。应聘者会经过最初的筛选,这决定了他/她是否适合这个职位。一旦确定,标准的SWE面试将在以下阶段进行。
- 编码 - 3到5轮
- 系统设计 - 1轮
- 领导力准则 - 1轮
PS:我将更多地关注编码阶段的准备工作,因为它们占据了面试过程中更大的一部分。但是,我们将在后面的部分简要地介绍系统设计和领导力准则。
A. 编码
软件工程师经常会遇到挑战,例如:处理模糊的、不明确的需求、分解复杂的问题、处理边界情况、最终确定折衷方案等。编码面试是了解这些技能的一种方式。
为简单起见,编码面试专注于用数据结构和算法解决问题。这些问题往往是棘手的,能有效得出候选人的编码分析能力。
善于解决数据结构和算法(Data Structures & Algorithm,后面简称DSA)问题,这种技能需要较长时间获得,没有捷径;唯一真正的方法就是练习、练习、再练习,直到你自然而然地具备了解决问题的能力。
准备策略
- 估计准备时间
这通常被忽略并且认为没有必要。我建议校准你目前在DSA中解决问题的方法。我仔细研究了我的强项和弱项,并粗略估计了准备时间。这种估计帮助我为长期(或短期)目标做好准备,并保持动力。
“给自己足够的准备时间。准备充分总比准备不足好。”
总持续时间可能因你的专业知识而异。从广义上讲,我已归类为以下几个类别。
- 初学者-可以舒适地使用至少一种编程语言进行编码。缺乏数据结构和算法的基础知识。努力(或花费大量时间)解决“轻松”难题。
- 中级-对数据结构和算法有良好的了解。轻松难度没有问题。可以解决大多数中等问题。努力解决难题。
- 高级-中等难度没问题。能够解决大多数难题。
在面试之前,我让自己保持在中级水平。
编码和学习平台
LeetCode、InterviewBit和geeksforgeeks是我主要的编码实践平台。在面试之前,我解决了大约320个LeetCode, 80个InterviewBit, 30个geeksforgeeks问题。
中等难度问题至关重要,因为你的大多数面试问题都属于此类。解决这些问题将极大地提高你的速度和解决问题的能力。
重要的是,在早期阶段,将简单和中等水平的问题结合起来。一旦你有了足够的信心,就从困难的问题开始。如果你无法解决困难的问题,不要灰心丧气。这些问题需要较长的时间来练习和完善。每当我感到不知所措时,我就会回到一个容易激发动力的地方。
保持成长心态。每一个你无法解决的问题都是学习新东西的机会。
- LeetCode:毫无疑问,它是最好的平台之一。LeetCode最好的地方是它的社区。讨论论坛非常有用,并且提供了多种方法。不要犹豫选择LeetCode Premium;它绝对物有所值。
- InterviewBit:我强烈推荐遵循编程轨道。在这个平台上的体验最接近真实的面试。有时你的代码通过了所有的测试用例,但可能不是时间/空间最佳的(如实际面试中所要求的)。InterviewBit报告这些意见书是不理想的,为你提供其他的反馈。
- geeksforgeeks:我使用这个平台主要是为了发现问题和DSA基础。主题说明和语言定制的实现确实很棒。geeksforgeeks还收集了公司和特定主题的问题。
我并没有完全依靠单一的学习资源。每一种资源都为我提供了新的见解。我写日记,不断地积累和扩展我的知识。
- 算法专业化:这个课程太棒了!它共有4门课程,涵盖了所有的基础和一些高级的DSA主题。非常适合初学者。
- Youtube:视频解说是我的最爱!列举几个有帮助内容的频道- Rachit Jain, Abdul Bari, Tushar Roy(很棒的演示!)和BackToBack SWE。
- CTCI和EPI:我将它们用作准备的补充。这些书为我提供了有关理论与问题的快速入门。在此处定位单个主题有时会很耗时。相反,我选择在面试前全面介绍这些部分。
- CLRS:有时用于查找伪代码。方便的资源,可获取有关时间复杂性和理论的深入知识。
最后但很重要,Vaidehi Joshi在BaseCS上发表的文章,她在几个DSA主题上写了直观明了的解释。
- 使用计时器
随着面试时间的缩短,按照解决问题的进度进行工作至关重要。通常,一次编码面试需要45-50分钟,并且应聘者需要解决— 2个中等难度 OR 1个高等难度 OR 1个简单题加一个较难的后续题。
即使你可以解决第一个问题,但花费更长的时间,这也意味着你将没有足够的时间来解决第二个问题。
在解决问题的过程中,我用定时器给自己计时。
- Medium Problem: 20 mins 中等问题:20分钟
- Hard Problem: 40–45 mins 难题:40–45分钟
初学者可以选择忽略此因素,因为寻求正确的解决方案显然更为重要。
- 模拟面试
在正式面试之前,我做了很多模拟面试。这些都是非常有益的。在测试环境中早期失败会给你提供有用的见解。这将帮助你发现思维过程中的差距。尝试纠正每个错误,并在每次模拟面试中做得更好。
如果你连续几次都能在模拟面试中表现出色,可以把这看作是一个积极的信号。
- [免费] LeetCode模拟面试
- [免费点对点] Pramp
- [免费点对点] InterviewBit模拟面试
付费模拟面试还有其他好处。特别是,面试后的反馈提供了有关面试官期望的许多细节。
- [付费] ExpertMitra
- [付费] Mocki
- [付费]技术模拟面试
- 准备一个路线图
到目前为止,我们谈到了可以准备的不同元素。现在,让我们尝试将这些部分连接在一起并创建路线图!
在面试前一个月,请考虑以下我的日程表快照。
我将整个准备工作分为一组任务/里程碑。我在面试前几周(甚至几个月)分配了每日目标。这种方法帮助我避免了随机性,并防止一路迷路。
- 在工作日我只能分配几个小时,因为我忙于办公室工作。我在这个时间段安排了解决问题的时间。
- 理论主题只保留给可能花费大量时间的周末。
- 面试临近的时候,我安排了一些模拟。在最后几周中,我减少了编码时间,而将重点更多地放在阅读CTCI和EPI上。
我知道我们很多人都有家庭任务和全职工作。预测的时间表可能并不总是按计划进行。但是这里的整个想法是养成习惯,跟踪进度和待处理项目。继续进行调整,直到找到最适合你的时间表。
B. 系统设计
此轮测试候选人的技术设计技能。它可以进一步分为低层设计(LLD)和高层设计(HLD)。该领域的知识随着行业经验的增长而增长。
尝试获取有关诸如分布式系统,负载平衡,网络协议,一致性哈希,CAP定理,复制和分片等概念的知识。
- YouTube频道-Gaurav Sen和Narendra L
- [付费]系统设计面试(系统设计的最佳资源之一。强烈推荐。)
- [付费]进行面向对象的设计面试
- [付费] AlgoExpert系统设计基础
C. 领导力准则/行为
与前几轮不同,这一轮完全不涉及技术。公司希望通过应聘者自己的话来更多地了解他/她。可能是如下问题:
- 候选人的性格
- 之前的项目和工作经验
- 在具有挑战性的情况下采取的处理方法
- 对积极和消极的反馈做出的回应,等等。
“这里的关键是保持透明,做你自己。”
我将强调在CTCI中提到的关于S.A.R.(情况、行动、结果)的部分。这个想法是通过基于以前的工作对故事进行分类来确定有影响力的讨论点。了解更多关于这个软技能表的知识。
Tips
- 参加LeetCode和Codeforce上的编码竞赛。跟踪无法解决的问题,并始终进行解决。
- 我在LeetCode上广泛使用了“ Shuffle”。另外,避免解决不喜欢的问题。这些大多数都不值得你花时间。
- 许多面试都是在非IDE编辑器上进行的,例如 Google文档,CollabEdit。因此,尝试在简单的记事本上编写具有生产质量的代码。
- 在面试时边思考边说。如果你走错了方向——这会帮助面试官引导你走上正确的道路。
- 我通常首先记下针对面试问题的多种方法。从最简单的蛮力到最优的,并为每一个指定数据结构和时间/空间复杂性。这种解决问题的系统方法有助于我解释自己的思考过程。
常见问答
Q1. 主要学习哪些数据结构和算法?你参考了哪些资源?
前面提到的学习资源将很有用。我没有为每个主题添加单独的资源,因为它将拉长这篇文章。
以下主题,无特定顺序:
链表、位操作、栈与队列、二分查找、堆、贪心算法、动态规划、数组、时间复杂度和空间复杂度、排序、双指针、滚动窗口、并查集、字符串处理、树与图、BFS/DFS、递归、Hash算法、Trie树、线段树、二分查找树等。
Q2. 你学习了哪些编程语言?
深入学习一种语言,我认为就足够了。我的首选是Java。
Q3. 你如何知道数千个问题中哪些问题适合练习?
解决所有问题几乎是不可能的。但是,最多有12–15个DSA主题。尝试通过解决特定主题的问题来强化每个类别。通过实践,可以确定所需的正确数据结构和算法。关注质量而不是数量。
Q4. 如果我不是一个有竞争力的程序员,我还会有机会吗?
绝对是的。在这种情况下,竞争性编程不是强制性的。
- CP是一项运动,涉及的话题和问题要广泛得多。诸如CodeChef和Codeforces之类的平台更倾向于CP。
- 当然,CP有一些重叠的领域比较有帮助。例如:让招聘人员注意到你的简历,解决问题等。
- 然而,编码轮完全是一个不同的阶段,并且具有不同的优先级。
Q5. 如何接到面试电话?你是如何申请的?
招聘人员直接通过LinkedIn与我联系。我不知道候选人入围程序。但是,我有一些建议。
- 作为一名学生,要专注于学术。参加竞赛,黑客马拉松,从事激动人心的创新项目。尝试做出开源贡献。有很多方法可以使你的个人资料脱颖而出。
- 最重要的是享受旅程。努力工作。要有耐心,尊重并始终努力成为一个更好的自己。其余的将会随之而来。:)
PS:如果你有任何疑问仍未解决,请在LinkedIn个人资料上给我留言,或发邮件到shantanu.kshire@gmail.com。我通常会在三天内回复。