硬核!如何全面系统地自学Java
大家好,我是沉默王二。
我今年 XX 岁(调皮),使用 Java 开发将近 15 年了,目前虽然不在技术一线,但仍然和 Java 形影相伴,如影随形,每天都在相爱相杀。
虽然我是科班出身,但说实话,十多年走过来,无论是 Java 语言本身,还是它配套的工具和框架都发生了巨大的变化。我自己也是一路学习新的知识,一路丢掉废旧的知识。
现在回头来看,发现自己也走了不少弯路,浪费了不少时间,真的是既遗憾又叹息!
关注我的读者当中应该有很大一部分是 Java 初学者,因为是初学,所以面临着巨大的压力,不能付出太高的试错成本。而应该寻找一条更高效的学习路线和一套行之有效的学习方法,否则一不小心,很可能会前功尽弃。
但好在 Java 的学习资料非常丰富,只要我们稍微用心去整理下,就能找出一条高效的学习路径。过去这两年里,我不断地整理自己的思路,分享了不少关于 Java 方面的文章,但都过于分散,借这个机会,我打算重新梳理一遍,希望能对大家的学习有所帮助。
01、学习 Java 之前先学 C
自学 Java 并不容易,尤其是对于非科班的同学来说。所以我强烈的推荐大家在学习 Java 这门编程语言之前,先学一下 C 语言。如果没有 C 语言作为基础的话,在初学 Java 的阶段会莫名的心慌。
我上大学的时候,一上来就学的 Java,并且教材是《Java 编程思想》,真的,就感觉给看天书一样。班里面有 80% 的人都在毕业的时候放弃了编程,很可悲的一件事,不是说 Java 这门编程语言不好,而是我们底子太差,都是第一次接触编程,难度可想而知。
编程语言都是相通的,C 语言作为 Java 语言的母胎,还是非常值得去学习一下打打基础的。其实对于我们程序员来说,学的是计算机科学,而不是编程语言,语言只是工具,没有优劣。像我,就学过 Java、C 语言、Ruby、JavaScript 等等这些编程语言,他们之间确实有很多相似之处。如果学过 JavaScript,能很容易搞懂 Java 的 Lambda 表达式
C 语言的特殊性就在于它可能是唯一一门最适合来学习一系列计算机基础的媒介,比如 Linux 操作系统,就是用 C 语言重构的;比如计算机网络,里面有很多网络协议,有不同的 header 定义,这些字段用 C 语言的 union 和 struct 来操作非常便捷。Java 中虽然剔除了指针这种烦人的东西,但说白了,引用其实和指针差不多,理解了 C 语言中的指针,就能很好的理解 Java 中的引用。
当然了,由于 C 语言的抽象程度更高,学起来也需要花费一番功夫。对于初学者来说,我推荐大家先看一下翁恺教授的 C 语言程序设计。
B 站地址:https://www.bilibili.com/video/BV19W411B7w1
喜欢看书的同学我只推荐一本,《C Primer Plus》,可以说是学习 C 语言的圣经。豆瓣评分高达 9.1 分,包括数据类型、格式化输入输出、运算符、表达式、流程控制语句、函数、数组和指针、字符串操作、内存管理、位操作等等这些基础知识都全部讲解到了,非常适合系统学习 C 语言的读者。
在学习的过程中切记一点,就是一定要多练多练多练,这一点不仅适合学习 C语言,也适合学习 Java 语言。有句话说得好呀,看懂了+上万行代码=学会了。无论是看视频学习,还是看书学习,最怕的就是眼高手低,以为自己看懂了,实际上呢,离学会了还差上万行代码。
一开始学习会很痛苦,我也不例外,直接开干 Java 的时候,简直就觉得自己不是块学编程的料,有想过转别的专业,比如说机械自动化,可惜考试成绩太差,没转成。等到敲的代码越来越多,慢慢的就开窍了,开窍了以后,学习依然会痛苦,但再也没有那种放弃的念头了。
有了 C 语言的基础,再学 Java 就容易多了!
PS:对于初学者来说,起步会很难,甚至不知道该用什么软件来编写代码。我已经提前为大家踩过坑了,强烈推荐 VS Code,颜值高、占内存小、插件丰富、简单易用。
02、学习 Java 之前要安装的软件
工欲善其事必先利其器,战斗之前我们要先配备好武器。
JDK 是 Java Development ToolKit 的简称,也就是 Java 开发工具包。JDK 是整个 Java 的核心,包括 Java 运行环境(Java Runtime Envirnment,简称 JRE),Java 工具(比如 javac、java、javap 等等),以及 Java 基础类库(比如 rt.jar),学习 Java 之前必须要安装。
已经 2021 年了,真没必要在记事本上敲代码了。反正我遇到过太多的课程,包括我上大学的时候,老师一而再再而三的强调,一定要用记事本敲出来第一个程序,并且在命令行里成功运行起来。
这么多年下来,我觉得这个建议真的是糟糕极了。记事本和命令行,怎么能让初学者上手呢?最起码也得是个老江湖才行啊!当年我就差点被记事本和命令行劝退。
Intellij IDEA,不用说,是编写 Java 程序的最佳 IDE,必须得掌握。初次使用的话,建议阅读一下《IntelliJ IDEA 简体中文专题教程》,GitHub 上已开源。
https://github.com/judasn/IntelliJ-IDEA-Tutorial
Maven 是一个项目管理和自动化构建工具,基于项目对象模型(POM)的概念,可以管理项目的构建、报告以及文档。作为 Apache 组织中的一个颇为成功的开源项目,Maven 主要服务于基于 Java 的项目构建、依赖管理和项目信息管理。有了 Maven 以后,第三方类库管理起来就舒服多了。
Maven 安装起来很简单,之间看官方的文档就行了,如果还想进一步深入,推荐大家看一下《Maven 实战》这本书,不用细看,大致过一遍就行了。
我推荐大家使用 GitHub 来作为私有的代码仓库,特别方便,免费还可以云同步。我之前针对新手专门写过一个教程,需要的同学可以点击当前链接去上手体验一下。对 Git 命令比较抗拒的话,可以通过 GitHub 桌面版来傻瓜式地操作。
顺带把 MySQL 也安装一下吧,毕竟学习一门编程语言,如果不去操作下数据的话,就感觉这门编程语言空有皮囊却没有灵魂。推荐大家看一本书《MySQL 必知必会》,很薄的一本小册子,慢的话,一周就可以看完,快的话一天就能搞定。
这一套软件安装完成后,基本上开发 Java 的必备工具就齐活了。接下来,就可以放心大胆的进入 Java 的世界了。
03、Java 学习的重点是什么
“冰冻三尺非一日之寒”,要想把 Java 学好,当然需要花费很长一段时间,而 Java 所涵盖的知识点可以说太平洋都装不下。来上一张劝退的思维导图,罗列一下 Java 所涉及到的知识点,一是镇楼,二是让大家感受一下 Java 这门编程语言的魅力,为什么岗位多,为什么高薪,道理其实很简单,它的应用场景实在是其他编程语言不能媲美的。
Java 语言的知识点非常多,而我们又时间紧迫,意味着只能挑重点、挑实用,不能面面俱到,一些不常用的知识点就只好假装已经学会了,用到的时候再去学也跟得上。总之一句话:“好钢用在刀刃上”。
入门书的话,我推荐两本,一本《Java 核心技术卷》,一本《Head First Java》。
《Java 核心技术卷》分为上下两册,上册的难度较低,可以在最短时间内刷完,尤其是有了 C语言的编程基础后,再刷这本书可以说是手到擒来。下册涉及到的内容有流与文件(☆)、XML、网络(☆)、数据库编程、国际化、Swing、AWT、JavaBean、安全(☆)、脚本编译和注解处理、分布式对象、本地方法(☆),没有标星的内容我认为可以略过。
《Head First Java》更有趣一些,里面有很多小游戏,很活泼的一本书。
两本书之间的风格差别比较大,之前就有读者给我反馈说,《Head First Java》有点驾驭不了,那就挑《Java 核心技术卷》。
刷完任意一本书后,可以看一看《Java 编程思想》,看自己是否能驾驭得了。因为思想的东西嘛,只有经过一些实践后才能有所感悟,否则就像王阳明一开始对着竹子格物一样,屁也格不出来,有了后面领军作战的经验,以及到地方上体验艰苦生活的感受后就开创了心学。
上面提到的这三本书里面都还保留了图形程序设计的内容(AWT 和 Swing),我认为是完全可以跳过的,希望后面出版社再版的时候能把这些内容全部删除,定价估计就降了,但他们不一定会这么干。
Java 是一门面向对象的编程语言,所以三大特性:封装、继承、多态是必须要掌握的,然后是异常处理、IO、集合和并发编程。只要这些内容掌握了,可以说 Java 的基础知识就全部掌握了。
这其中的难点是并发编程,我并没有把这部分放到思维导图中,显然这部分内容学起来并不容易,但却最能考验一名 Java 后端工程师的功底了。
并发编程这部分怎么学呢?我推荐另外一本非常牛逼的开源电子书《深入浅出 Java 多线程》来作为辅助和进阶,几位阿里朋友写的,质量非常高,我在很早之前推荐过,可以点击当前链接下载离线版。
因为是自学,所以强烈建议大家把书本上的代码都敲一遍,尤其是在初学阶段。由于不像工作后,有大量的项目可以实践,所以不能得到及时的反馈,记笔记就显得特别的重要。另外,一定要分门别类保存好自己的 demo,以便以后可以快速得找得到,尤其是一些小套路,会很有用,积累得多了,可能就变成了自己的工具库。
一定要善待自己写过的那些小 demo,尤其是那些已经调通的,千万不要扔,没准哪一天能帮上大忙。以我的经验,在学习的过程中,尽管某些知识点在当时理解的多么透彻,但只要时间一长,或者换个开发环境,可能就完蛋,明明感觉代码是一样的,但就是运行不起来。如果手头恰好有这么一个 demo,打开参考一下,甚至拷贝过来试一下,问题就会迎刃而解。
部分内容参考自我的偶像沈世钧老师,大家可以通过链接进入他的知乎主页看一看,绝壁是个宝藏。https://www.zhihu.com/people/zhang-xu-guang-21
大部分 Java 程序员都要从事 JavaWeb 的相关开发工作,要开发 JavaWeb,自然就离不开 Spring 的系列框架。甚至可以这么说,没有 Spring 的 Java 项目是不存在的。Spring 框架正在变得越来越庞大,但核心的概念仍然是 IOC 和 AOP,也就是控制反转和面向切面编程。这个两个概念对于初学者来说,学习曲线有点陡峭。我来说说 IOC 吧。
在我们编码的过程中,通常都需要两个或者更多的类通过彼此的合作来实现业务逻辑,也就是说,某个对象需要获取与其合作对象的引用,如果这个获取的过程需要自己实现,代码的耦合度就会高,维护起来的成本就比较高。假如老王是少林寺的主持,他想让小二和尚去扫达摩院的地,代码可以这样实现。
class Xiaoer {
public void saodi() {
System.out.println("小二我在扫达摩院的地");
}
}
class Laowang {
public void mingling() {
new Xiaoer().saodi();
}
}
class Test {
public static void main(String[] args) {
Laowang laowang = new Laowang();
laowang.mingling();
}
}
Laowang 类的 mingling 方法中使用 new 关键字创建了一个 Xiaoer 类的对象——这种代码的耦合度就很高,维护起来的成本就很高,为什么这么说呢?某一天,达摩院的地又脏了,老王主持想起了小二和尚,可小二和尚去练易筋经了,让谁去扫地呢,老王主持想起了小三和尚,于是 Laowang 类就不得不重新下一个新的命令,于是代码变成了这样:
class Xiaosan {
public void saodi() {
System.out.println("小三我在扫达摩院的地");
}
}
class Laowang {
public void mingling() {
new Xiaoer().saodi();
}
public void mingling1() {
new Xiaosan().saodi();
}
}
假如小三和尚去挑水了,老王主持没准要下命令给小四和尚去扫达摩院的地。这样下去的话,Laowang 这个类会疯掉的。老王主持觉得自己堂堂一届高僧,下个扫地的命令竟然这样麻烦,他觉得很不爽。我们得替老王主持想个办法对不对?
不如把这个扫地的差事交给老王的师弟老方吧,老方负责去叫小二和尚还是小三和尚还是小四和尚去执行老王主持的命令。
public interface Heshang {
void saodi();
}
class Xiaoer implements Heshang {
@Override
public void saodi() {
System.out.println("小二我在扫达摩院的地");
}
public boolean isYijinjing() {
// 星期三的时候小二和尚要练易筋经
return false;
}
}
class Xiaosan implements Heshang {
@Override
public void saodi() {
System.out.println("小三我在扫达摩院的地");
}
}
class Laofang {
public static Heshang getSaodiseng() {
Xiaoer xiaoer = new Xiaoer();
if (xiaoer.isYijinjing()) {
return new Xiaosan();
}
return xiaoer;
}
}
class Laowang {
public void mingling() {
Laofang.getSaodiseng().saodi();
}
}
如果老方确认小二和尚在练易筋经,就叫小三和尚。老王现在是不是省心多了,他只管下命令,该叫谁去扫达摩院的地由他师弟老方去负责。
我们替老王想的这个办法就叫控制反转(Inversion of Control,缩写为 IoC),它不是一种技术,而是一种思想——指导我们设计出松耦合的程序。控制反转从词义上可以拆分为“控制”和“反转”,说到控制,就必须找出主语和宾语,谁控制了谁;说到反转,就必须知道正转是什么。你看,在紧耦合的情况下,老王下命令的时候自己要通过 new 关键字创建依赖的对象(小二和尚或者小三和尚);而控制反转后,老王要找的扫地和尚由他师弟老方负责,也就是说控制权交给了老方,是不是反转了呢?
至于 AOP 的话,就留给大家在以后的学习当中去理解吧。掌握了这 IOC 和 AOP 这两个概念,再把 Spring MVC 学会,再学习其他的,比如说 Spring Boot 就会平滑很多。
要学习 Spring,能读的书不多,我能想到的只有《Spring实战》,坦白地说,这本书很一般,但市面上比它好的书,我还不知道。
学完 Spring,就要学 SpringMVC,推荐大家看松哥的视频,在 B 站上虽然播放量不是特别大,但我觉得内容特别棒——毕竟好兄弟!视频地址我贴一下。
https://www.bilibili.com/video/BV1qp4y1n7D1
然后是 MyBatis,不用找书看了,直接看官方文档就行,讲得特别好。本身 MyBatis 也没有特别难的东西,就是一些 XML 配置和动态 SQL。
Spring+SpringMVC+MyBatis 这三个框架学完,可以说你就具备了开发企业级应用的能力了。
至于 Spring Boot,我推荐看大哥纯洁的微笑的博客,访问量在千万级别以上,影响了无数的初学者,我个人强烈推荐。地址就不用我贴了,直接搜“Spring Boot”这个关键字应该就可以看到他的博客地址。
简单解释下 Spring Boot 是什么。
Spring Boot 是由 Pivotal 团队提供的一个全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。说句人话就是,Spring Boot 不是什么新的框架,它默认配置了很多框架的使用方式,就像 Maven 整合了所有的 Jar 包,Spring Boot 整合了所有的框架。
反正有了 Spring Boot 后,我们要搭建一个 Web 项目,基本上变得轻而易举了,不像以前还得配置 web.xml,加载 Spring 和 SpringMVC,配置数据库链接池、配置 Spring 事务,配置日志文件,部署 Tomcat 运行 Web 项目等等。
如果说你已经掌握了 Spring、SpringMVC、MyBatis、Spring Boot 等内容,就有能力进行一些真正有用的应用项目开发了,比如说学生管理系统、商城系统、博客系统、秒杀系统等等。
如果你觉得这些系统无从下手的话,其实可以到 GitHub 或者码云上去找,很快就能找到一大堆。为了节省大家的时间,我直接给大家推荐两个。
vhr(微人事),一个前后端分离的人力资源管理系统,采用 Spring Boot 和 Vue 开发,松哥出品,鉴于我和松哥铁到差点睡一张床的原因,他赠送了我一个贡献者的荣誉——唯一一个哟。
https://github.com/lenve/vhr
mall,一套电商系统,好朋友宏哥的,相比 vhr,上手难度会大一些。但几乎囊括一个 Java 后端工程师所需要掌握的一切技术,比如说 SpringBoot、MyBatis、SpringSecurity、Elasticsearch、RabbitMQ、Redis、MongoDB、Nginx、Docker、Druid、Lombok、Swagger 等等。
https://github.com/macrozheng/mall
当然了,要做完整的 Java Web 项目,前端的一些知识肯定是少不了的,但不能放太多心思,界面丑点无所谓,重点在 Java 上面。
学习编程就是一个由混沌到有序的过程,如果碰到了理解不了的知识,不要怀疑自己适不适合编程,跳过就行了,这是再正常不过的事了——必须抱有一颗越挫越勇的心,我到现在还有很多 Java 的知识点没搞懂呢,遇到了再说。不要着急,很多知识点都可以放到工作以后边用边学。
04、哪些 Java 知识不需要再学了
张无忌在学太极拳的时候,他爹的师父张三丰老爷爷就对他喊一定要把之前所学习的武功全部忘掉,**忘得越多就会学得越快。**同样的,自学 Java 的时候一定要先知道哪些 Java 知识不需要再学了,毕竟技术的更新迭代就好像火箭一样快,Java 的一些知识点早已经过时了。如果不懂得断舍离,那学起来就不免太痛苦了。
1)AWT 和 Swing
真不知道为什么,我之前推荐的那些入门书里还在介绍 AWT 和 Swing,这就好像不知道大清朝早已经亡了几百年一样。已经 2021 年了,谁还会用 AWT 和 Swing 去开发桌面应用呢?有人说是为了学习事件驱动,可拉倒吧,冠冕堂皇的理由呀!
就我所知,C++ 程序员会用 MFC,C# 程序员会用 Winform 和 WPF。甚至还可以用一种更时髦的技术(比如 Electron)把 Web 网页裹一层华丽的外衣,变成可执行文件。
2)Applet
作为网页插件技术,Applet 压根就没流行起来。2010 年我在日企的时候用的 Flex 作为富客户端,浏览器要 Adobe Flash Player 插件,否则就无法运行,马上也要淘汰了。
3)XML
XML 还没有被淘汰,应用的地方还有不少,比如说 Maven 的 pom.xml 文件里就还在用。但是作为一种数据传输格式,它正在被 JSON 替代。至于复杂的 XML 操作 API(例如 XPath)就完全没必要学习了,如果真的用到了,再去补也不迟。
4)JDBC
我个人不建议再学习偏底层的 JDBC 了,尤其是对于时间宝贵的自学程序员来说。与其花这点时间,不如把精力投入到 MyBatis 的学习上。当然了,如果真的有时间,真的想打基础,研究一下也无可厚非。
5)Struts
Struts 是早年一个优秀的 MVC 框架,单从技术的角度来看,还是蛮不错的。但是自从有了 SpringMVC 后,Struts 就被拍死在沙滩上了。
6)Hibernate
在我刚参加工作那会(2010 年的时候),持久层框架用的正是 Hibernate。但时过境迁,Hibernate 太重量级了,学习成本太高,取而代之的是轻量级的 MyBatis。现在有一种说法就是这种对象关系映射太过死板了,不如直接写 SQL 来得灵活,像我很喜欢的一个轻量级框架 JFinal 就更偏重于在 Java 代码中写 SQL,而不像 MyBatis 和 Hibernate 在 xml 文件中写。
7)JSP
JSP 在实际开发中,主要是作为 MVC 模型中的V(View)层出现的。它本来是为 Java 后端程序员开发前端界面而生的,但随着技术的发展,前后端分离的流行,JSP 的生命周期已经到头了。
8)Servlet
虽然 SpringMVC 的底层是以 Servlet 为基础的,是 JavaWeb 容器的基石,但 Servlet 的确已经过时了。如果后面有空余时间的话,想钻的话可以钻一下,对服务器端接收请求数据和向前端发送响应数据时会有一些帮助。
我这样的说法可能不够可观,不够顾及底层知识,但自学的时间成本还是要适当控制一下。总之,我们应该省下更多的时间去学习前面小节提到的重点知识!
05、学习 Java 还需要补充哪些知识
这部分内容我之前梳理过。但为了这篇文章的完整性,重新搬运过来并做了一些内容上的优化。看过的同学就假装重新复习一遍,没看过的同学准备好收藏了!
1)数据结构与算法
毫无疑问,数据结构对一名程序员来说非常重要,还是那句话程序=数据结构+算法
,这种说法无论放在什么时候都是成立的。
大部分的数据结构课程,关注的重点都在如何从数学上实现一个数据结构,但在实际开发中,大部分主流语言都已经内置了常见的数据结构,比如说 Java。也就是说,对于大部分程序员来说,实际开发中,很难有需求要从零开始实现一个数据结构。因此我们只需要做到下面几点。
1、熟悉常见数据结构的概念,比如说数组、堆栈、链表、哈希表等。
2、了解常用数据结构之间的差异,比如说 ArrayList 和 LinkedList,我在之前的文章中有详细说明过,可以点击链接去查看下。
3、关注常用数据结构的外围算法,比如说如何对 List 和 Map 进行查找。
4、关注数据结构使用中容易出错的地方,比如说线程是否安全等。
...
B 站上浙江大学的一个数据结构的课还不错,很系统很经典,适合小白入门。视频地址如下:
https://www.bilibili.com/video/BV1JW411i731
以我接触的领域来说,大部分普通的业务系统都不会涉及到太复杂的算法,因此我没有在算法上投入过多时间。但如果你将来要从事一些特殊的领域,如果算法跟不上,可以说是“寸步难行”,比如说图形处理领域,无论是图像的变化还是增强,无一例外都要用到矩阵变换,因此就必然涉及到线性代数的内容,再往深处学的话,必然会牵扯出更多的知识。
所以学习算法要视情况而定,如果想走算法岗,那么《算法第4版》、《算法导论》、《数学之美》、《编程珠玑》、《剑指offer》这些书都要耐着性子啃一啃。
如果想进大厂,或者对算法有着强烈的兴趣,可以到 GitHub 上看一看 labuladong 的算法小抄,这个仓库我也看了,总共 60 多篇原创文章,都是基于 LeetCode 的题目,涵盖了所有题型和技巧,而且做到了举一反三、通俗易懂,绝不是简单的代码堆砌。离线版可以点击链接下载。
2)设计模式
我认为设计模式是初中级程序员迈向高级程序员的必经之路。有不少程序员,前期冲劲十足,但后继乏力,都是吃了设计模式的亏。在工作的前几年,大部分程序员都处于熟悉编程语言的阶段,也就是处于“技”的阶段,随后就要进入“术”的阶段了。在编程领域,“术”的典型代表就是“设计模式”。
我自己推荐的一本书是《设计模式之禅》,代码是用 Java 实现的,读起来比较轻松,也更符合国内程序员的阅读习惯。另外就是我上次推荐的 Refactoring Guru 网站,里面附带的图片非常精美,阅读起来的视觉效果会比较丰富。
在线阅读地址如下所示:
https://refactoring.guru
离线版可以通过下面这个链接下载(无套路,不需要解压密码):
3)JVM 和源码
JVM 是相对难吃透的一个环节,但却十分的重要,尤其是在遇到一些性能瓶颈的时候。初学者很难搞懂,所以我希望大家能在储备了大量的实战经验后再来深入的理解 Java 虚拟机。
JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需要生成在 Java 虚拟机上能运行的目标代码,也就是字节码,就可以实现跨平台的诉求了。JVM 学得通透的话,可以说是非常牛逼的程序员了。
推荐一本书,就是周志明老师的《深入理解 Java 虚拟机》。推荐一个视频,尚硅谷宋红康老师讲解的,地址如下:
https://www.bilibili.com/video/av83622425
面试的时候,面试官都特别喜欢问一些源码方面的知识,比如说 HashMap 的一些经典问题,加载因子为什么是 0.75?哈希冲突的时候,HashMap 是如何查找并确认元素的等等,这些问题只有通过源码才能得出比较准确的回答,对吧?
我有个同学说过一句话,给我的印象特别深刻,就是“有啥解决不了的?只要你肯阅读源码。”说起来源码,我是不太建议新手去阅读,容易劝退。不信,你让一个小学生去读一下《百年孤独》,我保证他会从此对阅读失去兴趣。等有了一些编程经验后,再去阅读源码,就会有很大的收获。
羊哥出过一个视频,详细地介绍了如何阅读 JDK 源码,推荐给大家。地址如下:
https://www.bilibili.com/video/BV1V7411U78L
4)操作系统、计算机组成原理和计算机网络
为什么要学习操作系统呢?第一,面试要考;第二,无论学习哪门子编程语言,比如说 Java、C/C++,都需要和操作系统打交道,像 Java 中的多线程技术,其实是由操作系统来负责进程和线程管理的;第三,学习操作系统,还能学到内存分配方面的知识。
我推荐清华大学的《操作系统》课,虽然清华大学的校门进不去,清华大学的视频课还是可以白嫖的嘛。地址如下:
https://www.bilibili.com/video/BV1js411b7vg
众所周知,计算机是由 CPU、内存、显示器这些设备组成的硬件,但我们大学毕业后,往往从事的是软件方面的开发工作。那怎样才能在硬件和软件之间自由穿梭呢?答案就是学好计算机组成原理。弄明白了计算机的组成原理,也就对整个软件开发有了一个系统的认知,不论是计算机的硬件原理,还是软件架构,都能很好的驾驭,随之而来的,我们的职业发展机会也就更多了。
如果想深入学习计算机组成原理的话,我推荐哈工大的这门视频课,整体评价非常高。地址如下:
https://www.bilibili.com/video/BV1WW411Q7PF
当今这个时代,没有网络简直无法生存,哪怕是在电梯里的一分钟,我都受不了那种手机没有网络的状态。我们所学的编程知识,如果脱离了网络,将变得毫无意义,因为没有哪个编程语言是要在单机环境下运行的。
计算机网络方面的视频我推荐湖科大教书匠的《计算机网络微课堂》,制作得非常用心,是一部不可多得的佳作。
https://www.bilibili.com/video/BV1c4411d7jb
这部分不推荐大家看书,比较枯燥,不如直接刷视频来得直接。
5)项目管理与架构
实现一个软件系统的过程,不仅只有编码,还涉及到项目安排,团队协调等一系列非技术因素,如果想从一名程序员走向管理岗,成为 team leader 或者开发经理,软件工程方面的知识就必须得跟得上。
这里我推荐几本不错的经典书,其中有一本邹欣老师的书,他刚出任 CSDN 副总裁,希望 CSDN 能在他的入驻后变得更好一些。他这本书的书名叫做《构建之法》,我看过,还是很不错的。另外还有两本必读,就是《人月神话》和《人件》,虽然有了岁月的痕迹,但依然值得深读。当然,关于软件工程,最好的学习方法是观察,观察你所在的团队是如何处理工程问题的,然后思考,最终形成自己的方法观。
要想写出一个好而美的程序,需要经过三个阶段。
第一阶段,有扎实的基本功,简单点说,就是要做到语法熟练、框架熟练,成为一名能够完成开发任务的“码农”。
第二阶段,从“码农”到“工程师”,在局部上,不仅要能够实现功能,还能关注功能之外的维度,比如健壮性、低耦合、可扩展等指标。
第三阶段,从“工程师”到“架构师”,不仅在局部上追求一个模块的好坏,而且还要从整个系统层面去掌控,合理安排资源的优先级,保证整个系统不会出现腐败等等。
要想成为一名优秀的架构师,除了自身的努力,也需要一点点运气,但靠读书可能不够,但这些经典书籍还是要阅读的,能给日常的工作带来巨大的帮助。
《代码大全》 《重构:改善既有代码的设计》 《设计原本》 《大型网站技术架构核心原理与案例分析》
最后
Java 程序员这条道路并不好走,不仅要学习很多新技术、新框架,还要及时补充必要的计算机基础知识,底子硬的同时还要学会拥抱变化。
学习的过程,就好像登山一样,大概有 80% 的人在这个过程中会掉队。那么请相信我,只要目标明确,努力加上坚持,再加上一点点好运气,你就能登顶!
最后说一句哈,大家学习 Java,是为了什么,我想大多数不是为了兴趣,是吧?是为了找工作,那么终极的一步,我们需要在找工作之前刷一波面试题,然后找工作的机会也会提升很多。我推荐好朋友 Guide 哥的面试突击,专门针对 Java 程序员的面试宝典。
通过上面这幅图就能感受得到,非常全面,非常精彩。大家可以点击我的公众号名片在后台回复关键字「面试」拉取到。
衷心的希望,大家都能在学习 Java 的这条路上快乐一些,纯粹一些,少听少看一些那些焦虑文,什么 35 岁,什么学历歧视,沉下心来,多学习一点知识,让自己变强一点,比什么都好!
一家之言,必然有不尽善尽美的地方,但只要能对大家的学习有些许帮助,我也就很满足了!
这么硬核,别忘记点赞鼓励下哟~