You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

28 lines
6.9 KiB
Markdown

2 years ago
# 特别放送 | 如何持续保持对学习的兴趣?
你好我是李号双。今天我们抛开技术本身的内容来聊聊专栏或者一门新技术的学习方法我也分享一下自己是如何啃下Tomcat和Jetty源码的。
专栏如今已经更新完了五个模块我们学习了Tomcat和Jetty的整体架构、连接器、容器和通用组件这些内容可以说是Tomcat和Jetty的设计核心。在日常工作的使用中我们使用到了Tomcat和Jetty提供的功能我希望通过学习专栏还能帮你了解这些功能是如何实现的以及Tomcat和Jetty在设计时都考虑了哪些地方。
所以在学习专栏时你不妨思考这样一个问题假如让你来设计并实现一个Web容器你会怎么做呢如何合理设计顶层模块如何考虑方方面面的需求比如最基本的功能需求是加载和运行Web程序最重要的非功能需求是高性能、高并发。你可以顺着这两条线先思考下你会怎么做然后再回过头来看看Tomcat和Jetty是如何做到的。这样的学习方法其实就在有意识地训练自己独立设计一个系统的能力不管是对于学习这个专栏还是其他技术带着问题再去学习都会有所帮助。
说完关于专栏的学习方法下面我必须要鼓励一下坚持学习到现在的你。专栏从第三模块开始开始讲解连接器、容器和通用组件的设计和原理有些内容可能比较偏向底层确实难度比较大如果对底层源码不熟悉或者不感兴趣学习起来会有些痛苦。但是我之所以设计了这部分内容就是希望能够揭开Tomcat和Jetty的内部细节因为任何一个优秀的中间件之所以可以让用户使用比较容易其内部一定都是很复杂的。这也从侧面传递出一个信号美好的东西都是有代价的需要也值得我们去付出时间和精力。
我和你一样我们都身处IT行业这个行业技术更新迭代非常快因此我们需要以一个开放的心态持续学习。而学习恰恰又是一个反人性的过程甚至是比较痛苦的尤其是有些技术框架本身比较庞大设计得非常复杂我们在学习初期很容易遇到“挫折感”一些技术点怎么想也想不明白往往也会有放弃的想法。我同样经历过这个过程**我的经验是找到适合自己的学习方法非常重要,同样关键的是要保持学习的兴趣和动力**。
举个我学习Spring框架的例子记得当时我在接触Spring框架的时候一开始就钻进一个模块开始啃起了源代码。由于Spring框架本身比较庞杂分很多模块当时给我最直观的感受就是看不懂我不明白代码为什么要这么写为什么设计得这么“绕”。这里面的问题是首先**我还没弄清楚森林长什么样子,就盯着树叶看**很可能是盲人摸象看不到全貌和整体的设计思路。第二个问题是我还没学会用Spring就开始研究它是如何设计的结果可想而知也遇到了挫折。后来我逐渐总结出一些学习新技术的小经验在学习一门技术的时候一定要先看清它的全貌我推荐先看官方文档看看都有哪些模块、整体上是如何设计的。接着我们先不要直接看源码而是要动手跑一跑官网上的例子或者用这个框架实现一个小系统关键是要学会怎么使用。只有在这个基础上才能深入到特定模块去研究设计思路或者深入到某一模块源码之中。这样在学习的过程中按照一定的顺序一步一步来就能够即时获得**成就感**,有了成就感你才会更加专注,才会愿意花更多时间和精力去深入研究。因此要保持学习的兴趣,我觉得有两个方面比较重要:
第一个是我们需要**带着明确的目标去学习**。比如某些知识点是面试的热点那学习目标就是彻底理解和掌握它当被问到相关问题时你的回答能够使得面试官对你刮目相看有时候往往凭着某一个亮点就能影响最后的录用结果。再比如你想掌握一门新技术来解决工作上的问题那你的学习目标应该是不但要掌握清楚原理还要能真正的将新技术合理运用到实际工作中解决实际问题产生实际效果。我们学习了Tomcat和Jetty的责任链模式是不是在实际项目中的一些场景下就可以用到这种设计呢再比如学习了调优方法是不是可以在生产环境里解决性能问题呢总之技术需要变现才有学习动力。
第二个是**一定要动手实践**。只有动手实践才会让我们对技术有最直观的感受。有时候我们听别人讲经验和理论感觉似乎懂了但是过一段时间便又忘记了。如果我们动手实践了特别是在这个过程中碰到了一些问题通过网上查找资料或者跟同事讨论解决了问题这便是你积累的宝贵经验想忘记都难。另外适当的动手实践能够树立起信心培养起兴趣这跟玩游戏上瘾有点类似通过打怪升级一点点积累起成就感。比如学习了Tomcat的线程池实现我们就可以自己写一个定制版的线程池学习了Tomcat的类加载器我们也可以自己动手写一个类加载器。
专栏更新到现在,内容最难的部分已经结束,在后面的实战调优模块,我在设计内容时都安排了实战环节。毕竟调优本身就是一个很贴近实际场景的话题,应该基于特定场景,去解决某个性能问题,而不是为了调优而调优。所以这部分内容也更贴近实际工作场景,你可以尝试用我前面讲的方法,带着问题学习后面的专栏。
调优的过程中需要一些知识储备比如我们需要掌握操作系统、JVM以及网络通信的原理这些原理在专栏前面的文章也讲到过。虽然涉及很多原理也很复杂并不是说要面面俱到我们也不太容易深入到每个细节所以最关键的是要弄懂相关参数的含义比如JVM内存的参数、GC的参数、Linux内核的相关参数等。
除此之外,调优的过程还需要借助大量的工具,包括性能监控工具、日志分析工具、网络抓包工具和流量压测工具等,熟练使用这些工具也是每一个后端程序员必须掌握的看家本领,因此在实战环节,我也设计了一些场景来带你熟悉这些工具。
说了那么多,就是希望你保持对学习的热情,树立明确的目标,再加上亲自动手实践。专栏学习到现在这个阶段,是时候开始动手实践了,希望你每天都能积累一点,每天都能有所进步。
最后欢迎你在留言区分享一下你学习一门新技术的方法和心得,与我和其他同学一起讨论。