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