零基础编程小白如何拿 Offer?八年经验面试官万字肺腑之言
对于很多程序员小白来说,只要能有实践的机会,哪怕工资再低,公司情况再一般,只要自己上心努力,就可能在短时间内快速提升,甚至有希望在工作2年后进大厂,毕竟项目里真实的开发实践环境是平时学习不能模拟的。
但很多想从事Java开发的同学被卡在了第一步:无法积累足以找到工作的项目经验,甚至不知道该如何积累,导致缺少面试机会,或者面试总通不过,导致很多有编程天赋、聪明上进的程序员可能与感兴趣的职业失之交臂。
作为面试官,我知道Java初级开发的最低面试标准,作为Java培训讲师,我帮助过不少零基础的人应聘成功初级Java开发岗。在这篇文章里,将结合我多年来从事面试官和培训师的经验,针对零Java基础、零Java项目基础的同学,讲述下如何积累项目经验,以及成功找到开发工作的相关技巧。
我从事java开发多年,做过面试官,如果你现在也在学习Java,了解Java,渴望成为一名合格的Java开发工程师,在入门学习Java的过程当中有遇见任何关于学习方法,学习路线等方面的问题,都可以加入我的Java学习交流峮:108 中 062 后 1881,里面聚集了很多正在自学Java的初学者,文件里面还有我做Java技术这段时间整理的一些Java学习手册,面试题,开发工具,PDF文档书记教程,需要的话都可以自行来浏览获取。
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买两到三本,Spring Boot买两到三本。为什么要买两到三本呢,因为一本书上的知识点可能不全,买多了知识点就重复了,如果买两到三本,基本该覆盖到的技术点覆盖了。
2、环境安装好了,书也买好了,照着书敲代码了。我们拿现成代码复制粘贴来运行,退一步就是照着书上敲,别自己写代码。因为刚开始什么都不懂,自己写很容易出错,往往因为一个拼写错误就卡两三个小时,这样浪费时间。
把敲进去的代码运行后,就能从结果里反推关键代码的含义。再加上书上的说明,很容易就能快速上手。一般来说,对于Java基础知识,一般两周运行并理解好一本书,顶多用1个月就能掌握Java核心的大致语法。
3、JDBC数据库和SSM框架也一样,这两方面需要配置环境,如要搭建MySQL数据库,在其中建表,搭建SSM环境,下载pom文件,编写配置文件并部署到Web服务器上。对于数据库和框架,难点并不是代码,而是如何成功运行,如果你的书有视频教程,你可以照着做,遇到问题,就去搜索引擎搜索,这个过程可能需要1个月。对大多数零基础的同学而言,这块确实有难度,但大家都这样过来了,遇到问题如何解决?第一看视频照着别人做,第二到网上查解决方法。
掌握基础知识的标志是运行通并理解两到三个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等关键字,能证明你熟悉多线程并发方面的内存管理细节。
8.能力一般,更要在回答问题时引导面试官
零基础的同学经过一段时间的学习和背面试题,能力达到能干活的程度,但如果被面试官发散性地提问的话,很多问题是说不上的,所以同学们面试时更要掌握引导技巧,引导技巧说穿了一文不值,即回答好对应问题后再多说一句,然后面试官自然就接茬问了。
下面给出具体的范例:
1、回答完数据库相关的问题后,你顺口说句,“我在项目里,还通过执行计划优化过SQL技能”。然后展开通过执行计划调优,大多数是理论方面的技巧,初级开发绝对可以准备。
2、在回答集合方面问题后,你说,在遍历集合的时候,我们项目里会非常小心快速失效问题,然后展开。
3、在回答线程内存模型,或被问到volatile相关问题时,你说,我知道ConcurrentHashMap里用到volatile,我能具体说下吗?再结合这个对象,扩展到线程并发话题,结合底层代码讲的。
4、被问异常处理问题,如运行期异常,如何自定义异常,那么再引导到异常处理最佳实践,比如finally的用法。
5、回答完线程方面的问题后,提下在项目里用过ThreadLocal,由此引出底层的Weak引用话题,再引出JVM结构以及OOM调优方面的话题。具体的细节大家可以参照我提到过的文章。
6、准备好Log4j的实践技巧,在被问到SSM等框架时,回答好问题再多说一句,在这个项目里我们还用到了Log4j分级打印日志,然后展开。
下面就给出三个非常实用的引导案例,哪怕你之前是零基础,照样可以准备,照样可以在面试中发挥。第一个可以从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里不慎把表里所有数据都捞出来了等等。这样一引导后,虽然你实际能力通过3个月运行过若干SSM项目,但和别的初级开发竞争者,差距马上就拉开了。
第二个引导案例是从volatile等问题引导到ConcurrentHashmap底层代码。对于初级开发而言,ConcurrentHashmap底层代码是个万能的法宝,你费少许功夫看明白底层源码的流程,并看明白其中读写操作和并发的关系,在面试中可以说是百试百灵的。
面试时问多线程,volatile关键字大概率被问到。比如你知道volatile是什么含义吗?
你除了说好本身含义外,再说下,我看过ConcurrentHashmap底层源代码,其中用到volatile,虽然volatile无法做到原子性,但可以提升效率。你看了底层源码后就能继续说,在该类的put和get方法,以及Entry对象里,大量用到这个,还有transient关键字。当你结合底层源码说清楚ConcurrentHashmap的相关流程以后,一些外派公司甚至就不再问了。
第三个引导案例展示你的Java基础,从final关键字引导到JVM垃圾回收流程,并进一步引导到OOM问题排查。final关键字面试时一般会问,你回答好final作用在类、方法上的含义后,再说下,我还知道匿名内部类只能访问final类型的变量,这个点可能一些高级开发不知道,你提出来后面试官一定会感兴趣。
说好以后,你就可以继续说,平时我还专研过JVM GC流程,这个背资料就能说,说好以后你再深入下说,我除了知道GC回收外,还在项目里排查过OOM问题,至于OOM问题的排查方法,大家可以参照前文的说辞。
大家在引导说辞在面试之前就要准备好相关内容,比如被问到xx问题还如何抛出其它相关点,这样引导的时候就会很自然,否则的话被面试官看出牵强附会的痕迹就不好了。
原本面试官在面试初级开发的时候,本来期望就不高,能增删改查就行了,但你如果用上述三个引导说辞,让面试官挖掘出你底层代码和OOM以及JVM等方面的亮点,这样哪怕你有些问题没回答好,也会大概率过面试,如果你其它回答中规中矩,但如果通过引导说出上述任一亮点的话,那么基本上面试成功就成定局了。
9.总结
如果零基础的同学按本文给出技巧和经验,虽然不敢保证一定能100%找到工作,但一定能大幅增加通过面试找到工作的概率,因为本文总结了前人的经验。
“说一千道一万不如真刀真枪地干”,大家如果真开始敲代码,一定会遇到很多问题,当大家进展到准备简历和面试实战的阶段,会遇到更多的问题。但我相信,本文给出的介绍项目经验和面试引导相关技巧,能帮助到大家,当大家开始实践后,自然会见招拆招,克服掉很多问题。
如果大家总是有各种顾虑,比如担心学好了工作找不到,或者积累的项目通不过筛选,那么就会止步不前,可能将失去机会。预祝大家经过努力,找到心仪的工作。