This commit is contained in:
louzefeng
2024-07-11 05:50:32 +00:00
parent bf99793fd0
commit d3828a7aee
6071 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,80 @@
你好我是杨晓峰。今天这期周末福利我整理了几本自己在学习和使用Java时用过的参考书把它们分享与你。在专栏里有不少同学留言让我推荐一些参考书。另外我认为书是个好的系统化知识来源但更多提高还是来源于实践、阅读源码、技术交流等毕竟书籍也很难完全跟上技术和架构的变革另外我也尽量缩减了书单的长度。
**关于夯实Java编程基础我推荐Bruce Eckel的《Java编程思想》Thinking in Java**非常有名的经典书籍。这本书的特点是不仅仅介绍Java编程的基础知识点也会思考编程中的各种选择与判断包括穿插设计模式的使用作者从理论到实践意义从不同的角度进行探讨构建稳固的Java编程知识体系。
当然这本书也有不足之处毕竟每个人的基础不太一样如果你完全没有Java编程基础也可以考虑其他的参考书例如 **《Java核心技术》**。
另外这两本书的部分内容已经多少有点过时了尤其是《Java编程思想》。例如目前很少会需要学习Java桌面图形类库等较新的语法和API当然也没有包含我的建议是尽管忽略过时内容适当补充Java新技术的学习。
提到经典,自然也少不了 **《Effective Java》**这本书的英文第三版已经在国内上市涵盖了Java 7到Java 9的各种新特性。严格来说这本书不算是一本基础书籍但当你有一定基础后还是非常建议通读一下的。关于这本书的阅读我的建议是边学习边回顾在吸收书中的经验时多去想想自己在实际应用中是如何处理的。虽然《Effective Java》的具体章节可能是从某个点出发但可以说都是对Java、JVM、面向对象等各种知识的综合运用对于设计和实现高质量的代码很有帮助。
<img src="https://static001.geekbang.org/resource/image/bf/06/bf6e3f87d162595ddaa5d0786c0ed806.jpg" alt=""><br>
<br>
**《Head First设计模式》** 这本书就不用我再费笔墨去介绍了吧,能把设计模式用这种轻松的形式展现本身已经十分不易了,章节之间的联系让你可以反复加深印象,加上生动的表达方式和丰富的习题更容易沉浸其中。
<img src="https://static001.geekbang.org/resource/image/17/0e/17ed56811412ccab5024a119511e0f0e.jpg" alt="">
这本书非常适合对面向对象和设计模式基础有限的同学。设计模式不是银弹,实践中也莫要为了模式而模式,掌握典型模式,能够举一反三就很好了,就当作是程序员之间沟通的“方言”。
谈过了Java基础接下来聊聊**并发和虚拟机**的参考书。
**《Java并发编程实战》**作者全是响当当的人物比如Brian Goetz我多次在专栏里引用他的观点众多强力作者也保证了书的质量。抛开作者光环这本书的内容全部建立在理论之上先讲清道理再谈实践可以真正让你知其然也知其所以然。这本书更加侧重并发编程中有哪些问题如何来深刻地理解和定义问题如何利用可靠的手段指导工程实践并没有过分纠结于并发类库的源码层面。
<img src="https://static001.geekbang.org/resource/image/04/3f/0432ac1e431256fb894144aa2e66b03f.jpg" alt="">
这本书的我的学习建议是,尽量充分利用其中提供的样例代码,结合自己的业务实践去深入学习,毕竟这本书的内容有些偏理论,可能并不适合你快速掌握所谓并发“核心”技术。<br>
<br>
关于JVM的学习不用我多说了吧看过专栏的同学肯定都知道我经常推荐**周志明的《深入理解Java虚拟机》**可以说是国内最好的JVM书籍之一。
<img src="https://static001.geekbang.org/resource/image/98/5f/98d02b66e1d3fdf8cc1f7f7c6f974b5f.jpg" alt="">
我这里并没有单独推荐类似GC算法等书籍它们对于大多数Java工程师的价值也许有限。
关于性能优化,我推荐**Charlie Hunt和Binu John所著的《Java性能优化权威指南》Java Performance**也是我上次在直播时向大家推荐的。Java之父James Gosling也力荐这本参考书。
<img src="https://static001.geekbang.org/resource/image/c9/10/c9fae97c8a4954cb91b59dc7e59ab710.jpg" alt="">
但这本书也存在着不足里面过于偏重Solaris等商业操作系统和相关工具我建议你在阅读的时候尽量体会其思路和原理更加侧重于Linux等主流开放平台。
还有一些如开源软件和互联网架构相关的图书可以作为扩展阅读,你可以参考下面这几本。
《Spring实战》
<img src="https://static001.geekbang.org/resource/image/75/61/7559562971dc2eadd8fd03f02980a461.jpg" alt="">
可以说Spring等相关框架已经成为业务开发的事实标准系统性地掌握Spring框架的设计和实践是必需的技能之一。
《Netty实战》
<img src="https://static001.geekbang.org/resource/image/f8/d9/f8b11bdcb1559e472b77e23fcf184dd9.jpg" alt="">
Netty在性能、可扩展性等方面的突出表现已经得到充分验证作为基础的通信框架已经广泛应用在各种互联网架构、游戏等领域甚至可以说如果没有仔细分析过Netty对NIO等方面的理解很可能还在很肤浅的阶段。
《Cloud Native Java》
<img src="https://static001.geekbang.org/resource/image/d2/12/d286554382cbba791f85e667ea124e12.jpg" alt="">
Java应用程序架构处于飞快的演进之中微服务等新的架构应用越来越广泛即使未必是使用Spring Boot、Spring Cloud等框架但是系统的学习其设计思想和实践技术绝对是有必要的。当然如果你在实践中使用Dubbo等框架也可以选择相关书籍。
前沿领域的变化非常快,很多风靡一时的开源软件,在实践中逐渐被证明存在各种弊端,或者厂商停止维护。所以这部分的学习,我建议不要盲目追新,最好是关注于分布式设计中的问题和解决的思路,做到触类旁通,并且注重书籍之外的学习渠道。
下面两本并不算是Java书籍但Java程序员进阶少不了对互联网主流架构的学习了解分布式架构、缓存、消息中间件等令人眼花缭乱的技术对于有志于成为架构师的Java工程师来说非常有帮助。
《大型分布式网站架构设计与实践》
<img src="https://static001.geekbang.org/resource/image/4a/4f/4ab17456a34278a8ca18de54fea76f4f.jpg" alt="">
这本书总结了作者在构建安全、可稳定性、高扩展性、高并发的分布式网站方面的心得。
《深入分布式缓存:从原理到实践》
<img src="https://static001.geekbang.org/resource/image/3d/b8/3d70890354f556d1b3acbc2f2fdd99b8.jpg" alt="">
这本书融合了原理、架构和一线互联网公司的案例实践,值得参考。
下面给入选精选留言的同学送出15元学习奖励礼券。专栏即将进入尾声希望所有订阅的同学能够坚持到底也欢迎大家留言分享自己学习或面试的心得体会。
<img src="https://static001.geekbang.org/resource/image/35/bf/35c9a5cab69eae467adb7d85d76d41bf.jpg" alt="">

View File

@@ -0,0 +1,74 @@
<audio id="audio" title="周末福利 | 谈谈我对Java学习和面试的看法" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/3a/38/3af1dd9515db2855e30f4823a28f5938.mp3"></audio>
你好我是杨晓峰。今天是周末我们稍微放松一下来聊聊“Java核心技术”之外的内容正好也借这个机会兑现一下送出学习奖励礼券的承诺。我在每一讲后面都留下了一道思考题希望你通过学习结合自身工作实际能够认真思考一下这些问题一方面起到检验学习效果的作用另一方面可以查漏补缺思考一下这些平时容易被忽略的面试考察点。我并没有给出这些思考题的答案希望你通过专栏学习或者查阅其他资料进行独立思考将自己思考的答案写在留言区与我和其他同学一起交流这也是提升自己重要的方法之一。
截止到今天专栏已经更新了15讲走完了基础模块正式进入进阶模块。现在也正是一个很好的时机停下来回顾一下基础部分的知识为后面进阶的并发内容打好基础。在这里我也分享一下我对Java学习和面试的看法希望对你有所帮助。
首先,有同学反馈说专栏有的内容看不懂。我在准备专栏文章的时候对一些同学的基础把握不太准确,后面的文章我进行了调整,将重点技术概念进行讲解,并为其他术语添加链接。
再来说说这种情况有人总觉得Java基础知识都已经被讲烂了还有什么可学的
对于基础知识的掌握,有的同学经常是“知其然而不知其所以然”, 看到几个名词听说过就以为自己掌握了,其实不然。至少,我认为应该能够做到将自己“掌握”的东西,**准确地表达出来**。
爱因斯坦曾经说过,“如果你不能把它简单地解释出来,那说明你还没有很好地理解它”。了解-掌握-精通,这是我们对事物掌握的一个循序渐进的过程。从自己觉得似乎懂了,到能够说明白,再到能够自然地运用它,甚至触类旁通,这是不断提高的过程。
在专栏学习中,如果有些术语很陌生,那么了解它就达到了学习目的,如果能够理解透彻达到掌握的程度当然更好。乐观点来看,反正都是有收获,也完全不必过分担心。
从学习技巧的角度,每个人都有自己的习惯,我个人喜欢动手实践以及与人进行交流。
- 动手实践是必要一步,如果连上手操作都不肯,你会发现自己的理解很难有深度。
- 在交流的过程中你会发现,很多似是而非的理解,竟然在试图组织语言的时候,突然就想明白了,而且别人的观点也验证了自己的判断。技术领域尤其如此,把自己的理解整理成文字,输出、交流是个非常好的提高方法,甚至我认为这是技术工作者成长的必经之路。
再来聊聊针对技术底层,我们是否有必要去阅读源代码?
阅读源代码当然是个好习惯,理解高质量的代码,对于提高我们自己的分析、设计等能力至关重要。
- 根据实践统计,工程师实际工作中,阅读代码的时间其实大大超过写代码的时间,这意味着阅读、总结能力,会直接影响我们的工作效率!这东西有没有捷径呢,也许吧,我的心得是:“**无他,但手熟尔**”。
- 参考别人的架构、实现,分析其历史上掉过的坑,这是天然的好材料,具体阅读时可以从其修正过的问题等角度入手。
- 现代软件工程,节奏越来越快,需求复杂而多变,越来越凸显出**白盒**方式的重要性。快速定位问题往往需要黑盒结合白盒能力,对内部一无所知,可能就没有思路。与此同时,通用平台、开源框架,不见得能够非常符合自己的业务需求,往往只有深入源代码层面进行定制或者自研,才能实现。我认为这也是软件工程师地位不断提高的原因之一。
那么,源代码需要理解到什么程度呢?<br />
对于底层技术这个确实是比较有争议的问题我个人并不觉得什么东西都要理解底层懂当然好但不能代表一切毕竟知识和能力是有区别的当然我们也要尊重面试官的要求。我个人认为不是所有做Java开发的人都需要读JVM源代码虽然我在专栏中提供了一些底层源代码解读但也只是希望真的有兴趣、有需要的工程师跟进学习。对于大多数开发人员了解一些源代码至少不会在面试问到的时候完全没有准备。
关于阅读源代码和理解底层,我有些建议:
- **带着问题和明确目的去阅读**比如以debug某个问题的角度结合实践去验证让自己能够感到收获既加深理解也有实际帮助激励我们坚持下来。
- **一定要有输出**,至少要写下来,整理心得,交流、验证、提高。这和我们日常工作是类似的,千万不要做了好长一段时间后和领导说,没什么结论。
大家大都是工程师不是科学家软件开发中需要分清表象、行为behavior还是约定specification。喜欢源代码、底层是好的但是一定要区分其到底是实现细节还是规范的承诺因为如果我们的程序依赖于表现很有可能带来未来维护的问题。
我前面提到了白盒方式的重要性但是需要慎重决定对内部的依赖分清是Hack还是Solution。出来混总是要还的如果以某种hack方式解决问题临时性的当然可以长久会积累并成为升级的障碍甚至堆积起来愈演愈烈。比如说我在实验Cassandra的时候发现它在并发部分引用了Unsafe.monitorEnter()/moniterExit()这会导致它无法平滑运行在新版的JDK上因为相应内部API被移除了比较幸运的是这个东西有公共API可以替代。
最后谈谈我在面试时会看中候选人的哪些素质和能力。
结合我在实际工作中的切身体会,面试时有几个方面我会特别在乎:
- **技术素养好,能够进行深度思考,而不是跳脱地夸夸其谈**,所以我喜欢问人家最擅长的东西,如果在最擅长的领域尚且不能仔细思考,怎么能保证在下一份工作中踏实研究呢。当然这种思考,并不是说非要死扣底层和细节,能够看出业务中平凡事情背后的工程意义,同样是不错的。毕竟,除了特别的岗位,大多数任务,如果有良好的技术素养和工作热情,再配合一定经验,基本也就能够保证胜任了。
- **职业精神,是否表现出认真对待每一个任务**。我们是职场打拼的专业人士,不是幼儿园被呵护的小朋友,如果有人太挑活儿,团队往往就无法做到基本的公平。有经验的管理角色,大多是把自己的管理精力用在团队的正面建设,而不是把精力浪费在拖团队后腿的人身上,难以协作的人,没有人会喜欢。有人说你的职业高度取决于你“填坑”的能力,我觉得很有道理。现实工作中很少有理想化的完美任务,既目标清晰又有挑战,恰好还是我擅长,这种任务不多见。能够主动地从不清晰中找出清晰,切实地解决问题,是非常重要的能力。
- **是否hands-on是否主动**。我一般不要求当前需要的方面一定是很hands-on但至少要表现出能够做到。
下面放出中奖名单和精选留言送出15元学习奖励礼券希望我的《Java核心技术36讲》不仅能带你走进大厂Java面试场景还能帮你温故知新基础知识构建你的Java知识体系。也欢迎你在这里与我交流面试、学习方面的困惑或心得一起畅所欲言、共同进步。
<img src="https://static001.geekbang.org/resource/image/57/8a/575e25256f663427fb51d9aa527fdf8a.jpg" alt="" />
<img src="https://static001.geekbang.org/resource/image/54/07/5421d5bf1eea5d2a232f43db5f8a1d07.jpeg" alt="" />
<img src="https://static001.geekbang.org/resource/image/cb/44/cbc080e0cbdfdc137d8f2ddaf30db644.jpeg" alt="" />
<img src="https://static001.geekbang.org/resource/image/ec/7c/ecf4c99d15d6407e2b650e9e6d0d697c.jpeg" alt="" />
<img src="https://static001.geekbang.org/resource/image/8e/8c/8e376fa283f5db1e6f2f35349d73228c.jpeg" alt="" />
<img src="https://static001.geekbang.org/resource/image/fa/85/fa7cc9998a4d7af386e12b5577db0b85.jpeg" alt="" />
<img src="https://static001.geekbang.org/resource/image/bc/64/bc1373d1e22023dc57710346e7dd5064.jpeg" alt="" />
<img src="https://static001.geekbang.org/resource/image/3a/30/3a0f9e151b35ceb00ded7ebc0745d230.jpeg" alt="" />
<img src="https://static001.geekbang.org/resource/image/b1/ea/b156224c10943df2287a71aea6a21bea.jpeg" alt="" />
<img src="https://static001.geekbang.org/resource/image/46/26/46d5cd1d042337e5e00d2caa91d92d26.jpeg" alt="" />
祝贺石头狮子、Woj、[kursk.ye](http://kursk.ye)、Miaozhe、肖一林、曹铮、雷霹雳的爸爸、vash_ace、Walter也要感谢I am a psycho、magict4、李林、Woong、L.B.Q.Y指出我文稿中的疏漏一并送出学习奖励礼券。