
作者|杨晓峰
编辑|李明原
如何准备一份具有“工程师范儿”的简历?怎样在面试中展现出代码能力?Face to Face 面试中必考的 Java 知识点都有哪些?大厂面试的实例是怎样的?本文是 7 月 19 日杨晓峰老师在极客 Live 上进行的《1 小时搞定 java 面试》直播的整理内容。杨晓峰老师具备资深 Java 工程师的身份。他还是极客时间《Java 核心技术 36 讲》的专栏作者。
1 如何准备一份「工程师范儿」的简历?
定制简历
我的经验表明,每个岗位的具体需求存在差异。所以,大家不能用一份通用的简历来应对所有岗位,最好依据特定公司的特定岗位来定制简历。这并非让大家编造故事,而是要突出与目标岗位相匹配的经验和能力。大家应聘开发或测试工程师这一角色,与应聘 Team Leader 或技术经理的角色是完全不同的。如果我应聘管理性质岗位,会在简历里适当突出曾从 0 开始组建 10 人的技术团队,团队中有资深 Java 开发工程师若干,还有数据库工程师等,这样更有说服力;同理,不同技术岗位需求有区别。大家写简历的首要目标是让简历在筛选阶段得以生存。一个岗位往往会收到大批简历。如果简历写得不够清晰,不能让 HR 觉得很适合,那么很有可能在开始阶段就被刷掉,从而没有机会去面试。
突出亮点
我见过许多简历,其中都写着自己既懂得 Java,又懂得 JavaScript,还懂得 Python,并且一下能写十几行。这本身并没有错,然而最好能够将自己的核心技能突出出来,例如,“我拥有 8 年的 Java 开发经验,在 Java 并发或者 Java 安全方面极为擅长”。但要注意,突出亮点时不要过分浮夸。因为有时看到简历中有太多“精通”“深度掌握”这类词,第一感觉会是怀疑,而非觉得这个人很牛。所以要适当把握程度,事实是基础。另外,在项目经验方面,我建议按照时间顺序从近到远进行排序。最好能够体现出目标岗位的匹配度,突出自身项目的难度和价值,同时也要展现出自己在项目中的作用。这样做就能够进一步帮助面试官去判断候选人的能力以及其在团队中的位置。
用事实和数据说话
工程师更注重定量而非定性,所以要让面试官和 HR 感受到大家的经历或亮点是可度量的事实。例如,在简历中强调“善于快速学习”是有帮助的,但配上“在两个星期内学会了 Clojure 语言并做了一个撮合系统”,能更好地体现“快速学习”能力。有很多人表述较为模糊,例如在简历里写“我提升了系统性能”,但未明确具体提升程度,而作为面试官,我难以知晓这个所谓的“提升”到底是何种程度。大家最好写得明确些,例如在一个四核 8G 的配置下,能够将吞吐量从 2000 QPS 提升至 8000 QPS,平均请求为 100K bytes 等,这样就会很有说服力。
公开成果很加分
如果是开源项目的贡献者,拥有一个内容丰富的博客,在 Github 上提供了许多被采纳的 PR,发表过一些技术论文,在 QCon 或者 ArchSummit 上进行过分享,或者撰写过一些著作等。像这些能够公开看到的成果,比自己对自己进行评价更有效果。
简历形式
在形式方面,最好去参考一些优秀的简历,把它们的模板借鉴过来。需要注意的是,中国人的习惯与外国人不同。如果是去应聘欧美公司,最好到 Google 上查找英文简历模板,而不要直接将中文简历翻译成英文。
简历篇幅
最好将内容控制在 1 至 2 页的篇幅,既不能显得内容过少而单薄,也不能显得篇幅过长而过于冗长,并且各个段落之间要做到条理清晰。
杨晓峰老师的《Java 核心技术 36 讲》订阅量已经突破 2 万。可以通过扫码立刻查看该课程。

2 如何在面试中体现代码能力
有的面试者平时工作很认真,但因面试前没时间充分准备,就会处于劣势。因为很多面试考察的算法和数据结构在平时工作中未必会用到,面试时若稍有生疏,就会给面试官留下不好的印象。所以大家在准备技术面试时,一定要提前在代码方面进行热身,至少要让自己对基础知识的掌握处于良好状态。
在面试编码时,面试官会逐步深入。面试官会考察面试者对算法的理解是否达到预期深度,能否很好地沟通,能否理解面试官的主要目的,以及能否将不清晰的东西通过探讨逐渐清晰化。具体到代码编写,至少要体现出良好的编码习惯,让面试官觉得你能够思考全面,写出高质量的代码。在命名方面最好参考业界较好的实践,在结构上也最好参考业界较好的实践。因为这些小的地方,恰恰能够体现代码的质量。
另外,很多时候面试者需在白板上编写代码。我发现很多人对此并不适应,像 Java 开发者,大多是用 Eclipse 或 IDEA 这类 IDE 来进行开发,以致有的面试者甚至连 main 函数的一些细节都不确定,这是很可怕的。所以,大家要记住诸如主要的 API 结构等内容。
最后,对于刷题这件事,大家的看法各不相同。我自己未曾刷过题,但我得承认刷题网站是有效果的。所以,我并不反对求职者去像 LeeCode 这样的刷题网站学习一下。当然,能否区分出刷题高手是面试官的能力所在。
3 Face to Face 面试必考 Java 知识点
大家首先要仔细阅读招聘需求。招聘需求通常能体现出面试官对我们的期望以及未来工作的主要范围。例如,一个普通的 Java 后端工程师岗位,可能会明确要求应聘者知晓高并发,知晓 JVM 基础,熟悉 Spring 或者 Netty 这些开源框架,这样大家就能够有针对性地进行准备,因为谁都无法确保自己还能清晰地记得一两年前所做项目用到的知识点。
大家可以参考我在极客时间推出的《Java 核心技术 36 讲》专栏,以了解 Java 面试的核心知识点。这个专栏的设计目的就是满足这方面的需求。极客时间团队在内容和选题方面充分参考了主流互联网大厂在 Java 面试中的问题域,并且选取了其中的典型问题,这些内容一定会对大家有所帮助。在专栏里,内容设计的目的是让大家对 Java 语言的核心基础特性熟悉起来,要掌握主要的知识点。比如,有并发的容器,还有基础的容器,其中最常见的是 ConcurrentHashMap 或者 HashMap。各种并发的基础元素,像 Synchronized 的底层机制,以及 ReentrantLock、线程池等等,这些在 Java 面试中一直都是热点。JVM 是一个范围很庞大的东西。它包含 Runtime、GC、编译器等模块,还包括所谓的 Serviceability 的一些特性。每一个方面都有可能被面试官深入探究。虽然整个中国做 JVM 开发的团队人数很少,可能连一只手都不到,但这并不妨碍 Java 面试会考查 JVM,大家还是需要在这些知识点上深入了解。
现在 Java 开发在各种领域广泛应用开源框架,其中包含像微服务这种新的软件架构形式,因此大家必须对主流的开源框架有足够的认识。做普通业务开发时,Spring 或 Mybatis 这类框架或许是业务开发的标配。对于 Spring 中的一些机制,像 Bean 的生命周期、AOP 等基础概念,需要有深入的认知。倘若大家应聘的岗位是大数据,那么对 Hadoop、Spark 这类开源框架就必须要有深入的理解。
关注热点很重要,我们技术人要时常关注世界。例如,曾有段时间,面试时会被问到哈希碰撞等问题,这是因为当时一些大厂发生了此类攻击。又如,前两年,很多人在面试中被问到抢购、秒杀等类似场景。如果大家完全不关注这些热点,等到面试被问到才去思考,由于时间有限且紧张,就很难考虑得充分。这两年,微服务似乎成了一个必考的题目。比如在选择用 Dubbo 还是用 Spring Cloud 时,需要有基础性的理解,这样才不会在被问到的时候毫无准备。除了热点领域,特定领域都有其特定的专业知识,像深度学习、推荐算法等。只有做好充分准备,才能保证大家在面试时的表现完美。
4 大厂面试实例分析
下面,我以自身经验来介绍。作为面试官,我在面试中会考察一些方面,也有一些侧重点。不同的公司和不同团队,面试风格存在区别。我曾听到个别朋友说,在一些公司面试结束后,感觉经历很痛苦。但我的团队不会如此苛刻地对待候选人。因为本质上,我们面试的目的不是要展现面试官自己有多厉害,而是要找出合格的候选人。我在面试时有时会深入探究。但我的目的并非为难面试者,而是想知晓对方的深度所在之处,以及在面临挑战时会做出何种反应。
其次,要考察面试者是否“适合”。对于不同的岗位,“适合”的定义存在很大差异。
像 JDK 团队这样,由于它是一个极为基础且底层的软件,最为看重的是性能、质量、可靠性等方面。所以,对底层和基础技术的把握程度是很重要的。而有的候选者或许是一位很出色的业务开发工程师,然而其经验和技能可能并不适合。
为了保证公平,我们不会随意询问候选人各种问题。我们会有即兴发挥的时候,但总体上是有固定套路和节奏的。因为只有用同一标准考察不同面试者,才能确保对候选人的判断没有太多主观因素。
另外,面试者的兴趣和态度很重要。倘若面试者对编程语言没什么兴趣,那么以我们的工作性质来看,他可能会在工作中感到非常痛苦。对于我们的团队而言,我们招人的标准比较特别,我们甚至不要求候选人精通 Java,只要候选人敢说自己很擅长某种编程语言就行。比如,我们这儿有一位经验非常丰富的工程师。在他加入 Java 团队之前,他对 Java 是一无所知的,基本上完全没有使用过 Java。然而,我们的团队有着足够的耐心,能够让他充分发挥自己的能力,去构建他自己的强项。不是每一个团队都会像我们这样做,我认为这也不存在对错之分,这要根据具体的需求来决定。
我们会在意候选人的过去背景。倘若其跳槽过于频繁,我们便会心生疑虑。因为过于频繁的跳槽或许意味着候选人的耐心和态度存在一定问题(当然也可能是一些被动因素导致的),如此一来,招聘成本会变高。所以,这里有个建议,倘若大家有选择的余地,尽量避免过于频繁地跳槽。我们会查看面试者在过去岗位的表现。一个基本判断是,若一个人在前一个岗位表现得极为优秀,那么他在下一个岗位继续保持优秀的可能性也会很大。
具体流程
以下是一些具体的流程介绍。通常情况下,起初我不会即刻询问极为严肃的问题,而是会让面试者进行自我介绍。或者从较为轻松的话题着手,例如前些天西二旗那边发生了大水这类情况,以此让面试者先舒缓情绪、放松下来。
然后,我通常会问的一个问题是:“请谈谈你做过的最具挑战性的项目。”比如,某个难度极高的项目,或者在该项目中发挥了较大作用的项目,亦或是能充分展现个人能力的项目。从答案中,我能看到多方面情况。其一,面试者是否对自己的项目了解得很透彻。因为倘若一个项目做了数年,却仍对其了解不够透彻,那就会暴露出一定的问题。其二,面试者能否清晰地表达出他所做的东西。工作中彼此交流的场景很多,像 JDK 这方面,有相当一部分需进行互相交互的 Review ,或者在开源社区讨论。能否清楚表达问题决定能否完成任务。介绍过程中,我会选择性地问一些项目细节,以此查看面试者对细节的态度,同时防止面试者只在讲故事。我会重点考察面试者做事的态度,会考察他们解决问题的思路和能力,还会考察在遇到难点时采取的方法,这些角度都具有参考价值。
这之后,在 Java 工程师岗位的招聘中,我会考查一些算法和数据结构的基础知识。因为良好的基础是成功的一半。我通常会从非常基础的题目入手,甚至包括像链表这样的数据结构。通过考察简单的数据结构,能够看出面试者编写程序是否很熟练、很实际。如果一开始就询问一个难度较大的题目,在很多情况下,即便对方是很资深的工程师,也未必能够写得出来。这样一来就会处于尴尬的境地,甚至会导致交流无法继续下去。接着,会考查一些相对较为深入的问题,比如将简单的数据结构进行组合以实现一个新的功能,或者在常规的算法基础上进一步进行优化,以及计算算法的复杂度等。这时候我通过面试者给出的思路,再来查看他能否体会到一些常见的变通思路和方法,比如空间换时间。在面试过程中,我会观察面试者与我之间的交流是否流畅、准确且完整,以此能体现出我们之间是否可以很好地合作。所以,建议面试者即便遇到较难的题目,也要尽量展现出积极沟通的态度。
最后,在面试时,我不会过于专注于特别复杂的算法以及特定的知识点。我也不会选取刷题网站上的那种题目。这样做是为了避免招聘到仅仅在面试中表现出色的人,因为真实的业务能力与刷题能力未必相关。知识点和能力可能是不同的,考住一个人相对容易,而准确判断他的能力才是关键所在。其实我们在工作中解决的大部分问题,只要具备好的基础和好的态度,通常是能够做到的。因为我们并非在解决极为艰深的科学问题,也不是在制造原子弹。这些方面就是我在面试中较为看重的一些内容。
要想顺利在 Java 面试中突围并拿到理想 offer 吗?强烈推荐杨晓峰老师的《Java 核心技术 36 讲》专栏呢,目前该专栏已经有 2 万多的订阅量啦!这个专栏主要围绕着“术”和“道”,给你讲解 Java 面试的核心知识点。即便你暂时没有准备面试的打算,依然可以通过这个专栏来提升 Java 技能。
另外,当你邀请一位好友进行购买时,你能够获得 12 元现金。同时,你的好友也会获得 6 元的返现。邀请的好友越多,获得的返现就越多,并且没有上限。你可以立即进行提现,提现流程为:在极客时间 App 中,进入“我的”页面,然后点击“分享有赏”。
长按下图二维码,微信支付,立即订阅。

今日荐文
点击下方图片即可阅读
WebIDE:在浏览器中写代码的时代即将来临?
