对于各位Java程序员来讲,只要能有实践的机会,哪怕工资再低,公司状况再通常,只要本身上心努力,就可能在短期内快速提高,甚至在工做2年后进大厂都有但愿,由于项目里真实的开发实践环境是平时学习不能模拟的。因此不少想从事Java开发的同窗实际上是卡在了第一步:没法积累足以找到工做的项目经验,甚至不知道该如何积累,从而致使没面试机会,或者面试总通不过。这样不少有编程天赋有并且聪明上进的程序员可能就与感兴趣的职业失之交臂了。前端
做为面试官,我知道Java初级开发的最低面试标准,做为Java培训讲师,我帮助过很多零基础的人应聘成功初级Java开发岗,在这篇文章里,就将结合个人相关面试和培训经验,针对零Java基础零Java项目基础的同窗,讲述下如何积累项目经验,以及成功找到开发工做的相关技巧。 java
对于零基础的同窗来讲,目标能够是半年后(最快三个月)进公司干Java,这里的公司多是以下种类:1 规模比较小的公司 2 外派公司,即之外派的身份到银行保险之类甲方公司去干活。3 外包公司,即在公司里干些分包的活。mysql
固然你学历学校比较好的话,也有可能去挑战下大公司,但毕竟路要一步步走,并且这类公司里,有可能工做环境和氛围不如意,但项目里包含的值钱技术点足以帮助你在两三年后进大厂。更重要的是,这些公司的应聘要求相对比较低,大可能是只要你在面试过程当中。再进一步,下面给出了这类目标公司的面试要求。linux
1 商业项目经验越长越好,但至少作过SSM或Spring Boot的项目。程序员
2 数据库方面,须要会增删改查,最好知道单机版调优技巧,好比索引和执行计划。并且在这方面,须要有Spring用Mybatis整合数据库的经验,知道在mybatis的配置文件里编写增删改查乃至事务的技巧。web
3 Java基础方面,掌握集合,文件操做,异常处理,面向对象,多线程等基础知识,其实这块很大程度上能够经过刷面试题达到要求。面试
4 还有一些是所谓的计算机方面基础知识,即数据结构,算法,操做系统,网络编程等技能。其中可能也就会多问些数据结构和算法的问题,其它问题大多也能够经过刷题来解决。ajax
以上是技术方面的,固然还有其它工做态度方面的,好比人看上去比较老实,肯加班,学习能力强,沟通没问题等,但说实在的,在面试的这段较短期内,不多由于这些因素刷掉人的,好比我问愿不肯意加班,听到的大可能是愿意加班,问遇到你不熟悉的技术怎么办,大多数的回答都是尽快努力学习。redis
其实说实在的,一些面试中的加分项,好比以敏捷等方式实践项目的技巧,JVM性能调优,分布式组件基础,linux实践要点和分析与排查问题的能力,虽然对于初级开发不作要求,并且要达到精通的程度确实很难,但真的要准备面试时的说辞,其实并不难,你说了就比别人强,在本文里也会给出相关技巧。 算法
目标明确了,也就能够对应地列出该掌握的技术点了,固然在实践中可能会有增减,但至少不会出现“花大量时间去学无需掌握技能”这种状况了,下面将由浅到深,给出各方面具体要学的技术点。
首先最基础的固然是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项目的开发流程,以及和数据库整合的方式。固然你若是进一步具有调试框架代码分析解决实际问题的能力这更好,但这块对初级开发而言,难度并非遥不可及。
以上给出的实际上是低配版的技能要求,也就是说只要你会增删改查,基本也就达到了进小公司干活的要求。在明确技术点的基础上,下面就会给出学习的相关建议。
其实对于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数据库,在其中建表,搭建SSM环境,下载pom文件,编写配置文件并部署到web服务器上。能够说,对于数据库和框架,难点并非代码,而是如何成功运行,若是你的书有视频教程,你能够照着作,遇到问题,就到百度去搜索,这个过程可能也须要1个月。对大多数零基础的同窗而言,这块确实有难度,但你们其实都这样过来了,遇到问题如何解决?第一看视频照着别人作,第二到网上查解决方法。
掌握基础知识的标志是运行通并理解2到3个SSM框架,其实运行通了,大体也就能理解其中的调用步骤以及基本配置,在下面部分里,就会详细给出框架项目里该要具体掌握的点。
不一样的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如何同事务整合等,当你用一个月到两个左右的时间运行通框架代码并理解后,你就掌握面向框架的增删改查流程了,就有资格出去面试了。
按刚才的提示,通常经过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子模块,同时外带功能改进,这样面试官也能理解。
可能有同窗说了,我确实没商业项目经验,因此找工做有困难,但这里第一是你要从零基础升级到初级开发,第二你没有商业项目经验的现状不是我形成的,相反我都已经很是细化地给你建议了,因此你还真该第一继续积累学习项目经验,第二多挖掘商业项目经验。
若是你投出去的简历大多石沉大海,那么就或者多加上些项目经验,或者多加些技术描述,同时看下你的简历是否真能对上对方的JD,这样总能获得面试机会。当你有面试机会时,首先应该刷题,毕竟不少面试题是源于项目但高于项目。
1 你到网上去搜java面试题,spring面试题,SSM框架面试题,Spring Boot面试题和数据库面试题等等,总能看到一大堆题目,首先把它们背下来,很多地方甚至有系列题,作到这点基本没问题。
2 对初级开发而言,更会侧重Java基础,因此你们还能够去找些集合、异常处理、IO和多线程方面的题去背下。
3 去找些数据结构和算法题,好比排序相关,链表堆栈队列等的,这块不只要会说,更要会写代码,毕竟很多公司有笔试。
4 至于智力题情商题还有面试刁钻问题,这块也有现成的资料。
可是我能够这样告诉你们,若是你单纯就准备这些理论方面的面试题,大多数面试你过不了,由于面试官更要结合项目经验考核你的技术。
1 会问些项目里经常使用的SSM框架配置,或者问你mybaits和spring整合的方式,总之你作过项目必定知道,没作过就很难说出。
2 让你结合项目业务说下SSM框架或Spring Boot的流程。
何况若是你主动地结合项目展现你的技能以及加分项,更能超越你的大多数竞争者,由于以前已经说过,大多数初级开发只会增删改查,在下文里,就将围绕项目介绍,告诉你们展现技能和亮点的面试技巧。
我面过很多候选人,网上有的面试题回答都很好,但让介绍项目,并结合项目提问技术点时,就回答得很很差了,可能这也是大多数零基础开发者的通病。 这块你们别抱有幻想,面试时必定会结合项目提问,这里就给出具体的技巧。
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底层代码,我就解决了这个问题。其它问题也能够照此方式抛出。
零基础的同窗通过一段时间的学习和背面试题,可能能力会达到能干活的程度,但若是被面试官发散性地提问的话,不少问题是说不上的,因此对于这批同窗,面试时更要掌握引导技巧,其实引导技巧说穿了一文不值,即回答好对应问题后再多说一句,而后面试官天然就接茬问了。以下给出些具体的范例。
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等方面的亮点,这样哪怕你有些问题没回答好,也会大几率过面试,若是你其它回答中规中矩,但若是经过引导说出上述任一亮点的话,那么基本上面试成功就成定局了。
写到这里,本人自认为,若是零基础的同窗按本文给出技巧和经验,虽然不敢保证必定能100%找到工做,但必定能大幅增长经过面试找到工做的几率,由于本文总结了前人的经验。
有道是说一千道一万不如真刀真枪地干,你们若是真的开始敲代码作了,必定会遇到不少问题,当你们进展到准备简历和面试实战的阶段,必定会遇到更多的问题。但我相信,本文给出的介绍项目经验和面试引导相关技巧,必定能帮助到你们,并且当你们真的开始实践后,天然会见招拆招,克服掉不少问题。但相反若是你们老是有各类顾虑,好比担忧学好了工做找不到,或者积累的项目通不过筛选,那么就会止步不前,最终让你们失去不少机会。
最后预祝你们通过努力,都找到各自心仪的工做。