如何准备一份「工程师范儿」的简历?如何在面试中体现代码能力?哪些是 Face to Face 面试必考 Java 知识点?
如何准备一份「工程师范儿」的简历?
定制简历:每个岗位的具体要求都不同,因此大家不要用一个通用的简历去应付所有的岗位,最好是根据特定公司的特定岗位来定制简历,突出与目标岗位匹配的经验和能力。大家去应聘一个开发或者测试工程师,和去应聘一个 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 开发者,绝大部分是用 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核心技术36讲》专栏
评论