第一章:
最近我看到不少在校的同学在学java,而且,在我最近举办的一次直播活动中,也有不少在校生同学来提问,java该怎么学。
对于那些已经工作的同学,哪怕才工作不久,毕竟也能从项目实践里总结和探索java的学习途径和相关方法。但在校生同学由于没机会接触实际项目,在学习内容、进阶途径和学成标准这些方面都是两眼一抹黑,而大学里的内容可能偏重于理论,讲述的技术往往也和软件公司里常用的技术不匹配。
这就导致了很多上心的在校生,虽然很努力,但到毕业时,才发现自己起早贪黑学成的技能并不能帮他们找到工作。在本文里,就将结合我面试实习生和毕业生的标准,专门给在校生这个群体一些学习Java方面的建议。
一、明确目标,先说下公司面试应届生的标准
我最近可能都在大公司,到毕业季,会到一些学校去校招,校招的标准描述起来很简单:Java方面能干活,或者能经短期帮带后能干活,具体标准如下。
1. Web框架方面,需要以全栈的形式,了解SSM,或Spring Boot或Spring Cloud从前端到后端的基本语法,至少能在项目经理短期帮助下,能照着别人的例子写代码。应届生候选人只要能讲清楚相关框架的语法点和流程即可,最多再附带说明下mybatis等组件的用法,至于redis,dubbo,根本没要求。
2. 数据库方面,能会基本的增删改查即可,外带一些基本概念,比如事务怎么处理,JDBC里批处理怎么处理。
3. Java语法(也就是核心方面),其实如果能讲清楚SSM等Web框架技能,这块只要刷题就能过,比如就问些ArrayList和LinkedList的差别,以及多线程等的概念。
4. 人看上去听话,想法少,学习能力强,责任心强,不是刺头,这块其实大多数人都可以达标。
以上不要求有商业项目经验,当然如果有,绝对是加分项,而且这还是大公司的面试应届生的标准。至于一些小公司,或者是一些外包公司,有时候能招到人就阿弥陀佛了(至于有些能力比较强的一本的应届生愿不愿意去还难说)。有些在招收应届生的时候,不少小公司甚至在“项目经验”方面没要求,哪怕没学习项目经验也不要紧,只会问些网上比较大路的面试题,能说上来即可。
二、面试中大多数应届生的实际表现
从面试官角度来看,招收应届生的标准其实是很低的,对应的,在招初级开发时,多少都需要有商业项目经验。从这个角度来看,应届生最好在校期间就找到工作,毕业后两三个月找不到工作问题还不怎么大,但如果半年后再找不到工作,那么到时候被面试的标准就高于“应届生”的标准了。
这里我无意贬低应届生的水平,毕竟我们都是从这个阶段过来的,但从面试情况来看,至少有将近一半的应届生达不到标准,下面列些具体的表现。
1. 没有框架开发的经验,这里最低要求是能自行搭建个SSM项目,但不少同学根本没有。
2. 数据库方面,就知道理论上的增删改查,甚至不会在MySQL, Oracle和SQL Server平台上运行过SQL语句。
3. Java核心方面,掌握了一大堆项目里一定不会用的,比如Swing之类的界面编程技术,但该掌握的多线程集合等,一些常用的概念也不清楚。
论动手能力,有些同学甚至没有在Eclipse等IDE上运行通Java代码,或者出了基本的语法错误不知道如何自行解决,至于没有debug调试经验的,就更加见怪不怪了,而在代码里需要加必要的try...catch异常处理语句,这就更加凤毛麟角了。
在一些一本大学里,理论和实际操作能力较差的同学虽然不多,但也有,就更别提其它大学和大专了。我也和一些大学老师打过交道,也看过一些大学里用的Java和数据库等编程方面的教材,再结合诸多应届生在面试时的表现,我的感受是,或许大学阶段更会培养学生的理论素养,但大学生朋友在读大学阶段,一定要提升实际的编程能力,包含但不限于(SSM)框架的编程能力,数据库实际操作能力和Java核心部分代码的开发和调试能力 。
三、哪些大学里学到的知识点面试大概率不问(根本不用太费精力看的技术有哪些)
前几天我看到篇大学生朋友写的文章,或许很多大学生朋友也知道上进,平时也在不断看各种资料,但可能苦于方法不当,可能有些大学老师也没真在公司里干过,也没法给出合适的学习建议,所以导致最终毕业找工作时,能力没达到基本的期望要求。
也就是说,大学教育和公司面试需求之间存在差距,这就给一些培训机构带来了商机。但培训机构收的钱也不便宜,而培训班也不是一定能保证学生能找到工作,关键要靠自己。从这里开始,就将给出有实际操作性的学习建议。
我最近接触到不少大学生朋友,发现他们努力正在学的知识,面试时未必会问,也就是说,这些点白学了。之前已经提到了面试的标准,这里就将结合具体的知识点,列出面试时需要掌握的最低技能标准,除此之外,大概率不会问的。
1. Java核心方面,集合,多线程,异常处理,IO,JDBC,面向对象技能,大概率会问到,其它的没提到的,比如图形化界面,NIO,Socket网络编程,甚至Applet之类的,不会问到。
2. 数据库方面,会写增删改查的SQL语句,知道存储过程之类的概念,会通过索引优化查询条件,会建表,会些诸如子查询,group by,having,表关联查询等基本SQL技能,这里请注意,至少得用过一种商业化数据库。
3. 框架方面,需要有Spring+Spring MVC+mybatis框架的实际操作能力(不是商业项目开发能力),至于有Spring Boot或Spring Cloud,那更好了。
4. 综合技能方面,能知道基本的数据结构知识(线性表外带排序外带一些树的技能),基本的操作系统知识(一般仅限于线程进程概念),基本网络通讯知识(一般仅限于网络通讯模型和tcp udp协议),但这仅仅是“需要知道”而已。
大家其实也可以通过看各种职位描述和招聘需求,看下哪些技能实际上是不会问的,对于这些知识,就不用学,从而把精力用到学实际Java相关技能上。
这里需要说明,在大学阶段学的很多知识,不能说没用。比如网络通讯里的tcp底层通讯细节,这些技能或者要等到工作5年后升级到高级开发或架构师的时候才会用到,而且以高级开发视角观察需要掌握的通讯协议细节知识,绝对要比大学阶段要复杂。
换句话说,很多技能,在大学阶段也就“需要了解有这事”,以在大学阶段的经历,再多用时间学,估计也无法达到“实际项目的需求”,而且等到有实际项目经验时,再学这类技能也就是一两周的事情。两厢一对比,结论就很明确了:在校阶段应该更多积累实际开发能力,因为更得靠这个找工作。
四、用一个月的时间了解Java核心部分的内容
通过上文,大家大致可以了解到毕业时找工作的目标,如果再不了解,可以实际看下招聘要求,甚至直接多去参加招聘会和面试,总之优先考察实际的开发能力,具体在Java核心部分,该如何高效学习呢?
1. 在电脑上装jdk,eclipse,别用editplus之类的工具,最好再用eclipse的自动编译功能。这方面,其实是锻炼自己的动手搭建环境的能力,工作后,开发是一方面,搭建环境的能力同样重要。
2. 刚开始,一定得去找两三本Java入门书,先通过运行现有代码,理解代码的含义。别光看书不运行,开始阶段,也多运行别人的代码,别自己敲代码。这里建议直接找书,因为相比一些视频教材,毕竟书上的知识很系统,而且能正式出版的书一般没代码问题,能直接运行。不建议自己敲代码,是因为自己敲代码时,多少会遇到问题,遇到问题后延误学习进度是小,因为一直得不到解决从而影响学习信心,甚至终止学习了,事情就大了。
3. 如果找到两三本Java入门书,一般其中涵盖的知识系统大多很相似,大家可以先运行一遍所有代码,这样就能大致掌握代码结构和基本知识点,而且由于书上代码一般问题不大,而且质量也不会低,至少不会有太大的阻碍性问题。
4. 当运行好以后,着重观察集合,面向对象,多线程,IO处理,JDBC,异常处理相关章节,这个阶段,是以掌握API用法为主,在这基本上再看下诸如接口,抽象类,异常处理流程,垃圾回收之类的高级知识点。
在上述基础上,如果可以通过资料的帮助,用Java实现堆栈,链表,队列,散列表,树等的数据结构,同时操练各种排序算法,这对找工作也有些帮助。
五、用半个月的时间,以MySQL为例,了解数据库的大致操作
在数据库方面,最好也去找本书,同时在MYSQL上实践。为什么选MYSQL?因为这比较轻,相比Oracle而言,好安装,当然如果有条件装SQL Server之类的,那就更好了。
1. 在MySQL数据库上,实践各种增删改查的SQL语句,实践建表,建索引能技巧,同时实践一下诸如子查询,with as等等复杂的SQL语句。
2. 用JDBC连同MYSQL,在Java代码里做各种增删改查的操作。
3. 在此基础上,了解诸如索引,范式和锁等概念,这时候虽然认识也会很肤浅,但至少不会一头雾水了。
这样,在数据库方面,好歹有实际操作经验了,这为之后的项目实践,能打下很好的基础。
六、用一个月的时间,了解基于Spring的web框架
面试时更看重的是框架经验,这块学习的建议如下。
1. 先通过运行代码,了解Spring里IOC, AOP,这时应该注意各种配置。
2. 熟悉Spring的基本概念后,可以尝试跑一个SSM的小例子,这个例子可以非常简答,就一个页面也行,但要包含Spring MVC和Mybatis诸多要素,这样大家好歹能知道框架的构成,在这个基础上,可以继续扩展,加些必要的业务,从而进一步了解这个框架。
在这个阶段,还是最好看书上的例子,因为书上的例子一定能通,而且还会带部署和运行的步骤,还是不建议自己敲代码,因为SSM框架相对复杂,在这个阶段如果自己敲,很有可能会因为问题太多而放弃。
3. 在自己机器上跑通SSM框架的案例后,可以网上找个带业务的系统,比如图书管理系统等,从中看些前端和后端交互数据的流程,同时,结合业务看Mybatis里的ORM过程,以及Spring里的常用注解。
七、在学习过程中,可以避免的误区
Java方面,本人按照上述步骤辅导过不少在校的同学,只要肯上心练习,效果不会太差,不过很多同学在实践过程中会走弯路,这里列些普遍存在的问题,请大家在操练的过程中尽量避免。
1. 别钻牛角尖,先面再点。比如有同学对一个知识点不理解,或者一段代码运行有问题,就会在这个点上耗费很多时间,不解决就不继续。其实在这个过程中,首先需要全方位掌握SSM框架、Java技术和数据库,个别点如果有问题,可以跳过,或者一个案例运行不通可以运行其它类似的,总之别在一个点上花费太多的时间。
2. 再啰嗦一下,最好先照着书上代码运行,开始阶段的学习方法是“复制粘贴运行理解”,在自己已经有一定的基础后,再尝试自己写代码。
3. 在操练SSM项目时,有些同学会照着视频上提到步骤做,如果有些视频步骤不对,这样就会有问题,所以还是建议照着书做。
4. 工具要选对,刚开始就eclipse,或者Idea,别用editplus或命令行。
上述是方法上的误区,其实最大的问题出在态度上,上述学习过程持续时间不会短,快则两三个月,慢则半年,如果中途因为效果不明显而放弃,那就很可惜了。
八、有学习项目经验后,争取找些商业项目的实践机会
按照上述步骤,让自己拥有最基本的SSM以及其它Java和数据库相关技能后,要做的绝不是继续积累学习项目经验,而是尽可能去找实习的机会,以积累商业项目的经验。在找实习经验方面,大家可以参照如下的建议。
1. 在我之前的博文里也提到,大三时,打听计算机学院里哪些老师和外面公司有合作,一般硕导都有这样的项目,然后直接去找老师,刚开始不要钱,只求经验,或许对各位在校生同学而言,这种方式是比较可行的,本人第一个商业项目经验也是由此得到的。
2. 一般学校里都会安排实习,实习的过程中,一定要重视,这个是实打实的商业项目经验。
3. 寒暑假,找软件公司,这可能会比较艰辛,因为在校阶段自己非常难找相关实习机会,但要去找。
4. 这个大家根据自己的实际情况自己斟酌:如果报培训班,多少能积累些项目经验,但这仅仅是学习项目经验,不过在培训班里,可以找相关老师推荐实习的机会。
5. 如果实在找不到实习的机会,那么尽可能通过各种渠道,去找商业项目经验的案例,我知道有些网站有,但不做广告。虽然靠这种方式积累的商业项目经验质量就打折扣了,但好歹聊胜于无,而且毕竟很多毕业生,连学习项目经验都没。
不少在校的同学发现,哪怕实际只干了三个月的商业项目经验,自己的技能也会很大程度提升,而且实际的商业项目经验,会让大家掌握书本上根本不会多提但项目里一定会用的技能,比如JVM内存调优或多线程并发。从这意义上来讲,只要有条件,大学生朋友应该挤破头去找商业项目的经验,而不是悠哉游哉地坐在机房里敲代码。只要你有商业项目的经验,哪怕就三个月,找工作时你就有代差优势。
九、毕业生准备简历的要点
按照上述步骤,大家在毕业时,多少会有些商业项目经验,再不济也能有学习项目经验,请记住,在招聘毕业生时,第一看项目经验,第二看项目里包含的技能,第三再问算法和理论问题,至于逻辑题和情商题,只供参考。
对此,毕业生在简历中,一定得突出做过的项目经验,优先挖掘商业项目经验,实在没有学习项目也行。如果没任何项目经验,那么找工作时会吃力很多。本文的重点是讲学习方法,准备简历的技能只是稍微提到。这块可以参考的之前写的博文,你的简历能帮你争取到面试机会吗?。如果有时间的话,或许我会再专门针对毕业生朋友,写篇文章讲在java方面,如何准备简历和面试,以及如何找工作。
十、总结:最多坚持半年,技能就会大变样
我记得两年前,我的Python能力仅限于写hello world,我运行代码看文档,辛苦坚持了半年,自认为就达到了出版书的地步,再过了半年,果真就从出版社接到了一本以股票案例讲述Python技术的选题,并自认为写的内容不会误人子弟。
不光是这位同学,经我培训的其它很多大学生,也只要肯上心学,最多半年,最短三个月,就能从小白进阶到能实际干活的水平,而且还真能面试进软件公司干活。
第二章:
java后端开发什么水平才算合格?相信作为毕业就混进某厂,至今11年,参加过若干次秋招,也经常作为部门面试官的我,可以告诉你一些答案吧。
什么算合格?如果你只想成为一个coder,干着外包的体力活,自然难以说合格二字吧?合格自然是变成一个真正的程序员,拿着一线的offer,才算合格吧。做到下面这些,无论哪个厂都会考虑要你,就算你合格了:
1. 数据结构与算法你合格了吗?作为一个打算当程序员的你,基本的数据结构和算法你必须掌握吧?如果连数组,链表,这两个基本的结构都搞不懂,时间复杂度与空间复杂度的概念都不知道,你配说入门二字?如果平衡二叉树,红黑树,哈希表,堆,桶,图,这些基本的数据结构都不知道其特性和应用场景,甚至连听都没听过的人,拿什么去合格?也不要求你掌握多么深难的算法了,如果连简单的冒泡和选择排序被要求你手写下都面有难色,估计一写代码也只能面向百度编程,合格吗?那么快排、插入、希尔、堆排序、二路归并、多路归并、桶排、计数、基数这些稍微复杂一点而又基本的东西你要是都有所了解,那么姑且就合格了吧。
2. 操作系统你合格了吗?如果几个基本的linux命令都不知道的人,看个日志遇到文件大了估计都要卡死服务器的主,你认为这叫合格?系统简单的脚本还是要会编写一点吧?内存分配、进程、线程调度这些简单基础的概念你还是要知道以下的,别说这些东西没用,不少经典的东西在做实现的时候,都参考了不少操作系统的设计思路,这些都有所理解,算你及格吧。
3.数据库层面的事情你合格了吗?。几大范式定义概念你知道吗?数据库事务的ACID能扯明白吧?隔离层级分别保障的粒度,以及这些隔离层级下依然存在的问题你得知晓吧?这些算是最基本的要求了,如果都不明白那还提什么合格二字?SQL写得荣誉无比,拿SQL搞运算写出复杂无比但是卡得爆机你就可以沾沾自喜了?就问你SQL优化搞没搞过?主流的MYSQL的存储引擎之间的区别,几种索引的区别和应用场景,这些你都如数家珍撒?再说了作为一只技术狗,数据库事务的实现方式你应该知道一些吧?二阶段提交、三阶段提交你知道不?了解这些算你还凑活事儿吧。
以上算通用层面的东西,只要你说你还是个程序员,你就应该是合格的。下面我们就来掰扯下和java有关的东西了。
1.集合方面的事情你合格了吗?map,set,list的区别概念,能捯饬明白?你看看数据结构重要不?就问你点具体的实现类简单点的就HashMap HashSet ArrayList,看你能明白多少,然后换点稍微有意思的话题HashTable,CurrentHashMap,TreeSet,LinkedHashSet,LinkedList,BlockingQueue及其各种实现看你能白活多了?搞java的嘛,这些怕是老生常谈的面试面试开场白噢?要是一问三不知,怕是你自己都不好意思说自己合格吧?
2.IO方面:IO要掌握的就比较多了,IO的设计模式你知道吗?BIO\NIO\AIO它们是怎么设计的呢?Facade\Reactor\Proactor又都是些什么鬼呢? select,poll,epoll又有哪些区别?以上的东西和NIO\AIO,又有哪些联系呢?都知道,那么mina,netty,Grizzly,听没听过,玩没玩耍过?相信很快能摸出你的合格特性。别说这些没有用哈,rpc的框架的异常堆栈抛出来了,基本上都在上面三个东西里面,至于合格几分就是你的事情了。
3.多线程你合格了吗:不问这个怕是面试官不合格吧?线程的生命周期,同步异步的区别,什么时候需要同步,什么时候需要异步,线程的调度方式,聊聊并发编程,为啥要并发,怎么去并发,你处理了哪些并发问题,说句真心话,别说没有应用场景,都知道业务流程有主次之分,那么对于不影响主流程的次要流程,你如果都没异步处理过的下,你过去搞的系统或者说工作经验真心不好说合格二字了。
4.JVM你合格吗:都是搞java的,那么虚拟机的一些东西你总得知道吧?JVM的内存模型,垃圾回收机制,各种机制下的垃圾回收器怎么工作还是知晓些吧。基本的参数调优,你应该有所了解吧。这些知道其实大概其合格了。不过,JVM字节码这种苛刻的要求,如果你非要看了某些面经上来炫技,那么必须满足你的诉求,大家好生掰扯,希望你能达到合格的目的。
5.搞web开放的人,一些基本的常识你都不了解你合格吗?http协议、https协议,dns解析过程、servlet是个什么东西?生命周期如何?request/response区别,session/cookie区别实现机制,redirect/forward的区别你能给简单讲讲?如果这些都不了解,你怕不是搞java web开发的,又到哪里去合格?
6. 编程框架你合格了吗?都是搞web开发的,问下web的框架执行流程都不清楚,你能说你合格吗?比如SpringMVC是如何工作的?你自己实现个web框架可以还是不可以?怎么做,可有思路?自己吃饭用的勺子怎么工作的你还是应该了解的撒?反射加代理再用个map做缓存就能搞的事情都不知道,这个怕是不合格噢。
7.Spring的基本原理你掌握合格了吗?IOC\AOP的实现原理怎么来的?bean的作用域有哪些,务传播机制,隔离层级,这些你都了解吗?如果只是知道点用法,你就认为你合格了,那么估计技术这条道路你的走法也合格不到哪里去。实现机制的一些事情你还是该掌握吧?比如代理的几种方式JDK的cglib的aspectJ的,你又知道多少?抛弃了框架你自己实现基于类的代理有门么?mybatis听过没?不管你听没听过反正jdbc那些事情,数据库连接池的那些事情,面试的时候还是要人认为你合格的,必须和你好好聊聊。spring boot?如果上面这些你掌握得比较好,你算都够可以了,合格了吧?
8.一些通用问题你合格了吗:大名鼎鼎的apache你知道吗?web服务器,应用服务器类的区别你知道吗?ngnix玩耍过没?ngnix你都用来干了些什么?缓存可有听过?怎么来玩耍?从浏览器端一直到后端的各层缓存该怎么来玩耍?策略又是如何来定的?分布式缓存可有听过?memcached,redis可有玩耍过?总之话题很多,根据你掌握的深浅程度,聊聊就可以知道你不是不是合格了。
9.分布式的一些问题你合格了吗:你可知晓为啥需要你的系统搞成分布式的?分布式有哪些经典问题?应用无状态的几种实现方式你都了解(别拿机构你告诉你的每一次请求都打到认证中心那种方式来扯,培训刚毕业多半是合格不了的)?全局唯一ID,(莫要拿什么雪花算法之类的烂大街的来扯,被当成机构里听了两句就出来扯的是,那真的阿弥陀佛恭喜你了),分布式锁怎么搞?负载均衡有没有概念?如何做?如何保障你的应用高可用?如何去保障分布式环境下的一致性问题?消息中间件玩耍过没有?知不知道都有哪些,实现区别在哪里,用它干嘛去?分布式的环境下如何去保障服务的可靠性?如何面临雪崩问题?如何面临穿透问题?包括但不限于spring cloud的相关话题,都解决了哪些分布式中哪些个方面性的问题,如何解决的,策略有哪些?至于你掌握了多少,掌握到什么程度,有没有真正的搞过就决定你合格的程度了。
10.你解决问题的思路是否合格?比如你系统里用于登陆验证的加密盐值泄露了,你如何解决?前提不能影响正常用户的使用噢?真的只是你一个应用就能解决问题的事情吗?再比如,给你一个大文件里面全是数字如何去完成排序?你以为你想到归并排序,就万事大吉了?不认真思考问题,张嘴就来,基本分都达不到,你算什么合格?有没有想到这个文件怎么读、怎么写,读到哪里,写道哪里?你想没像过读取后写到不同的机器,然后不同的机器跑一样的算法然后合并结果,最后输出?对的,能想到这些东西,说明你能思考问题,并借鉴其他软件的经典解决思路,比如hadoop,在思考问题的一些思想上你算合格了。
好了,也不多扯了,只抛问题不给解决办法是不对的,还是应该给你一些帮助。
关于怎么快速上手java相信这个可以帮助到你
第三章:
考点总结
综上,各家公司的招聘要求,梳理出七个方向的考点,包括:基本功底、常用技术、技术深度、技术经验、学习能力、工作能力、项目经验。
四、总结
战斗
,知己知彼才能游刃有余。面试怎么面主要是看简历怎么写,最终是你来主导面试,还是被主导,更多也是依赖于你的技术身家。五、系列推荐
2020年新手怎样快速上手java?
更多学习教程一整套从基础到高级内容全套这里领取,全套免费领取~