java面试编程面试题_如何通过编程面试

java面试编程面试题

招聘平台程序员的九部分指南

作者:AMMON BARTRAM,2016年3月8日。该帖子开始作为我们发送给候选人的准备材料,但我们决定公开发布。

作为一名优秀的程序员,在通过编程面试中的作用很小。 要成为一名高效率的程序员,您需要能够在数周甚至数月内解决庞大的问题。 相比之下,面试中的每个问题持续不到一小时。 为了在面试中取得好成绩,您需要能够在胁迫下快速解决小问题,同时清楚地说明自己的想法。 这是另一种技能[1] 。 最重要的是,面试官通常训练不足,专心致志(他们宁愿编程),并提出远离实际工作的问题。 它们带来了偏差,模式匹配和缺乏标准化。

运行三字节,我清楚地看到了这一点。 我们不看简历就采访工程师,而是将他们快速转到顶级高科技公司的现场。 在过去的9个月中,我们采访了1000多位程序员。 我们将重点放在实际编程上,并让求职者选择几种评估方式之一。 这意味着我们与许多(非常有才华的)程序员一起工作,而没有接受正式的CS培训。 其中许多人在面试中表现不佳。 他们在早餐时吃了一大堆问题,但是却对45分钟的算法挑战感到沮丧。

好消息是面试是一种可以学习的技能。 我们已经成功地教过候选人在面试中做得更好。 确实,与三字节应聘者通过公司面试最相关的质量不是天才,而是勤奋。

我从根本上不认为优秀的程序员应该学习特殊的面试技巧才能在面试中表现出色。 但是现状是事实。 我们正在Triplebyte进行更改。 如果您对我们正在做的事情感兴趣,我们希望您检查我们的流程 。 同时,如果您确实想在面试中变得更好,则这篇博客文章描述了我们认为您如何最有效地做到这一点。

1.热情

热情对面试结果有很大的影响。 在公司未通过面试的三字节候选人中,约有50%因非技术原因而失败。 公司通常将此称为“文化欠佳”。 在十分之九的企业中,文化契合度意味着对公司的工作充满热情。 公司希望候选人对自己的使命感到兴奋。 在许多公司中,这与技术技能一样重要。 这是有道理的。 激动的员工会更快乐,更努力地工作。

问题在于这是伪造的。 一些候选人设法说服他们与之交谈的每家公司,这是他们梦dream以求的工作,而另一些人(真正令他们兴奋的)却未能说服任何人。 我们一次又一次地看到了这一点。 解决方案是让每个人都能更好地展现自己的热情。 这是不允许说谎的。 但是面试就像约会。 即使是通常的情况,也没有人希望初次被告知它们是众多选择中的一个。 同样,大多数程序员只是想要一份薪水不错的好工作。 但是在采访中说这是一个错误。 最好的方法是在面试之前准备笔记,以了解您对公司的兴奋之处,并在每位面试官询问您是否有任何问题时提出。 一个很好的想法来源是阅读公司最近的博客文章和新闻稿,并记下您发现令人兴奋的内容。

这个想法似乎很简单。 我想您读这篇文章时会点头。 但是(正如曾经面试过的任何人都能告诉你的那样),只有极少数的申请人这样做。 认真准备有关为什么找到一家令人振奋的公司的说明,确实会提高您的合格率。 您甚至可以在面试中参考笔记。 带来准备好的笔记表明准备。

2.研究常见的面试概念

面试问题的很大一部分具有数据结构和算法。 不论好坏,这都是事实。 我们从在公司面试的应聘者那里收集问题的详细信息(我们将在以后的文章中对这些数据进行深入分析),算法问题占所提出问题的70%以上。 您无需成为专家,但是了解以下算法和数据结构列表将对大多数公司有所帮助。

  • 哈希表
  • 链表
  • 广度优先搜索,深度优先搜索
  • 快速排序,合并排序
  • 二进制搜索
  • 2D阵列
  • 动态数组
  • 二叉搜索树
  • 动态编程
  • 大O分析

根据您的背景,此列表看起来微不足道,或者看起来完全是令人生畏的。 这就是重点。 这些概念在采访中比在生产Web编程中更为普遍。 如果您是自学成才或失学多年,并且您不熟悉这些概念,那么在学习面试时会做得更好。 即使您确实知道这些知识,刷新知识也会有所帮助。 面试问题的惊人比例很高,减少到广度优先搜索或使用哈希表来计算唯一性。 您需要能够编写BFS密码,并且需要了解如何实现哈希表。

学习这些东西并不像我们交谈的许多人那么难。 算法通常用学术语言描述,这可能会引起争议。 但从本质上讲,此列表中没有什么比现代Web应用程序的体系结构更复杂。 如果您可以构建一个Web应用程序,那么您可以学习这些内容。 我推荐的资源是Steven Skiena撰写的《算法设计手册》 。 第3章至第5章以简单的方式很好地完成了本材料。 它确实使用C和一些数学语法,但是很好地解释了材料。 Coursera也有一些很好的算法课程。 这其中 ,尤其侧重于在采访重要的概念。

学习算法和数据结构不仅有帮助,因为面试中会涉及材料,而且因为算法课程中解决问题的方法与面试中效果最佳的方法相同。 学习算法将使您进入面试的心态。

3.获得面试官的帮助

面试官可以帮助候选人。 他们给出提示,回应想法,并通常指导过程。 但是他们不能平等地帮助所有候选人。 一些程序员能够获得大量帮助,而面试官不会反对他们。 对于其他人给出的任何暗示,都会对其进行严厉的评判。 您想得到帮助。

这归结为过程和沟通。 如果面试官喜欢您的过程,并且您与他们进行了很好的沟通,他们将不介意提供帮助。 您可以通过仔细的过程来提高这种可能性。 我建议的步骤是:

  1. 问问题
  2. 通过暴力解决方案进行交谈
  3. 讨论优化的解决方案
  4. 写代码

在询问您面试问题之后,请先弄清所问的内容。 现在是做书的时候了。 弄清您能想到的每一个歧义。 询问边缘情况。 提出具体的输入示例,并确保您对预期的输出是正确的。 即使您几乎确定知道答案,也要提问。 这很有用,因为它使您有机会提出边际案例并充分说明问题(查看边际案例的处理方式是面试官评估面试时要寻找的主要内容之一),并且还因为它可以为您提供需要一分钟的时间来收集您的想法,然后再开始解决问题。

接下来,您应该讨论最简单的暴力解决方案,以解决您可能想到的问题。 您应该讲话,而不是立即着手编写代码,因为讲话时您可以移动得更快,并且对面试官来说更具吸引力。 如果访问员订婚,他们将介入并提供指示。 但是,如果您退缩以编写代码,则将错失良机。

假定问题的暴力解决方案过于明显或错误,则候选人通常会跳过暴力步骤。 这是个错误。 确保始终为提出的问题提供解决方案(即使这需要花费指数时间,或者使用NSA超级计算机)。 当您描述了暴力解决方案时,请询问面试官他们是否希望您实施该解决方案,或者提出更有效的解决方案。 通常,他们会告诉您提出更有效的解决方案。

更为有效的解决方案的过程与蛮力相同。 再说一次,不要写代码,然后从面试官那里跳出来。 希望这个问题与您所看到的类似,并且您将知道答案。 如果不是这种情况,那么考虑一下您所看到的最相似的问题并与面试官一起提出这些问题将很有用。 大多数面试问题都是经典CS算法的模糊应用。 面试官通常会指导您使用此算法,但前提是您开始该过程。

最后,在您和您的面试官都同意您有一个好的解决方案之后,您应该编写代码。 根据公司的不同,它可能在计算机或白板上。 但是,因为您已经提出了解决方案,所以这应该很简单。 对于其他问题,请询问您的面试官是否希望您编写测试。

4.谈论权衡

编程面试主要由编程问题组成,这就是我到目前为止所说的。 但是,您可能还会遇到系统设计问题。 公司似乎特别喜欢这些,尤其是对于经验丰富的候选人。 在系统设计问题中,询问候选人如何设计一个复杂的现实世界系统。 示例包括设计Google Maps,设计社交网络或为银行设计API。

第一个观察结果是,回答系统设计问题需要一些特定的知识。 显然,没有人真正期望您设计Google Maps(这花费了很多人很长时间)。 但是他们确实希望您对这种设计的各个方面有所了解。 好消息是,这些问题通常集中在Web后端,因此您可以通过阅读有关此领域的内容来取得很大的进步。 要理解的事情的不完整清单是:

  • HTTP(在协议级别)
  • 数据库(索引,查询计划)
  • CDN
  • 缓存(LRU缓存,memcached,redis)
  • 负载均衡器
  • 分布式工作者系统

您需要了解这些概念。 但更重要的是,您需要了解它们如何组合在一起以形成真实的系统。 最好的学习方法是阅读其他工程师如何使用这些概念。 “ 高可伸缩性 ”博客对此是一个很好的资源。 它发布了真实公司的后端体系结构的详细文章。 您可以了解上面列表中的每个概念如何在实际系​​统中使用。

阅读完这些内容后,回答系统设计问题就成为一个过程问题。 从最高级别开始,然后向下移动。 在每个级别上,向面试官询问规范(您应该提出一个简单的起点,还是谈论一个成熟的系统看起来像什么?),然后讨论几个选项(应用您阅读中的想法)。 在设计中讨论折衷是关键。 面试官不太在乎您的设计本身是否好,而在乎您是否能够谈论决策的权衡(正面和负面)。 练习这个。

5.突出结果

您可能会遇到的第三种问题是体验问题。 面试官在这里要求您谈论您过去完成的编程项目。 许多工程师在此问题上犯的错误是谈论一个技术上有趣的附带项目。 许多程序员选择谈论实现神经网络分类器或编写Twitter语法机器人。 这些都是错误的选择,因为访问员很难判断其范围。 许多候选人夸大了简单的附带项目(有时从未真正起作用),而面试官没有办法告诉您是否正在这样做。

解决方案是选择一个产生结果的项目,并突出显示结果。 这通常涉及选择一个技术上不太有趣的项目,但这是值得的。 (提前考虑)您所完成的编程对现实世界的影响最大。 如果您编写了iOS游戏,并且有5万人下载了该游戏,则下载数量使其成为一个不错的选择。 如果您在实习期间编写了一个管理界面,并已将其部署到整个管理人员,那么部署是一件好事。 选择一个实际的项目还将与您重点关注实际工作的公司进行沟通。 过于关注有趣技术的程序员是公司反对的反模式(这些程序员有时效率低下)。

6.使用动态语言,但要提及C

我建议您在面试时使用动态语言,例如Python,Ruby或JavaScript。 当然,您应该使用最了解的任何语言。 但是我们发现许多人尝试使用C,C ++或Java进行面试,给人的印象是这些是“真正的”编程语言。 关于面试的几本经典书籍都建议程序员选择Java或C ++。 至少在初创公司,我们发现这是个坏建议。 使用动态语言时,候选人的表现会更好。 我认为这是真的,因为动态语言的紧凑语法,灵活的键入以及列表和哈希文字。 它们是允许的语言。 在编写复杂的系统时(这是一个值得商point的问题),这可能是一个责任,但是当尝试将二进制搜索塞入白板时,这很好。

无论使用哪种语言,提及其他语言的工作都会很有帮助。 公司所反对的一种反模式是只懂一种语言的人。 如果您只懂一种语言,则必须依靠自己的实力。 但是,如果您已经完成了多种语言的工作或副项目,请在与面试官交谈时确保提出来。 如果您使用过诸如C,C ++,Go或Rust的低级语言,那么谈论这一点将特别有帮助。

Java,C#和PHP是有问题的情况。 正如我们在上一篇博客文章中所描述的那样,我们发现了初创公司对这些语言的偏见。 我们的数据显示,在面试中使用这些语言的程序员通过率较低。 这不公平,但这是事实。 如果您还有其他选择,建议不要在初创公司面试中使用这些语言。

7.练习,练习,练习

通过练习回答问题,可以使面试变得更好。 之所以如此,是因为面试压力很大,但压力却损害了绩效。 解决方法是实践。 面试变得与压力无关。 这是凭经验自然发生的。 即使在一次求职中,我们也发现候选人经常会在初次面试中失败,然后随着信心的建立而通过。 如果压力是您要解决的问题,我建议您通过练习采访压力来快速启动此过程 获取面试问题列表(《 破解编码面试》是一本好书)并解决它们。 为每个问题设置20分钟的计时器,然后竞赛回答。 练习在白板上写下答案(并非所有公司都要求这样做,但这是最坏的情况,因此您应该练习)。 纸上笔是白板的一个很好的模拟。 如果您有可以帮助您做准备的朋友,轮流面试是很棒的。 阅读许多面试问题还有一个额外的好处,那就是为您提供在实际面试中使用的想法。 重用(全部或部分)数量惊人的问题。

即使是经验丰富(且没有压力的)候选人也将从中受益。 面试是与作为程序员根本不同的技能,并且可能会萎缩。 但是有经验的程序员经常(合理地)认为他们不必为面试做准备。 他们学习较少。 这就是为什么初中候选人在面试问题上通常比有经验的候选人表现更好的原因。 公司知道这一点,并且自相矛盾的是,有些公司告诉我们他们为有经验的候选人设置了较低的编程问题门槛。

8.提及凭证

证书偏向面试官。 在顶级公司工作或在顶级学校学习过的三字节应聘者比没有这些证书的程序员通过面试的比率要高出30%(对于我们的凭据盲目屏幕上的给定性能水平)。 我不喜欢这样 这不是精英,很糟糕,但是如果您拥有这些资历,请确保您的面试官知道这一点符合您的利益。 您不能相信他们会阅读您的简历。

9.排队优惠

如果您曾经阅读过有关创始人的募资建议,那么您将知道,获得第一家风险投资公司提供投资是最困难的部分。 提供一份工作后,会有更多人涌入。工作机会也是如此。 如果您已经有报价,请务必在面试中提及。 在面试中提及其他提议会使面试官偏向于您。

这将提出以下策略:列出您感兴趣的公司,并以相反的兴趣顺序进行采访 在此过程中尽早做好,将增加您获得第一选择的机会。 你应该做这个。

结论

通过面试是一种技能。 成为一名优秀的程序员会有所帮助,但这只是其中的一部分。 每个人的部分面试都失败了,适当的准备可以帮助每个人通过更多。 热情至高无上,研究对此有所帮助。 许多程序员由于缺乏热情而失败,也由于技术原因而失败。 面试官在面试过程中为求职者提供帮助,如果您遵循良好的流程并进行清晰的沟通,他们会为您提供帮助。 练习总是有帮助的。 阅读许多面试问题并确保自己承受面试压力会带来更多机会。

这种情况并不理想。 准备面试是一项工作,并且迫使程序员学习除开发出色软件之外的技能是浪费每个人的时间。 公司应改善面试流程,以减少学术CS,记忆事实和彩排面试流程的偏见。 这就是我们在三字节上所做的。 我们帮助程序员找到工作而不看简历。 我们让程序员选择要评估的几个领域之一,并且随着时间的推移,我们研究和改进我们的过程。 我们很乐意帮助您在初创公司找到工作,而不会遇到麻烦。 您可以从这里开始。 但是现状是事实。 在此之前,程序员应该知道如何准备。

感谢Jared Friedman,Emmett Shear,Garry Tan,Alexis Ohanian和Daniel Gackle阅读了此草稿。

[1]这并不是说面试表现与编程技巧无关。 是的 但是相关性远比大多数公司的假设弱,并且编程技能以外的其他因素可以解释面试差异的很大一部分。

最初发布于Triplebyte的博客: https ://triplebyte.com/blog/how-to-pass-a-programming-interview

翻译自: https://hackernoon.com/how-to-pass-a-programming-interview-57504817df3d

java面试编程面试题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值