一本插画式的Python书籍,内容风趣易懂,点击图片查看
作者 | 胡书敏
责编 | 刘静
出品 | CSDN(ID:CSDNnews)
本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。
在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。
Java程序员准备和投递简历的实战技巧
1.1 简历中应包含的要素,一个都别落下 为了让简历更吸引技术面试官或其它相关筛选简历的人,大家在准备简历应当注意“直接”两字:能让筛选人能直接地看出本人的教育背景、工作经历和项目经理,并让他们“直接”感到这份简历能纳入考虑范围。 根据这个原则,大家可以按次序在简历中列出如下表所给出的要素。
| 简历中应包含的要素 | 目的 |
| 基本信息,比如姓名,性别,年龄,目前所在城市,是否在职,手机和电邮等。 | 1 让招聘方了解候选人的基本信息。 2 以便招聘方通过手机等方式能联系到候选人。 |
| 按时间倒叙写教育背景,一般只需要包含高中以上,初中高中等不必写,但需包含专业和学历学位信息。 | 用专业和学历学位等信息向招聘方证明自己的技术背景。 |
| 总结性地列出自己所掌握的技能。比如: 1 有3年Java经验,有2年Spring MVC经验。 2有3年Oracle经验,有2年Oracle调优经验。 等等 | 一般这些总结点是和职务需求是一致的,这样能让招聘方直接地感受到该候选人的匹配度。 在这基础上,可以适当列些能成功帮到自己的总结点。 |
| 按倒叙列出工作过的公司,并列出在这些公司里的项目经验,这部分的技能下文会详细描述。 | 在项目经验描述里,能通过项目用到的技术经验等,具体地给出自己“匹配”该岗位的证明。 |
| 可以列出和应聘岗位相关的培训经历和得到过的奖励 | 这些属于加分项,同等情况下能优先录用 |
| 用少量篇幅列出自己的兴趣和自我总结 | 让招聘公司进一步了解候选人 |
面试时该如何讲解技术项目赢得面试官好感
2.1 别害怕,因为面试官什么都不知道 面试官是人,不是神,拿到你的简历的时候,是没法核实你的项目细节的(一般公司会到录用后,用背景调查的方式来核实)。更何况,你做的项目是以月为单位算的,而面试官最多用30分钟来从你的简历上了解你的项目经验,所以你对项目的熟悉程度要远远超过面试官,所以你一点也不用紧张。如果你的工作经验比面试官还丰富的话,甚至还可以控制整个面试流程(笔者在面试方面成精后也经常干这种事情,大家一定也能行)。
| 你 | 面试官 | |
| 对你以前的项目和技能 | 很了解 | 只能听你说,只能根据你说的内容做出判断 |
| 在面试过程中的职责 | 在很短的时间内防守成功即可 | 如果找不出漏洞,就只能算你以前做过 |
| 准备时间 | 面试前你有充足的时间准备 | 一般在面试前用30分钟阅读你的简历 |
| 沟通过程 | 你可以出错,但别出关键性的错误 | 不会太为难你,除非你太差 |
| 技巧 | 你有足够的技巧,也可以从网上找到足够多的面试题 | 其实就问些通用的有规律的问题 |
| 提问方式 | 目的 |
| 让你描述工作经验和项目(极有可能是最近的),看看你说的是否和简历上一致 | 看你是否真的做过这些项目 |
| 看你简历上项目里用到的技术,比如框架、数据库,然后针对这些技术提些基本问题 | 还是验证你是否做过项目,同时看你是否了解这些技术,为进一步提问做准备 |
| 针对某个项目,不断深入地问一些技术上的问题,或者从不同侧面问一些技术实现,看你前后回答里面是否有矛盾 | 深入核实你的项目细节 |
| 针对某技术,问些项目里一定会遇到的问题,比如候选人说做过数据库,那么就会问索引方面的问题 | 通过这类问题,核实候选人是否真的有过项目经验(或者还仅仅是学习经验) |
Java面试者该准备哪些加分项技能
3.1框架是重点,但别让人感觉你只会山寨别人的代码 一般工作在3年内的候选人,大多仅仅是能“山寨”别人的代码,也就是说能在现有框架的基础上,照着别人写的流程,扩展出新的功能模块。比如要写个股票挂单的功能模块,是会模仿现有的下单流程,然后从前端到后端再到数据库,依样画葫芦写一遍,最多把功能相关的代码点改掉。 如果单纯使用SSM框架,大多数项目都会有痛点。比如数据库性能差,或者业务模块比较复杂,并发量比较高,用Spring MVC里的Controller无法满足跳转的需求。所以我一般还会主动问:你除了依照现有框架写业务代码时,还做了哪些改动? 我听到的回答有:增加了Redis缓存,以避免频繁调用一些不变的数据。或者,在MyBitas的xml里,select语句where条件有isnull,即这个值有就增加一个where条件,对此,会对任何一个where增加一个不带isnull的查询条件,以免该语句当传入参数都是null时,做全表扫描。或者,干脆说,后端异步返回的数据量很大,时间很长,我在项目里就调大了异步返回的最大时间,或者对返回信息做了压缩处理,以增加网络传输性能。 对于这个问题,我不在乎听到什么回答,我只关心回答符不符逻辑。一般只要答对,我就会给出“在框架层面有自己的体会,有一定的了解”,否则,我就只会给出“只能在项目经理带领下编写框架代码,对框架本身了解不多”。 其实,在准备面试时,归纳框架里的要点并不难,我就不信所有人在做项目时一点积累也没,只要你说出来,可以说,这方面你就碾压了将近7成的竞争者。 3.2 别单纯看单机版的框架,适当了解些分布式 在描述项目里框架技术时,最好你再带些分布式的技术。下面我列些大家可以准备的分布式技术。
反向代理方面,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的底层实现代码比较难看懂,但大家可以说些关键的类,根据关键流程说下它们的实现方式。
预估面试题,准备对应的回答
4.1 哪些问题面试中大概率会被问到 在面试里,不管如何引导面试官,其实如下方面的问题很大可能会被问到,所以在面试前可以提前准备。
职位介绍里提到的技能要点,比如职位介绍里有提到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的组件,工作流程等问题,这能搜到问题和相关说辞。
面试时如何不被面试官牵着鼻子,自我把控面试的走向?
5.1 在介绍项目时,引导话题的技巧以及案例 在做项目介绍的时候,你可以穿插说出一些你的亮点,但请记得,不论在介绍项目还是在回答问题,你当前的职责不是说明亮点而是介绍项目,一旦你详细说,可能会让面试官感觉你跑题了。 所以这时你可以一笔带过,比如你可以说,“我们的项目对数据要求比较大,忙的时候平均每小时要处理几十万条数据”,这样就可以把面试官引入“大数据”的方向。 你在面试前可以根据职位的需求,准备好这种“一笔带过”的话。比如这个职位的需求点是Spring MVC框架,大数据高并发,要有数据库调优经验,那么介绍以往项目时,你就最好突出这些方面你的实际技能。 再给大家举个例子,比如Java虚拟机内存管理和数据库优化是绝大多数项目都要遇到的两大问题,大家都可以在叙述项目经验时说,在这个项目里,我们需要考虑内存因素,因为我们的代码只允许在2G内存环境中运行,而且对数据库性能要求比较高,所以我们经常要监控优化内存和数据库里的SQL语句。这样当面试官深入提问时,就能抛出自己准备好的虚拟机内存优化和数据库优化方面的说辞。 或者说,在项目介绍时提到,在xx模块里,我们使用了nginx做负载均衡,达到了承受百万级并发的效果,从而引出nginx的话题。 实在不行,你也可以说“我除了做开发,也做了了解需求,测试和部署的工作,因为这个项目人手比较少,压力比较大”,这样你也能展示你有过独挡一面的经历。 5.2 以Netty为例,讲述引出值钱话题的技巧 比如在介绍项目时,我提到了Netty技术,如果面试官没打断,我就问,能否介绍其中的Netty细节?得到允许后再说。 或者把技术关联到面试官可能会问的问题上,比如问及网络通讯时介绍Netty,这个事先整理一个问题列表,遇到此类问题,顺带抛出Netty说辞。 问题列表可以是,项目里你用到哪些组件?用到哪些通讯协议?如何进行模块间的交互等等,然后先回答问题本身,再扩展到Netty。但请记住,别自说自话,因为过犹不及,其它技术照此办理 5.3 以案例说明,在回答问题时引出准备过话题的技巧 比如面试官问你Spring相关问题,假设问到,你对Spring依赖注入了解多少,在说好Spring相关问题后再提一句,我们同时用Spring,以低耦合的方式整合了MyCAT组件,从而达到了分库分表的效果,这样就引出了分库分表的话题 。 或者在介绍Netty流程后,再说一句,在实际项目里,我们还遇到了因Netty底层代码而导致的OOM问题,对此,我们组负责排查和解决问题,这样就自然而然地引出了OOM内存溢出的问题。 或者在介绍完线程相关问题时,再提一句,在项目里,我们用到了线程池来管理线程,这样就引出了高并发的话题。 但在引导的时候,请注意如下的三点。 第一,面试官不接口的,应当立即停止,再说下去就属于自说自话了。 第二,还是要准备必要的基础问题,还是要刷题,还是要准备各种说辞,因为面试前的全面准备,是引导的基础。 第三,应当引导面试官问些“框架”和“性能调优”等值钱方面的技能,这样才能最大程度地展示你的能力,同样,此类问题需要面试前准备。 5.4 你可以引导的加分项 在如下的一些表格里,归纳的加分项甚至初级开发多少也能准备,其中涵盖了诸多方面。 表 Java Core方面可以准备的亮点
| 技术方面 | 可以说的亮点 |
| 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 出了问题,如何发出警告 |
由此大家能看到,其实很多事先可以准备的点,其实是你没有想到,但你项目里一定用过。你据此准备,在通过上述技巧在面试中合理地找机会说出来,你面试成功的可能性一定会大大增加。
总结,面试准备后,结果可能就大不同
先从面试官的角度看下,哪些人能面试成功? 1. 最近半年的项目经历和JD匹配度很高; 2. 通过面试,JD上的技能候选人大多能掌握; 3. 候选人在Java核心,数据库和框架方面的基础技能达标; 4. 不是刺头,团队合作没问题,没有其它大问题。 但如果大家面试前不准备,或者准备不到位,那么就会面临如下的后果了: 1. 简历未必能过筛选,甚至没有面试机会; 2. 无法证明项目里用到的技术和JD高度契合; 3. 介绍项目经验时没问题,把提问的主动权交给面试官; 4. 不知道将会问哪些问题,所有问题都现场想; 5. 在面试现场,没法让面试官全面了解你的技术亮点。 但如果按照上述方法准备,大家很大程度上能得到如下的收获。 1. 能通过微调简历,得到更多的面试机会; 2. 能通过挖掘项目经验,证明自己的技能和JD契合; 3. 能知道哪些属于值钱技能,并能结合业务准值钱技能和调优技能的说辞,而且能不露痕迹地展示; 4. 不仅限于coding,更能展示项目管理(sonar等),linux,项目部署(nginx)等方面的技能; 5. 知道面试大致会问哪些问题,并由此能事先准备; 6. 能事先尽可能多地挖掘亮点,并在面试时展示。 这就是大家阅读本文后的收获,最后感谢大家看完本文。 作者简介: 胡书敏,知名外企资深架构师,8年内面试过数以百计的Java工程师,5年的Java培训讲师经验,帮助众多初学者成功拿到心仪的Offer。 著有《Java核心技术及面试指南》。 CSDN博客专家: https://blog.csdn.net/sxeric 声明:本文为作者原创投稿,未经允许请勿转载。
☞大学生活这样过,等着 Offer 飞来找 | 程序员有话说
☞揭秘支撑双 11 买买买背后的硬核黑科技!
☞假如有人把支付宝存储服务器炸了
☞ 区块链+“中国制造”:一文看懂区块链如何提升供应链金融活力与效能!☞AutoML未来可期,工程师的明天何去何从?
你点的每个“在看”,我都认真当成了喜欢