硬核,学习 Java 的一点小建议(思惟导图,建议收藏)!

CSDN 收到一条读者的私信,情真意切,因此我承诺他今天必定写篇文章好好回复他一下。先来看一下他的私信内容吧。html

首先映入个人眼帘的是这个称呼——“老前辈”,我一会儿没忍住,笑了!git

提及来也奇怪,上学的时候,同窗几乎都比我大,玩得好的基本上都是哥哥或者姐姐。就连高三时追过的一个学妹,后来得知居然比我大几个月。程序员

可这些年呢?无论是遇到的读者,仍是写博客的朋友,几乎不约而同的比我小,有上初中的,有上高中的,有读大学的,有在职的,几乎都是 90 后或者 00 后。比我年长的,还真的是百里挑一、屈指可数!github

不得不感慨,本身真的是“老前辈”了!!!!!!!!!残忍!!!!!!!!web

至于说读了个人文章后“深有感触,百般感想”,我不得不认可,这话恭维出了一股浓烈的文学家的色彩!面试

一名普普统统的中职计算机学生,即将踏进大专的计算机应用领域,极度的诚恳,袒露心声,但“坚信个人一辈子定与计算机相关”,铿锵有力,让我这个“老前辈”都有点震撼到了!算法

其实不少人学编程都会遇到困难,一开始极度的迷茫,没有方向。数据库

我上大学以前,没怎么接触过电脑。仅有的机会应该就是去网吧聊 QQ,打忍者神龟了吧!或者看某些动做电影。编程

那真的是一个蛮荒的年代。后端

上了大学后,虽然阴差阳错的选了计算机专业,但同窗们都内心门清,这是学校最不重视的专业,老师们的水平也很是堪忧,上课的时候明显感受到力不从心。

整个大学看得最多的书,就是《21 天学会 XXX》系列了,害,学的那叫一个什么玩意。

一度怀疑,大学毕业后人该何去何从?

但上帝眷顾了我,让我有幸在实习的时候进入一家外企,而且顺利经过了三次考试,没有被辞退,后来通过本身的努力居然是新人当中最快成为团队 Leader 的那一个。冥冥之中,这就成为了个人人生转折点。

往事不堪回首,有太多的内心话想要说给你们听,请牢记。

第一,无论学校的课程有多烂,必定不要挂科

不知道是从哪里传来的一句鬼话,“不挂科的大学是不精彩的。”

我大学的时候还特别喜欢这句话,因而还真挂科了好几门,最后补考应该是批卷老师手下留情,都是压着及格线过的。

我有几个同窗,大学的时候特别喜欢打魔兽,几乎成天的时光都泡了游戏当中,有些还知道收获爱情,有些可真惨,毕业的时候是一无全部,爱情没有,毕业证都没有,挂的科真的难补,老师再放水,也得本身过及格线啊。

学历虽说不能表明一切,但步入了社会,想要作一名合格的打工人,这学历是必不可少的,进工厂还必须得要求学历呢。

98五、211 的学历是学历,双非的本科也是学历,就连被看不起的大专好歹也是学历啊!

第二,本身要知道学,下劲学

成绩好,能够去好的学校,选择好的专业,成绩很差,只能将就,天然身边遇到的同窗,总体水平可能就要差一些。

若是你去的是一个很差的学校,身边的同窗都在无所事事,都在消磨时光,假如你以为既然你们都这样,那本身也这样吧,等到毕业的时候,才发现人家是叛逆,家里已经安排稳当,你就真后悔也买不到后悔药了!

我大学的同窗当中,有三个,是公认的喜欢编程的,愿意把本身培养成一名技术极客的。

当咱们都在实现简单的一对一的 Socket 和 SocketServer 通讯时,他们三个当中的一个,已经作出了多对多的聊天室模式,就像“飞秋”那样,既能发文字,还能发图片、表情,甚至文件都行!

还知道把 JDK 也打包到程序当中,直接双击人家打包好的程序就能跑起来,咱们的还得先装 JDK,再在命令行启动 SocketServer,而后再启动 Socket,才能联得通。

差距直接就拉满!

他们仨根本就无论老师的教学进度,彻底是凭借本身的爱好去学习的,他们想经过编程来改变命运。十多年过去了,他们也都实现了本身的梦想。

我说的都是真人真事。其中有两个,在个人青铜时代读者群里,有一个,在个人黑铁时代读者群里,在群里的读者均可以找到他们的头像。

第三,不知道怎么学,不知道学什么,我来告诉你

以前的叫道,这个叫术,一条龙服务。

首先,我强烈推荐你们先学一下 C 语言,先不说为何,先推荐学习工具和学习资源。

代码编辑器用 VS Code。

书的话推荐《C 程序设计语言》,我大概花了一周的时间过了一遍,颇有收获。若是指针看不懂,不要紧,能够先跳过,但像变量、算术运算符、关系运算符、逻辑运算符、赋值运算符、条件表达式、控制流、方法、传参等等,这些其余编程语言里都有,学一遍就不用学第二遍了。

视频的话推荐,推荐浙江大学翁恺教授的《程序设计入门——C语言》。

https://www.icourse163.org/course/ZJU-199001?from=searchPage#/info

能够到慕课上或者 B 站上看,慕课上有证书认证。

记住,课程里面的练习题必定要作,那但是浙江大学的练习题,无论你上什么大学,均可以直接白嫖。浙大应该能在全国排前五吧(可能不许确),总之就是能够白嫖,想一想能和浙大的同窗共用一个老师,共用一套学习资源,美滋滋。

而后,我再来讲为何要学习 C 语言。下图是我在读《深刻理解计算机系统》的时候拍的一张图,C 语言虽然是“古怪的、有缺陷的”,但同时也是一个巨大的成功。

C语言具有现代程序设计的基础要求,它的语法是不少编程语言的基础,好比说 Java。C 语言和 Java 常年霸占编程语言的前两名,都很是强。C 语言学得好,对后续操做系统、编译原理,以及 Java 的学习都是很好的基石。

若是你还处在学生阶段,必定要花时间把这门课过一下,至于指针,就像我前面说的,能够稍微了解一下,若是真的一时半会学不会,就先跳过去。

说完 C 语言,我再来推荐两门公开课,一门是哈佛大学的 CS50,一门是计算机科学速成课。这两门课我以前都有推荐过,这里再次强调,有时间必定要刷。嗯,应该说即便没有时间,也要挤出时间来刷,之后你会来感谢个人。

网易公开课(CS50):

https://open.163.com/newview/movie/free?pid=M6U6LS8CV&mid=M6U6MHDUR

计算机科学速成课:

https://www.bilibili.com/video/BV1EW411u7th

若是你下定决心,就像我这名读者同样,这一辈子都要从事于计算机专业,那就必定要看完这两门课。

接下来,就是个人拿手活了!说说大学该怎么学习 Java,从大一开始,就为校招作好准备。

国内大型的互联网公司中,阿里应该是最倚重 Java 的,因此先来看看阿里校招对 Java 研发岗的要求。

看完以后,你可能会以为,“咦,也没说具体的要求呢?”是的,大厂在校招的时候对编程语言是没有限制的。Java 的关键字就出现了一次,仍是“或许,你并不熟悉 Java 编程语言,更精通 C,C++, PHP,.NET 等编程语言中的一种或几种”,这什么鬼?

嗯,再来看百度的。

啊,你心中万分欢喜,终于他喵的出现了“熟悉 Java 编程语言”的要求。

校招不一样社招,更看重的是你的计算机基础功底和你的学习能力,并不看重编程语言自己。要知道,咱们学的是计算机科学(CS),而不是编程语言,编程语言只是工具而已。

可能不少同窗会说,你只说了阿里和百度,它们是国内互联网的杠把子,比较难,但其实若是你去查了其余公司 Java 研发岗的要求,你会发现,基本上和这两家要求的差很少,只不过深度和广度不大同样。

按照这两家的招聘要求,我来讲说具体该学哪些知识。

第1、计算机基础

1)数据结构与算法

这部分的重要性,经过阿里和百度的校招要求就能看得出来了,两家都不约而同地放在了很前面的位置。

数据结构是一种具备必定逻辑关系,在计算机中应用某种存储结构,而且封装了相应操做的数据元素集合。 它包含三方面的内容,逻辑关系、存储关系及操做。 不一样种类的数据结构适合于不一样种类的应用,而部分甚至专门用于特定的做业任务。 例如,计算机网络依赖于路由表运做,B 树高度适用于数据库的封装。

为何数据结构这么重要呢?清华大学计算机系邓俊辉教授有过这样一段描述:

数据结构是计算机科学的关键内容,也是构建高效算法的必要基础。其中涉及的知识,在相关专业的课程系统中始终处于核心位置。以 ACM/IEEE Computing Curricula(计算机教学大纲)为例,其中对于几个相关专业(计算机科学、计算机工程、信息系统、信息技术、软件工程)的共同要求中,数据结构与算法做为程序设计概念与技能的核心,紧随在数学以后,排在第二位。

算法就更不用说了,大厂的面试题都考,必须玩得 66 的,ACM 的题,或者 LeetCode 的题目,必须刷到本身都感受废了的地步他喵的,BAT 大佬的这份刷题笔记太强了!

大学阶段,最好能参加点算法比赛,能拿奖就更好了,加分项!加分项!加分项!重要的事情说三遍。

2)计算机操做系统

编译原理、操做系统、图形学被称为程序员的三大浪漫,因此可想而知,操做系统对计算机而言有多么重要。工做当中的不少疑难杂症都和操做系统密不可分,好比说:

  • 内存为何会泄露
  • 文件为何会打不开
  • 服务进程为何会宕掉
  • 网络服务为何会掉线

除此以外,在进行服务端高性能编程的时候,也常常会用到内存、进程、线程、IO 相关的知识。能够说学好操做系统,能直接解决在工做当中遇到的不少问题。另外,操做系统也是面试考察的一个重点,好比说:

3)计算机网络

对于 Java 研发岗来讲,面试当中被问到的计算机网络知识可能比计算机操做系统还要多,好比说:

计算机网络这部分知识怎么学?推荐斯坦福大学的 CS144 课程,我大体看了一下,课程讲的还能够,里面 Lab 也很棒,有时间的同窗能够跟着学一下。另外就是《计算机网络:自顶向下方法》这本书,值得啃一啃。

4)设计模式

若是你感受本身代码写得比较烂,缘由可能有两个。其一,多是刚入门,代码写得少,若是咱们满打满算只写过一两千行代码,是不可能写出多优雅的代码的。其二,可能不懂设计模式,设计模式是软件设计中常见问题的典型解决方案,它们就像能根据需求进行调整的预制蓝图, 可用于解决代码中反复出现的设计问题,若是不懂设计模式的话,遇到这些问题就只能抓瞎了。

对于面试而言,不必 23 种设计模式都要倒背如流,最好是结合项目能说出几个经常使用的,好比说单例、工厂、简单工厂、建造者这些。

2、编程语言

虽然阿里和百度的校招要求里面没有特别强调编程语言这一块,但若是你误觉得这部份内容彻底不重要的话,可能就真的走偏了。对于校招,编程语言基础和计算机基础是同等重要的。

由于无论你学操做系统,仍是学设计模式,或者刷算法题,总归是逃不过编程语言这一关的,代码毕竟仍是要用编程语言来敲的。

在此以前,你已经学过了 C 语言,那么再学习 Java 就会轻松不少。拿 Java 中的 String 来讲,C 语言里面是没有的,但 String 的底层结构是字符数组,这和 C 语言里面的 char 型字符数组是彻底同样的。再好比说,Java 中引用的概念,和 C 语言中的指针概念是有必定的类似性的;还有,理解了 C 语言的方法传参为何是经过值传递的,也就很容易明白为何 Java 只有值传递没有引用传递。

你们能够先看看我以前整理的这份 GitHub 上星标 115k+ 的 Java 教程,里面涵盖了 Java 全部的知识点,包括 Java 语法、Java 集合框架、Java IO、Java 并发编程和 Java 虚拟机,内容很少,只讲重点。

超级硬核,GitHub 上标星 115k+ 的 Java 教程,详细介绍!

Java 中的知识体系能够分为 5 大块:

提一嘴,Java 语言基础的部分,也能够看我一直在连载的《教妹学Java》,通俗易懂,风趣幽默,目前已经更新 40 篇,目录以下

对于 Spring 来讲,要能理解 AOP 和 IOC 这两个重要的概念;对于 SpringMVC,要能理清处理请求的流程;对于 MyBatis,要能掌握分页、延迟加载。

因为 Spring 的快速发展,它逐渐从一个轻量级的开发框架变成了一个“庞然大物”,愈来愈笨重,致使搭建一个应用程序的成本愈来愈高,因而 Spring Boot 就应运而生了,它只须要不多的配置就能够搭建出一个独立应用。Spring Cloud 利用 Spring Boot 的开发便利性,巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等。

3、数据库

SQL:CRUD 的核心就是利用 SQL 语句进行数据的增删改查,因此基础的 SQL 语句必定要熟,不要轻视。

MySQL:MySQL 是目前互联网公司用得最多的数据库,若是要选择一个数据库进行学习的话,建议学习 MySQL,要能掌握:索引、事务、锁、存储引擎、主从复制、分库分表等知识。推荐看MySQL Tutorial这个英文网站教程来系统的学习 MySQL。

Redis:因为数据量愈来愈庞大,为了减轻数据库的压力,通常都会使用 Redis 做为缓存,因此 Java 工程师必定要能掌握 Redis 的基本数据类型和持久化方式,还要能理解缓存与数据库一致性的问题,对缓存穿透和缓存雪崩也要有所了解。

4、微服务/分布式

消息队列:消息队列是分布式系统中重要的组成部分,当不须要当即获取结果,但并发量又须要进行控制的时候,消息队列就派上用场了。目前主流的消息队列有 RabbitMQ、Kafka 等。须要掌握的知识点有:

注册中心:注册中心本质上是为了解耦服务提供者和服务消费者,Zoopkeeper 在国内很长一段时间都是注册中心的一哥。

分布式框架:目前的主流就是 Dubbo 和 Spring Cloud,虽然咱们常常拿它们两个作比较,但Dubbo 负责人曾说,Dubbo 将来的定位并非要成为一个微服务的全面解决方案,而是专一在 RPC 领域,成为微服务生态体系中的一个重要组件。

分布式不是校招的必选项,若是你在这块不是很擅长的话,尽可能不要在简历上突出,省得面试的时候面试官缠住分布式这块不放手,毕竟校招偏重的是基础,分布式懂一些就好,能够作一些练手项目,做为加分项便可。

5、工具

Intellij IDEA:建议直接上手 Intellij IDEA,用熟练后你会爱不释手的。

Git:版本控制系统很是重要!!!!!!即使你只是一我的在编码,它也能够帮助你建立项目的快照、记录每一个改动、建立不一样的分支等等。若是你参与的是多人协做,它更是一个无价之宝,你不只能够看到别人对代码的修改,还能够同时解决因为并行开发带来的冲突。版本控制系统有不少,其中最突出的表明就是 Git。

Maven/Gradle:所谓的项目构建指的是完成工程发布流程须要的一系列步骤,包括编译、测试、打包、部署等,Maven/Gradle 是目前最流行的两款项目构建工具。

Docker:从 2013 年发布至今, Docker 一直广受瞩目,被认为可能会改变软件行业,它将应用程序与该程序的依赖,打包在一个文件里面。只要运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行同样,这样就不用再担忧环境问题了。

6、实战项目

大学阶段,重视计算机基础的同时,必定要拉出来一个项目本身亲手体验一把,不要纠结这个项目多少人作过,你要作的是经过这个项目来巩固本身学过的那些基础知识。俗话说,“光看不练假把戏”,我要说的是“光学不练假把戏”,看似学会了不少知识,一上手本身就抓瞎,这是不少人容易犯的毛病。说白了,就是动手能力差。

我这里给你推荐一些牛逼的 Java 练手项目,文档都很是全面,很是适合自学。

1)电商秒杀

SpringBoot 完整电商系统 Mall:包括前台商城系统及后台管理系统,基于 SpringBoot+MyBatis 实现。

miaosha:秒杀系统设计与实现。

2)博客论坛

vhr:微人事是一个先后端分离的人力资源管理系统,项目采用 SpringBoot+Vue 开发。

halo([ˈheɪloʊ],意为光环,也能够当成拼音读(哈喽)):一个优秀的开源博客发布应用。

这些项目都很是适合做为练手项目。像 vhr,我是贡献者之一,目前有 20k+ star 了。

大学时光说短不短,说长不长,做为“老前辈”,真的是感受一眨眼就过去了;对于正在读(或者将要读)大学的学弟学妹们来讲,正是青春的好时光,有不少事情要作,忙着社交,忙着拓展,忙着锻炼,忙着课业,忙着恋爱,忙不得开交。

但最须要忙的一件事,就是别忘了忙学习,别忘了忙刷题。像算法,基本上大厂是必考的,因此不要产生厌恶的情绪,该刷仍是要刷啊!你不刷,天然岗位就给别人了,多难受。LeetCode 和牛客网上均可以刷题,若是以为本身没有解题思路的话,能够看看老前辈的刷题心得刷完 300 道 LeetCode 题后,我飘了!

以上,就是“老前辈”个人一点小建议!建议收藏!