请肆无忌惮地点赞吧,微信搜索【沉默王二】关注这个在九朝古都洛阳苟且偷生的程序员。
本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题。
回想起 10 年前我学习 Java 那会,资源极度匮乏,老师给我们推荐了两本书,一本《Java 编程思想》,一本《Java 开发宝典》。老师以为第一本书讲理论,第二本书讲实战,完美的组合。
但实际上呢,毕业的时候,班里面只有 13 名同学从事了软件开发的工作,其余 30 多名学生要么大一的时候转专业,要么很早就放弃编程了。
《Java 编程思想》是本经典的好书,没错,但作为入门书籍的话,只会劝退。《Java 开发宝典》更是劝退书,里面用 Java 做成的项目都很经典,比如说浏览器,五子棋,但小白根本驾驭不了啊!
10 年过去了,我已经拥有 10 多年的编程经验了。别问,问就是加班加出来的。那我在 Java 编程方面已经有了自己的一些心得和体会,所以我在知乎上推荐了一个书单,阅读人数超过了 66 万,点赞数 1200+,说明大家都很受用,都很喜欢啊。
地址贴一下,需要的同学可以去围观一下。
https://www.zhihu.com/question/269505829/answer/933582331
上面这个回答里面包含了 13 本经典的书籍,并且是按照循序渐进的方式,相信同学们看完后会来私信感谢我的。不过,这个回答已经过去了一年多时间了,我想再添加一些书单进去,仍然按照入门→进阶→深入的顺序。
01、入门
-
《Java 核心技术卷 1》
-
《Head First Java》
注意跳过 Swing、AWT、Applet 这些章节。当然了,你也可以看一下我写的这些 Java 教程,比较通俗易通一些,数了数,差不多 200 篇,还是非常全面给力的。
- 《鸟哥的 Linux 私房菜》
为什么要学 Linux 呢?因为在实际的开发工作中,项目基本上都要部署到 Linux 环境下。Windows 作为服务器的很少,除了慢没别的原因。
假如能够提前掌握一些 Linux 基本操作的话,不仅简历上是加分项,工作中更能快人一步。
-
《Maven 实战》
-
《Git 权威指南》
在我刚学 Java 那会,代码只能在本地,要想进行版本控制的话,还得装一个 SVN 服务器和客户端。另外,还不能云同步,换台电脑的话,基本上要把代码和项目依赖的 jar 包重新拷贝一遍。
要知道,代码都是很琐碎的文件,复制粘贴起来非常慢;如果项目比较大的话,依赖的 jar 包也比较多,复制粘贴起来就更慢了。
现在好了,有码云、GitHub 这些云仓库可以用,多台电脑进行同步非常方便。再配合 Maven(项目构建工具) 和 Git(版本控制工具),玩起来 666 啊!
02、进阶
- 《Java 编程思想》
《Java 编程思想》这本书确实没得说,质量很高,但需要放在 Java 入门后再去读,这样才能真正地去理解思想。
很多没有足够编程基础的同学,盲目自信,直接开啃这本书,然后他们发现,啃得很痛苦,这就是因为没有根基的原因造成的,就像没有学会走就开始跑一样,摔得很痛。
作者在前言里已经表明了,读者需要知道基本的程序语句(比如 C里面的 if 和 for),也就是说,作者假设读者已经熟悉 C 的一些语法。可想而知,没有编程基础的同学在读这本书的时候是多么痛苦啊。
我就是在大学老师的误导下开啃这本书的,第一遍,只读了前言,就读不下去了,晦涩,难懂。实习了一年结束后,我第二次读这本书,仍然觉得头大,强忍着,读了差不多 200 页,耐力就消耗殆尽了。
直到两年前,我再重拾这本书,发现读起来津津有味,每读一个章节就产出一篇文章,这本书的价值真正地体现了。为什么呢?因为我已经有多年的编程经验,结合书中的理论知识,读起来就有一种“恍然大悟”的感觉。
《Java 编程思想》不仅教我们怎么做,还告诉我们为什么要这样做,这才是 Java 这门编程语言的精髓。
不过,《Java 编程思想》出版的时间是 2007 年,已经十多年过去了,虽然经典,但避免不了过时。但幸好,有《On Java 8》,这本书的作者就是 Bruce Eckel,即《Java 编程思想》的作者。事实上,《On Java 8》就是《Java 编程思想》的第五版,第四版用的 JDK 还是 1.5,《On Java 8》用的 JDK 已经升级到了 Java 8。
那同学们可能就要问了,《On Java 8》上哪买啊?
不用买了,雷锋已经将这本书翻译成中文并且开源了,访问上面的链接就可以在 GitHub 上阅读了。
- 《Java 网络编程》
《Java 网络编程》这本书的整体评价并不算高,但是,对于学习 Java 网络编程的基础知识非常的有用。
- 《Netty 实战》
无论是构建高性能的 Web、游戏服务器、推送系统、RPC 框架、消息中间件还是分布式大数据处理引擎,都离不开 Netty,在整个行业中,Netty 广泛而成功的应用,使其成为了 Java 高性能网络编程的卓绝框架。
- 《Effective Java》
《Effective Java》第三版一共包含了 90 条极具实用价值的经验规则,每条规则都值得 Java 程序员在实战中去参照。这本书不需要按部就班地从头到尾读,可以随意挑选任意小节进行阅读,因为每条规则相对都是独立的,尽管它们之间会交叉引用,但并不妨碍我们随心所欲地阅读。
作者 Josh Bloch 非常的牛逼,曾是 Google 的首席 Java 架构师,《Java开发者杂志》将他列为世界上最顶尖的四十名软件人物之一。Java 之父詹姆斯·高斯林对《Effective Java》的评价也非常的高。
- 《阿里巴巴 Java 手册》
《阿里巴巴 Java 开发手册》这本小册子虽然只有几十页,但讲的主要是一些典型的开发规约、编程规范、以及最佳实践,已经成为业界普遍遵循的开发规范。
最新版是嵩山版,封面就有一个扫地僧,唉,这就厉害了呀!
- 《代码整洁之道》
软件的质量,不仅依赖于架构,更与代码质量息息相关。而代码的质量与其整洁度成正比关系,越整洁的代码,其质量毫无疑问的就会越高。
《代码整洁之道》的第一章,对整洁代码下了一个定义,每个程序员都应该铭记在心。
1、整洁的代码力求专注,每个方法、每个类都应该全神贯注于一件事;命名更要给人一种“顾名思义”的感觉。
2、整洁的代码简单直接,从不隐藏设计者的意图。
3、整洁的代码应当有单元测试。
4、整洁的代码拒绝重复,其表达力直击人的心灵。
-
《Java 并发编程实战》
-
《Java 并发编程之美》
-
《实战 Java 高并发程序设计》
对于程序来说,如果具有并发的能力,效率就能够大幅度地提升。对于程序员来说,如果精通 Java 并发编程的话,挣钱能力就会大幅提升,这话真的不是调侃,而是良心话啊。
这三本 Java 并发方面的书可以结合起来看,互相补充,帮助同学们在这方面快速地提高。
- 《Java 性能权威指南》
通过阅读《Java 性能权威指南》这本书,我们可以运用 4 个基本原则最大程度地提升性能测试的效果、使用 JDK 自带的工具收集程序的性能数据、理解 JIT(即时编译器)编译器的优缺点、调优 JVM 垃圾收集器、最大程度优化多线程等等。
-
《Spring 实战》
-
《Spring 揭秘》
Spring 是 Java 平台的一个开源框架,为基于 Java 构建的 Web 应用程序提供了大量的拓展支持。
1、Spring 能帮我们根据配置文件创建以及组装对象之间的依赖关系。
2、Spring 面向切面编程能帮助我们无耦合的实现日志记录、性能统计、安全控制。
3、Spring 能非常简单地帮我们管理数据库事务。
4、Spring 能与第三方数据访问框架(如 MyBatis、JPA)无缝集成。
5、Spring 能方便的与 Java EE(如 Java Mail、任务调度)整合。
《Spring 实战》和《Spring 揭秘》能够帮助同学们对 Spring 有一个更加全面的了解和掌握。
- 《Spring Boot+Vue全栈开发实战》
Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。简单来说,就是 Spring Boot 其实不是什么新的框架,它默认配置了很多框架的使用方式,就像 Maven 整合了所有的 Jar 包,Spring Boot 整合了所有的框架。
Spring Boot 方面的好书不多,索性就推荐一下我的好朋友江南一点雨的书,他本人还录制了很多免费的视频,这些视频配套着他的书看,绝对可以对 Spring Boot 有着充分的掌握。
这个链接是江南一点雨的教程合集,我觉得质量还是很高的,我自己在学习 Spring Boot 的时候就参照了不少。
-
《图解 HTTP》
-
《HTTP 权威指南》
程序员,毕竟是搞 IT(Information Technology)的,网络这一块还是很重要的。HTTP 全称是 HyperText Transfer Protocal ,即:超文本传输协议,从 1990 年开始就在 WWW 上广泛应用,是现在 WWW 上应用最多的协议,HTTP 是应用层协议,当你上网浏览网页的时候,浏览器和 Web 服务器之间就会通过 HTTP 在 Internet 上进行数据的发送和接收。
《图解 HTTP》和《HTTP 权威指南》很值得去读一读。
-
《高性能 MySQL》
-
《MySQL 必知必会》
-
《MySQL 技术内幕-InnoDB 存储引擎》
MySQL 由于性能高、成本低、可靠性好,已经成为最流行的开源数据库,随着 MySQL 不断的成熟,越来越多大规模的网站开始使用 MySQL,比如维基百科、Google 等。
作为一名 Java 程序员,MySQL 必知必会啊。
- 《MyBatis 从入门到精通》
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
除了《MyBatis 从入门到精通》这本书,同学们还可以直接阅读 MyBatis 的中文网。
-
《Redis 实战》
-
《Redis 深度历险:核心原理与应用实战》
Redis 是互联网技术领域中使用最广泛的存储中间件,它是 Remote Dictionary Service 三个单词中加粗字母的组合。
Redis 以超高的性能、完美的文档、简洁的源码著称,国内外很多大型互联网公司都在用,比如说阿里、腾讯、GitHub、Stack Overflow 等等。它的版本更新非常的快,功能也越来越强大,最初只是用来作为缓存数据库,现在已经可以用它来实现消息队列了。
可以这么说吧,掌握 Redis 已经变成了一项后端工程师必须具备的基础技能。
- 《RabbtiMQ 实战指南》
RabbitMQ 是一款开源的消息队列系统。主要特点在于健壮性好、易于使用、高性能、高并发、集群易扩展,以及强大的开源社区支持。《RabbitMQ 实战指南》从消息中间件的概念和 RabbitMQ 的历史切入,主要阐述 RabbitMQ 的安装、使用、配置、管理、运维、原理、扩展等方面的细节。
- 《Kafka 权威指南》
每个应用程序都会产生数据,包括日志消息、度量指标、用户活动记录、响应消息等。如何移动数据,几乎变得与数据本身一样重要。如果你是架构师、开发者或者产品工程师,同时也是 Apache Kafka 新手,那么这本实践指南将会帮助你成为流式平台上处理实时数据的专家。
- 《第一本 Docker 书》
Docker 是一个开源的应用容器引擎,开发者可以利用 Docker 打包自己的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
《第一本 Docker 书》可以帮助我们学习到 Docker 的安装、部署、管理和扩展。
03、深入
- 《深入理解 Java 虚拟机》
《深入理解 Java 虚拟机》这本书牛逼到什么程度,几乎所有写 Java 虚拟机方面的文章,没有一个不在文章最后注明:本文参考字周志明老师的《深入理解 Java 虚拟机》。假如这篇文章最后没有注明的话,那保不准是不尊重版权。
- 《重构,改善既有代码的设计》
《重构,改善既有代码的设计》这本书在业界的名声也非常的响,只不过看起来就需要一些精力和耐力,上面这些书看完后,可以看这一本,对于重新审视现有代码有极大的帮助。
- 《深入理解 Nginx》
Nginx 是异步框架的网页服务器,也可以用作反向代理、负载平衡器和 HTTP 缓存。《深入理解 Nginx》这本书通过还原 Nginx 设计思想,剖析 Nginx 架构来帮助我们快速高效地开发 HTTP 模块。
- 《深入剖析 Tomcat》
Tomcat 是一个 Servlet 容器,并提供了作为 Web 服务器的一些特有功能。基本上写过 Web 程序的 Java 程序员都用过 Tomcat 作为服务器,所以有时间的话,对 Tomcat 深入剖析一下还是非常值得去做的。
- 《JDK 里的设计模式》
这并不是一本书,而是左耳朵耗子的一个帖子,文中列出了 JDK 中 23 个经典的设计模式,非常值得一看。
-
《深入浅出设计模式》
-
《设计模式之禅》
-
《Head First 设计模式》
大家都听说过,学习设计模式非常的重要,那么为什么这么重要呢,设计模式到底是什么?打个比喻学编程就像学武功一样。
武功要练得很牛逼,有两样东西不能丢。第一,是内功;第二,是武功秘籍。内功对应到编程就是我们编程基础能力,那编程的设计模式就可以想象成武术中的武功秘籍。
设计模式就是根据不同类型场景,设计优雅的(编码)解决方案。学好设计模式有很多好处,比如,容易看懂经典代码中的逻辑(很多优秀的开源框架大量使用了设计模式);应对面试时对答如流(设计模是面试重点);可以编写出优雅的解决方案(或者代码)。
-
《算法》
-
《大话数据结构》
现在的大厂面试,都特别喜欢考算法和数据结构方面的知识,把这个作为程序员水平高低的一个考核标准。对于大部分业务开发来说,平常更多的是利用已经封装好的现成接口、类库,很少需要自己实现数据结构和算法。
但是,如果知道这些类库背后的原理,懂得时间、空间复杂度分析,绝对可以在工作中得心应手。掌握数据结构和算法,不管对于阅读框架源码,还是理解背后的设计思想,都是非常有用的。写出高质量,达到开源级别的代码,算法和数据结构,值得我们去掌握。
-
《大型网站系统与 Java 中间件实践》
-
《大型网站技术架构:核心原理与案例分析》
-
《亿级流量网站架构核心技术》
这三本书,如果能够驾驭得了,那基本上可以这么说,你已经是一名不可多得的 Java 方面的高级人才了。
没有什么难题是百度云盘不能解决的,别忘了双击屏幕给个点赞!
《Java 最强书单推荐》链接链接:https://pan.baidu.com/s/1OcIK_Qd7fKtv3tlACgh2LQ 提取码:l4o1
04、学习方法
我们都经历过学生时代(有些同学还正在经历),同一个班级,同一个老师,为什么成绩截然不同呢,有些同学天资聪颖,学什么都快,有些同学学习能力差,但方法得体,也能取得好成绩。如果既没有天赋,又没有学习方法,那就只配俩字了——对,学渣(大学的我就是一个学渣,不堪回首)。
那正确的学习方法是什么呢?
第一,善用搜索引擎。平常需要找资料,需要解决问题,如果自己一时半会没有方法的话,就去搜。
Google 是第一选择,Bing 是第二选择,微信搜索是第三选择。PC 端的话,Google 和 Bing 就很靠谱,基本上要找的东西,都有好的结果。手机端的话,就用微信搜,答案也很靠谱。
第二,学会提问。如果搜索引擎找不到答案的话,不要直接把问题抛到群里,抛给同事、领导,或者大牛,要先对问题梳理一下。
我想问什么,我的环境是什么,问题的描述是否足够清楚,态度是否端正。
不要唐突,不要冒昧,还要脸皮厚,很难,对吧?这就是提问的艺术啊。
第三,善于总结和归纳。很多同学给我反馈,“二哥,怎么总是感觉记不住啊,学完就忘啊,有什么好的办法吗?”
有啊,当然有。学完一个知识点,如果需要动手去实践,那就去敲代码,敲一遍,还是理解,再敲一遍。如果真的感觉自己理解,尝试写篇文章,把自己的学习心得分享出来,看看是否能够教会别人。
如果自己是半瓶水,倒出去只能是半瓶水;只有自己是一瓶水,倒出去才可能多余半瓶水,对吧?
归纳总结的好处就是把零散的知识变成体系,在脑海中构建一副蓝图,日积月累,你就会发现自己也从一条小溪变成了海洋。
顺带推荐一下费曼学习法,灵感源于诺贝尔物理奖获得者理查德·费曼,运用费曼技巧,只需要花 20 分钟就可以深入理解知识点。听起来是不是很神奇?
费曼学习法的四个步骤:
第一步,能把一个孩子教懂。这有点类似我们古代的一名诗人,白居易,他希望自己的诗连老太婆都能看得懂,那就是好诗。
具体怎么做呢?拿出一张白纸,写下要学习的主题,想一下,怎么把它教给一个孩子,你会讲哪些,然后记下来。
同学们可以把白纸换成 iPad 了,有道云笔记了,等等。
第二步,回顾。当我们尝试把知识点讲给小孩子的时候,可能会卡壳,那就需要把这些卡壳的点重新学习,这些点可能就是我们认知的边界——重新学习的地方。
第三步,简化语言。如果发现表述的文字比较复杂,不够清晰,那就尝试把这些内容读出来,直到通顺,直到自然,直到足够简练。
第四,传授。这点虽然是可选项,但真的非常重要。如果确保自己理解了,那就把它教给别人,看你能否把别人教懂,也就是我说的善于总结和归纳。
整个思维导图( 推荐的在线网址有百度脑图、ProcessOn)了,或者博客(建议使用 markdown 格式)了。
第四,多去实践。实践出真知,到底马谡行不行,给他一个街亭守一守,对吧,收不住就是纸上谈兵,没啥鸟用。
GitHub 或者码云上有很多优秀的开源项目,挑一些优质的,down 下来,去研究研究,在原有的代码基础上,尝试做一些优化,或者增加一些功能。
自己动手去做的过程中,你会发现,哇,真的有新大陆呀!
第五,熟练使用开发工具。Intellij IDEA、VSCode 都是非常流行的开发工具,能够帮助我们在学习和工作中变得更加高效,里面有没有快捷键,有没有什么骚操作,对吧?
在使用 Intellij IDEA 编写代码的过程中,一定要注重代码规范。提前就把 SonarLint、阿里巴巴开发规约这些插件安装上,写完代码就 check 一下,按照提示对一些不良的习惯做出修正。
第六,学好英语。这一点真的真的真的非常非常非常重要重要重要,即便是英语功底本身很差,一定不要自暴自弃,对吧?雷军敢一句“are you ok”走天下,你怕什么?
况且,Chrome 浏览器可以安装 Google 翻译插件,Intellij IDEA 可以安装 Translation 翻译插件,只要稍微有点英语的底子,完全不用怵的。
英语水平提高了,可以看官方的文档,可以在 Stack Overflow 上找答案,可以查看 JDK 源码,等等,编程水平就会与日俱增啊。
第七,注意休息。身体健康非常重要,千万不要沦为工作的机器,认为年轻的时候就应该拼命的加班,通过加班提升技术,多挣点钱。这种想法可以有,但要节制,懂吗?
任务紧,马上要 deadline 了,可以适当的加班,但不要一年四季 365 天都在加班。花点时间去旅游了,读书了,学习了,谈恋爱了,享受生活了。
年轻人,不要做个“奋斗逼”,奋斗可以,但不要盲目。想想脑袋上的那点头发,就别熬夜了。一个人加班,就会有第二个人加班,第三个人加班,第四个人无休止的加班。只有大家都不去加班了,工作的良性氛围才会有啊!
以上,希望能够对同学们有所帮助,peace。
我是沉默王二,一枚在九朝古都洛阳苟且偷生的程序员。关注即可提升学习效率,感谢你的三连支持,奥利给🌹。
如果你觉得文章对你有些帮助,欢迎微信搜索「沉默王二」第一时间阅读,回复关键字「面试」可以免费获取我为你精心准备的大厂面试攻略;本文 GitHub github.com/itwanger 已收录,欢迎 star。