速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

写给 Java 工程师的面试指南

  • 2019-02-02
  • 本文字数:4970 字

    阅读完需:约 16 分钟

写给Java工程师的面试指南

杨晓峰老师是资深 Java 工程师,也是极客时间《Java核心技术36讲》的专栏作者,他分享的内容有:


  1. 如何准备一份「工程师范儿」的简历?

  2. 如何在面试中体现代码能力

  3. Face to Face 面试必考 Java 知识点

  4. 大厂面试实例分析

如何准备一份「工程师范儿」的简历?

定制简历:我自己的经验是,每个岗位的具体要求都不同,因此大家不要用一个通用的简历去应付所有的岗位,最好是根据特定公司的特定岗位来定制简历。当然这并不是让大家编故事,而是突出与目标岗位匹配的经验和能力。大家去应聘一个开发或者测试工程师,和去应聘一个 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 讲》已破 2w 订阅,戳我立即查看

如何在面试中体现代码能力

有的面试者,平时很认真工作,但面试前没有时间准备充分,就会比较吃亏,因为很多面试时考察的算法和数据结构在平时工作中未必用得到,面试时如果有点生疏,就会给面试官留下不好的印象。所以大家在准备技术面试时,在代码方面一定要事先做个热身,至少让自己对基础知识的掌握处于一个良好的状态。


还有,在面试编码的时候,面试官会逐步深入,考察面试者是否对算法的理解达到了预期的深度,是否能够很好的沟通,是否能够理解面试官的主要目的,以及是否能够把不清晰的东西通过探讨逐渐清晰化。具体到代码的编写,至少要体现出良好的编码的习惯,让面试官觉得你是一个能够思考全面,写出高质量代码的人。包括在命名和结构上,最好参考业界比较好的实践,因为这些小的地方,恰恰也是代码质量的体现。


另外,很多时候面试者都需要在白板上编写代码。这一点,我发现很多人并不是很适应,例如 Java 开发者,绝大部分是用 Eclipse 或者 IDEA 这些 IDE 去进行开发,以至于有的面试者,甚至连 main 函数的一些细节都不确定,这个是很可怕的。因此,大家要记住比如主要的 API 结构等等。


最后,关于刷题,我觉得仁者见仁,智者见智。我自己没有刷过,但必须承认刷题网站是有效的,所以,我并不反对求职者去类似 LeeCode 这样的刷题网站学习一下,当然,区分刷题高手是面试官的能力。

Face to Face 面试必考 Java 知识点

首先,大家要仔细阅读招聘需求。因为招聘需求往往就体现出了面试官对我们的期望和未来工作的主要范围。比如,一个普通的 Java 后端工程师岗位,可能会写明需要应聘者懂高并发、懂 JVM 基础、熟悉 Spring 或者 Netty 这些开源框架,大家就可以有针对性的去做准备,因为谁也不能保证自己还能清楚的记得一、两年前做的项目用到的知识点。


关于 Java 面试核心知识点,大家可以参考我在极客时间推出的《Java 核心技术 36 讲》专栏,这个专栏的设计,就是针对的这方面的需求。极客时间团队在内容和选题上充分参考了主流互联网大厂在 Java 面试中的问题域,选取了其中的典型问题,一定会对大家有帮助。当然,也有读者反馈专栏里介绍的一些基础知识似乎平常用不上,这确实是事实,但我把这些基础知识列在里面是有原因的,希望专栏不是仅仅应付面试,而是能够有更多实际价值。同时,很多面试官,即使工作大多是做普通的数据库增删改查这些操作,也有可能从非常底层的角度去考察你,比如 JVM 底层或者是并发里 Synchronized 是怎么实现的。因此在专栏中,内容设计的目的都是为了让大家对 Java 语言的核心基础特性可以非常的熟悉,掌握主要的知识点。比如,并发的容器和基础的容器,最常见的 ConcurrentHashMap 或者 HashMap,各种并发的基础元素,Synchronized 底层机制,或者 ReentrantLock、线程池等等,都是 Java 面试中的长期热点。还有 JVM,它是一个很庞大的范围,它分为 Runtime、GC、编译器等模块,包括所谓的 Serviceability 的一些特性,这每一个方面实际上都有可能被面试官刨根问底,虽然可能我们整个中国做 JVM 开发的团队连一只手都不到,但是不妨碍 Java 面试中会去考 JVM,大家还是要在这些知识点上面深入了解。


另外,现在 Java 开发越来越广泛的应用到各种开源框架,包括像微服务这种新的软件架构形式,所以大家对主流的开源框架也要有充分的认识。比如,做普通业务开发时,Spring 或 Mybatis 这类框架可能是业务开发的一个标配,那对 Spring 里的一些机制,比如 Bean 的生命周期、AOP 等基础概念,就要有深入的认识。如果大家应聘的岗位是大数据,那对 Hadoop、Spark 这类开源框架就必须要有深入的理解。


关注热点也非常重要,我们技术人也要时常抬头看这个世界。比如曾经有段时间,面试就会被问哈希碰撞之类,就是因为当时有些大厂发生了这种攻击。再比如前两年,非常多的人在面试中被问到类似抢购、秒杀这样的场景等等。如果大家完全没有关注这些热点,等面试中被问到才去思考,时间有限加上紧张,很难考虑的充分。这两年,微服务似乎变成了一个必考的题目,比如对用 Dubbo 还是用 Spring Cloud,就需要有基础性的理解,以免被问到的时候没有准备。除了热点,特定领域都有特定的专业知识,例如,深度学习、推荐算法等,只有准备充分才能保证大家在面试时的表现完美。

大厂面试实例分析

下面,我就以自身的经验来介绍一下作为面试官,我在面试中会考察哪些方面,有哪些侧重点。不同的公司、不同团队,面试风格会有区别。我听到个别朋友说过,在一些公司面试完了,感觉经历很痛苦,我的团队不会这么苛刻的对待候选人。因为本质上,我们面试的目的并不是要表现面试官自己有多厉害,而是为了找出合格的候选人。有时我在面试中,也会刨根问底,但目的绝不是为了为难面试者,而是想看一下对方深度到底是在哪里,以及遇到挑战的时候,会有什么样的反应。


其次,就是考察面试者是否“适合”,对于不同的岗位,“适合”的定义是很不同的。


比如说像 JDK 团队,因为是一个非常基础的、底层的软件,最在乎的是性能、质量、可靠性等,所以对底层和基础技术的把握程度很重要。候选者可能是一个很棒的业务开发工程师,但是经验和技能可能不适合。


为了公平起见,我们也不会特别随意的问候选人各种问题,当然也会即兴发挥,但总体上是有固定的套路和节奏的,因为只有用同一标准去考察不同面试者,才能保证候选人的判断没有太多主观因素。


再有,面试者的兴趣和态度也非常重要,如果面试者对编程语言没有什么兴趣,那以我们的工作,他可能会做的非常痛苦。对于我们团队来说,我们招人的标准就比较特别,我们甚至不要求候选人精通 Java,只要你敢说自己很擅长某种编程语言。比如,我们这有个很资深的工程师,他在加入 Java 团队之前是不懂 Java 的,基本完全没有用过 Java,但是我们团队有足够的耐心,去让他发挥他的能力,构建自己的强项。不是每个团队都会这样,我觉得这也没有对错,得看具体的需求。


我们也会很在乎候选人过去的背景,如果跳槽过于频繁,就会有所疑虑。因为太频繁的跳槽可能意味着你的耐心和态度有一点问题(当然也可能是一些被动原因),这样的话,招聘成本就会很高。因此,这里也有一个建议,如果大家有选择,尽量不要过于频繁的跳槽。同样,我们也会看面试者在过去岗位中的表现,一个基本的判断就是,如果一个人在前一个岗位非常优秀,那他在下一个岗位继续优秀的可能性也会非常大。


下面,我介绍一些具体的流程。一般来说,开始的时候我不会直接问特别严肃的问题,会让面试者做一下自我介绍,或者从轻松的话题开始,比如像前两天西二旗这边发大水了等等,让面试者先放松下来。


然后,我一般会问的一个问题是“谈谈你做过的最有挑战的项目”,例如,难度很大、在这个项目中起到的作用比较大、能力表现最充分的项目。从答案里,我就可以看到很多方面,一方面是面试者是不是对自己的项目了解的很透彻,因为如果一个项目做了几年,还对它了解不很透彻,就会反映出一定的问题;另一方面就是面试者能不能清晰的表达出他所做的东西。因为在工作中,我们彼此之间交流的场景会非常多,尤其是像 JDK,有相当一部分要进行互相交互的 Review,或者在开源社区进行讨论。能不能清楚的表达问题,就决定了能不能完成任务。在介绍过程中,我也会选择性的问一些项目的细节,看下面试者对细节的态度,也防止面试者在讲故事。我会侧重考察面试者做事情的态度,解决问题的思路和能力,以及在遇到难点的时候采取什么方法,这些角度都很有参考价值。


这之后,对于 Java 工程师岗位来说,我就会考一些算法和数据结构的基础知识,因为好的基础是成功的一半。我一般会从很基础的题目开始,甚至如类似链表之类的数据结构。考察简单的数据结构,可以看出面试者写程序是否很 hands-on。如果上来就问一个很难的题目,很多时候,即使是很资深的工程师也未必写的出来,这样就会很尴尬,甚至导致谈不下去了。然后,就会考一些相对深入的问题,类似把简单的数据结构进行组合达到一个新的功能,或者在一个常规的算法上面进一步优化,计算算法复杂度等等。这时候通过面试者给出的思路,我再来看他是不是能够体会到一些常见的,比如空间换时间这些变通的思路和方法。在面试过程中,我也会观察面试者和我之间的交流是否流畅、准确、完整,也能体现出我们之间是不是可以很好的合作。因此,建议面试者即使遇到比较难的题目,也要尽量表现出积极沟通的态度。


最后,我在面试时并不会去死抠特别复杂的算法,或者特定的知识点,也不会选择刷题网站上的那种题目,以免招聘到面试高手,真实的业务能力未必和刷题能力相关。知识点和能力可能是两码事,考住一个人很容易,准确判断他的能力才是重点。其实我们工作中解决的绝大部分问题,只要有好的基础和好的态度,基本上就能做得到,毕竟我们不是在解决过于艰深的科学问题,也不是在做原子弹。以上这些,就是我在面试中比较看重的一些方面。


想顺利突围 Java 面试,拿到理想 offer?重点推荐杨晓峰老师《Java核心技术36讲》专栏,目前已有 2w+订阅!专栏重点围绕“术”与“道”,为你讲解 Java 面试的核心知识点。就算你暂时不需要准备面试,照样可以通过这个专栏,提升 Java 技能。


2019-02-02 16:238243

评论

发布
暂无评论
发现更多内容

Tech Talk 活动预告 | 为什么说 Serverless 是应用开发的未来?

亚马逊云科技 (Amazon Web Services)

Serverless

如何在 Vue 中使用 Chart.js - 手把手教你搭可视化数据图表

蒋川

Vue PDF pdf阅读器

「架构实战营」模块四作业 考试试卷存储方案

hxb

「架构实战营」

惨,给Go提的代码被批麻了

捉虫大师

Go 开源 Code Review

大画 Spark :: 网络(5)-Spark中的server端和client端

dclar

大数据 hadoop spark Spark 源码 大数据开发

Hoo虎符研究院|区块链简报20220307期

区块链前沿News

Hoo 虎符交易所 虎符研究院

高精度轻量级目标检测产业应用,实现多类通信塔识别

百度大脑

假如让你来设计SSL/TLS协议,你要怎么设计呢?

华为云开发者联盟

网络安全 HTTP 通信 SSL/TLS 协议 网络通信安全

PingCode 全新子产品 Insight 开放内测

爱吃小舅的鱼

AI人脸识别测温一体机设计

DS小龙哥

3月月更

关于中国芯片,这些话如鲠在喉

脑极体

CompusAss校园社团小程序解决方案

CC同学

如何避免在面试中看走眼

Hockor

个人成长 面试经验

12 款最棒 Vue 开源 UI 库测评 - 特别针对国内使用场景推荐

蒋川

Vue vue admin

微服务工程中,基础组件应用

架构 分布式 微服务

跨越DDD从理论到工程落地的鸿沟

华为云开发者联盟

DDD 业务逻辑 领域模型 设计思想 业务治理

小程序的第六年,我们还能怎么玩?

知晓云

小程序 微信 小程序生态 小程序运营

社区人物志|缪翎:见证开源世界的女性力量

ApacheDoris

大数据 开源 数据分析 OLAP apache doris

springsecurity默认用户生成

急需上岸的小谢

selenium操作元素遇到的异常

红毛丹

selenium

java高级用法之:无所不能的java,本地方法调用实况

程序那些事

Java Netty 程序那些事 3月月更

业内首家!百度智能云智慧金融业务通过ISO37301合规管理体系认证

百度大脑

React Draggable 实现拖拽 - 最详细中文教程 - 卡拉云

蒋川

React

appsmith 怎么用?评价如何

蒋川

appsmith

《大饼卷一切》爆笑相声剧 今晚开票!

InfoQ 天津

Android TabLayout 选中 tab 文字加粗显示

逆锋起笔

android 3月月更 TabLayout android滑动标签

Flutter 容器盒子布局模型

岛上码农

flutter ios 安卓 移动端开发 3月月更

Dubbo服务如何优雅的校验参数

vivo互联网技术

dubbo 服务器 java;

安全代码审计-PHP

网络安全学海

网络安全 信息安全 渗透测试 漏洞 代码审计

免费硬件、专属导师、豪华大礼|AI达人创造营第二期项目征集启动啦!

百度大脑

python 编辑器提示 do not use bare except

AlwaysBeta

Python vscode 编辑器 pycharm Python PEP

写给Java工程师的面试指南_语言 & 开发_杨晓峰_InfoQ精选文章