聊聊阿里社招面试,谈谈“野生”Java程序员学习的道路

发布时间:2018-07-06 15:49:00作者:左潇龙阅读(2453 )评论(31)

    引言   

      

      很尴尬的是,这个类型的文章其实之前笔者就写过,原文章里,笔者自称LZ(也就是楼主,有人说是老子的简写,笔者只想说,这位同学你站出来,保证不打死你,-_-),原文章名称叫做《回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议》,首发于笔者的博客园博客,这里也郑重声明一下,所有内容类似文章均属转载或抄袭。   

      之前看过的朋友可能会有疑问,为什么要再次捡起这篇文章,还把称谓改成了笔者这么高端的词汇。   

      简单的解释一下,原因有三个,第一个原因,是说不得的原因,请各位看官自行YY。第二个原因,是两年过去了,笔者在阿里也呆了700+天的时间,所以对这篇文章,又有了一些新的理解和想法,想回过头来,再完善一下。最后一个原因,是因为最近笔者经常刷某音,根据玩某音的经验,发两次会火,哈哈,-_-。   

      所以,这篇文章,可以说是之前那篇文章的进阶版,为了方便大家观看,本文会引入很多原文章的内容,避免没看过上一篇文章的同学,还需要回过头去翻看。(好吧,我承认是为了偷懒,-_-)

     

    阿里社招面试都问什么?      

      

      和之前一样,文章一上来,我们先来谈谈阿里的社招面试都问什么,其实这个话题并不是什么秘密,所有来阿里面试过的同学,都能回答一二。

      两年前的时候,笔者在文章里是这么回答的。

      这个是让LZ最头疼的一个问题,也是群里的猿友们问的最多的一个问题。

      说实话,LZ只能隐约想起并发、JVM、分布式、TCP/IP协议这些个关键字,具体的问题真的是几乎都没记住。而且就算LZ记住了,也告诉你了,你也背会了,但LZ觉得,在面试中,你被问到一模一样问题的可能性依然很小。

      甚至,就算你运气好被问到了,你也照着背下来了,也不一定就能对你的面试起到正面的作用,因为面试官万一多问一句,你可能就露馅了,那还不如干脆点说不会更好。

      LZ参加的是阿里的社招面试,而社招不同于校招,问题的范围其实是很随机的。因为能参加一些比较知名的互联网公司社招的人,70%以上都会有个3-5年的经验。这倒不是说一两年经验的同学没有机会进这些公司,而是因为这种公司,大部分情况下只招一些比较资深的开发和应届生,而不招那些处于中间阶段的人。而1-2年经验的同学,往往就刚好处于这个尴尬的阶段。

      对于能有3-5年经验的这部分人中,每个人的经历又都不同,所擅长的点也不一样,因此这就会导致每个人的问题和范围都不太一样。

      很少说有哪个知名的互联网公司,比如BAT、京东、360、搜狐、网易等这些公司,其社招面试还有固定的问题和模式,让你可以像应届生面试一样,在面试前靠临时抱佛脚度过这一关。

      大部分公司在社招的时候,不光是阿里,其它公司也都一样(因为LZ在一年多前也参加过很多其它知名互联网公司的面试,详情见《记录2015年年初跳槽的经历!》),基本上都分为两个阶段的提问。

      第一个阶段是主语言本身以及它的高级特性,第二个阶段是讲述自己的项目,并在中间穿插着问题。

      所以,LZ不妨就这两个阶段,谈谈社招面试的准备,而不是去把阿里面试的过程背一遍。说实话,LZ也确实记不住,所以不要再问LZ阿里面试都会问哪些问题了,你看看上面那个连接里的文章,也会发现,LZ里面也基本上没有写具体的问题,原因是一样的,真的记不住啊。(就是因为记忆力的问题,导致LZ从小偏科,文科成绩一直堪忧,-_-)

      看到当时自己的回答,笔者有种在review几年前代码的错觉,不过好在,哪怕是现在来看,当时写的虽然多了些废话,但整体思路应该还是没错的。

      只不过在这里,笔者想要再补充下,如果把以上两个阶段再概括化一下,其实得到的答案,就基本适用于所有面试,而并非只是阿里的社招面试。

      那就是,第一阶段是主语言,第二阶段是项目。

      这点相信不少人在面试的过程中,已经深有体会,大部分面试就是分这么两个阶段去问的,只不过针对不同的公司和职位,每个阶段面试的难易程度会不同,所问的问题范围,自然也会有所不同。

      说到面试的难易程度,不得不八卦一下,据之前笔者在网上某地方看到的评论中说,就面试的技术难度而言,BAT之间的排列顺序是这样的,阿里>百度>腾讯。

      对此,笔者实际的感受倒是和上面一致,因为笔者参加过百度和阿里的面试,就个人的感觉而言,阿里的难度是高于百度的。

      不过笔者说阿里的难度比百度高,其实也仅限于笔者那一次具体的面试,实际上,两家公司面试的具体难度,是不能这么简单对比的。

      面试的难度,根据职位的不同(比如低级工程师还是高级),部门的不同(比如业务部门还是纯研发部门),用人需求的不同(比如是急需还是人才储备),面试官的喜好(比如是装逼型还是温和型)等等因素,就算是在同一家公司,难度也是会有差异的,所以不能简单的对比两家公司的面试难度。

      到底难不难,只有来试了才知道!

      所以,阿里中间件团队欢迎你!(咳咳,不要问我为啥加这句话,说不得,0-0)

     

    阿里社招面试如何准备?   

     

      这个话题相信是大家比较关心的话题,之前笔者其实已经详细谈论过了,就这一部分内容来说,之前写的还是比较详细的,所以索性偷个懒,把原文搬上来了。

      LZ会分为四个部分来谈论这个问题,由于LZ本身是Java出身,因此关于主语言的问题,都是与Java相关,其它语言的同学可以选择性忽略。此外,面试的时候一般面试官的问题都是环环相扣,逐渐深入的,这点在下面大家可以更明显的感受出来。

      1、主语言本身以及它的高级特性。

      主语言当然就是你平日里拿来赚钱的家伙。不要告诉LZ你没有主语言,你会N多种语言,或者是你精通N多种语言,你要非这么说的话,你可以来杭州试试,LZ保证不打死你,最多打残。

      LZ的主语言很显然是Java,那么对于Java来说,它的语言本身以及它的高级特性,都有哪些比较容易在面试中问到呢?

      一般情况下,主要有以下知识点很容易被问到。(PS:以下所列举的,都是一些Java相对而言比较高级一点的知识点,因为这里谈的是社招,而不是校招)

     

      1)Java的数据结构相关的类实现原理,比如LinkedList,ArrayList,HashMap,TreeMap这一类的。以下简单模拟一个数据结构的连环炮。

      比如,面试官先问你HashMap是不是有序的?

      你肯定回答说,不是有序的。那面试官就会继续问你,有没有有顺序的Map实现类?

      你如果这个时候说不知道的话,那这个问题就到此结束了。如果你说有TreeMap和LinkedHashMap。

      那么面试官接下来就可能会问你,TreeMap和LinkedHashMap是如何保证它的顺序的?

      如果你回答不上来,那么到此为止。如果你依然回答上来了,那么面试官还会继续问你,你觉得它们两个哪个的有序实现比较好?

      如果你依然可以回答的话,那么面试官会继续问你,你觉得还有没有比它更好或者更高效的实现方式?

      如果你还能说出来的话,那么就你所说的实现方式肯定依然可以问你很多问题。

      以上就是一个面试官一步一步提问的例子。所以,如果你了解的不多,千万不要敷衍,因为可能下一个问题你就暴露了,还不如直接说不会,把这个问题结束掉,赶紧切换到你熟悉的领域。

     

      2)Java并发包当中的类,它们都有哪些作用,以及它们的实现原理,这些类就是java.concurrent包下面的。与上面一样,咱们也简单的模拟一个并发包的连环炮。

      比如面试官可能会先问你,如果想实现所有的线程一起等待某个事件的发生,当某个事件发生时,所有线程一起开始往下执行的话,有什么好的办法吗?

      这个时候你可能会说可以用栅栏(Java的并发包中的CyclicBarrier),那么面试官就会继续问你,你知道它的实现原理吗?

      如果你继续回答的话,面试官可能会继续问你,你还知道其它的实现方式吗?

      如果你还能说出很多种实现方式的话,那么继续问你,你觉得这些方式里哪个方式更好?

      如果你说出来某一个方式比较好的话,面试官依然可以继续问你,那如果让你来写的话,你觉得还有比它更好的实现方式吗?

      如果你这个时候依然可以说出来你自己更好的实现方式,那么面试官肯定还会揪着这个继续问你。

      为什么说面试的时候要引导面试官,原因就在这了。因为面试官的提问很多时候都是有迹可循的,你如果抓住了他的轨迹,能够猜到他下面很可能会问什么,那你在回答的时候就可以往你想要谈的方向去说。这样面试时就会显得更加从容,更加的游刃有余。

      

      3)IO包和NIO包中的内容。这部分里面NIO会是重点,IO包大部分都会比较熟悉,因此可能会直接略过,直接问你NIO的内容。

      IO包和NIO包的内容相对来说不是很多,首先NIO模型要熟悉,特别是其中的selector一定要非常清楚它的职责和实现原理。其实NIO的核心是IO线程池,一定要记住这个关键点。有的时候,面试官可能也会问你IO包的设计模式(装饰器模式),为什么要这样设计?

      有的面试官还会问你有没有更好的设计,这个时候如果你不知道请果断说自己现在的水平有限,想不出来更好的设计,千万不要信口开河,随意YY。

      

      4)Java的虚拟机的内容。这部分主要包括三部分,GC、类加载机制,以及内存。

      一个GC部分简单的连环炮。

      面试官可以先问你什么时候一个对象会被GC?

      接着继续问你为什么要在这种时候对象才会被GC?

      接着继续问你GC策略都有哪些分类?

      你如果说出来了,继续问你这些策略分别都有什么优劣势?都适用于什么场景?

      你继续说出来了以后,给你举个实际的场景,让你选择一个GC策略?

      你如果选出来了,继续问你,为什么要选择这个策略?

      下面是关于类加载机制的简单连环炮。

      首先肯定是先问你Java的类加载器都有哪些?

      回答了这些以后,可能会问你每个类加载器都加载哪些类?

      说完以后,可能会问你这些类加载之间的父子关系是怎样的?

      你在回答的时候可能会提到双亲委派模型,那么可以继续问你什么是双亲委派模型?

      你解释完了以后,可能会继续问你,为什么Java的类加载器要使用双亲委派模型?

      你回答完以后,可能会继续问你如何自定义自己的类加载器,自己的类加载器和Java自带的类加载器关系如何处理?

      再来一个关于内存的连环炮。

      首先肯定就是问你内存分为哪几部分,这些部分分别都存储哪些数据?

      然后继续问你一个对象从创建到销毁都是怎么在这些部分里存活和转移的?

      接着可能会问你,内存的哪些部分会参与GC的回收?

      完事以后,可能还会问你Java的内存模型是怎么设计的?

      你回答了以后,还会继续问你为什么要这么设计?

      问完以后,还可能会让你结合内存模型的设计谈谈volatile关键字的作用?

      你在谈的时候,肯定会提到可见性,那么接着可见性这三个字,还可以继续问你并发的内容。

      

      基本上Java语言本身以及语言稍微高级点的内容就是以上部分,如果你能把以上四部分了解的非常透彻,那基本上Java这部分就没啥问题了,因为光以上的内容就够你跟面试官聊很久了。你聊这些聊得久了,自然问你其它问题的时间就会短点。

      你从LZ写这些问题的过程也应该能感受出来,很多时候,面试官都是顺着一条线一路问下去的,如果你觉得这条线你不熟悉的话,就要及时拐弯,引导面试官去问其它方面的问题。千万不要一直往下深入,直到自己跳不出来为止,那就尴了个尬了。

      

      2、讲述自己的项目,并在中间穿插着问题

      这一部分是面试过程中必问,也是聊得最久的一个阶段。除非你前面的语言部分非常扎实,扎实到面试官问了一两个小时,依旧没有探出你对语言本身的了解到底有多深。否则的话,你一定逃不过自己的项目这一关,而且一般情况下聊得时间不会太短。

      这一部分内容,一般的模式就是你自己去讲你做过的项目,然后面试官会冷不丁的让你去解释其中某一部分,比如让你解释当时为什么要这么做,或者问你现在觉得有没有更好的办法。而这些穿插的问题,大部分与你的项目所用到的技术有关。而你需要做的,就是充分、再充分的去总结自己做过的项目(尤其是最近的一两个项目),挖掘出一个甚至N个亮点,以备于到时候可以让面试官产生眼前一亮的感觉。如果你能达到这种效果的话,基本上离你成功就不远了。

      这部分内容由于和每个人自己的经历息息相关,因此这里也没法列举可能问到的问题。这篇文章《程序员面经:面试前到底该不该刷题以及面试前该如何准备》是LZ之前写的,里面大概讨论了下如何在面试前总结,有兴趣的可以去了解一下。

      

      3、额外的加分项

      上面两个阶段基本上是必问的,还有一些加分项。这些加分项中,有些内容面试官也会问你(比如TCP/IP协议、算法),但更多的是会先问你了解不了解,你了解的话再继续聊,不了解的话就直接略过了,不至于因为这种问题而直接把你打入地狱。

      下面LZ列举一下这些加分项,如果可以的话,这些加分项还是要争取一下的。

      1、计算机系统原理。

      2、网络通信协议(TCP/IP,HTTP等)。

      3、数据结构与算法。

      4、著名开源项目的源码。

      5、你自己有很棒的开源项目。

      6、你的个人博客。

      7、待评论区补充。

      这几项当中,对于前1-3项,如果你之前就比较了解,只是由于时间问题忘记了的话,还是可以临时抱佛脚一下的。至于后面4-6项,就需要你日常的积累了,不是一时半会儿能做到的。如果你平日里没有积累,那么后面这三个加分项只能抛弃了。

      

      4、与你职位相关的内容

      其实这最后一项是对前面三项的补充,你应该尽量去主攻和你面试的职位相关的内容。比如你面试一个实时计算的职位,那么你的算法最好要厉害,对于著名的实时计算开源项目要熟悉,最好阅读过源码,而且还要对分布式系统有一定的见解。

      因此,这个第4部分没有具体的内容,只是提醒你,如果你很明确自己的面试职位,最好在面试前准备的时候,尽量朝职位的需求方向靠拢,这样成功的可能性更大。

      看完以后,关于连环炮的部分,笔者这里还是想简单再补充几句,上面之所以举了那么多连环炮的例子,其实并不是想让大家背下来,而是想让各位看官体会一下社招面试的套路。

      说到底,这些连环炮的例子,就是在考验你对某一个知识点理解的有多深。就笔者的亲身经历而言,其实上面所提到的这些连环炮,你并不需要每个都理解的很深,只需要有那么一两个点比较深,甚至超过面试官的理解,就可以达到要求了。

      很多时候,面试官并不需要你对每一个知识点都很深入,他只是在考察你的理解能力,以及平时有没有一些技术积累。

      如果一个面试官,只因为一两个技术知识点而否决你的话,那么只有两种可能,第一种是这个点,可能确实是你所面试的职位中,非常重要的知识点,比如面试算法类岗位的话,算法不好是不行的,或者是面试偏运维类的技术岗位,Linux玩不好也是不行的。

      第二种可能就是——他在装逼,-_-。

     

    “野生”Java程序猿学习的道路

     

      这一部分笔者上篇文章谈了很多,不过这一次,笔者在Java程序猿前面加了个限定词——野生

      笔者一向自称是“野生”程序员,所谓的“野生”,笔者这里先简单下一个定义,就是在大学之前,从来没想过会走程序猿这条路,而是在进入社会之后,才逐渐走上程序猿这条路的人,笔者称之为“野生”程序猿。

     

    自学还是培训机构?

     

      “野生”程序猿有不少程序猿“正规军”所不具备的共性,其中最典型的一个共性,就是“野生”程序猿在进入社会之后,都会经历一个学习入门的阶段。

      也正是因此,社会上出现了大量的培训机构,所以往往“野生”程序猿在入行初期,所面临的第一个问题就是,到底是自学,还是选择培训机构?

      笔者就收到过无数这类的问题,其实这个问题没办法一概而论,要具体情况具体分析,但如果简单粗暴一些来说的话,假设你家里不缺那个培训费,就去培训机构,反之就别去。

      毕竟花了钱,总会多一些学习上的资源,最起码聊胜于无。

      所以,这个问题通俗点说,就是有钱就去,没钱就自学

      就像那个经典的笑话一样,说自己买东西有选择恐惧症的同学,不是真的有选择恐惧症,唯一的原因就是——穷,呵呵哒。

     

    算法到底重不重要?

     

      除了上述的共性之外,“野生”程序员还有一个共性,就是学习曲线和程序员“正规军”会有所不同,前者是从实践到理论,后者是从理论到实践,这就会导致“野生”程序员的基本功一般不怎么扎实,比如算法、计算机系统原理、计算机网络等。

      私底下,无数同学问过笔者同样的一个问题,到底算法重不重要?阿里面试考不考算法?

      其实第一个问题,关于算法到底重不重要,笔者这里是有两个答案的,如果来问的同学互相对质一下的话,可能会发现笔者给每个人的答案会略有不同。

      如果是一个学生来问的话,笔者会告诉他,算法非常重要,一定要全力学习。

      而如果是一个已经踏入职场多年的人来问的话,笔者一般会告诉他,按需学习即可,如果你做的工作和算法关系很大,那自然要好好学,比如你做算法工程师,你告诉我算法重不重要? 当然重要!

      而如果你每天写的是增删改查,更注重业务,那还是别花那个精力了,省省吧,有学算法这个精力,多研究研究业务,多思考思考技术与业务结合这种问题,可能比你学习算法收效更高。

      至于第二个问题,阿里面试考不考算法,笔者清晰记得,面试官问了这样一个问题的,“你对算法的了解多不?”

      而笔者当时的回答是,“不好意思,这个我不会。”

      看到这里,可能有的同学会有疑问了,“作者啊,你这样做不太好,你这不等于告诉大家,算法不重要,不学算法一样可以进阿里吗?”

      有这种疑问的同学,是没有想明白这么一件事,算法是否重要,和是否一定要花精力学习它,并没有什么直接的卵关系。

      更何况,不会算法能进阿里也很正常,难道你觉得阿里万千工程师,都是熟悉算法的吗?我敢说,你敢信吗?

      还有不少人有一个误区,那就是,“算法好的人,工资都高了不少。”

      关于这个,笔者只想说,如果这个人本身就是搞算法类工作的,那无可厚非,但是如果他是搞增删改查的,笔者可以很确定的说,他学算法这个时间去学点别的,工资可能会更高。

      所以,不要被这个表象迷惑了,他高工资本质是因为他业余时间学习了才高,而不是因为学习了算法才高。

      俗话说学以致用,不光花钱要花到刀刃上,学习也是要学到刀刃上的,因为时间比金钱更珍贵

      当然,以上所说对于算法要按需学习的论调,仅适合于毕业多年,已经进入职场的同学,如果你是一个在校生,那么对于算法这个东西,就只有一个字——学!往死里学!

     

    “野生”Java程序员如何学习

     

      扯完了家常,咱们聊点正事,“野生”程序员,如何度过自己的学习和职场生涯。

      关于这个话题,笔者会引用一下上一篇文章中的内容,但是两年过去了,笔者会对其中再做一些补充。

      接下来,我们首先看一下之前笔者所写的前奏。

      这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是LZ你是如何学习Java的,能不能给点建议?

      今天LZ是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍。这一部分的内容,同样适用于一些希望转行到Java的同学。

      在大家看之前,LZ要先声明两点。

      1、由于LZ本人是Java后端开发出身,因此所推荐的学习内容是Java Web和Java后端开发的路线,非Java Web和Java后端开发的同学请适当参考其学习思想即可,切勿照搬。

      2、下面对于【第一部分】的推荐内容,目的是让你尽快成为一个可以参加工作的Java开发者,更适用于处于待业状态,准备转行Java的同学。如果你是在校学生,务必要在学好基础(比如计算机系统、算法、编译原理等等)的前提下,再考虑去进行下面的学习。

      其实这段前奏中,笔者第2点中所说的“处于待业状态,准备转行Java的同学”,就是今天一直提到的“野生”程序员。

      笔者这里专门提到这点,也是希望看官们可以明白,本文所有内容,都是围绕着“野生”程序员展开的,如果你不属于其中的一员,那么一定要对文中提到的学习道路自行取舍。

      哪怕是“野生”程序员,也不一定就非要完全照搬文中的学习,也要有自己的思考。

     

    第一阶段——未参加工作的同学

     

      这个阶段,其实就是上面笔者提到过的,是“野生”程序员学习入门的阶段。大部分人在这个阶段学习的时候,都是非常痛苦的,所谓万事开头难,是有一定道理的。

      不过没关系,谁让你运气好,看到了这篇文章呢(吹逼会不会遭雷劈?),你只需要保持学习的信念,然后按照下面的思路去学习就可以了。

      强调一下,对于程序员来说,心中那股信念很重要,你要问笔者这股信念是什么,笔者只能说只可意会不可言传,自己在职场生涯中慢慢体会吧。

      一、Java基础

      首先去找一个Java的基础教程学一下,这里可以推荐一个地址,或者你也可以参照这个地址上去找相应的视频,地址为http://www.runoob.com/java/java-tutorial.html

      学习Java基础的时候,应该尽量多动手,很多时候,你想当然的事情,等你写出来运行一下,你就会发现不是这么回事儿,不信你就试试。

      学完以上内容以后,你应该对Java有一个基本的了解了,你可以用Java语言写出一些简单的程序,并且你用的是最简单的编辑器,比如记事本。

      这个时候,不要急于进入下一部分,留下几天好好写一些程序,尽可能熟悉这些基础内容。

      二、Web开发

      等你写上几天程序以后,你往往会比较迷茫,因为你写的东西似乎看起来毫无用处,比如实现一个简单的计算器,读取一个文件等。这个时候你就应该去学着写一些让你觉得有意思的东西了,所以你应该学习更多的知识。

      这些内容主要是Web开发相关的内容,包括HTML/CSS/JS(前端页面)、Servlet/JSP(J2EE)以及Mysql(数据库)相关的知识。

      它们的学习顺序应该是从前到后,因此最先学习的应该是HTML/CSS/JS(前端页面),这部分内容你可以去上面的那个runoob网站上找。你可以试着自己写一些页面,当然,你可以尽你最大的努力让它变得最漂亮。这部分内容对于后端Java来说,理论上不是特别重要,但至少要达到可以自己写出一些简单页面的水平。

      接下来,你需要学习的是Servlet/JSP(J2EE)部分,这部分是Java后端开发必须非常精通的部分,因此这部分是这三部分中最需要花精力的,而且这个时候,你要学会使用开发工具,而不能再使用记事本了,可以选择eclipse。

      当你下载安装好eclipse以后,请视频中的教程一步一步去学习,一定要多动手。关于Servlet/Jsp部分视频的选择,业界比较认可马士兵的视频,因此推荐给大家。当然了,LZ本人并没有看过他的视频,所以不好说的太绝对,如果大家自己有更好的选择,可以坚持自己的,不要被LZ干扰。

      原本LZ也是打算出教学视频的,但是由于时间问题,还是决定放弃了。但是如果你看视频的过程中遇到了问题,欢迎来LZ的交流群提问,或者去斗鱼观看LZ的直播提出你的问题,直播地址和群号都在LZ的个人博客左侧。

      最后一步,你需要学会使用数据库,mysql是个不错的入门选择,而且Java领域里主流的关系型数据库就是mysql。这部分一般在你学习Servlet/Jsp的时候,就会接触到的,其中的JDBC部分就是数据库相关的部分。你不仅要学会使用JDBC操作数据库,还要学会使用数据库客户端工具,比如navicat,sqlyog,二选一即可。

      三、开发框架

      当你学会以上内容以后,这个时候你还不足以参加工作,你还需要继续深造。公司里为了提高开发的效率,会使用一些Java Web框架,因此你还需要学习一些开发框架。

      目前比较主流的是SSM框架,即spring、springmvc、mybatis。你需要学会这三个框架的搭建,并用它们做出一个简单的增删改查的Web项目。你可以不理解那些配置都是什么含义,以及为什么要这么做,这些留着后面你去了解。但你一定要可以快速的利用它们三个搭建出一个Web框架,你可以记录下你第一次搭建的过程,相信我,你一定会用到的。

      还要提一句的是,你在搭建SSM的过程中,可能会经常接触到一个叫maven的工具。这个工具也是你以后工作当中几乎是必须要使用的工具,所以你在搭建SSM的过程中,也可以顺便了解一下maven的知识。在你目前这个阶段,你只需要在网络上了解一下maven基本的使用方法即可,一些高端的用法随着你工作经验的增加,会逐渐接触到的。

      关于学习SSM框架的地址给大家推荐一个,这里面有视频,大家可以去观看,地址是http://edu.51cto.com/lesson/id-76468.html

      四、找工作

      当你完成开发框架的学习以后,你就该找工作了,在校的找实习,毕业的找全职。与此同时,在找工作的同时,你不应该停下你的学习,准确的说,是你在以后都不能停下学习。

      上面这些内容你只是囫囵吞枣的学会了使用,你可以逐步尝试着去了解更多的东西,网络是你最重要的老师。

      两年过去了,其实这个学习路线,并没有什么太大的变化,唯一变化的点,就是spring-boot的普及,省去了之前很多框架整合的工作。

      回想11年笔者培训那会儿,想要搭建一个SSH框架,还要自己梳理jar包,整合一大堆配置,一不小心就各种报错,而且那异常往往都不是简单的NPE,甭提多苦逼了。

      所以,同学们,珍惜你现在的生活吧,呵呵哒。

     

    第二阶段——工作0到1年的同学

     

      这个阶段是所有人都会经历的一个阶段,这个阶段的程序员,心里往往都是非常复杂的,刚找到工作,坐在明亮的办公室里,仿佛自己成为了电视剧中的主角,难免会感到意气风发,但是同时心中又不免会有些恐惧,生怕自己一个不小心,再次被打回原形。

      如果你有这样的感觉,不用紧张,这是所有人都要经历的,你要做的,就是让自己彻底沉浸在工作和学习当中即可,原因很简单,因为这个时候——你还是单身狗,-_-。

      恭喜你,这个时候,你已经拥有了一份Java的工作。这个阶段是你成长极快的阶段,而且你可能会经常加班。

      但是加班不代表你就可以松懈了,永远记得LZ说的那句话,从你入行那一刻起,你就要不停的学习。在这一年里,你至少需要看完《Java编程思想》这本书。这本书的内容是帮助你对于Java有一个更加深入的了解,是Java基础的升级版。

      这本书很厚,当初看这本书,LZ花了整整三个月。正常速度的话,应该可以在半年左右看完。LZ这里不要求过高,只要你在一年以内把这本书看完即可。当然了,LZ所说的看完,是充分吸收,而不是读一遍就完事了,因此有些内容你可能会看不止一遍。

      总而言之,这个阶段的核心学习思想就是,在工作中实践,并且更加深入的了解Java基础。

      补充一下,看书的时候,不要只是看书,一定要经常思考,比如思考你所写的代码,和书中的内容是否有联系。

      举个实际的例子,当你看到static这一部分内容的时候,你是否会去翻一下你现在开发的项目里,是否有地方使用static,它使用的目的是什么,它使用的方式是否正确。

      只有这样看书,你才能真正的把书看进去,一定要注意,看书的最终目的是为了引发自己的思考,只看书不思考的话,那叫背书,不叫看书

      说到这里,有不少同学问过笔者这样的一个问题,“我看书看不进去怎么办呢?有没有什么好的办法?”

      笔者这里可以很负责的告诉你,哪有什么岁月静好,只是有人替你负重前行而已。

      所以,不要期望有什么开开心心,快快乐乐就把书给看了的办法,你想的倒还挺美,呵呵哒。

      这玩意儿没有什么好办法,就是靠着自己内心的一股信念,强迫自己去看,特别是刚开始的时候,是最困难的,熬过那一段时间,后面看起来相对来说会顺畅很多。

      万事开头难,用在看书学习上,也同样适用。

     

    第三阶段——工作1到2年的同学

     

      这个阶段的你一般已经做了一年的增删改查,与刚入职时的意气风发不同,这个时候的你,会开始考虑你未来要走的路,但通常在这个时候,你很难看清前方的路,因此你或许会有些焦虑。

      如果你存在这样的焦虑,不必忧心,只需记得,在程序员的道路上,学习能使你变得更加充实,继续沉浸在学习的海洋中吧。

      这部分时间段的同学,已经对Java有了一个更加深入的了解。但是对于面向对象的体会可能还不够深刻,编程的时候还停留在完成功能的层次,很少会去考虑设计的问题。

      于是这个时候,设计模式就来了。LZ当时看的是《大话设计模式》这本书,并且写了完整版的设计模式博客。因此,LZ要求大家,最多在你工作一年的时候,必须开始写博客,而设计模式就是你博客的开端。

      请记住,LZ所提的基本都是最低要求,因此不要有任何松懈的心理,否则五年后,你不要去羡慕别人高于你的工资,也不要去羡慕别人进入了某公司。

      这一年,你必须对于设计模式了如指掌,《大话设计模式》可以作为你的开端。当然了,你也可以去看LZ的个人博客去学习,地址是http://www.cnblogs.com/zuoxiaolong/p/pattern26.html

      此外,设计模式并不是你这一年唯一的任务,你还需要看一些关于代码编写优化的书。比如《重构 改善既有代码的设计》,《effective java》。

      总而言之,这个阶段,你的核心任务就是提高你的代码能力,要能写出一手优雅的代码。

      这个阶段笔者所建议的三本书,其实都是在教你如何更好的编写和设计你的代码,除此之外,设计模式这个系列,也是在锻炼你对问题的抽象能力。

      使用Java这种面向对象的语言,抽象能力是非常重要的一项能力,和上面一样,笔者建议,当你看完设计模式、重构和Effective Java这几本书后,一定要结合自己的项目,做深入的思考。

      不思考的人生是不完整的,只干活儿不动脑子的人,看似勤奋,实际就是台机器,既然是机器,那就早晚会被取代的。

      只有不断思考,总结过往,指导未来的人,才最终会成为这个社会的主导者。

     

    第四阶段——工作2到3年的同学

     

      这个阶段,对于程序员来说,是非常重要的一个阶段。在笔者的学习道路规划中,这个阶段学习的目的,是为了让你从初中级工程师迈入高级,实现质的提升,因此,这一部分的学习,难度会比之前两年的要高。

      但既然你已经踏上了这条路,就没有回旋的余地,只能往前冲。

      所以,做好心理准备,迎接挑战吧。

      有的同学在这个时候觉得自己已经很牛逼了,于是忍不住开始慢慢松懈。请记住,你还嫩的多。

      这个阶段,有一本书是你必须看的,它叫做《深入理解Java虚拟机》。这本书绝对是Java开发者最重要的书,没有之一。在LZ眼里,这本书的重要性还要高于《Java编程思想》。

      这本书的内容是帮助你全面的了解Java虚拟机,在这个阶段,你一定已经知道Java是运行在JVM之上的。所以,对于JVM,你没有任何理由不了解它。LZ之前有写过JVM系列的知识,可以去看一下,地址是http://www.cnblogs.com/zuoxiaolong/category/508918.html

      另外,在过去2年的工作当中,你肯定或多或少接触过并发。这个时候,你应该去更加深入的了解并发相关的知识,而这部分内容,LZ比较推荐《Java并发编程实战》这本书。只要你把这本书啃下来了,并发的部分基本已经了解了十之六七。

      与此同时,这个阶段你要做的事情还远不止如此。这个时候,你应该对于你所使用的框架应该有了更深入的了解,对于Java的类库也有了更深入的了解。因此,你需要去看一些JDK中的类的源码,也包括你所使用的框架的源码。

      这些源码能看懂的前提是,你必须对设计模式非常了解。否则的话,你看源码的过程中,永远会有这样那样的疑问,这段代码为什么要这么写?为什么要定义这个接口,它看起来好像很多余?

      由此也可以看出,这些学习的过程是环环相扣的,如果你任何一个阶段拉下来了,那么你就真的跟不上了,或者说是一步慢步步慢。而且LZ很负责的告诉你,LZ在这个阶段的时候,所学习的东西远多于这里所罗列出来的。因此千万不要觉得你已经学的很多了,LZ所说的这些都只是最低要求,不光是LZ,很多人在这个时间段所学习的内容都远超本文的范围。

      如果你不能跟上节奏的话,若干年后,如果不是程序猿市场还不错的话,你很可能不仅仅是工资比别人低,公司没别人好,而是根本就找不到工作。

      总而言之,这个阶段,你需要做的是深入了解Java底层和Java类库(比如并发那本书就是Java并发包java.concurrent的内容),也就是JVM和JDK的相关内容。而且还要更深入的去了解你所使用的框架,方式比较推荐看源码或者看官方文档。

      另外,还有一种学习的方式,在2年这个阶段,也应该启用了,那就是造轮子。

      不要听信那套“不要重复造轮子”的论调,那是公司为了节省时间成本编造出来的。重复造轮子或许对别人没有价值,因为你造的轮子可能早就有了,而且一般情况下你造出来的轮子还没有现存的好。但是对别人没有价值,不