专栏首页bigsaijava后端学习路线建议

java后端学习路线建议

前言

  • 进入IT领域,就像进入大海—浩瀚而广阔。然而,它又很容易让人迷茫,不知所措。所以,在IT的海洋中,找好一艘船特别重要,这艘船带你前进、减少迷失。这艘船或许是一个人,或一本书,又或许是一篇文章。
  • 然而在现实的大学生活中,在我们普通院校中,其实更多的可能是忙忙碌碌,或者碌碌无为。或者就是按照课本循规蹈矩,学着一些陈旧,或者自己不喜欢的东西。到最后就是那种啥都会、啥又都不会的人。
  • 笔者为一个即将进入大四的学生,在这个领域的学生生涯也算是感触良多吧,自己算不上优秀但是也不是无所事事的那种人。在大一和大二荒废和浪费了太多时间,每每想到都会后悔上一番。希望后人能够引以为戒!

预备工作

了解IT领域

热门语言

  • 在学习一门语言,或者一门技术,你首先要先了解这门技术,这门语言在世界,在中国的市场份额。以及火热程度。有些语言渐渐暗淡。而有些语言逐渐兴起。
  • 当前比较火热的语言大致有javapythonc++、c(嵌入式)、javascript、typescript、c#、R、go、kotlin(安卓)、scala(大数据)、ruby、php、matlab、dart(flutter跨平台移动端)、swift(苹果)、objective -c(苹果)、shell脚本、lua脚本等等。
  • 选择一门语言要根据你的方向来。比如你要学习后端。那就java、python、php、c#、或node.js。如果搞安卓那肯定java、kotlin、js(混式开发)。如果大数据那肯定是java、scala最好,其次python也行。如果搞人工智能算法那肯定是python、matlab。数据分析可以考虑R、python、matlab。如果你想搞爬虫,那python肯定最好选择,当然java等其他语言都可以。如果你是竞赛ACMer。那c++肯定是你的拿手菜、也不排除部分鬼才用java哈。
  • 笔者从大众角度还是建议要熟悉掌握一门编程语言。对于作为学习的基础语言。建议从java或者c++开始。后续可以学习python。go等语言。

热门方向

  • 对于方向,虽然笼统的说有web开发、大数据、人工智能、物联网、云计算、运维、测试、网络安全等等。但是对于普同学软件的大学生来说主要的还是·前端后端运维大数据、测试这些。
  • 对于很多人说的或者当前炒的火热的人工智能、爬虫那些。我只能说很大程度那就是一个坑吧。因为大公司除了一些做搜索引擎的百度、谷歌、360他们利用爬虫+算法+存储做搜索引擎。而其他大公司他们都有自己产生的数据、他们更多致力于这些数据的处理,分析。而不是想着怎么爬。还有就是理性看待培训机构的python吹,python是很方便简单,是能干很多事情。对于鼓吹的爬虫学到后面的拓展方向。要么是扩大量分布式方向拓展。要么就是分析JavaScript各种加密。如果是安卓等app还要反编译看源码查看java代码的逻辑,以前记录的浅谈网络爬虫。而AI方向众所周知一般非985/211硕士很难找到。并且AI重要的是数学和算法,跟编程语言关系也不大。python仅仅是一个工具而已。
  • 根据方向市场大部分需求还是前端、后台、算法(要求很高)。前端和后台的需求远远超过其他的方向人员。因为所有网站的其他开发功能都要依赖于前端和后台。并且随着html5流行。web能干的事情也越来越多。这也极大的抢占了桌面应用和原生安卓、苹果应用。所以个人建议后端、前端、运维三个方向选择一个。当然。具体选择方向还是要根据兴趣来,你喜欢大数据(工程类要求不是很高,数据挖掘算法要求高),人工智能,爬虫,游戏开发,桌面开发等你都可以做。只不过再选择方向时候要尽早不要好高骛远。根据自己所在院校、自己实际水平。以及计划研究自己想要研究的。

自身定位:

你是想要进大厂,还是想进小公司呢? 对于一个普通本科生,很可能真正步入学习的时间不多。并且能够掌握的知识的广度和深度也是有限度的,还要考虑学习环境的影响。要慎重选择学习的侧重点。

  • 相进大厂,那么如果裸的只会java后端技术是不够的。在校招阶段进大厂更多知识的要求不是广度,而是深度。比如操作系统网络数据结构和算法,以及jvm,和java的基础知识需要熟练掌握。而框架和一些高级中间件需要你了解或简单应用。但是大厂就那几个,竞争压力还是比较大的。
  • 想进小公司,其实很多小公司的要求特别高,并且很多小公司干的活也多一定程度能够使得技术快速成长,也有不少人先到小公司积累技术然后跳大厂。小公司更多看中你会的技术有哪些,会那些框架,中间件而相对不太注重那些底层。
  • 如果你要就业一定要提前几个月准备面试,准备基础,进行复习,github上的javaguide力荐。

同时,也不要有心理包袱,不要认为自己是双非的大学就进不了大厂,如果学习的早,自身积累够多,够扎实,用心准备那么进大厂也是没问题的。

解决学习障碍

个人感觉在学校的学习过程中主要有两大障碍。一个是个人障碍,另一个是学校障碍。

个人障碍:

  • 不了解就业的压力。总把事情交给’明天’,以后。或者把领域看的很简单,又或者好高骛远,看不上当前所学,又不拓展新知识。
  • 还有 混日子等临近毕业补习找工作。这种就是低薪码农,和容易被淘汰的。IT的每一个技术栈都很深,都需要长期的沉淀才能变强。
  • 考研党会认为:我要考研。我要考研,我不要学这个,我要做研究。你做研究,研究生基本是算法或者底层深入的研究。有些甚至连基本知识、语法都不会,准备用宝贵的两年半去从0开始么。这里就不再吐槽了。如果想要考研的也要为自己的将来打算做铺垫。比如你想将来研究机器学习算法。你可以刷刷题提高编程思维能力,学个爬虫能够抓取一些数据。为自己以后做个铺垫

学校障碍:

这个可能有些学校好一些。但是对于我们学校的教学方案和课程。真的很想吐槽一下。虽然学习是个人的事情,但是在当前教育制度下很多学校也有无法推脱的责任。

  • 课程陈旧、冷门课程:IT发展迅速、技术更迭较快,然而很多学校课程甚至5、6年都不改。就比如我自己我们疯狂学C#,sqlserver,windowsapp(windows应用商店app),.net微软这些玩意。如果认真学习出来真的是没啥用——不迎合市场。对于这些,如果你是忠于技术的感觉还是要有所取舍。如果你要是钻研你自己的技术一直钻研下去那么你肯定会慢慢沉淀,收获很多。但是学科成绩就会降低甚至是挂科。对于其他更深的影响这里就不分析了。
  • 还有些学校 疯狂开设相关性不大的课程 比如日语,疯狂开硬件课程。确实占用大量学习时间。如果在遇到一些要求很严格的老师,真的是欲哭无泪。
  • 对于这些障碍,你要 认清自己大学期间想要收获的是什么。然后自行决定取舍。如果你是想从事技术就业,个人感觉学业成绩没那么重要、可以多关注技术,多做项目对成长、就业的好处会更大。但是对于操作系统数据结构和算法网络这些课程也是程序员内功区分的很大准则。还是要认真学习的。

浅谈学习

这里通过个人过程浅谈一些java方向学习的建议

javase部分

万岁入门难。当你敲起hello world跑起来,那其实算不上入门。论上入门应该是把Java的基础都掌握吧。javaSE是java的核心和基础。只有这块学好在后面阅读其他代码、框架才能更加轻松容易。

几点建议:

  1. 对于入门的书籍,其实还是推荐<java 从入门到精通>,内容丰富而通俗易懂。跟着书上案例敲demo就很容易入门。如果认为这本很简单,可以买一本<java编程思想>,其他的书暂时就不建议买。
  2. 对于入门的视频,其实比较多了,像网易课堂,腾讯课堂,慕课,这些在线教育平台有很多免费课程,适合入门。并且淘宝上也有很多培训机构的课程,也是相当不错。比如黑马,尚学堂,传智播客,各种可以从淘宝买的到。当然笔者之前各种也买了很多。你要想要可以关注笔者微信公众号:bigsai回复对应字段自己取就行了。
  3. 对于入门的资料,其实比较多了。基于微文章,博客等的流行,越来越多好文章涌现在stack overflower,csdn博客园掘金,今日头条,简书,微信公众号以及个人博客上,所以要充分利用搜索引擎获取资源。
  4. 对于编译器,入门建议eclipse。idea(入手需要时间)也可以。如果用idea最好先找一下idea搭建项目流程和介绍。两者编译器有些不一样。java基础学习建议eclipse。javaweb建议使用idea。不建议使用myeclipse,感觉太臃肿。

javase知识体系

  • java基础: 包过安装环境,第一个helloworld,命名规范,数据类型,运算符,控制语句和方法,数组,字符串,面向对象,异常,泛型,以及一些api 例如正则、math、大数等模块。这部分比较简单,跟着书上、视频、博客的demo跟着敲就能够理解。对于一些模块不一定需要立即完全掌握。比如Math类有很多数学计算方法,你掌握一些常用的求平方、根号可以以后用到再慢慢积累。还有正则和大数模块在入门阶段要求也不是很高。
  • java 进阶: 对于进阶部分的内容。都是java处理问题的利器!,并且都很重要。
    • io(熟练掌握):在后面javaEE开发中,或者实际项目中。很多涉及到文件传送,需要对IO的api熟练掌握,并且io的拓展也比较多有NIO,BIO等等。
    • 集合(熟练掌握):Map和List在开发过程中使用是非常多的。并且在面试中也会常问Hashmap,currentHashMap,ArrayList、LinkList相关内容。并且在写算法题,写项目时候集合也是必不可少的部分。
    • 网络编程(了解):了解socket编程,tcp/udp编程。如果喜欢网络编程或者想研究通信方面或者一些网络传输中间件要深入了解网络编程。
    • 多线程(先了解熟悉):这部分内容比较深。在入门学习可先了解熟悉,因为等java有一定基础还需要对多线程进行深入学习。因为在大型项目中会涉及到线程安全问题、同步问题。都需要多线程方面的知识。
    • 反射(先了解):反射的功能比较强大,对于很多人来说还是太难了。这部分在入门学习建议了解。如果后面有能力可以深入学习。因为当前流行的spring,mybatis很大程度是依赖反射去完成的。
    • jdbc(掌握),jdbc在jsp/servlet中关于数据库的操作几乎必不可少,这部分在javaEE会二次学习。
    • javaswing(直接跳过):java在桌面编程并没有太大优势,虽然eclipse,idea,webstrom,pycharm等众多编辑器是java开发的。但java开发桌面效率还是偏低。难度偏大。但是很多老师的课程设计会基于javaswing的管理系统。如果你想学也可以研究吧。但是个人觉得还不如多花点时间用web做一个管理系统呢。

javaEE

前言

  • 在从javaSE刚过度到javaEE的时候,笔者初期感到深入不适,甚至也停止了好久。因为对一些概念没搞清楚并且有一点畏难的思想。因此也耽误了很长时间。因为之前的javase只有java代码。而javaEE有java代码,又有啥javabean,serverlet,jsp,js/css,xml,tomcat,还有session,cookie系列名词。后面还有啥maven,框架啥的。这些没有接触的概念曾经一度阻挡自己学习。
  • 其实当你有这些问题时候,建议你两点:一就是先百度把各个名词先百度一下,先弄清楚这些玩意是干什么的。二就是建议你找个系统的视频课程或者教程跟着学习,他们会带着你一步步更新认知和了解。能够少走很多弯路。
  • 这部分还有一个很重要的就是省略得当,有些技术过时的、陈旧的不需要学或者不需要深学。比如jsp页面语法,strus2,hibernate,jsp整合javabean等等。了解就好。

jsp/servlet

  • 这部分应该是javaEE的基础部分吧。推荐这部分可以在 菜鸟教程,或者易百教程,或者较为体系化的结构可以参考。
  • 这部分感觉总要的还是cookie、session、表单处理、文件上传、文件下载、servlet3.0新特性、过滤器、监听器需要掌握。而jsp对应的内容和在jsp嵌入java代码稍微了解吧。因为现在用jsp做模板引擎的不多并且前后端分离已经成为潮流。也就是——jsp有点过时了。
  • 这部分跟着教程了解每一个特性,把每一个组件整合一下就ok,不需要利用这部分的技术做太多的项目。至于websocoket如果做web小游戏或者通讯可以研究。但市场有很多封装好的拆箱即用。

传统框架(掌握)

  • 上一代的传统框架为ssh(spring,strus2,hibernate)。但是那套体系很陈旧,很少有公司使用了。所以没必要学。现在更多的是springboot+mybatis。springboot是整合spring相关内容,使得开发减少配置,更加方便。所以还是要先学ssm,然后再springboot。
  • 对于学习顺序,笔者建议先从mybatis,然后spring,然后springmvc。然后整合spring、springmvc、mybatis。然后再学习springboot。
  • mybatis学习:除了看视频之余。推荐一位博客园的博主孤傲苍狼 写的mybatis教程,感觉写的特别棒。当然,你也可以在其他教程上学习mybatis的教程。对于mybatis半自动化ORM框架(基于jdbc封装)。写sql,封装成一个接口调用。比起jdbc方便很多,极大提高效率。
  • Spring学习:spring 主要ioc和aop。对于入门阶段要熟练掌握ioc。aop可以先放一放。个人觉得到后面有项目业务需求时候可以再学。
  • Springmvc:这部分学习可以精简得当,因为很多教程可能还是用大量model(modelAndview)。以及el表达式渲染数据。这部分如果专注个人开发可以多学一点。对于spring和springmvc。
  • ssm整合:笔者记得当初在整合ssm项目的时候是废了很大一把劲。刚开始用的myeclipse用它下载部分spring的jar包。然后整合的时候又是各种报错。然后又找各种缺失的jar包。然后又是各种版本错误。找bug。最终好容易整合到跑以来。但是这样项目不易于管理。又项目转移到IDEA.用maven管理jar包。百度很多能跑的整合方案却不多。然后到最后好不容易找到完整的跑起来。所以在学框架的时候最好就是从开学就用maven管理依赖jar包。对于如果有整合难题可以到github找ssm项目copy修改。当然你也可以关注笔者公众号:bigsai 笔者也很乐于帮助?。
  • springboot:当你学完ssm转移到springboot就很容易。只需要注意一些规范和语法。一个ssm项目充斥着大量的xml配置文件。让项目看起来非常的臃肿。而springboot配置简单。用maven管理项目。并且传统ssm配置其他中间件又要多不少xml。对于这些springboot都做了优化。对于springboot学习教程,推荐程序猿DD和battcn两位博主的个人blog。当然笔者也写过写springboot的demo放到github也欢迎参考。

进阶(尽量多了解)

  • 上述学完也只能说是后端世界的冰山一角吧。然而在后端世界还有很多知识需要掌握。比如一些中间件Nosql,MQ消息队列,Elasticsearch/solr搜索,nginx反向代理,zookeeper等。还需要掌握一些shiro/spring-security安全框架。jwt token生成框架,quarz定时,swagger2 restful接口生成等流行框架。很多中间件初用比较简单,但是深究是很复杂的,如果想要强,最好能熟练掌握一个中间件的各种应用方式和场景。比如精通redis,或es,或某个mq。
  • 在微服务方面有dubbo一套和springcloud一套。主要注重服务的拆分和治理,当前dubbo用的挺多,性能也比较好。但是遇到更新瓶颈。而springcloud兴起不久,也比较火。推荐springcloud官方教程以及方志明博主的系列教程。当然,这部分学习需要成本比较大,如果电脑内存不够几个程序下来内存就满了。没两个服务器也体验不到cloud程序的快感。
  • 当然,在java领域还有很深的水和内容。需要深入考虑的。比如mq消息丢失,elk日志处理,使用部分大数据组件,docker容器化,还有各种集群带来的问题,各种性能问题、安全问题、运维部署集成问题和各种优化。这就很大程度需要你在工作中实践真正仅一家互联网企业,开发和维护业务。以及处理高并发和各种其他原因带来的问题。你会发现原来自己是真的啥都不会(至少笔者是啥都不会)。

学习拓展

除了对于后端学习,了解或掌握一些其他技能还是很有必要的。

  • 前端:html/js/css 以及jquery,一套以上ui框框(easyui或者layui)能够熟悉使用(小全栈)。有能力可以接触vue,react等流行js。
  • 算法:各个大厂对工程师的数据结构和算法要求都挺高,建议可以刷letcode,剑指offer(牛客),pat(牛客),这些算法在面试会经常问道或者出现在笔试。喜欢的也可以刷hdu,poj增强算法思维和能力。对于刷题入门。推荐从杭电oj第11页或者pat乙级开始入门。可能刚开始刷题会遇到困难。但是刷题一方面能够锻炼思维,另一方面可以巩固java的一些语法和集合使用。当你对程序复杂度有了概念,在开发时候对你有很大帮助的,你的思考点就不仅仅是实现功能,还有效率。
  • 爬虫:当前爬虫算是一个比较火但是不太拿的上台面的一门技术。可以通过爬虫(python/java都可以)增强对接口的认识。为自己工作的反爬做做准备。并且在课余之际也可以做些有趣的东西。
  • git 当多人协同开发,git等svn是必不可少的,提前掌握git,备份代码。为开源社区做一份贡献。
  • linux 服务器基本是linux(centos和ubuntu居多),linux也是程序员必备技能。建议装个双系统(ubuntu)为日常学习使用,当然,这途中会遇到很多坑,需要自己踩。
  • 一定要注重网络,操作系统,数据结构和算法积累。

说在后面的话

推荐几个java学习的网站:

  1. 菜鸟教程、ws3chool :适合入门级和快速成型,吸收。内容相对浅显、基础。
  2. 易百教程 相比前两内容丰富性要好很多
  3. how2j一个专注java的教程。站长精心打理。强力推荐。
  4. 腾讯云开发手册,感觉不错
  5. 各个中间件、框架如Es,spring官网(中文社区)

推荐刷题网站:

  • letcode,牛客,PTA,杭电oj,poj,(cf,atcoder,vjudge有能力者考虑)

推荐IT交流社区

  • csdn,掘金,StackOverflow(境外),博客园,v2ex,开源中国,简书,头条

笔者一些建议:

  • 最好能找个学长代,鉴于学校课程很多还是偏水。找几个学长或者加一些交流群很重要。最主要是有人能够引导你一下,帮你开拓一下视野。
  • 多动手,做一些项目实践而不是空理论,但项目不要做太多,或者没一些成长性的。太多的项目也是个负担。
  • 多逛IT社区,多逛交流群,多关注一些博主公众号。增加学习途径。
  • 找一些伙伴一起学习、交流、互助,毕竟一个人还是很孤单的。不要被搞其他技术的人影响,根据自己兴趣,找到一些志趣相同的人一起成长学习。

本文分享自微信公众号 - bigsai(bigsai),作者:bigsai

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • LeetCode 04寻找两个正序数组的中位数(困难)二分法

    分析之前小吐槽一句,这题自己真的没想到O(log(m+n))的方法,只能想到O(m+n)的归并,没想到怎么去使用二分,后来看了题解也是才明白。但也算自己理解了和...

    bigsai
  • 短小精悍的多源最短路径算法—Floyd算法

    在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径。

    bigsai
  • python可视化文本分析(2)—snownlp+jieba分析QQ群成员发言情况

    第二个情感分析写出来,主要通过python实现qq群消息分析,分析群成员发言总次数,群成员情绪对比,单个群成员的发言词云状况以及单个同学的发言情感走势。 用到一...

    bigsai
  • Java整理篇(一)

    古人曰:做事要总结。对,借着古人这句话,我们总结下这一个星期,一个星期时间不长,但实际上群里积累的知识点挺多的,基本上把java基础的都过了一遍,如输入输出,...

    微笑的小小刀
  • 反射基础之Constructor

    构造器的声明包含了:名字,修饰符,参数和异常。可以通过java.lang.reflect.Constructor类获取这些信息。 下面的例子描述了如何获取构造器...

    代码拾遗
  • 房上的猫:了解java与学习java前的准备

    一.java  概述:   1.通常指完成某些事情的一种既定方式和过程   2.程序可以看做对一系列动作执行过程的描述   3.计算机按照某种顺序完成一系列指令...

    房上的猫
  • CentOS下重新安装JDK,避免OpenJDK干扰

    有的时候根据自己的需要,可能要不同版本的JDK,使用如下命令可以查看JDK版本 java -version Centos在安装的时候,自带了一个OpenJDK...

    用户1154259
  • 海量数据处理

    Mister24
  • ajax防止重复提交

    windseek
  • 跟我学系列之JVM远程监控编写(一)

    从JAVA 5开始,JDK提供了一些JVM检测的API,这就是有名的java.lang.management 包,包里提供了许多MXBean的接口类,可以很方便...

    小程故事多

扫码关注云+社区

领取腾讯云代金券