我今年 51 岁(夸张手法)了,使用 Java 开发将近 30 年了,目前还在技术一线。
(嗯,其实我只有 18 岁,为了让自己说话显得有资历些,就一本正经的胡说八道了,嘿嘿,别杠,要杠就杠语文老师教的好)
虽然我是科班出身,但其实大学除了会谈恋爱,就剩下会打游戏了,Java 其实学的一塌糊涂。之所以毕业后还能找到工作,完全是因为当年“物以稀为贵”。
但是,自从我参加工作后,真的是使出了吃奶的力气,去不停地梳理学习路线啊,找学习资料啊,自己动手去做练手项目啊,加上工作中的日积月累,就真的成为“Java 领域的优质创作者”了!
之前有小迷妹要我分享一些学习 Java 的小心得,所以我想把这些年的经验一股脑的全部分享出来了,希望能帮助学弟学妹们在日常的学习当中少走一些弯路。
01、Java 学习的重点是什么
1)基础知识
建议大家先读一下我整理的这份 GitHub 上星标 115k 的 Java 教程,里面涵盖了 Java 所有的知识点,包括 Java 语法、Java 集合框架、Java IO、Java 并发编程和 Java 虚拟机,内容不多,只讲重点。
如果时间安排得比较得当的话,读完这份教程大概也就 2 周的时间。有了这份 Java 教程作为甜点,学习 Java 的效率就会大幅度提升!
然后如果你想看书的话,推荐《Java 核心技术卷 1》。不要问我为什么不推荐《Java 编程思想》,因为后者虽然是一本圣经,但更适合有编程经验的人读,别问我为什么知道,因为我当年就差点被劝退。另外,作者在绪论里也说了阅读这本书的前提条件。
本书假定你对程序设计有一定程度的熟悉:你已经知道程序是一些语句的集合,知道子程序/函数/宏的概念,知道像“if”这样的控制语句和像“while”这样的循环结构等等。
子程序/函数/宏这些概念其实在《C程序设计语言》一书里有提到,所以如果有时间的话,还是可以先读一读这本书的,不要花费太多时间,看懂指针这些可以先跳过,等会写了“hello world”这样的小程序后再回头去看可能会更容易理解一些。
如果你想看在线教程的话,其实可以看一看我的《教妹学 Java 专栏》,更轻松活泼,在 GitHub 上已经开源。
https://github.com/itwanger/Tech-Sister-Learn-Java
再贴一个 CS 小姐姐的评语:
如果你想看视频教程的话,推荐尚硅谷和动力节点的视频课,可以到 B 站上去看,有弹幕,学习起来会不那么枯燥。不过,这两份视频教程的内容实在是太多了,以至于有些内容是可以跳过的,这样能节省不少时间。比如说:
- 环境变量配置
- editplus 的安装
- 单行注释
- 多行注释
- 文档注释
- 变量的定义
- 三元运算符
- JDK 的安装
- PATH 环境变量的配置
- 变量
- 数据类型
- 循环控制语句 if、if-else、while
- MyEclipse
- 等等
我没列全哈,像视频教程中的这些内容,其实都是可以跳过的,有些是已经过时了,比如说 editplus、MyEclipse,现在一般直接用 VS Code 和 Intellij IDEA;有些已经不需要了,比如说 JDK 的安装、PATH 环境变量的配置,有了 Intellij IDEA 后,这些都不需要了;有些不需要重复学习了,因为《教妹学Java》专栏和《GitHub 星标 115k 的 Java 教程》里都介绍过了。
因为是自学,所以特别需要及时反馈,就像打游戏时候的通关奖励一样,每升一级都会给你送装备,这样就会更有动力。怎么给自己奖励呢?就是记笔记,一是可以梳理思路,温习知识,二是可以当做备忘录,方便以后复习。
当你看到自己的笔记一天一天增多时,你就会感觉浑身充满了力量。如果不记笔记,过一段时间你可能就忘记了你曾经学过什么,就会很沮丧。
给大家一个建议,把自己的这些学习笔记分门别类保存好,在 GitHub 上建个 repo,把它们放进去,包括敲过的那些代码。这样做的好处就是,你敲过的那些“烂代码”可以永久性质的保存在互联网上,甚至有可能被 GitHub 搬运到南京冷冻起来,哈哈。
Java 基础当中,并发编程和 Java 虚拟机是难点,你可能在自学的过程中感受到阻力很大,没关系的,如果一时半会学不会,是可以暂时跳过去学其他知识的,并不是说,一定要把并发编程和 Java 虚拟机全部吃透,你才能过下一关。
这一点和打游戏可能还有些不同,打游戏的话,这关的 boss 没打过,下一关的地图就刷新不出来;学习不是这样的,这个知识点没学会,你是可以去学另外一个知识点的,等你把另外的知识点学会了,加上自己理解能力的增强,可以重新回过头来学习的。
像 Java 虚拟机,很少有人能在自学阶段就完全吃透的,因为很多性能优化的问题必须通过线上的一些问题真刀真枪的干一仗,才能有所收获。
2)Spring
网上总一些人,会很偏激,认为学 Spring 全家桶没什么用,他的理由是技术迭代太快,框架迟早是会被淘汰的,等你学会了,没准框架就过时了。
还有一些人会杠,怎么 Java 程序员变成了 Spring 程序员呢?
怎么说呢?对于 Java Web 开发来说,Spring 已经成为和 Java 核心库一样的基础设施,如果你想成为一名合格的 Java 程序员,Spring 是必经之路。
另外,一个很重要的点,就是,自学的过程中,你是没有时间或者没有能力徒手撸一个像 Spring 这样强大的框架的。有了 Spring,就有 AOP 和 IoC,意味着你可以做一些企业级的开发了。
再说,Spring 是建立在 Java 之上的一个框架,核心就是 AOP 和 IoC,如果 Java 基础不牢的话,也学不会 Spring。
怎么才能更好的理解 AOP 和 IoC,我在之前的文章里有介绍过。如果你想看到更专业的回答,AOP 可以翻到《码农翻身》的 187 页,认真地看一看。
IoC 可以看一看沈世钧老师在知乎上的一篇文章,我认为解释得很清晰:
https://zhuanlan.zhihu.com/p/64001753
Spring 中最经常用的一个模块是 SpringMVC,是建立在 IoC 和 Servlet 的基础上的,如果不懂 IoC 就搞不明白 SpringMVC 的配置,如果不懂 Servlet 就搞不懂 Spring 是如何注入以及拦截请求的。
再说说 Spring Boot。在没有 Spring Boot 之前,开发一个 Web 项目的时候需要很多配置,比如说配置 web.xml,加载 Spring 和 SpringMVC;配置数据库链接、配置 Spring 事务;配置日志文件;还要部署 Tomcat 来运行 Web 项目,但有了 Spring Boot 之后,一切都从简了。
当你想开发一个练手项目,比如说图书管理系统的时候,就变得很轻松。直接打开下面这个网址:
https://start.spring.io/
然后选择 Maven、Java 和基础的依赖,比如说 SpringMVC、MyBatis、RabbitMQ 等等。
再然后点击 generate 就可以生成一个初始化好的 Web 项目了。解压后将其导入到 Intellij IDEA,打开主程序,增加一些内容,如下:
代码语言:javascript复制@SpringBootApplication
@RestController
public class HelloSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(HelloSpringBootApplication.class, args);
}
@RequestMapping("hello")
public String hello() {
return "Hello World";
}
}
运行主程序,在浏览器地址栏访问 http://localhost:8080/hello
,就可以看到效果了,简直不要太简单了!有了这个基础,你就只关心具体的业务实现就行了,嗯,对,CRUD 就行了。
Spring 本身有很多优秀的设计理念在内,学习 Spring 框架的过程,其实也就加强了 Java 基础知识的学习,等掌握了 Spring,你会发现:“哦,原来 Java 可以干这么多事情啊!”
Spring 怎么学?可以到 B 站上看一下江南一点雨的视频教程,我推荐过很多次了,不只是因为我们关系好,更重要的是,他的视频质量很高,很值得推荐给大家。
如果你想把 Spring 学好的话,只看视频是不够的,你得动手去实战,那么我和江南一点雨共同打造的 vhr 项目就很值得推荐给大家:
https://github.com/lenve/vhr
一个前后端分离的人力资源管理系统,文档非常全面,特别适合自学。
强调一点哈,Spring Boot 的出现,并不意味着 Spring 和 SpringMVC 已经过时了,从设计目的上来说,Spring Boot 只是实现了 Spring 的自动装配,降低了项目搭建的难度。
从技术角度来说,Spring Boot 的底层依然是 Spring 的核心机制,也就是 AOP 和 IoC,Spring Boot 只是一个承载者。在我看来,学习 Spring 的正确路径应该是 Spring -> Servlet -> Spring MVC -> Spring Boot。
3)其他知识
比如说 MySQL、MyBatis、Redis 等等这些,甚至包括一些前端的知识,比如说 Vue、JavaScript、CSS 等等,你在做练手项目的时候是绕不开的,但经过 Spring 和 Java 基础知识的洗礼后,再学习这些内容就会容易得多。
当然了,Java 的知识体系是非常庞大的,还有很多其他的知识点需要掌握,但不着急,可以放到工作以后边用边学。
我大学阶段虽然蹉跎了岁月,但参加工作后,知道自己与实际工作要求的差距后,真的是有花大力气弥补差距。幸好,编程是一个由混乱到清晰的过程,很多知识点都是有关联的,如果一时间碰到理解不了的知识点,不必沮丧,也不要气馁,每个人都一样,并不是因为你学习差导致的。
像 Java 中的 Comparator 接口,就和 CPU 执行比较的机制是类似的(参照《程序是怎样跑起来的》)。假设要比较累加寄存器中存储的 XXX 值和通用寄存器中存储的 YYY 值,执行比较指令后,CPU 的运算装置就会隐式的进行 XXX-YYY 的减法运算,结果为正表示 XXX 比 YYY 大,零表示相等,结果为负表示 XXX 比 YYY 小。
你看,是不是还挺有意思的?CPU 竟然和 Comparator 接口串联起来了。
02、哪些 Java 知识不需要再学了
作为一名 51 岁的老 Javaer,见证了 Java 的太多技术变迁,包括:
IDE,从学生时代的 MyEclipse,到工作后的 Eclipse 和 NetBeans,再到最近些年“不可一世”的 Intellij IDEA。
Web 开发,从最初的 SSH 到 SSM,再到现在“一统天下”的 Spring Boot。
那到底哪些 Java 知识已经“过时”,没必要继续学习了呢?我判断的依据主要是:
- 实际开发是否用到
- 是否有助于加深对技术的理解
- 对面试是否有帮助
为了不引起大可不必的战争,我这里采用 @沈世钧 老师的观点,他本人是知乎上程序员话题下的优秀答主,所以如果有人觉得不适,那就别听我俩的,该怎么学就怎么学,就当没看见,没听见。
https://www.zhihu.com/question/305924723/answer/557800752
1)JSP
MVC(Model–View–Controller)大家应该都听说过,是软件工程中的一种架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
JSP,全称 Jakarta Server Pages,也被称为 JavaServer Pages,由 Sun 公司主导创建的一种动态网页技术标准,可以将 Java 代码和特定变动的内容嵌入到静态的页面当中,实现静态页面为模板,动态生成部分内容的效果。
可以说是 Java 后端程序员开发前端页面的福音,我七八年前为一家客户开发的电商系统就用了 JSP,目前这套电商系统仍然在使用当中。
随着“前后端分离”模式的流行,JSP 已经变得不合时宜了,互联网公司已经抛弃了这种模式,转到彻底的“前后端分离”,后端负责提供服务接口(REST),前端(H5)通过接口发送和获取数据(JSON)。
所以沈世钧老师的建议是“完全可以放弃 JSP 的学习”,我持同样的观点。
2)Struts
Struts 是 Jakarta 项目中的一个子项目,采用 Servlet / JSP 的技术,算是一个经典的基于 MVC 模式的应用框架。但随着 Spring 的发展壮大,尤其是 SpringMVC 的利剑出鞘,Struts 已经被拍死在沙滩上了,尽管 SpringMVC 在设计之初,参照了很多 Struts 的优秀设计理念,但现实就是这么残酷,成王败寇。
所以沈世钧老师的建议是“不要再学习 Struts 了,从 SpringMVC 开始吧!”,我持同样的观点。
3)Hibernate
其实在我一开始参加工作的时候,项目中用的就是 Hibernate,所以算是印象非常时刻了。Hibernate 的设计初衷是为了最大可能地解放程序员,完全隔离数据库,实现彻底的 OR 映射,但物极必反,大量的配置导致 Hibernate 在使用的过程中变得沉重。
前些年,我接触过一个更轻量级的框架,叫 JFinal,它的 SQL 语句基本上就写在 Java 类中,反而让我觉得更舒服和自然。
而近些年流行的 MyBatis,就做得比较温和,没有一股脑的只支持配置,它也支持 SQL,从而带来了灵活性。
所以沈世钧老师的建议是“不需要再学习 Hibernate 了,学 MyBatis 就够了!”,我持同样的观点。
4)Applet
Applet 诞生于 1990 年代中期,可以说是 Java 一炮走红的功臣之一,但时过境迁,Applet 这种页面插件技术已经被淘汰了,就连 Flex、Flash 这种表现力更丰富的浏览器插件也已经淘汰了。
5)Swing
提到 Swing,肯定有些人又要杠,说 IDEA 不就是 Swing 开发的吗?这种思维方式我是能理解的。
提一嘴 Applet 吧,当年 Java 在诞生之初就差点夭折了,幸好网页浏览器突然爆了,而 Applet 可以作为浏览器插件为网页提供更强的生命力,就一下子让 Java 起死回生了。
现实中的桌面应用,要么用 C (MFC),要么用 C#(WinForm、WPF),确实很少使用 Swing 了。Intellij IDEA 确实是例外,还有人杠 Eclipse 也是 Swing 开发的,其实不是的,Eclipse 是用 IBM 优化过的 SWT/JFace 开发的。
还有人杠 Swing 可以做五子棋啊、天天跑酷等等所见即所得的小游戏啊,能提高初学者对编程的兴趣啊,能提升初学者的编程思维啊,能打学习 Java 的基础能力啊,比学习 Spring 全家桶强多了,况且框架是早晚会被淘汰的东西。
嗯。。。。。。我叫不醒一个装睡的人,(逃
6)JDBC
Java Database Connectivity,简称 JDBC,是 Java 用来和数据库通信的基础架构,后来还发展出了一个 JTA(Java Transaction API)规范,《码农翻身》这本书里也用了较大的篇幅来介绍 JDBC。
按理说,JDBC 是挺重要的一块内容,但在执行 JDBC 的增删改查操作时,如果每一次操作都需要打开一次连接,然后操作,然后关闭连接,那么创建和销毁 JDBC 连接的开销就太大了。为了避免频繁地创建和销毁 JDBC 连接,就有了 JDBC 连接池,可以更好的复用已经创建好的连接。
像 HikariCP、Druid,是目前使用最广泛的 JDBC 连接池,于是 JDBC 的学习优先级就排的越来越靠后了。
再次重申,**以上肯定有武断之处,如果你发现,上面说的很多不大必要去学的都学了,没关系,学了肯定有好处,开阔下思路。**这次强行圆回来,嗯,这样应该就不会杠了。
最后,提醒大家一点,就是不要在语言上限定自己,比如说我是 Java 程序员,对其他的编程语言都特别排斥,这样的想法很可能就把路走窄了!
在学习阶段,可以专注于一门编程语言,比如说 Java,彻彻底底把 Java 这条学习路线梳理清楚了,再去切换到其他赛道,你就会感觉很轻松。
我大学阶段是没有学 C 语言的,但后来发现如果要学习操作系统的话,C 语言是必须学的,再加上我妹当时也在学 C 语言,她们老师讲的听不懂,所以我就补了一段时间的 C 语言,除了指针那块确实比较绕以外,没发现特别难的地方。
重要的是,原来有一些 Java 里面理解的不是很清晰的概念,比如值传递,竟然在学习 C 语言后豁然开朗了。
有了 C 语言作为基础后,再读《深入理解计算机系统》和《程序是怎样跑起来的》,就会感觉没那么上头了。
Java 的整个知识体系是非常庞大的,想要学得好,必须得挑重点,不能一锅端,否则一个月,甚至一个学期,你都不会感觉有什么明显的进步。
好了,我是二哥呀,我们下期见~