CRUSH Your Coding Interview Preparation – 7 Steps to Success
1. 准备你的作品集
面试官最喜欢看到的是你编码技能的实际成果。当他们看到你的开发者作品集时:
- 他们知道你对构建和解决问题充满热情
- 他们看到你掌握技能的证明
- 他们欣赏你坚持完成项目的纪律性
提示: 提交简历时附上作品集。设计师这样做——工程师也应该这样做:这会让你脱颖而出。
完成越多的副业项目,你就越有可能学会有效编码并找到工作:
- 构建移动应用或Web项目。并准备好展示源代码。充满实际编码项目的作品集将使你在其他面试者中脱颖而出。
- 使用GitHub。向面试官提供你的GitHub用户名,以便他们查看你参与的项目以及你的工作方式。
- 参加黑客马拉松。参与黑客马拉松是简历上的亮点,也是面试中可以谈论的话题。
- 为开源项目做贡献。这表明你可以与团队合作,并且能够接受代码审查。
2. 进入他们的领域
下一步是带着不可动摇的信心进入编程面试:
- 成为他们公司的专家。并尽早与他们联系。
- 查看他们的“关于我们”页面。在这里你可以了解他们的历史、自我形象和价值观。
- 查看他们在社交媒体上发布的内容。通过查看他们的Twitter、Facebook或YouTube,你可以了解更多关于他们的信息和沟通风格。
- 阅读关于他们公司的最新文章。这样你可以确保了解公司的最新动态和当前业务。
- 在LinkedIn上找到你的面试官。尽可能多地了解他们的背景。你可以在面试中利用这些信息更好地与他们建立联系。
- 了解公司的团队。搜索同一部门的人。发送连接请求并开始与他们互动!结果是在面试当天你已经认识了所有人。
- 与最近的面试者联系。自我介绍后,礼貌地询问他们关于面试过程的建议。在很多情况下,他们会乐意帮助你。他们甚至可能告诉你被问到的问题类型。
现在你了解了他们的历史和当前事件。你知道他们重视什么。并且你已经认识了你的面试官和潜在的未来同事。
你甚至从最近经历过面试的人那里学到了如何最好地准备自己。
这些都将为你的编程面试带来优势。
3. 像赢家一样思考
- 可视化成功。花时间在心理上排练你的编程面试。想象你如何熟练地解决问题,自信地沟通,并在整个面试过程中保持专注。
- 没有什么可失去的。当然,每次面试都是一个巨大的机会。但即使你失败了,还有更多公司可以申请。以丰富的态度进入,你会发现更容易表现出色——同时保持冷静和自信。
- 不要为无法控制的事情压力。为结果、激烈的竞争或团队动态而压力是浪费你的内在资源,因为它超出了你的控制范围。保持对结果的独立。如果你得到这个职位,很好;如果没有,也没什么大不了的——不要把它个人化,并为下一次面试更好地准备。
- 坚持会得到回报。如果你愿意做真正的工作并投入时间,你最终会成功。即使你不是最伟大的开发者,经验有限,通过坚持,你也可以获得一个好的角色。一旦你做到了,从那里开始会容易得多。
4. 掌握编程面试问题
很好地回答技术问题当然是获得工作机会的重要组成部分。遵循本指南以在面试的技术部分表现出色。
另请查看此处的常见编程面试问题。
学习如何解决问题
你无法通过仅仅记忆问题来攻克编程面试。
目标是更高层次地理解事物。
你希望能够处理一个你从未见过的问题,分解它,并分析它。你了解它遵循的模式。然后你知道如何解决它。并且你可以一步一步地向面试官解释你的过程,充满信心。
这就是你有效解决编程问题的方式。这就是你在面试中给人留下深刻印象的方式。
一个简单的问题解决过程
- 完全阅读问题两次。
- 用3组样本数据手动解决问题。
- 优化手动步骤。
- 将手动步骤写为注释或伪代码。
- 用真实代码替换注释或伪代码。
- 优化真实代码。
准备数据结构和算法问题
数据结构
- 数组:编程中最常见的数据结构——是确定如何访问信息的重要组成部分。它是面试官最喜欢的话题之一,你在任何编程面试中都会听到很多关于数组的问题,例如反转数组、排序数组或搜索数组中的元素。解决基于数组的问题的关键是对数组数据结构以及基本编程构造(如循环、递归和基本运算符)有良好的了解。
- 字符串:与数组和链表数据结构一起,字符串是编程工作面试中另一个流行的话题。我从未参加过没有基于字符串的问题的编程面试。字符串的一个好处是,如果你知道数组,你可以轻松解决基于字符串的问题,因为字符串只不过是一个字符数组。所以,你通过解决基于数组的编程问题学到的所有技术也可以用于解决字符串编程问题。
- 链表:另一种常见的数据结构,补充了数组数据结构。与数组类似,它也是一种线性数据结构,以线性方式存储元素。然而,与数组不同,它不将它们存储在连续的位置;相反,它们分散在内存中的各处,使用节点相互连接。为了解决基于链表的问题,对递归的良好了解很重要,因为链表是一种递归数据结构。
- 栈和队列:栈是一种线性数据结构,类似于数组和链表。区别在于栈不允许随机访问其元素。它可以概念化为一组元素,只能从一个方向共同添加或减去。队列是一种线性数据结构,其中元素只能从列表的一侧(称为后部)插入,而元素只能从另一侧(称为前部)删除。
- 图:非线性数据结构,由多个节点和边或“顶点”组成。图可以表示网络架构,并可用于解决实际问题。广义上,它们描述了有向或无向的关系。
- 树:树数据结构是一种允许你以分层方式存储数据的数据结构。根据你存储数据的方式,有不同类型的树,例如二叉树,其中每个节点最多有两个子节点。与其近亲二叉搜索树一起,它也是最流行的树数据结构之一。因此,你会找到很多基于它们的问题,例如如何遍历它们、计数节点、查找深度以及检查它们是否平衡。解决二叉树问题的关键点是强大的理论知识,例如二叉树的大小或深度是什么,什么是叶子,什么是节点,以及对流行遍历算法的理解,例如前序、后序和中序遍历。
- 映射:数据结构中的映射是抽象数据类型,在数组中存储键值对。键值对关联两片数据,一片“键”可用于查找另一片“值”。
- 堆:堆是一种完全二叉树,二叉树是一种节点最多可以有两个子节点的树。在了解更多关于堆数据结构之前,我们应该了解完全二叉树。
算法
- 深度优先搜索(DFS):通过从根节点开始并在回溯之前尽可能远地跟随每个分支来搜索图和树。DFS可用于检测图中的循环、查找路径以及定位强连通组件。
- 广度优先搜索(BFS):首先检查兄弟节点,然后检查子节点。BFS可用于对等网络中以查找最短路径,甚至用于搜索引擎中的网络爬虫。
- 二分搜索:一种搜索算法,在排序数组中查找目标值的位置。二分搜索将目标值与数组的中间元素进行比较。如果它们不相等,则消除目标不可能存在的一半,并在剩余的一半上继续搜索,再次取中间元素与目标值进行比较,并重复此过程直到找到目标值。如果搜索以剩余一半为空结束,则目标不在数组中。
- 排序算法:一种将列表元素按顺序排列的算法。比较运算符用于设置数据结构中元素的新排列。
- 动态编程:一种优化技术,用于解决相同工作反复重复的问题。如果一个问题满足以下两个标准,则可以使用动态编程进行优化:
- 具有最优子结构。
- 具有重叠子问题。 如果一个问题满足这两个标准,那么我们可以肯定它可以使用动态编程进行优化。
- 回溯算法:通过考虑搜索中的每一个可能组合来尝试找到正确的输出。它一次处理一个片段,并删除在任何点不满足约束的解决方案。
- 分治算法:递归地将一个问题分解为两个或多个相同或相关类型的子问题,直到这些子问题变得足够简单可以直接解决。然后将子问题的解决方案组合起来,给出原问题的解决方案。
如何练习编程问题
- 制定你的时间表:如果你想准备攻克编程面试,在申请任何工作之前,给自己三个月的专注学习时间。每天留出2-3小时,在此期间处理2-3个编程问题。到三个月结束时,你将解决大约200个问题。然后你可以充满信心地进入面试。
- 练习大声和在纸/白板上解决问题:在你的练习中,你希望尽可能接近真实情况。养成可视化映射解决方案、提问和回答问题以及谈论你的过程的习惯。这就是你在编程面试中会被要求做的事情。如果你已经这样做了几个月:猜猜看——你将能够像钟表一样执行它。
- 想要一个现成的结构?选择一个编程面试准备平台:如果你不想处理创建自己的时间表、选择最佳问题练习和查找最佳解决方案,你可能想投资一门课程或准备平台。像AlgoExpert这样的平台指导你完成编程面试准备过程。你得到最可能的问题,以简单的格式策划,一个内置编译器可以直接输入你的代码,以及带有逐步解释的解决方案。另请查看不同的编程面试准备课程如何比较。
5. 提升你的软技能
作为开发者提升你的软技能,为编程面试的行为部分做准备。
3个留下好印象的技巧
- 用例子回答关于你先前项目的问题
- 了解公司,以便你可以定制解释为什么你想要这份工作,以及为什么雇用你会增加价值
- 提出有趣的问题,展示你的兴趣和热情
准备行为答案
用对行为问题的出色回答赢得面试官
每当被问到一个典型的行为问题时,你可以使用Saeed Gatson发明的CAT框架来构建回答:
- 情况(Circumstance)。
- 行动(Actions)。
- 收获(Takeaway)。
首先谈论你所处的情况,然后解释你为解决问题所采取的行动,最后描述你从整个经历中的收获。
事先准备好一些情况是有帮助的。
“告诉我关于你自己”的问题
使用Saaed的NFL方法,代表现在(Now)、以前(Former)、以后(Later)。从你现在正在做的事情开始。然后谈论你在以前的工作或项目中做过的事情。最后完成你在这个给定机会中想要实现的目标。
我在面试中从未没有被问到这个问题。这几乎是保证的。你不妨把它做好。
他们寻找的行为特质
合适的开发者不仅仅是知道算法的人;它是有效沟通并知道作为团队一部分意味着什么的人。
他们在行为面试中寻找的可以总结为4P:(信用:Saeed Gatson)
- 解决问题的能力(Problem-Solving Ability)。
- 对公司的热情(Passion for the Company)。
- 对技术的热情(Passion for Technology)。
- 得体的展示(Personable Presentation)。
详细来说,他们寻找这些特质:
编程面试的行为特质
- 解决问题
- 团队合作
- 礼貌
- 时间管理
- 身体语言
- 沟通
- 处理未知
作为工程师,你需要成为一个问题解决者。在编程面试中,你有足够的时间来证明这一点。一个常见的错误是试图尽快开始编写代码。你必须抵制这种冲动。确保你花足够的时间完全理解问题,然后再尝试解决它。另一个大错误是试图在第一次迭代中过度解决解决方案。保持简单,不要试图耍花招。
新的工程角色在更大的团队中,所以能够团队合作、为团队效力并成为团队玩家,而不是个人贡献者,将对你产生巨大影响。通过谈论你过去做的项目来说服面试官你团队合作良好。
你将与公司内部的许多人互动——甚至客户。这就是为什么你的面试官会筛选你的社交技能和意识。在面试中力求礼貌和同理心(而不软弱),你将在这一方面得分很高。
展示你可以按照自己的时间工作并完成任务。再次,你可以通过告诉他们你完成作品集中编码项目的过程来传达这一点。此外,你解决面试问题时如何分配时间也会给他们提示你的时间管理技能。
设置好,投射你的声音,打开胸膛,对你说的每句话都充满信心。或者至少尝试自信。在面试中力求“放松的自信”。你为即将到来的事情做好了准备。但你对结果不太执着。这体现在你如何表现自己——一个伟大的个人展示可以赢得面试官。
倾听好。回答要切中要点。不要在你的技能或项目上撒谎!为他们准备问题。适应你的听众——有洞察力和同理心:知道你在和谁说话,以及如何定制你的对话以适应他们。用你的语调展示你对公司的热情、对编写代码的热情、对完成项目的热情。
而不是冻结,你:提出正确的问题。采取高层次的观点,看看你是否可以将其分解。
如果你能在压力下保持冷静,并保持乐观和以解决方案为导向,即使很难,你也能够给你的面试官留下深刻印象。
如何在编程面试前提升你的软技能
社交技能对频繁练习反应良好。寻求将自己置于具有挑战性的社交情境中,要求你有魅力:
- 与新的人交谈。尝试通过有趣和感兴趣来赢得他们。
- 寻找任何公开演讲的机会并抓住它。
- 与你的朋友、其他程序员和高级软件工程师练习模拟面试。
6. 练习模拟面试
为了准备在压力下表现,尽可能模拟真实的编程面试环境。模拟面试是做到这一点的最佳方式。
再次,有在线平台帮助你进行这些模拟面试。有两个主要选项:
- Pramp将你与面试同类工作的同伴配对。你可以免费使用该平台与同伴进行模拟面试。
- 其他面试平台收费,但而不是同伴模拟面试,你与真正的FAANG高级软件工程师配对。在编程面试之前多次进行这些,你将准备好轻松通过它。
7. 准备谈判
不要忘记为好的结果准备自己!
如果你到目前为止遵循了学习 roadmap 的所有步骤——那么你最大化了收到offer的机会, sooner rather than later。
如果你谈判正确,你可以将软件工程工作的起薪提高相当多的金额——远远超过你从加薪中可能期望得到的。
谈判是有回报的。其次,加薪是基于你当前工资的百分比。这就是为什么在开始新工作时获得好工资并尽可能最好地谈判至关重要。
如果你能将整体补偿提高10%——这通常很容易获得——你可能在加薪方面领先2-3年,加薪通常 around 2-3%,但实际上可能是0%。
- 不要第一个说出数字
- 不要说你当前或过去的工资
- 提出反报价
- 小心从你想要的下降,总是尝试让他们上来
- 包裹的所有部分都是可谈判的
- 不要害怕花时间
这就是如何准备编程面试的总结!
关于在编程面试中如何行动的提示,请查看我的文章 with 17 coding interview tips。