如果纯粹是为了学Java,那么不建议阅读本文,因为本文不是从理论和教科书的角度讲述如何打好java基础,而是会从“快速用java挣钱”这个角度,讲边学、边做项目和边提升的方法。
在讲具体的方法前,有必要和大家讲明如下的道理。
1 工作中用到的java技术。绝不单纯是java核心语法,而包括java核心语法、数据库技能、web框架(目前比较流行的是spring boot框架)和整合大数据组件和分布式组件的技能。其中资深架构需要掌握java核心语法、数据库技能、web框架技能,而架构师还需要精通整合大数据和分布式组件的技能。所以学java绝不是单纯学线程集合等java核心的语法。
2 找到java工作后,学java技能的速度要比单纯自学和在培训班里学java要高太多,原因很简单,用来挣钱的项目里包含的才是真正的技术,自学或培训项目,没法模拟相关环境。所以本文后面给出的java打基础的方法,是先学到能找到工作的程度,再找工作,然后到项目里学。
3 Java相关的书很多,但不是每个技术点都在项目里用到,而且很多项目里需要的技能,其实根本无法从书本上学到。比方说,某初学者在找工作前学了一大堆java技能,或者是数据结构网络通讯操作系统方面的技能,但是在工作后,会发现真正用到的只是其中一部分,比如java核心里的socket编程,不少项目就未必用到。
4 相反,项目中经常要遇到的分析排查问题,和分布式组件调优等的技能,相关的书就比较少,而且,越是值钱的技能,越在书本上看不到,这些技能只是零散地存在网上的诸多文章里。说这些话的含义还是,请大家务必要在工作中学,自学不是不重要,但高级开发之上的技能点,靠自学或培训班积累的经验,未必能和实际项目要求能对上。
在讲好上述铺垫后,下文就可以给出具体的Java固基的步骤了。
1 先用3到5天,在本机安装jdk,IDEA集成开发环境,MySQL数据库和MySQL WorkBench数据库客户端环境。
2 买两本java书,比如Java疯狂讲义和Java编程的逻辑。为什么买书?因为书里的内容毕竟经过出版社审核过,而且代码能跑通,两本书并集足以涵盖java基础点。
但是,在学java核心的时候,可以只学基本语法,面向对象语法,集合,异常处理和JDBC。IO,设计模式,图形化界面,tcp socket编程这块,可以不用看,因为刚开始找工作未必要用这些技能。而JVM和多线程这块,可以先通过跑代码,了解相应的概念。
也就是说,java核心方面的技术点虽然多,但刚开始学的时候,未必要涵盖所有的点,上文提到不用学的点,在初级开发阶段基本用不到,所以学了白学,而且在学java核心技能的时候,一定得边跑代码边学。
3 上文给到的java书里,一定包含用jdbc连接操作数据库的技能,此时可以在mysql上搭建相关表,一方面熟悉sql语法,另一方面了解下java连接和使用数据库的大致步骤。
由于列出了只要学习的技能点,所以上述技能学起来应该不难,而且大概用1个月的时间能学好。后面就需要学spring boot,但是,这方面只需要学到能做增删改查业务的地步。
4 学spring boot的时候可以用我写的书。在我的书里,不仅包含了 spring boot+JPA做增删改查的技能,还进一步给出了可跑通的项目,此外还包含了 spring boot整合分布式组件的基本做法。
学好spring boot应该能以跑通一个项目为标志,请注意这里是跑通现成代码,而不是自己手写出一个全新的项目。
跑通一个spring boot项目后,大致能掌握spring boot做业务的基本技能,这也是干java活的最低标准。达到这个程度后,后面不应该继续学,而是应该去找工作了。
跑通一个spring boot项目后让大家去找工作,不是因为后面java技能不会用学了,而是比这高深的技能一方面通过自学效率不高,另一方面,找到工作后,更能通过项目为导向,更精准地知道后面该学什么。
比如一些资深java开发都知道,学好spring boot相关技能后,可以一方面继续学习junit和logback等实用性组件,另一方面应当去学数据库优化,jvm调优乃至分布式组件应对高并发的技能。但这些技能该学什么?学到什么程度可以去挑战更高阶的职位,只能是在做项目的工作中自己去体会,如果没有在项目中,学到的相关技能,我可以说,大部分都是白学。
java小白如何找工作,虽然很重要,但和主题无关,所以就不再展开说明,如果大家要了解细节,可以看我其它相关文章。
可以这样说,找到第一份java工作,是学习java的一个关键性的里程碑,在这之前,如果光学习找不到工作,学的技能有可能是白学。在后文里,就将讲一下找到第一份工作后,如何有效且高效地继续打好java基础。
当零基础的java开发找到第一份工作后,首先需要尽快掌握用spring boot等框架开发业务的流程,其中不仅包括写代码,还包括测试,调试和排查问题等,可以说,入职3个月这段时间内,基本能打好最初级的java基础,即能成为一个合格的码农,在这个阶段,还应当掌握如下的基础知识。
1 结合项目需求,熟悉java集合的用法,即数据结构如何用在存储业务数据方面。
2 用通过命令登上linux服务器,再通过命令查看日志,如果可以,再积累分析问题和排查问题的能力,在此基础上,更可以开始熟悉mysql,redis等组件在linux上的安装和部署流程。
3 全面积累并掌握单机版spring boot的开发、测试和调试技术,这块要做到给一个需求,能很快用spring boot框架实现,出现问题,只要不是分布式方面的,可以很快通过调试看日志等手段发现并解决问题,适当掌握junit单元测试等的手法。
一般来说,java初级开发应该在半年内熟悉上述技术,最长不应该超过1年。在这个过程中,不仅应当掌握必要的java和spring boot框架等方面的技术,更要习惯在做项目时解决问题的方式。
比如遇到问题该如何通过搜索关键字来排查和解决问题,遇到自己不会的技术,如何快速通过搜索引擎熟悉,更重要的是,在被要求开发一个新的功能模块时,能快速地仿照着现有模块,改写并实现现有功能模块。做到这一点以后,其实后面的提升,只是体力活了。
初级java开发的标准是更用spring boot等框架开发增删改查的功能,用半年到1年时间做到这种程度后,更应当为升级到高级开发打下java方面的基础,这块需要哪些技术?又该怎么做?
1 凡是项目里遇到的问题,你都积极去参加,哪怕你不是熟悉,也得复盘人家的分析和解决过程,这样做个3个月,一定能快速积累经验。
2 多参与系统上线和发布的工作,这方面包含了大量搭建组件环境和排查组件问题的经验,还是这句话,刚开始不懂就先跟着学,这方面绝对也是一回生两回熟。
3 千万留心分布式方面和调优方面的事情,比如了解项目里用到哪些redis,kafka等分布式组件,结合业务看这些组件的语法和配置参数,同时学习下通过分布式组件实现高并发的技能。如果项目里遇到性能调优等方面活(比如数据库调优jvm调优或高并发调优),这种事情多参加,哪怕不归你管你也多参加,要升级到资深开发和架构,就需要打好这方面的基础。
如果做到这种程度,是否能拿高级开发或资深开发到工资我不敢说,但技术上应该是满足了资深开发的要求。这里请注意,从初级开发升级到资深开发,以及以后升级到架构师,该学什么java技术,不能人云亦云,而应当结合自己的实际,在项目开发中自己体会。
比如网上有很多系列的升级教程,这些教程中包含了足够多的技术体系,而每个技术体系里,也恨不得罗列全所有的语法和经验。这就好比服用补药,每个人的体质不同,进补的目的也不同,如果java程序员不管三七二十一,脱离自己的需求盲目地学习网上的教程,虽然不会出错,但学到的技能未必对自己的提升有直接的项目。
所以在打基础的过程中,不应缘木求鱼,定好方向,即我要应聘大厂资深开发岗,需要哪些技术,该如何学,如何准备面试?具体精准下来,无非包括如下的内容。
1 证明自己有调优和分布式组件的技能,按上文给出的做法,能通过项目找到对应的实践机会,然后针对性地看redis和dubbo组件的用法即可。
2 证明自己有数据库调优和jvm调优能力,也是老办法,项目里解决问题的实践+适当看资料。
3 很多面向资深开发的面试官,会问看似很偏的技能,比如violate或dubbo协议等,掌握这些技能的做法是,收集面试题,再找实际项目中的落脚点,这样也能高效地打好相关基础。
4 至于背题,这种不能不算基础,但仅仅属于理论基础,用几天背下就可以了。
一个java初级开发升级到高级或资深开发的时间,快则1年,慢则2年,如果2年内再升不成,那估计是方法有问题。这个过程该打好哪些基础,该怎么做?这些绝非能用短短的文字来描述,上文也仅仅是给出了方法。
再啰嗦下,在java初级开发升级到资深开发的过程中,绝不能仅仅关注项目,因为项目里未必有升级能用到的技能,也绝不能单单去看书去看面试题,更不能过于听信别人给出的技术路线。而应当先全面收集高阶职位大厂的面试题,这个是目标方向,同时尽可能地在当前你做的项目中找落脚点,如果项目里没,然后再找网上的资料看。总之第一确定技术要点,第二看这些要点是如何同项目结合的,第三再适当背题,这样不仅能高效打好java资深开发相关的基础,而且还能高效通过资深开发的相关面试。
写好java资深开发方面打基础的方法后,似乎应当继续写架构师的基础该怎么打。但本文已经洋洋洒洒写了将近4千字,而架构师打基础的方法可能和前文说的不同。为了不喧宾夺主,本文暂且告一段落。如果本文点击量高,本人会再来更新一波,写写架构师的固基之法。
这是我的公众号,其中包含了大量面试文章,同时我自己出了多本Python和Java方面的书籍,会定期在公众号里发书的电子版。请大家关注下我的公众号,谢谢了。