開篇--Java程序員如何快速成長?

你好,很高興你走進我的“深入拆解 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 開發中的位置。

隨着學習的深入,我還發現 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 開發這條路上向着架構師的方向狂奔,歡迎你給我留言,講講你所付出的努力、遇到了哪些問題,或者寫寫你對這個專欄的期待,期待與你交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章