开篇--Java程序员如何快速成长?

2023-11-02

你好,很高兴你走进我的“深入拆解 Tomcat & Jetty”专栏,与我和其他同学一起探讨熟悉又陌生的 Tomcat 和 Jetty。

如果你和我一样选择了 Java Web 开发这个方向,并且正在学习和提高的路上,你一定思考过这个问题:

我怎样才能成长为一名高级程序员或者架构师?

对于这个问题,每个人的答案都可能都不太一样,我先来讲讲我的经历。十年前我在实习的时候是做嵌入式系统开发,用的开发语言是 C 和 C++。出于我个人的兴趣爱好,当时我想转 Java,在学了一段时间的 Java 后,发现 Java 上手还是挺快的,API 比较齐全,而且也不需要自己来管理内存,感觉比 C 语言高级。毕业后我也顺利地找到了一个 Java 开发的工作,入职后我的工作主要是实现一些小模块,很多时候通过代码的复制粘贴,再稍微改改就能完成功能,这样的状态大概持续了一年。

在这个过程中,虽然我对 Java 语法更加熟悉了,也“背”过一些设计模式,用过一些 Web 框架,但是我很少有机会将一些 Java 的高级特性运用到实际项目中,因此我对它们的理解也是模糊的。那时候如果让我独立设计一个系统,我会感到非常茫然,不知道从哪里下手;对于 Web 框架,我也只是知道这样用是可以的,不知道它背后的原理是什么。并且在我脑子里也没有一张 Java Web 开发的全景图,比如我并不知道浏览器的请求是怎么跟 Spring 中的代码联系起来的。

后来我分析发现,我的知识体系在广度和深度上都有问题。为了突破这个瓶颈,我当时就想,为什么不站在巨人的肩膀上学习一些优秀的开源系统,看看大牛们是如何思考这些问题的呢。

于是我注意到了像 Tomcat 和 Jetty 这样的 Web 容器,觉得它们很神奇,只需要把 Web 应用打成 WAR 包放到它的目录下,启动起来就能通过浏览器来访问了,我非常好奇 Web 容器是如何工作的。此外 Tomcat 的设计非常经典,并且运用了方方面面的 Java 技术,而这些正好是我欠缺的,于是我决定选择 Tomcat 来深入研究。

学习了 Tomcat 的原理之后,我发现 Servlet 技术是 Web 开发的原点,几乎所有的 Java Web 框架(比如 Spring)都是基于 Servlet 的封装,Spring 应用本身就是一个 Servlet,而 Tomcat 和 Jetty 这样的 Web 容器,负责加载和运行 Servlet。你可以通过下面这张图来理解 Tomcat 和 Jetty 在 Web 开发中的位置。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3l6aF8yMDE3,size_16,color_FFFFFF,t_70

随着学习的深入,我还发现 Tomcat 和 Jetty 中用到不少 Java 高级技术,比如 Java 多线程并发编程、Socket 网络编程以及反射等等。之前我仅仅只是了解这些技术,为了面试也背过一些题,但是总感觉“知道”和“会用”之间存在一道鸿沟。通过对 Tomcat 和 Jetty 源码的学习,我学会了在什么样的场景下去用这些技术,这一点至关重要。

还有就是系统设计能力,Tomcat 和 Jetty 作为工业级的中间件,它们的设计非常优秀,比如面向接口编程、组件化、骨架抽象类、一键式启停、对象池技术以及各种设计模式,比如模板方法、观察者模式、责任链模式等,之后我也开始模仿它们并把这些设计思想运用到实际的工作中。

在理解了 Web 容器以及 JVM 的工作原理后,我开始解决线上的疑难杂症,并且尝试对线上的 Tomcat 进行调优。性能的提升也是实实在在的成果,我也因此得到了同事们的认可。

概括一下,独当一面的能力,离不开技术的广度和深度。

技术的广度体现在你的知识是成体系的,从前端到后端、从应用层面到操作系统、从软件到硬件、从开发、测试、部署到运维…有些领域虽然你不需要挖得很深,但是你必须知道这其中的“门道”。

而技术的深度体现在对于某种技术,你不仅知道怎么用,还知道这项技术如何产生的、它背后的原理是什么,以及它为什么被设计成这样,甚至你还得知道如何去改进它。

但是人的精力是有限的,广度和深度该如何权衡呢?我建议找准一个点先突破深度,而 Tomcat 和 Jetty 就是非常好的选择。但同时它们也是比较复杂的,具体应该怎么学呢?我想通过这个专栏,来分享一些我的经验。

首先我们要学习一些基础知识,比如操作系统、计算机网络、Java 语言,面向对象设计、HTTP 协议以及 Servlet 规范等。

接下来我们会学习 Tomcat 和 Jetty 的总体架构,并从全貌逐步深入到各个组件。在这个过程中,我会重点关注组件的工作原理和设计思路,比如这个组件为什么设计成这样,设计者们当时是怎么考虑这个问题的。然后通过源码的剖析,加深你的理解。更重要的是,帮你学会在真实的场景下如何运用 Java 技术。

同时我还会通过 Jetty 与 Tomcat 的对比,比较它们各自的设计特点,让你对选型有更深的理解。并且通过思考和总结,帮你从中提炼一些通用的设计原则,以及实现高性能高并发的思路。

在深入了解 Tomcat 和 Jetty 的工作原理之后,我会从实战出发,带你看看如何监控 Tomcat 的性能,以及怎么从内存、线程池和 I/O 三个方面进行调优,同时我也还会分析和解决一些你在实际工作中可能会碰到的棘手问题。

在这个过程中,我还会介绍 Tomcat 和 Jetty 支持的 Servlet 新技术,比如 WebSocket 和异步 Servlet 等,我会重点分析这些新技术是从何而来,以及 Tomcat 和 Jetty 是如何支持的。这些都是 Web 技术的最新动向,你可以在自己的工作中根据需要选用这些新技术。

总之,弄懂了 Tomcat 和 Jetty,Java Web 开发对你来说就已经毫无“秘密”可言。并且你能体会到大神们是如何设计 Tomcat 和 Jetty 的,体会他们如何思考问题、如何写代码。比如怎样设计服务端程序的 I/O 和线程模型、怎样写高性能高并发程序、Spring 的 IoC 容器为什么设计成这个样子、设计一个中间件或者框架有哪些套路等…这些都能快速增加你的经验值。

成长的道路没有捷径,不仅需要上进心和耐心,还要保持对知识的好奇心。如果你也想在技术和视野上有所突破,拥有独当一面的能力,从 Tomcat 和 Jetty 入手是一个非常好的选择,我也邀请你与我一起探究 Tomcat 和 Jetty 的设计精髓,一起收获经验、享受成长。

最后,如果你正在 Java Web 开发这条路上向着架构师的方向狂奔,欢迎你给我留言,讲讲你所付出的努力、遇到了哪些问题,或者写写你对这个专栏的期待,期待与你交流。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开篇--Java程序员如何快速成长? 的相关文章

随机推荐

  • 狂写11300字,我整理了mysql高级部分思维导图

    其实也谈不上高级部分 学的时间更长 整理历时两周多 也是学的囫囵吞枣吧 毕竟这个东西真很复杂 不可能面面俱到 总有遗漏的 只能说我把一些浅显的知识点 大块的知识点整理了一下 稀碎的 涉及到linux cache 内核层面 mysql c语言
  • vue+element ui中动态实现级联选择器 el-cascader踩过的坑

    实现效果图 实现方法 html 备注 props 可初始化一些字段 change事件可以获取所需要的value 值 js 获取动态数据并赋值所需要的数组 这样就基本实现了级联选择器 但是坑来了 描述 当级联选择器内容需要动态变化时 会爆出C
  • Leetcode 反转链表-Reverse Linked List

    Reverse a singly linked list Example Input 1 gt 2 gt 3 gt 4 gt 5 gt NULL Output 5 gt 4 gt 3 gt 2 gt 1 gt NULL Follow up
  • 掌握Python的X篇_30_使用python解析网页HTML

    本篇将会介绍beutifulsoup4模块 可以用于网络爬虫 解析HTML和XML 对于没有接触过前端 不了解HTML是如何工作的 需要先解释一下什么事HTML 1 HTML 网页中的各种布局等的背后都是非常简单的纯文本格式 那种格式称为H
  • 【Python】pydot安装失败解决方法

    使用keras时输出网络结构需要用到pydot 总是安装失败 最后按照下面这样的步骤成功了 1 安装graphviz pip install graphviz 2 安装graphviz软件 地址在 https graphviz gitlab
  • Android RecyclerView的notify方法和动画的刷新详解

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 前言 本篇讲解了RecyclerView关于通知列表刷新的常用的notify方法 和RecyclerVie
  • PyQt5入门1——PyQt5的安装与Hello World应用

    PyQt5入门1 PyQt5的安装与Hello World应用 学习前言 简介 From 百度百科 安装 Hello World 1 窗口构建 a 构建基础类 b 编写UI 2 主程序运行 全部代码 学习前言 搞搞可视化界面哈 虽然不一定有
  • paramiko通过ssh远程登陆服务器执行命令出现错误的问题

    最近为了要实现对远程linux服务器的上传 下载文件 和对远程服务器操作的命令 因此用到了python的一个模块paramiko来实现 上传文件和下载文件这些基本命令是很容易实现的 还有就是通过exec command cmd 命令能对服务
  • ant design中如何在表头中加个Icon和排序,悬浮icon又触发Tooltip

    欢迎点击领取 前端面试题进阶指南 前端登顶之巅 最全面的前端知识点梳理总结 分享一个使用比较久的 需求 本篇文章适用于表头同时添加悬浮和排序 另 只需支持文字悬浮对title封一层方法即可eg const TooltipTitle text
  • matlab字符串处理

    TOC matlab字符串处理 前言 在Matlab中 字符串是用单引号括起来的字符序列 一 字符串的表示 字符串是用单引号括起来的字符序列 gt gt xm Online University xm Online University g
  • MySQL长文本字段的选取

    某个字段需要存储 长文本类型的数据 长度可变 范围不清 varchar最多能存储多大长度呢 何种情况下用text更好 以下内容就为探究这个问题 lt 1 gt 先将content字段设为varchar 255 则此字段只能最多存储255个字
  • 企业生产过程能力分析(CPK)

    系列文章目录 文章目录 系列文章目录 前言 一 Cpk的定义 二 Cp Cpk Pp Ppk之间的关系 1 能力指数Cp 2 中心能力指数Cpk 3 性能指数Pp 4 中心性能指数Ppk 5 关联性 三 Cpk Ppk的区别 四 案例介绍
  • ClickHouse建表语句分析

    MergeTree引擎 Clickhouse 中最强大的表引擎当属 MergeTree 合并树 引擎及该系列 MergeTree 中的其他引擎 MergeTree 系列的引擎被设计用于插入极大量的数据到一张表当中 数据可以以数据片段的形式一
  • Angular基础系列学习(六)--异步数据交互(请求数据&接口调用)

    Angular从入门到放弃秘籍 第一篇Angular的介绍以及基本环境搭建 第二篇Angular模板语法 插值语法 事件绑定 第三篇Angular内置基本指令介绍 第四篇Angular组件的创建 组件声明周期钩子函数 第五篇Angular父
  • Unity踩坑记录—— 归一化距离向量

    Vector3 normalized 和 Vector3 Normalize 依据官方文档解释 前者 Vector3 normalized 是当前向量是不改变的 返回一个新的规范化的同方向上的向量 值为1 后者 Vector3 Normal
  • 网络总结知识点(网络工程师必备)四

    作者 小刘在C站 个人主页 小刘主页 每天分享云计算网络运维课堂笔记 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 夕阳下 是最美的绽放 树高千尺 落叶归根人生不易 人间真情 目录 前言 71 NAPT有什么特点 72 AR
  • java长连接和短连接_[Java教程]Tomcat 长连接与短连接性能测试

    Java教程 Tomcat 长连接与短连接性能测试 0 2015 01 10 19 00 59 环境 操作系统 centos 6 5 x64 cpu 32 core 内存 32G web服务器 tomcat 6 x jdk 1 6x 测试环
  • Java 程序员应该了解的 10 个面向对象设计原则

    http www iteye com news 24488 面向对象设计原则是OOPS Object Oriented Programming System 面向对象的程序设计系统 编程的核心 但大多数Java程序员追逐像Singleton
  • Appium实现app自动化测试

    目录 1 Appium设计 2 Appium环境安装 1 JDK安装配置 2 SDK安装 3 Appium desktop安装 appium server appium inspector工具 3 DesiredCapability 启动参
  • 开篇--Java程序员如何快速成长?

    你好 很高兴你走进我的 深入拆解 Tomcat Jetty 专栏 与我和其他同学一起探讨熟悉又陌生的 Tomcat 和 Jetty 如果你和我一样选择了 Java Web 开发这个方向 并且正在学习和提高的路上 你一定思考过这个问题 我怎样