你好,我是杨晓峰。今天是周末,我们稍微放松一下来聊聊“Java核心技术”之外的内容,正好也借这个机会,兑现一下送出学习奖励礼券的承诺。我在每一讲后面都留下了一道思考题,希望你通过学习,结合自身工作实际,能够认真思考一下这些问题,一方面起到检验学习效果的作用,另一方面可以查漏补缺,思考一下这些平时容易被忽略的面试考察点。我并没有给出这些思考题的答案,希望你通过专栏学习或者查阅其他资料进行独立思考,将自己思考的答案写在留言区与我和其他同学一起交流,这也是提升自己重要的方法之一。
截止到今天,专栏已经更新了15讲,走完了基础模块正式进入进阶模块。现在也正是一个很好的时机停下来回顾一下基础部分的知识,为后面进阶的并发内容打好基础。在这里,我也分享一下我对Java学习和面试的看法,希望对你有所帮助。
首先,有同学反馈说专栏有的内容看不懂。我在准备专栏文章的时候对一些同学的基础把握不太准确,后面的文章我进行了调整,将重点技术概念进行讲解,并为其他术语添加链接。
再来说说这种情况,有人总觉得Java基础知识都已经被讲烂了,还有什么可学的?
对于基础知识的掌握,有的同学经常是“知其然而不知其所以然”, 看到几个名词听说过就以为自己掌握了,其实不然。至少,我认为应该能够做到将自己“掌握”的东西,准确地表达出来。
爱因斯坦曾经说过,“如果你不能把它简单地解释出来,那说明你还没有很好地理解它”。了解-掌握-精通,这是我们对事物掌握的一个循序渐进的过程。从自己觉得似乎懂了,到能够说明白,再到能够自然地运用它,甚至触类旁通,这是不断提高的过程。
在专栏学习中,如果有些术语很陌生,那么了解它就达到了学习目的,如果能够理解透彻达到掌握的程度当然更好。乐观点来看,反正都是有收获,也完全不必过分担心。
从学习技巧的角度,每个人都有自己的习惯,我个人喜欢动手实践以及与人进行交流。
再来聊聊针对技术底层,我们是否有必要去阅读源代码?
阅读源代码当然是个好习惯,理解高质量的代码,对于提高我们自己的分析、设计等能力至关重要。
那么,源代码需要理解到什么程度呢? 对于底层技术,这个确实是比较有争议的问题,我个人并不觉得什么东西都要理解底层,懂当然好,但不能代表一切,毕竟知识和能力是有区别的,当然我们也要尊重面试官的要求。我个人认为,不是所有做Java开发的人,都需要读JVM源代码,虽然我在专栏中提供了一些底层源代码解读,但也只是希望真的有兴趣、有需要的工程师跟进学习。对于大多数开发人员,了解一些源代码,至少不会在面试问到的时候完全没有准备。
关于阅读源代码和理解底层,我有些建议:
大家大都是工程师,不是科学家,软件开发中需要分清表象、行为(behavior),还是约定(specification)。喜欢源代码、底层是好的,但是一定要区分其到底是实现细节,还是规范的承诺,因为如果我们的程序依赖于表现,很有可能带来未来维护的问题。
我前面提到了白盒方式的重要性,但是,需要慎重决定对内部的依赖,分清是Hack还是Solution。出来混,总是要还的!如果以某种hack方式解决问题,临时性的当然可以,长久会积累并成为升级的障碍,甚至堆积起来愈演愈烈。比如说,我在实验Cassandra的时候,发现它在并发部分引用了Unsafe.monitorEnter()/moniterExit(),这会导致它无法平滑运行在新版的JDK上,因为相应内部API被移除了,比较幸运的是这个东西有公共API可以替代。
最后谈谈我在面试时会看中候选人的哪些素质和能力。
结合我在实际工作中的切身体会,面试时有几个方面我会特别在乎:
下面放出中奖名单和精选留言,送出15元学习奖励礼券,希望我的《Java核心技术36讲》不仅能带你走进大厂Java面试场景,还能帮你温故知新基础知识,构建你的Java知识体系。也欢迎你在这里与我交流面试、学习方面的困惑或心得,一起畅所欲言、共同进步。
祝贺石头狮子、Woj、kursk.ye、Miaozhe、肖一林、曹铮、雷霹雳的爸爸、vash_ace、Walter,也要感谢I am a psycho、magict4、李林、Woong、L.B.Q.Y指出我文稿中的疏漏,一并送出学习奖励礼券。