我的新课《Java异常与调优一站式处理方案》
上海的夏季在下雨,秋季在下雨,冬季在下雨,春天当然也不例外,还在下雨!
2020年8月,开始《Java异常与调优一站式处理方案》这门课程的制作,当时我给我自己定的目标只有一个:这门课程要足够有用,不论是工作还是面试,要都能用得着才行!于是,我开始了自己与自己较劲儿的过程,内容改了又改,作品拖了又拖。直到最近,3月下旬,终于能和大家见面了!
你想要把任何一件事做好,无疑,这肯定需要你付出很多,这个过程肯定会很累。但是,认真过后,当你看到让你满意的作品,你还是会感叹:生活、工作,这一切都挺美好!
这篇文章中,我不想以叙事的过程来讲述我这门课程的心路历程,对,问答,问答才能够表明 『这些都是为什么』!当然,这些问答都不是我凭空想象的,作为慕课网水群最活跃的讲师,水群的过程,其实就是了解大家疑问的过程。
0. 我的这门课程设计主线是怎样的?包含了哪些知识点?
课程的主线围绕两个大的知识体系:异常、调优;并在此基础上对其进行了扩展。最终,课程形成了以『异常、日志、堆栈、调优』四个主题为主线,穿插 IDEA DEBUG 工具,并以 SpringBoot 脚手架工程为范本,帮助你在工程、面试上的技能有质的提升。来看一张图吧,这张图基本上包含了『当前』我的这门课程所涵盖的知识点:
1. 为什么出现了异常就束手无策?
我相信只要你写过代码,你就一定遇到过异常,那么,是不是发现:异常一旦抛出,大段的错误信息会让你毫无头绪?为什么我会这样说呢?因为太多太多的同学遇到问题时,我问他是哪里出错了,得到的回复就是『不痛不痒』的一小段错误消息截图,且根本就不是 Root Cause,对解决问题来说,基本上没有价值。不过,我也确实要为很多 Java 初学者打抱不平!原因有以下三点:
- 课本、教学只教你怎么把代码写正确,但是,这怎么可能呢?
- Java 的异常体系非常的经典而且有一定的难度,没有经过大量的练习、没有很多工程经验,怎么可能理解透彻呢?
- 遇到错误之后,问同学、同事,得到的仅仅是『自己查查』等等类似的话(毕竟,解决你的问题并不是其他人的 KPI)
所以,对于 Java 初学者来说,你需要找到好的学习方向、好的老师,这会让你明显的提高做事效率,这也是我制作这门课的其中一个初衷。但是,你也需要知道,我不可能枚举所有的异常情况,所以,我更多的是教会你方法。当然,再有问题的话,问答区随时欢迎你来提问!
2. 我需要花大量的时间学习 Java 日志体系吗?
首先,我说明下这个问题的结论:一定是需要的!回忆一下,你参与的工程或者负责的工程,日志是怎么配置的?是不是直接拿别人的或者以前的工程日志配置简单的改一改呢?(照猫画虎并不难)我估计,大概率是这样的,因为我也是这样做的,也确实,没有人会再去手敲 XML 配置文件。但是,问题来了,这些配置里的标签你都明白是什么意思吗?出了问题你知道怎么排查吗?
另外,日志配置只是第一步,如何打日志、如何打出优秀的日志才是学会 Java 日志体系的根本。作为程序员,日志能够发挥什么样的作用想必不需要我多说,所以,保证你的日志有意义、不冗余是势在必行的事。我 Review 过大量的代码,发现很多同学打日志都是想当然的,想 log 什么就去 log 什么。虽然,这不会引起代码的 bug,不会降低程序的性能;但是,这样做不好、不够专业。由此,我也花了很多篇幅在 Java 日志体系上面,包含了目前市面上应用最为广泛的两类日志框架:log4j2 和 logback。
3. 大家都是用 IDEA 写代码,他的断点调试为什么这么6?
Java 工程领域,IDEA 的市场占有量已经超过了 90%,所以,如果你还没用过 IDEA,我建议你要把这件事提上日程了。IDEA 提供了强大的 DEBUG 工具:
- 你可以打各种类型的断点,且可以提供参数定制这些断点
- 你可以跟踪代码的执行轨迹,轨迹中变量的值、状态可以一览无余
- 你可以在调试工具中修改『原本的』变量值,一次调试中横跨多种情况
- 你可以在本地远程调试服务器上的工程,这听起来就很 cool
不得不说,熟练的掌握这些工具的使用方法会让你做事情事半功倍;以后再有人跟你说,有个 Bug 你 Debug 下,就能够做到处事不惊了。不过,从我工作、教学的这些年来看,会 Debug 的同学并不多。所以,我的课程中加入了『IDEA 调试』的内容。不过,我仍然觉得关于调试,你还是会来问答区找我。至于为什么我会这么想,哈哈哈,等你来了我再告诉你!
4. Java 线程堆栈 && JVM 性能调优到底是工程必备还是面试必备?
这两个名词(线程堆栈、JVM 调优)相信大家都不会陌生,甚至是人人都叫得出来,但是不知道它们是什么、如何应用,就像我在标题中说的。好吧,我以我个人多年的工程经验来谈一谈这个事,简而言之:95% 的情况下,线程堆栈、JVM 调优不会应用到你的工程中;剩下的 5%,很可能你在工作生涯中遇不到。
面试造火箭,工作拧螺丝!这句话在大多数时候其实并没有夸张,反而现实情况可能会更差。但是,你总是要过这一关,毕竟这些知识点不知道何时何地被何人奉承为了 Java 最基础、最核心的知识点!既然事已至此,我们没有办法改变世界,那么,就需要改变自己。于是,我的这门课程里花了大量的篇幅教会你:
- 什么是线程堆栈、线程堆栈能够用来干什么、怎么用线程堆栈干那些
- JVM 调优调的是什么、JVM 堆的相关概念以及它是怎么玩的、GC 了怎么办,怎么去分析并解决 GC
嘿嘿嘿,告诉你个好消息,我个人也觉得停留于理论太过无聊,所以,我把它们用代码表达出来,用实例的形式告诉你如何应用这些听起来『高大上』的技术。但是,我仍然要强调一点:说到底,你要会说、能说、敢说!面试你的人,和我和你都是一样打工的,镇住他,就 50K;镇不住,不好意思,5K。
5. 程序员的成长经历怎样才是健康的?
我个人在工作中经常给周围的同学说:不要慌!当然,在慕课网水群的时候,我说的更多了。现实社会,确实大家会觉得节奏很快,要加快自己的步伐学习、工作。但是,工程技术真的就这么简单吗?会写了就是懂了吗?大多数时候,不见得是这样的。另外,公司给了很高的 Title,是不是就觉得自己的水平够了呢?
我常常说,步入程序员这一行列,三年以内,把基础打牢,能够完成工程中的业务需求,这就很好了。可能你会说了,不就是 CRUD 嘛,那能有什么难的?哪需要花这么多时间搞那些东西呢?业务需求,完成 CRUD 是真的,但是,你真的觉得 CRUD 就这么简单,不堪一击吗?我来提几个问题:
- 接口的平响达不到要求,慢查询太多,怎么去做优化?理由是什么吗?
- 功能逻辑之间耦合太严重,我要用消息队列解耦,如何去做?
- 我要你给我设计用户登录、鉴权方案,多久能给到我?这样设计的好处以及参考点是什么?
- 代码哪里能做优化和重构,给我解释下目的以及预期的优化程度?
- …
这些都属于 CRUD 呀,是不是发现就是单纯的去完成业务逻辑,也没有那么简单。一定要记住,后端工程可以是 DB 的 Proxy,但是,也会有很多 Logic 需要你去考虑。
工作至今,我个人花了很长时间去打牢基础,学习各种知识点(Spring 框架、Web 框架、语言、消息队列、数据库、缓存等等),当然,这其中也走了很多弯路,浪费了我大量的时间。刚开始的时候,我也以一种『加速』的方式去面对工作、面对技术,但是,到头来,觉察到了:罗马不是一天建成的,欲速则肯定不达。表面上,知道了很多名词、浅显的知识点;实际上,除了不能应用好之外,面试回答也是一团糟。后面,不断的亡羊补牢,不再浮于表面,也终有一些收获。所以,我给你最诚挚的建议就是:在适当的年龄做适当的事,莫慌!
有空的时候、迷茫的时候、无聊的时候、寂寞的时候,来勤一的 QQ 群里聊聊天,来这里感受程序员才能感受到的快乐!加油,年轻人!加油,勤一,你很棒!永远记住:大家都一样,如果不是生活所迫,谁会愿意把自己弄得一身才华!
写这篇文章的时候外面还在下雨!
– 勤一 2021.03.18 星期四 阴雨
共同学习,写下你的评论
评论加载中...
作者其他优质文章