Java程序员普遍存在的面试问题以及应对之道(新书第一章节摘录)

这里来讲一个面试问题的案例,比如面试官提问:“说下Java集合里ArrayList和Vector两种对象的区别?”,如果看过相关的面试题,候选人一般也能说出如下的说辞:“Vector是线程安全而ArrayList是线程不安全,同时在扩容时,Vector会扩容100%,而ArrayList是50%。”说到这个程度,面试官会认为候选人知道这两种对象,

但如果候选人再进一步给出如下的说辞:“在上个项目里的,如果遇到单线程的工作环境,我会使用ArrayList之类的线程不安全对象,而且出于提升内存性能的考虑,在项目里我是使用ArrayList,因为它的扩容比例较低。”

虽然上述说辞也就寥寥几语,但由于结合到了项目,所以面试官会因此确认候选人真实在项目里用过,但这种“结合项目说技术”的能力,可能是候选人,尤其是初级开发层次的候选人普遍缺乏的。

或许在Java核心基础技能方面,“结合项目经验说技术”这种做法对候选人帮助并不大,那么在分布式组件方面,“能结合项目说技术”的候选人与“仅会背题”的候选人之间的差别就足以决定面试成败了。来看下相关的面试案例。

又如在Redis方面,假设某候选人只是根据网上的面试题,了解了Redis数据结构和底层代码甚至搭建集群的做法,那么面试官只要用类似“结合项目说下Redis怎么用的”之类的问题就能问倒这位候选人,但如果另外一位候选人能结合使用场景说下配置、缓存数据的细节以及防穿透等项目实践要点,那么就能有效证明自己在项目里用过Redis。其实在面试中有不少候选人只会背题说理论,所以只要让面试官认为你在项目里做过,那么你就可以比那些只会背题的人强。

本书会在分布式组件方面,一方面结合案例告诉大家在项目里使用分布组件的实践要点,另一方面会结合这些实践要点为大家整理相关面试说辞,并且还会在此基础上给出“Redis防穿透”、“Dubbo防超时”以及“Kafka防重发”等亮点技术的展示方式,从中大家能直观地掌握分布式组件方面准备面试的技巧,并能以此在面试中成功地超越大多数竞争者。

3 linux层面,普遍缺乏基本操作技能

======================

确实大多数的项目是在windows操作系统上开发的,所以有不少候选人没有接触过linux等其它操作系统。根据作者技术面试官的经验,不少候选人会认为,开发好的项目是部署在windows系统上,分布式组件是安装在windows系统上的,日常排查问题,也只需要观察windows系统上的日志。

但实际情况不是这样,分布式组件乃至集群,大多部署在linux系统上,开发好的Spring Boot等类型的项目也是部署并运行在linux系统上,所以面试官在面试过程中问及linux操作等相关问题,也就绝非是为难候选人了。

大家可以试想一下,如果某位候选人连如何在linux上查找并打开文件,并在文件里查找关键字符串之类的问题也说不上,那么如何证明自己真的在项目里排查过问题?甚至有些面试官会以此认为候选人只会“在windows系统上开发增删改查”这类初级的技能。

其实哪怕对初级开发而言,要准备linux方面的面试,难度也不大,只需要准备些基本的文件操作命令,外带些基本的script脚本操作技能即可。也就是说,大家只需要稍微花点时间,根据本书后继章节里给出的步骤准备linux方面的说辞,就能在面试中让面试官有耳目一新的感觉,更何况通过linux操作技能,候选人还能有效地展示自己“分析、排查和解决问题”方面的能力。

4 排查和解决问题的能力,很多人不会展示

====================

大家可以试想一下,面试官最希望候选人有相关技术的项目开发经验,所以如果候选人能有效证明自己在之前的项目里,有排查和解决线上问题的经历,那绝对是个加分项。

但在面试过程中,很多候选人只是被动地回答问题,除此之外不会主动扩展。这样如果遇到不善于挖掘候选人亮点的面试官,那么这些被动回答问题的候选人是没有机会展示这类加分项的。

在后继讲述Redis、Dubbo和Netty等分布式组件时,作者会给出针对相应组件“排查和解决线上实际问题”的技巧和说辞,这里先给出展示这类加分项经历的通用步骤。

第一, 先说下对应的线上故障,比如某个系统不可用了,或者系统输出和预期的不同,或者在日志文件里发现错误日志。

第二, 再说下根据错误日志定位到问题的流程,比如通过Redis哪些日志发现Redis有超时问题。

第三, 再说下通过日志看到的错误和故障之间的因果关系,比如因为Redis超时,所以返回时间变长,这导致服务不可用。

第四, 最后说下怎么解决的,比如在配置文件里对应地缩小Redis超时时间。

这样候选人就能高效地在面试中展示相关技能地项目实践经验。而且请大家注意,这种“排查和解决问题”的相关说辞,在面试中怎么说都不会嫌多,所以在面试前,候选人可以针对“调优”、“高并发分布式应用”和“分布式集群”等诸多值钱技术,尽可能多地准备相关说辞。

5 被动回答问题,缺乏主动引导和抛出亮点的意识

=========================

刚才也提到了,不少候选人在面试中只会被动地回答问题,这样就拱手让出面试里的提问权,如果面试官问的问题不巧是候选人不熟悉的,那么面试结果可想而知。

但其实只要在回答好相关问题后,再多说几句话,就有可能把面试官的问题引导到你准备好的各种亮点说辞。其实这种“引导”技能一学就会,而本书在后继讲具体分布式组件的章节里也会较多地给出这种引导说辞,这里先给出些范例,请大家体会下这种引导的做法以及可能会带来的好处。

比如当你回答好JDBC里Connection组件的相关问题后,再多说一句,“在我们项目里,除了用JDBC连接数据库外,还用到了Redis缓存来提升数据库性能”,这样面试官就很有可能继续问Redis相关问题,这样你就有机会展示面试前准备过的Redis集群和防穿透等亮点说辞。

又如你回答好Redis防穿透方面的问题后,也可以再多说一句,“在之前的项目里,我们还解决过Redis防穿透方面的线上问题”,当面试官细问时,你可以继续说,“是通过日志发现了Redis穿透问题,原因是没有在Redis里缓存空数据和不存在的数据,后面缓存这类数据就解决了”,也就是说这里成功地把面试官的问题引导到“解决线上实际问题”的方面,并成功地展示了Redis方面的实际项目经验和排查问题的能力。

其实不少面试官在面试前,还在辛苦地修改bug或者参加各种会议,也就是在面试前草草地浏览了一遍候选人的简历,而且也不大会准备面试问题,很多问题都是在面试中临时想的。所以当候选人在面试中抛出这类“引导”说辞后,面试官很有可能顺着这个话题继续问下去,通过这种方法,候选人就可以在面试中把问题尽量引导到自己准备过的范围内。

6 准备面试的难度,要低于做好项目的难度

====================

怎么才算做好一个项目?要确保项目里没有各类bug,而且还要把项目成功部署上线,并且还要有效修复项目在线上运行时遇到的各种问题。怎么才能通过面试?回答出面试官的关键提问即可。

项目里遇到问题的种类和数量是不可测的,而面试官提的问题大多是有套路的,而且开发项目的周期至少几个月,而技术面试的时间最多也就持续一个小时,所以准备面试的难度,要低于做好项目的难度。

一般面试分技术面试、项目经理面试和人事面试这三轮,本书更多会地会关注技术面试。技术面试一般二三十分钟,再长一般也不会超过一个小时,具体流程一般如下所述。

  1. 寒暄后会让候选人介绍诸如学历和工作过的公司等基本情况,这些说辞面试前可以准备。

  2. 随后会让候选人介绍最近的(或最拿得出手)项目情况,此时候选人可以用本书将要给出的方法,根据面试前的准备,结合项目实际抛出各种亮点说辞,并可以把后继面试官的提问引导到准备好的范围内,也就是说,介绍项目环节也可以准备。

  3. 在介绍完项目情况后,面试官一般就会自由提问。说是自由提问,但也会围绕着职位介绍上提到的技术点提问,如果是招Java方面的程序员,分布式组件方面也是一个考核点。这时,如果候选人能用到前文提到的引导技术,就能尽可能多地把面试官的问题控制在自己熟悉的范围内。

  4. 面试官可能再会问些数据结构和算法等方面的问题,不过这类问题也可以通过刷题来准备。

  5. 最后面试官会让候选人提问,这个环节也可以准备,候选人还能借机抛出之前没机会展示的亮点说辞。

从中大家看到,做好项目和准备技术面试是两个不同维度的事情,前者是动手做,后者是开口说。而且如果在面试前准备充分,面试时绝对能结合项目抛出各种亮点说辞,或者可以通过“边写(细节)边画(框图流程图等)边说”的方式展示你对某个技术的理解,甚至还可以通过“回答好问题再多说一句”的方式引导面试官的问题。也就是说,通过准备面试以及在面试中引入各种技巧,候选人不仅能最大程度展示自己的亮点,还能有效地避免面试官过多地问及自己的薄弱点,这样就能有效提升通过技术面试的可能性。

7 准备面试的错误做法和正确做法

================

前文也说到,准备面试的难度要低于做好项目的难度,但事实上有不少候选人由于事先没有准备,或者准备方法不得当,从而无法通过面试,其中可能还不乏一些在项目组里承担重要作用的技术大牛,这也是为什么很多候选人在面试中表现不佳的原因。

其实原因前文里也提到过:准备面试和做好项目是两个维度的事情。在给出面试的正确准备方法之前,先来对比性地看些错误的准备做法。

  1. 只根据之前项目里用过的技术准备面试。由于程序员日常开发工作大多是“增删改查”,所以接触到的值钱技术非常有限,单凭此无法拉开和其它竞争者的距离,所以这样做哪怕最后面试成功,能力和薪资也有可能被低估。

  2. 过多地刷算法题或编程题或相关面试题。要知道面试官一定会考核候选人相关技术的项目实践能力,如果就这样准备,可能面试初级开发岗位时还有机会过,但可能就很难应聘成高级开发岗。

  3. 仅在理论层面背些(分布式组件等方面的)说辞。对于这些值钱说辞,面试官大概率会问技术实现细节和排查问题的步骤,如果单凭理论说辞,无法有效证明自己在项目里用过这些值钱技能。

对应地,正确的面试准备方法就呼之欲出了。这里给出的方法不仅涵盖了分布式组件方面,更适合于准备其它Java方面的面试。

1 . 刷题等必要工作不能拉下,因为面试里也有可能问及相关问题,同时结合项目展示基本技能的说辞也得准备。

  1. 结合你做过的项目,尽可能多地准备值钱技术方面的亮点说辞,比如你能结合之前开发过的风控模块业务,说出Dubbo远程调用流程,这要比你单纯从理论角度讲要好很多。最好是类似的值钱技术,都找个和项目的结合点。

  2. 不仅要结合项目准备亮点说辞,更需要准备抛出这些亮点说辞的预案。比如你在面试前充分准备了Dubbo、Redis和Netty等方面的说辞,但面试官一直不问及,你也不能自说自话地展示。对应地,你需要准备“回答好SQL问题后引导到Redis组件”的话术,或者是“回答好Redis数据结构问题后引导到Redis缓存调优”的话术。总之对于你准备好的亮点说辞,你都要准备一套或多套“引导方案”,这样就能最大程度地展示你的亮点。

本书之后会详细展开描述上述准备方法。当然不乏有一些资深的面试官会很好地把控面试走向,不大会轻易被候选人的话术所引导。但你如果用到了上述准备方法,哪怕是遇到这类面试官,也能最大程度地抛出亮点说辞。况且你遇到的很多面试官可能是技术大牛,但在面试方面未必经验丰富。

8 面试时可以主动抛出的亮点汇总

================

对于前文提到的亮点说辞,Java程序员可以从哪些方面准备呢?其实有些话题上文已经提到过,这里更多的是总结性归纳。

第一, 底层源码方面。往浅了讲,可以讲述Java核心对象方面的底层源码,比如ArrayList扩容、HashMap读写操作等底层实现,往深了讲,可以讲述Spring层面的底层源码,比如IOC机制如何注入对象,或者切面编程里如何关联对象和切面代码。再往深了讲,就可以讲分布式组件的底层源码,比如Dubbo的服务暴露或者Netty里的零拷贝。通过底层源码讲述对应的实现机制,能让面试官感觉你在这方面很专业。

第二, 性能调优方面。这里可以从JVM垃圾回收机制讲到内存调优,也可以在数据库调优方面从索引引申到Redis缓存或MyCAT分库分表组件,甚至可以再讲述数据库和缓存集群,当然最好是要结合项目案例讲。通过展示这种技能,就让面试官感受到你技术的深度。

2021年Java中高级面试必备知识点总结

在这个部分总结了2019年到目前为止Java常见面试问题,取其面试核心编写成这份文档笔记,从中分析面试官的心理,摸清面试官的“套路”,可以说搞定90%以上的Java中高级面试没一点难度。

本节总结的内容涵盖了:消息队列、Redis缓存、分库分表、读写分离、设计高并发系统、分布式系统、高可用系统、SpringCloud微服务架构等一系列互联网主流高级技术的知识点。

目录:

(上述只是一个整体目录大纲,每个点里面都有如下所示的详细内容,从面试问题——分析面试官心理——剖析面试题——完美解答的一个过程)

部分内容:

对于每一个做技术的来说,学习是不能停止的,小编把2019年到目前为止Java的核心知识提炼出来了,无论你现在是处于什么阶段,如你所见,这份文档的内容无论是对于你找面试工作还是提升技术广度深度都是完美的。

不想被后浪淘汰的话,赶紧搞起来吧,高清完整版一共是888页,需要的话可以点赞+关注
03279245)]

对于每一个做技术的来说,学习是不能停止的,小编把2019年到目前为止Java的核心知识提炼出来了,无论你现在是处于什么阶段,如你所见,这份文档的内容无论是对于你找面试工作还是提升技术广度深度都是完美的。

不想被后浪淘汰的话,赶紧搞起来吧,高清完整版一共是888页,需要的话可以点赞+关注

  • 13
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值