8年经验面试官详解 Java 面试秘诀
作者 |胡书敏责编 | 刘静出品 | CSDN(ID:CSDNnews)本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。Java程序员准备和投递简历的实...
 

 
| 
     简历中应包含的要素
     | 
     目的
     | 
| 
     基本信息,比如姓名,性别,年龄,目前所在城市,是否在职,手机和电邮等。
     | 
     1 让招聘方了解候选人的基本信息。
     
     2 以便招聘方通过手机等方式能联系到候选人。
     | 
| 
     按时间倒叙写教育背景,一般只需要包含高中以上,初中高中等不必写,但需包含专业和学历学位信息。
     | 
     用专业和学历学位等信息向招聘方证明自己的技术背景。
     | 
| 
     总结性地列出自己所掌握的技能。比如:
     
     1 有3年Java经验,有2年Spring MVC经验。
     
     2有3年Oracle经验,有2年Oracle调优经验。
     
     等等
     | 
     一般这些总结点是和职务需求是一致的,这样能让招聘方直接地感受到该候选人的匹配度。
     
     在这基础上,可以适当列些能成功帮到自己的总结点。
     | 
| 
     按倒叙列出工作过的公司,并列出在这些公司里的项目经验,这部分的技能下文会详细描述。
     | 
     在项目经验描述里,能通过项目用到的技术经验等,具体地给出自己“匹配”该岗位的证明。
     | 
| 
     可以列出和应聘岗位相关的培训经历和得到过的奖励
     | 
     这些属于加分项,同等情况下能优先录用
     | 
| 
     用少量篇幅列出自己的兴趣和自我总结
     | 
     让招聘公司进一步了解候选人
     | 
 
|  | 
     你
     | 
     面试官
     | 
| 
     对你以前的项目和技能
     | 
     很了解
     | 
     只能听你说,只能根据你说的内容做出判断
     | 
| 
     在面试过程中的职责
     | 
     在很短的时间内防守成功即可
     | 
     如果找不出漏洞,就只能算你以前做过
     | 
| 
     准备时间
     | 
     面试前你有充足的时间准备
     | 
     一般在面试前用30分钟阅读你的简历
     | 
| 
     沟通过程
     | 
     你可以出错,但别出关键性的错误
     | 
     不会太为难你,除非你太差
     | 
| 
     技巧
     | 
     你有足够的技巧,也可以从网上找到足够多的面试题
     | 
     其实就问些通用的有规律的问题
     | 
| 
     提问方式
     | 
     目的
     | 
| 
     让你描述工作经验和项目(极有可能是最近的),看看你说的是否和简历上一致
     | 
     看你是否真的做过这些项目
     | 
| 
     看你简历上项目里用到的技术,比如框架、数据库,然后针对这些技术提些基本问题
     | 
     还是验证你是否做过项目,同时看你是否了解这些技术,为进一步提问做准备
     | 
| 
     针对某个项目,不断深入地问一些技术上的问题,或者从不同侧面问一些技术实现,看你前后回答里面是否有矛盾
     | 
     深入核实你的项目细节
     | 
| 
     针对某技术,问些项目里一定会遇到的问题,比如候选人说做过数据库,那么就会问索引方面的问题
     | 
     通过这类问题,核实候选人是否真的有过项目经验(或者还仅仅是学习经验)
     | 
 
- 
  反向代理方面,nginx的基本配置,比如如何通过lua语言设置规则,如何设置session粘滞。如果可以,再看些nginx的底层,比如协议,集群设置,失效转移等; 
- 
  远程调用dubbo方面,可以看下dubbo和zookeeper整合的知识点,再深一步,了解下dubbo底层的传输协议和序列化方式; 
- 
  消息队列方面,可以看下kafka或任意一种组件的使用方式,简单点可以看下配置,工作组的设置,再深入点,可以看下Kafka集群,持久化的方式,以及发送消息是用长连接还是短拦截。 
- 
  SQL高级方面,比如group by, having,左连接,子查询(带in),行转列等高级用法; 
- 
  建表方面,你可以考虑下,你项目是用三范式还是反范式,理由是什么? 
- 
  尤其是优化,你可以准备下如何通过执行计划查看SQL语句改进点的方式,或者其它能改善SQL性能的方式(比如建索引等); 
- 
  如果你感觉有能力,还可以准备些MySQL集群,MyCAT分库分表的技能。比如通过LVS+Keepalived实现MySQL负载均衡,MyCAT的配置方式。同样,如果可以,也看些相关的底层代码。 
- 
  String a = "123"; String b = "123"; a==b的结果是什么?这包含了内存,String存储方式等诸多知识点; 
- 
  HashMap里的hashcode方法和equal方法什么时候需要重写?如果不重写会有什么后果?对此大家可以进一步了解HashMap(甚至ConcurrentHashMap)的底层实现; 
- 
  ArrayList和LinkedList底层实现有什么差别?它们各自适用于哪些场合?对此大家也可以了解下相关底层代码; 
- 
  volatile关键字有什么作用?由此展开,大家可以了解下线程内存和堆内存的差别; 
- 
  CompletableFuture,这个是JDK1.8里的新特性,通过它怎么实现多线程并发控制? 
- 
  JVM里,new出来的对象是在哪个区?再深入一下,问下如何查看和优化JVM虚拟机内存; 
- 
  Java的静态代理和动态代理有什么差别?最好结合底层代码来说。 
- 
  能通过less命令打开文件,通过Shift+G到达文件底部,再通过?+关键字的方式来根据关键来搜索信息; 
- 
  能通过grep的方式查关键字,具体用法是, grep 关键字 文件名,如果要两次在结果里查找的话,就用grep 关键字1 文件名 | 关键字2 --color。最后--color是高亮关键字; 
- 
  能通过vi来编辑文件; 
- 
  能通过chmod来设置文件的权限。 
- 
  ArrayList,LinkedList的底层代码里,包含着基于数组和链表的实现方式,如果大家能以此讲清楚扩容,“通过枚举器遍历“等方式,绝对能证明自己; 
- 
  HashMap直接对应着Hash表这个数据结构,在HashMap的底层代码里,包含着hashcode的put,get等的操作,甚至在ConcurrentHashMap里,还包含着Lock的逻辑。我相信,如果大家在面试中,看看而言ConcurrentHashMap,再结合在纸上边说边画,那一定能征服面试官; 
- 
  可以看下静态代理和动态代理的实现方式,再深入一下,可以看下Spring AOP里的实现代码; 
- 
  或许Spirng IOC和MVC的底层实现代码比较难看懂,但大家可以说些关键的类,根据关键流程说下它们的实现方式。 
 
- 
  职位介绍里提到的技能要点,比如职位介绍里有提到Mybatis,那么面试官一定会问相关问题; 
- 
  你在项目介绍时抛出的技术关键字,比如你在面试过程中介绍项目时提到了Redis,那么在介绍完项目后,面试官就会问,“你项目里是如何使用Redis的?”,类似的,简历中你写的技术,也有可能会被问到; 
- 
  Java核心,数据库,Spring框架,项目管理等基础问题,这些就不用说了,不过如果你引导得当的话,面试官会花费很多时间问你提到的技术,这块会问得比较少; 
- 
  必要的算法题,比如排序等,其实面试官感觉你技术可以的话,这块就不怎么会问了,但准备的时候需要看这个,有备无患。 
- 
  问用法,比如直接提问,项目里你netty怎么用的?这块大家可以结合项目准备说辞; 
- 
  问流程,比如结合业务,讲下nginx负载均衡的用法?这也可以结合项目和网上搜到的资料准备说辞; 
- 
  问原因,比如为什么要用netty?这块就要结合项目说明了; 
- 
  问技术点, 比如netty里零拷贝怎么回事?对此,需要对简历上提到的每个技术点,以及面试过程中将要提到的每个技术点,搜相关面试问题,并结合业务说明; 
- 
  问基础知识,比如finally从句的用途,这就可以通过刷题来获取了。 
- 
  斟酌面试时抛出的技能,逐一准备说辞; 
- 
  针对技术,网上搜索问题,比如搜Spring IOC面试题,结合网上的参考答案准备说辞; 
- 
  准备技术的实施要点,比如做了哪些配置文件,你在项目里踩过哪些坑? 
- 
  最好结合底层代码说明。 
- 
  准备业务背景,为什么要用?比如我们项目数据库并发压力大,需要用MyCat作为分库分表; 
- 
  如何使用,无非是设置分库规则,改写SQL语句等; 
- 
  准备下踩到的坑,比如自增长主键在每台机器上都要保证唯一; 
- 
  然后再结合些底层代码,准备下一条SQL语句是如何分发到对应的分库上的,然后执行好以后又如何返回的; 
- 
  再可以准备些只有做过才知道的细节,比如发布上线和清洗数据的流程; 
- 
  网上找些MyCAT的面试题,准备相关说辞。 
- 
  结合业务需求点,说下为什么要用这个技术,怎么用的,以及用了有什么好处? 比如为了优化网络通讯协议,所以用基于TCP协议的Netty,业务模块里的xxx功能是用到netty;
- 
  准备下踩到的坑,比如在某业务场景里,我遇到了半包粘包问题,我是通过调试底层代码解决的;
- 
  用了Netty对项目的帮助。比如Netty是基于TCP协议的,它要比Http协议要轻,所以通讯性能高,且Netty内部的Reactor线程模型对系统的IO帮助很大;
- 
  基于零拷贝、读写索引和异步处理机制,准备些底层代码,在面试里说明;
- 
  顺带再准备下Netty的组件,工作流程等问题,这能搜到问题和相关说辞。
 
| 
     技术方面
     | 
     可以说的亮点
     | 
| 
     Java集合对象
     | 
     1 能根据项目的需求选用合适的集合对象,比如知道ArrayList和LinkedList的差异,并能合理选用。
     
     2 能在合适的场合选用WeakHashMap。
     
     3 可以适当讲一些集合的JDK底层实现代码。
     | 
| 
     异常处理方面
     | 
     能在finally从句里写释放资源的代码
     | 
| 
     JDBC方面
     | 
     1 能通过PreparedStatement的预处理方法来防止SQL注入。
     
     2 能通过批处理来提升操作性能。
     
     3 能通过实例讲述事务隔离级别的含义
     | 
| 
     多线程方面
     | 
     1 会结合项目使用线程池
     
     2 能通过锁或信号量等手段正确地处理多线程并发时的数据一致性。
     
     3 熟悉各种并发组件
     | 
表 数据库方面可以准备的亮点
| 
     技术方面
     | 
     可以说的亮点
     | 
| 
     建表
     | 
     建表时需要根据项目的数据情况,考虑是采用三范式或是反范式。
     | 
| 
     SQL调优
     | 
     1 可以通过查看日志等方式看哪些SQL需要调优。
     
     2 可以通过执行计划查看SQL的所消耗的代价,并据此调优。
     
     3 可以通过建索引,建分区等手段来优化SQL性能。
     | 
| 
     事务
     | 
     1 可以说下JDBC或Spring里是如何管理事务的。
     
     2 可以说下Spring里的声明式事务的做法和优点。
     
     3 可以举例说明事务隔离级别和事务传播机制的用法。
     | 
| 
     分布式数据库
     | 
     1 可以通过MyCAT进行分库分表,从而减轻对单表访问所需要的代价。
     
     2 可以通过集群等方式来承担对数据库的过量的访问请求。
     | 
| 
     NoSQL和Hadoop
     | 
     这两个本身就是个亮点,如果大家用过,可以结合项目来说明。
     | 
表Java Web框架方面可以准备的亮点
| 
     技术方面
     | 
     可以说的亮点
     | 
| 
     Spring MVC/Boot架构
     | 
     1 可以说下Spring的IOC和AOP是如何优化项目结构的。
     
     2 可以说下拦截器等Spring组件对项目的帮助。
     
     3 可以说下Spring Boot对项目的帮助
     | 
| 
     ORM,比如Mybatis
     | 
     使用这种ORM技术时,如何优化访问和操作数据库的性能。
     | 
| 
     Spring和Mybatis等的整合
     | 
     可以讲下整合框架的细节,并可以举例说明整合后的框架能很好地适应需求的变更。
     | 
表 分布式组件方面可以准备的亮点
| 
     技术方面
     | 
     可以说的亮点
     | 
| 
     组件应用
     | 
     1 结合配置文件等,说明怎么用的
     
     2 结合业务,说下具体的效果,比如限流后有什么好处。
     | 
| 
     如何应对高并发的场景
     | 
     1 如何达到负载均衡
     
     2 如何进行失效转移
     | 
| 
     定位排查和解决问题
     | 
     1 如何通过分析log定位问题
     
     2 问题的根源和解决方法
     | 
| 
     健康检查和线上监控
     | 
     1 如何通过健康检查确定系统正常运行
     
     2 出了问题,如何发出警告
     | 
由此大家能看到,其实很多事先可以准备的点,其实是你没有想到,但你项目里一定用过。你据此准备,在通过上述技巧在面试中合理地找机会说出来,你面试成功的可能性一定会大大增加。
 
【End】
 
热 文 推 荐
☞
更多推荐
 
 



所有评论(0)