零基础的Java如何准备初级开发的面试
对于各位Java程序员来说,只要能有实践的机会,哪怕工资再低,公司情况再一般,只要自己上心努力,就可能在短时间内快速提升,甚至在工作2年后进大厂都有希望,因为项目里真实的开发实践环境是平时学习不能模拟的。所以很多想从事Java开发的同学其实是卡在了第一步:无法积累足以找到工作的项目经验,甚至不知道该如何积累,从而导致没面试机会,或者面试总通不过。这样很多有编程天赋有而且聪明上进的程序员可能就与感兴趣的职业失之交臂了。
作为面试官,我知道Java初级开发的最低面试标准,作为Java培训讲师,我帮助过不少零基础的人应聘成功初级Java开发岗,在这篇文章里,就将结合我的相关面试和培训经验,针对零Java基础零Java项目基础的同学,讲述下如何积累项目经验,以及成功找到开发工作的相关技巧。
1 明确目标:该去哪些公司?这些公司有哪些要求?
对于零基础的同学来说,目标可以是半年后(最快三个月)进公司干Java,这里的公司可能是如下种类:1 规模比较小的公司 2 外派公司,即以外派的身份到银行保险之类甲方公司去干活。3 外包公司,即在公司里干些分包的活。
当然你学历学校比较好的话,也有可能去挑战下大公司,但毕竟路要一步步走,而且这类公司里,有可能工作环境和氛围不如意,但项目里包含的值钱技术点足以帮助你在两三年后进大厂。更重要的是,这些公司的应聘要求相对比较低,大多是只要你在面试过程中。再进一步,下面给出了这类目标公司的面试要求。
1 商业项目经验越长越好,但至少做过SSM或Spring Boot的项目。
2 数据库方面,需要会增删改查,最好知道单机版调优技巧,比如索引和执行计划。而且在这方面,需要有Spring用Mybatis整合数据库的经验,知道在mybatis的配置文件里编写增删改查乃至事务的技巧。
3 Java基础方面,掌握集合,文件操作,异常处理,面向对象,多线程等基础知识,其实这块很大程度上可以通过刷面试题达到要求。
4 还有一些是所谓的计算机方面基础知识,即数据结构,算法,操作系统,网络编程等技能。其中可能也就会多问些数据结构和算法的问题,其它问题大多也可以通过刷题来解决。
以上是技术方面的,当然还有其它工作态度方面的,比如人看上去比较老实,肯加班,学习能力强,沟通没问题等,但说实在的,在面试的这段较短时间内,很少因为这些因素刷掉人的,比如我问愿不愿意加班,听到的大多是愿意加班,问遇到你不熟悉的技术怎么办,大多数的回答都是尽快努力学习。
其实说实在的,一些面试中的加分项,比如以敏捷等方式实践项目的技巧,JVM性能调优,分布式组件基础,linux实践要点和分析与排查问题的能力,虽然对于初级开发不做要求,而且要达到精通的程度确实很难,但真的要准备面试时的说辞,其实并不难,你说了就比别人强,在本文里也会给出相关技巧。
2 把公司的面试要求对应到技术点上
目标明确了,也就可以对应地列出该掌握的技术点了,当然在实践中可能会有增减,但至少不会出现“花大量时间去学无需掌握技能”这种情况了,下面将由浅到深,给出各方面具体要学的技术点。
首先最基础的当然是Java语法,其中包括基础语法,集合,IO操作,异常处理,JDBC,多线程。对初级开发而言,面向对象思想和设计模式这块太抽象,而且如果没有一定项目的积淀很难灵活应用,所以大多数初级开发也就是“会说”而已,这块大家只要多背些题,同时再结合项目说下你用过的设计模式应该就可以了,这块无需用大力气。而且一定别去看Java界面开发的,比如Swing方面的技能,因为面试不问。对于Java虚拟机和垃圾回收流程方面,虽然抽象,但项目里会用到,所以不仅需要掌握理论,最好再结合项目准备亮点。
其次是数据库方面,你得会结合一种数据库,比如MySQL或SQL Server或Oracle等,会写增删改查,知道索引怎么用,知道该如何建表,并且还要知道group by, having, 连接查询和子查询等的技巧。而且实际项目里,一般是用代码操作数据库,所以你还得掌握用JDBC和mybatis等操作数据库的基本操作,说白了该知道如何做增删改查。当然了,如果你进一步知道执行计划,Redis,Mycat等的资深调优技能,这一定是加分项,但这对初级开发而言不做过多的要求。
最重要的是框架方面,当前java比较流行的是Spring Boot和SSM框架,对初级开发而言,只需要能照着现成例子做增删改插查的业务模块即可,比如现有个增加订单的方法,需要你照着这个写业务代码,做个删除订单的方法。也就是说,这块需要你了解基本的Spring相关配置文件,以及SSM或Spring Boot项目的开发流程,以及和数据库整合的方式。当然你如果进一步具备调试框架代码分析解决实际问题的能力这更好,但这块对初级开发而言,难度并不是高不可攀。
以上给出的其实是低配版的技能要求,也就是说只要你会增删改查,基本也就达到了进小公司干活的要求。在明确技术点的基础上,下面就会给出学习的相关建议。
3 如何在短时间内快速掌握基础知识
其实对于IT人来说,职业发展的黄金时间并不多,如果30岁还在小公司,后继就会很吃力,而且一般来说,初级开发升高级需要2到3年,而达到高级开发后一般还需要再有1到2年再具备进大厂的资格,外加些余量,所以零基础到进大厂,一般需要4到5年时间。所以从零基础到进公司干活这个阶段,能浪费的时间还真不多。通常来说,半年足矣,顶多一年,如果超过一年还没得到实践机会,要么就是态度问题,要么就是方法问题了。为了杜绝方法问题,如下给出些具体的学习规划。
1 准备阶段顶多一周,具体的的工作包括在自己的机器上安装IDEA等开发环境,再包括去买若干本Java基础书和SSM以及Spring Boot相关的书。如果不知道该买哪些,就去京东上看销量最好的,最好买带视频教程的,而且最好同一题材买个2到3本,比如Java基础买2本,SSM买2到3本,Spring Boot也买2到3本。这时候别怕花钱,第一其实钱并不多,第二比起报班,这些钱算少的。为什么要买2到3本呢,因为一本书上的知识点可能不全,买多了知识点就重复了,如果买2到3本,基本该覆盖到的技术点也都有了。
2 等环境安装好了,书也买好了,后面就照着书敲代码了。 这时请注意,最好是拿现成代码复制粘贴来运行,退一步也照着书上敲,别自己写代码。因为刚开始什么都不懂,自己写很容易出错,往往会因为一个拼写错误就卡两三个小时,这样时间就浪费了。把敲进去的代码运行通以后,就能从结果里反推关键代码的含义了,再加上书上的说明,很容易就能快速上手。一般来说,对于Java基础知识,一般两周运行并理解好一本书,也就是说,顶多用1个月,就能掌握Java核心的大致语法。
3 JDBC数据库和SSM框架也一样,但这两方面更多的是需要配置环境,比如要搭建MySQL数据库,在其中建表,***M环境,下载pom文件,编写配置文件并部署到web服务器上。可以说,对于数据库和框架,难点并不是代码,而是如何成功运行,如果你的书有视频教程,你可以照着做,遇到问题,就到百度去搜索,这个过程可能也需要1个月。对大多数零基础的同学而言,这块确实有难度,但大家其实都这样过来了,遇到问题如何解决?第一看视频照着别人做,第二到网上查解决方法。
掌握基础知识的标志是运行通并理解2到3个SSM框架,其实运行通了,大致也就能理解其中的调用步骤以及基本配置,在下面部分里,就会详细给出框架项目里该要具体掌握的点。
4 先运行通框架项目,再看流程,再深入细节
不同的SSM等框架项目业务可能不同,比如是商城或管理系统,但调试的步骤大致相同。
1 安装数据库环境,一般是MySQL,这在本地装个服务器和Navicat客户端即可。安装好以后,可能还需要根据业务建表。
2 在IDEA等开发环境里导入项目,这里建议用书上的项目,或者网上视频课的代码,不建议运行来路不明的项目。如果项目经过出版社等机构认可后,运行通的概率就很高。
3 导入项目后,一般需要用pom或gradle去下载依赖包,这块问题也不大,确保代码里所有的import都正确,以及没语法问题即可。
4 比较麻烦的是集成web环境,这里不建议自己额外配置tomcat等,而建议用IDEA环境集成tomcat,集成后需要把代码部署到tomcat服务器里,如果是spring boot项目,还能直接运行。
部署后就可以在页面上运行,运行通后,无需跑遍所有的业务点,跑通3个功能即可,因为你关注的是技术,而不是业务。就拿最基础的登录功能来说大家需要掌握的流程和细节。
1 前端只要关注用户名和密码如何传到java代码,这里可以是ajax,也可以是query,甚至是最基本的form,至于前端页面里的juery等元素,了解即可,开始阶段甚至可以忽略。
2 一般前端请求会通过配置文件映射到业务处理层,即business层,这块需要关注配置文件,理解如何把请求映射到具体的业务处理类,在业务类里,一般会用spring的方式引入依赖包,比如@autowired等的方式,这种依赖方式需要结合配置文件或注解搞明白。
3 一般业务层会调用service层,而service会调用dao或repo层,而在dao或repo层会通过mybatis和数据库交互。这种层层调用关系一般不难,但难点在于mybatis和数据库的交互,比如如何用户model类如何与数据库里的用户表相关联,以及mybatis如何传入参数,如何把从数据库里的结果映射到业务model类里。
总之在登录流程里,先从前端收集登录信息,再层层到数据库,再把数据库结果层层传递回前端,这个流程以及类之间的调用关系大家需要看明白,再类似地理解其它若干个流程,这样就能基本掌握SSM框架或Spring Boot框架。
在此基础上可以再看些基本的配置技巧,比如Mybatis如何配置数据源,Spring如何同事务整合等,当你用一个月到两个左右的时间运行通框架代码并理解后,你就掌握面向框架的增删改查流程了,就有资格出去面试了。
5 在简历上写全公司感兴趣的要素,至少先得到面试机会
按刚才的提示,一般通过2个月的时间学习后,你至少能掌握框架层面的增删改查技巧。说实在话,如果要进一步理解框架以及其它值钱技术(比如redis,kafka等分布式技术),靠自学就比较难了,因为虽然这些技术的理论谁都接触到,但如果你没做过商业项目,很难理解这些技术在项目里的用法。所以后面你就该去找工作了。
在这个过程,如果你有足够的面试机会,虽然刚开始会一问三不知,但至少能用面试的问题来调整自己的准备方向,这样多面试几次就能成。但不少同学由于简历不达标,甚至不会有面试机会。哪些简历得不到面试机会呢?
出现最多的原因是,在简历上看不出相关技术的项目经验,比如某公司要一个Java初级开发,那么在职位介绍上一定会写要求,比如框架会ssm,数据库要用mysql等,哪怕要求再低,相关技术一定得有项目经验来支撑,如果就在简历上写会xx技术,没项目经验,或者你给出的项目里,用到的技术都是人家不用的,那么自然就连面试机会都没了。其实哪怕你是零基础,哪怕你就只有学习项目经验,你简历上好好写,至少能得到小公司或外派公司的面试机会。
1 简历上介绍完年龄学校学历手机联系方式后,立即列出你掌握的技术,比如1 熟悉SSM框架,有相关项目经验 2 掌握MySQL等数据库等用法 3 有n个项目经验,实践过xx项目,总之职位介绍上要求什么,你尽量开门见山地列上,这样看简历的人就会感兴趣,然后就向下读了。
2 倒序列出你做的项目,如果你没商业项目,那就写学习项目,写的时候淡化学习项目的因素,在写项目时,别侧重写业务功能,侧重写用到的技术如下给个范例。
在xx到xx的时间段里,我做了xx系统,其中用到了spring boot框架,我做了其中的订单查询和xx系统,这个项目有3个人做,数据库是mysql。具体还用到了mybatis,spring事务,xml文件读写技术(其它jd上要求的技术,如果你用在项目里,也写上)。
3 这样有几个写几个。说实话,如果你就写xx商城之类的项目,面试官大多能看出是学习项目,这样可能只有项目比较急的公司或外派公司才会给面试机会,所以你尽量挖掘你的商业项目经验。比如你在大学实习阶段,在外面公司用过java,或者你毕业论文项目是公司里的真实项目,或者你毕业后,虽然不是从事java相关开发工作,但和朋友一起做过兼职项目。总之多挖掘些公司的商业项目出来,而且在挖掘时别太夸张,比如某商城项目,你说你全做了谁都不信,但你说这是个维护项目,你们公司做了其中一部分,这样可信度就大了。或者你是兼职做了某项目里的xx子模块,同时外带功能改进,这样面试官也能理解。
可能有同学说了,我确实没商业项目经验,所以找工作有困难,但这里第一是你要从零基础升级到初级开发,第二你没有商业项目经验的现状不是我造成的,相反我都已经非常细化地给你建议了,所以你还真该第一继续积累学习项目经验,第二多挖掘商业项目经验。
6 准备面试时,先要刷题
如果你投出去的简历大多石沉大海,那么就或者多加上些项目经验,或者多加些技术描述,同时看下你的简历是否真能对上对方的JD,这样总能得到面试机会。当你有面试机会时,首先应该刷题,毕竟很多面试题是源于项目但高于项目。
1 你到网上去搜java面试题,spring面试题,SSM框架面试题,Spring Boot面试题和数据库面试题等等,总能看到一大堆题目,首先把它们背下来,不少地方甚至有系列题,做到这点基本没问题。
2 对初级开发而言,更会侧重Java基础,所以大家还可以去找些集合、异常处理、IO和多线程方面的题去背下。
3 去找些数据结构和算法题,比如排序相关,链表堆栈队列等的,这块不仅要会说,更要会写代码,毕竟不少公司有笔试。
4 至于智力题情商题还有面试刁钻问题,这块也有现成的资料。
但是我可以这样告诉大家,如果你单纯就准备这些理论方面的面试题,大多数面试你过不了,因为面试官更要结合项目经验考核你的技术。
1 会问些项目里常用的SSM框架配置,或者问你mybaits和spring整合的方式,总之你做过项目一定知道,没做过就很难说出。
2 让你结合项目业务说下SSM框架或Spring Boot的流程。
况且如果你主动地结合项目展示你的技能以及加分项,更能超越你的大多数竞争者,因为之前已经说过,大多数初级开发只会增删改查,在下文里,就将围绕项目介绍,告诉大家展示技能和亮点的面试技巧。
7 如何准备介绍项目的说辞?
我面过不少候选人,网上有的面试题回答都很好,但让介绍项目,并结合项目提问技术点时,就回答得很不好了,可能这也是大多数零基础开发者的通病。 这块大家别抱有幻想,面试时一定会结合项目提问,这里就给出具体的技巧。
1 面试前多练习项目说辞,这里给出一个介绍项目的范例。
我做的最近的一个项目,客户方是xx,有5个人做了半年,是xx系统的维护项目(说出项目要素,暗示不是学习项目,是公司的实战项目),其中用到了SSM框架,数据库用MySQL,还用到了数据库调优(索引),批量读写文件等的技术。(本次面试岗位的JD上还包含哪些技术要求,这里尽可能地都说全)。
这个项目用到了敏捷的开发模式,一般是1个月有一次发布,项目里用了Maven,junit,jenkins等管理软件,用log4j来写日志(进一步暗示是实战项目,同时暗示你有一定的项目经验)。在这个项目里,我除了做开发以外,还做了单元测试和集成测试,测试时用junit(暗示你不是只会写代码)。
在项目开发过程中,我还有数据库调优和内存调优的经验,还通过观察linux日志分析并排查过实际问题。(抛出亮点,并展示你有实际解决问题的能力)
基本说到这里就可以了,由于你抛出了JD里提到的关键点,以及调优等亮点说辞,就自然而然地把后继问题引到这些方面了。
2 介绍项目里别深入业务细节,比如我遇到有些候选人,大谈特谈某个模块里的业务,比如第一步调会员第二步调风控第三步再怎么地,遇到这类情况我一般会直接打断,因为当前岗位的业务一定和之前的不同,面试官一定不会关心,而且这样的话,候选人就相当于把后面提问的主导权交到面试官手里了。
3 介绍项目一般也就用1,2分钟,就说到点,别涵盖面,比如你提到用过log4j做日志就行,别深入说具体的配置,因为当前是介绍项目,如果深入细节会让面试官感觉你主次不分。
4 请一定记住,介绍项目有两个目的,第一证明你在项目里过JD上的技术,第二抛出关键字引导面试官后继提问,所以你抛出的技术你至少得知道怎么用,第二尽可能多地抛出亮点。
除了刚才给出的数据库调优JVM内存调优以及分析解决实际问题的亮点外,适合零基础的同学抛出的亮点还可以有如下这些。
1 Java集合方面,结合底层代码说下快速失效,hashcode,ArrayList扩容的点,这块能展示底层代码的能力,从而证明你很资深。
2 线程方面,了解violate+ThreadLocal等关键字,以此能证明你很熟悉多线程并发方面的内存管理细节。
3 就结合ConcurrentHashMap,展示并发能力,并展示你很熟悉底层代码。
4 围绕分析日志这个问题,准备下linux读文件和搜索文件的技巧,以此证明你解决过实际问题。
一方面,准备此类亮点,并不难,我之前有篇博文,《如何准备Java面试?如何把面试官的提问引导到自己准备好的范围内?》,其中详细给出了在项目介绍阶段引导面试官提问的方法和说辞,大家可以参考下。另一方面,在介绍项目时抛出此类亮点也很简单,比如就说一句,在项目里我们还遇到过因集合快速失效而导致的问题,经过debug底层代码,我就解决了这个问题。其它问题也可以照此方式抛出。
8 能力一般,更要在回答问题时引导面试官
零基础的同学经过一段时间的学习和背面试题,可能能力会达到能干活的程度,但如果被面试官发散性地提问的话,很多问题是说不上的,所以对于这批同学,面试时更要掌握引导技巧,其实引导技巧说穿了一文不值,即回答好对应问题后再多说一句,然后面试官自然就接茬问了。如下给出些具体的范例。
1 在回答好任何数据库相关的问题,比如索引,JDBC等,你顺口说句,我在项目里,还通过执行计划优化过SQL技能,然后然开,这块通过执行计划调优,大多数也是理论方面的技巧,初级开发绝对可以准备。
2 在回答好任何集合(如ArrayList)方面问题时,你可以说,在遍历集合的时候,我们项目里会非常小心快速失效问题,然后展开。
3 在回答好任何线程内存模型,或被问到volatile相关问题时,你就说,我知道ConcurrentHashMap里用到volatile,我能具体说下吗?再结合这个对象,扩展到 线程并发话题,而且这还是结合底层代码讲的。
4 被问到任何异常处理问题,比如运行期异常,如何自定义异常,那么再引导到异常处理最佳实践,比如finally的用法。
5 回到好任何线程方的问题,再提下在项目里用过ThreadLocal,由此引出底层的Weak引用话题,再引出JVM结构以及OOM调优方面的话题。具体的细节大家可以参照我提到过的博文《如何准备Java面试?如何把面试官的提问引导到自己准备好的范围内?》。
6 实现准备些log4j的实践技巧,在被问到SSM等框架时,回答好问题再多说一句,在这个项目里我们还用到了log4j分级打印日志,然后展开。
总之在我的其它博文里,也给出了Java面试时的诸多亮点,大家可以两两找关联,然后自行准备引导说辞。
下面就给出三个非常实用的引导案例,哪怕你之前是零基础,照样可以准备,照样可以在面试中发挥。第一个可以从String一直引导到JVM性能调优。
String问题面试时一定会问到,比如String a= “123”; String b=”123”; a==b;结果是true还是false,这个问题大概率问到。怎么引导呢?
先说结果是true,因为常量是存储在JVM的常量池里,然后说,我们项目里,在用String时要非常注意,因为会涉及到JVM性能优化,比如尽量少用连接操作,因为会造成内存碎片。由此引导到JVM调优。当面试官很有可能问,你还知道JVM调优方法?你就可以顺带展开,比如说,用到集合要clear,用好IO,Connection对象要close,尽量用StringBuilder等等。说好以后就可以再说一句,在实际项目里,我还排查过线上OOM问题。面试官很可能感兴趣继续问,你就可以继续说,比如在测试环境,看到日志里经常有OOM,然后你看dump文件,发现OOM的原因是某个大对象没clear,或者说ThreadLocal对象没remove,或者是mybatis里不慎把表里所有数据都捞出来了,这些具体说辞可以参见我其它博文,发现问题再说下解决方法,无非是集合用好后clear等。这样一引导,虽然你实际能力也就是通过3个月运行过若干SSM项目,但和别的初级开发竞争者,差距马上就拉开了。
第二个引导案例是从volatile等问题引导到ConcurrentHashmap底层代码。对于初级开发而言,ConcurrentHashmap底层代码是个万能的法宝,你费少许功夫看明白底层源码的流程,并看明白其中读写操作和并发的关系,在面试中可以说是百试百灵的。
比如问,面试时问多线程,volatile关键字大概率被问到,比如问,你知道volatile是什么含义吗?你除了说好本身含义外,再多下,我看过ConcurrentHashmap底层源代码,其中用到volatile,虽然volatile无法做到原子性,但可以提升效率。你看了底层源码后,就一定能继续说,在该类的put和get方法,以及Entry对象里,大量用到这个,还有transient关键字。当你结合底层源码说清楚ConcurrentHashmap的相关流程以后,一些外派公司甚至就不再问了。
第三个引导案例更能展示你的Java基础,就从final关键字引导到JVM垃圾回收流程,并可以进一步引导到OOM问题排查。final关键面试时一般也会问到,你回答好final作用在类,方法上的含义后,再说下,我还知道匿名内部类只能访问final类型的变量,这个点甚至连一些高级开发也不知道,你提出来以后面试官一定会感兴趣。其中具体的细节大家可以参考我的另一篇博文《内部类、final与垃圾回收,面试时你一说,面试官就知道》,这里就能引导到垃圾回收的流程。说好以后,你就可以继续说,平时我还专研过JVM GC流程,这个其实背些资料就能说,说好以后你再深入下说,我除了知道GC回收外,还在项目里排查过OOM问题,至于OOM问题的排查方法,大家可以参照前文的说辞。
总之这里请大家注意,引导说辞在面试之前就要准备好,比如被问到xx问题还如何抛出其它相关点,这样引导的时候就会很自然,否则的话被面试官看出牵强附会的痕迹就不好了。
大家可以想下,原本面试官在面试初级开发的时候,本来期望就不高,能增删改查就行了,但你如果用上述三个引导说辞,让面试官挖掘出你底层代码和OOM以及JVM等方面的亮点,这样哪怕你有些问题没回答好,也会大概率过面试,如果你其它回答中规中矩,但如果通过引导说出上述任一亮点的话,那么基本上面试成功就成定局了。
9 总结:很多事情干了才知道,但本文总结了前人的经验
写到这里,本人自认为,如果零基础的同学按本文给出技巧和经验,虽然不敢保证一定能100%找到工作,但一定能大幅增加通过面试找到工作的概率,因为本文总结了前人的经验。
有道是说一千道一万不如真刀真枪地干,大家如果真的开始敲代码做了,一定会遇到很多问题,当大家进展到准备简历和面试实战的阶段,一定会遇到更多的问题。但我相信,本文给出的介绍项目经验和面试引导相关技巧,一定能帮助到大家,而且当大家真的开始实践后,自然会见招拆招,克服掉很多问题。但相反如果大家总是有各种顾虑,比如担心学好了工作找不到,或者积累的项目通不过筛选,那么就会止步不前,最终让大家失去很多机会。
最后预祝大家经过努力,都找到各自心仪的工作。
如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,咱们下期见!