每日最新頭條.有趣資訊

Java工程師的成長路線圖是什麽?

平時經常能聽到一些同學困惑,“面試造火箭,天天擰螺絲”,每天進行重複的業務開發,似乎自己的能力被日常工作限制,無法突破提高自己的能力水準。

我想說,難道懂得如何造火箭,還能沒有實際價值嗎?它的價值在於,當真的出現不可預測的、具有挑戰性的任務時,你能不能 Hold 住。

我是極客時間《Java 核心技術 36 講》作者、前 Oracle 首席工程師楊曉峰,今天,我想借自己的經歷,跟大家分享Java 工程師從新手進階到專家的路線圖是什麽?有哪些階段?每一階段又該掌握哪些技能?

舉個真實的例子,前段時間周末,我被著急拉去優化一個 Go 語言開發的系統,馬上要上線了但實際吞吐量與需求有數量級差距。對,你沒看錯,不是 Java 應用,而且我對 Go 的了解基本就是 HelloWorld 水準。下面我簡單介紹一下,如何利用基礎知識,快速定位問題,並通過兩個代碼量有限地修改,實現吞吐量的數量級提高。

初始的表現是,非常低的負載下,CPU 利用率就已經超過 80%。首先,通過第 33 講的類似過程,定位問題在於低效實現導致的高 CPU 佔用問題,利用 Go Profiling 發現熱點代碼,據此快速查出一個最頻繁操作的算法複雜度是 nlogn。

修改為 logn 複雜度算法後,系統又表現出了新的特徵,隨著負載壓力的提高,CPU 利用率無法超過 60%,記憶體、I/O 也還有很大余量,吞吐量雖然已經有數量級提高,但還是達不到設計目標。

進一步分析發現在某共享模塊,竟然有可觀的同步開銷,原來不必要的共享以及其實現內部採用的一些線程安全手段,限制了系統的擴展性。將該模塊修改為非共享實例後,CPU/ 記憶體等計算資源就得到了充分利用,吞吐量基本達到理論峰值。

這個問題本身難度並不是很高,使用的也是基礎知識和技能,但也能說明掌握扎實的“基本功”,可以讓你剝開問題的表象,感受到技術本質的價值所在。

但是,我發現很多技術人不具備這種“解決問題”的能力,我覺得主要是以下 2 個原因:

第一,“知其然不知其所以然”。做了多年技術,開發了很多業務應用,但似乎並未思考過種種技術選擇背後的邏輯。

第二,知識碎片化,不成系統。無法完整、清晰地描述自己所開發的系統,或者使用的相關技術。

我去年在極客時間推出的《Java 核心技術面試精講》專欄,就是希望可以讓你可以透過問題看到本質,提高“解決問題”能力。

在專欄裡,我從 Java 核心知識點和能力出發,精選出 36 道 Java 面試題。每期針對 1 道題目,不僅會給出典型回答和考點分析,還會剖析 Java 核心知識點,將其講清講透,讓你徹底領悟題目背後所考察的能力,幫你梳理複習 Java 知識體系。不管你是在準備面試、還是想進階 Java,你都可以通過這個專欄,提升 Java 技能。

春節優惠,《Java 核心技術面試精講》超值參團只需 ¥79,原價 ¥99,立省 ¥20。想搞定 Java 面試的朋友,推薦你深入學習。再加上春節粉絲專屬優惠口令,支付時輸入:infoq2020(口令僅限前 100 人有效),還能再減¥15,到手價只要¥64▽

“德雷福斯模型”是一個常見的能力、水準劃分方法,我們可以試著把 Java 工程師劃分為新手、高級新手、勝任者、精通者和專家。

那如何找到自己所處的能力水準,通過學習和實踐實現進階呢?

一、新手

如果你是新手階段,全面、扎實地掌握語言的基本要素是當務之急。在這個階段我認為是有無限可能的,因此我並不建議完全用《Java 核心技術面試精講》專欄作為 Java 語言入門的課程,而是更應該找到更基礎的、系統的 Java 書籍或者課程。

你可以在正規的指導下飛速進步,並培養出良好的編碼習慣。然後可以再結合專欄,看看 Java 技術領域典型的、長期的熱點話題,了解業界通常從哪些角度判斷你的能力和水準。

你可以從專欄的基礎模塊,看到 Java 領域長期的熱點話題(十年前面試就會問,一直問到今天),比如:

第 2 講 | Exception 和 Error 有什麽區別?

第 3 講 | 談談 final、finally、finalize 有什麽不同?

第 4 講 | 強引用、軟引用、弱引用、幻象引用有什麽區別?

二、高級新手

工作了幾年,整天忙於業務代碼,很容易困惑下一步的方向在哪裡,相當多的程序員長期停留在高級新手的階段。一個常見的表現就是發展成為了“面向搜索引擎”編程工程師,擅長快速利用開源項目或者以往成果,完成一些“OK”的工程任務。這本無可厚非,職業路線很多,未必每個人都想成為底層專家。

但是,如果想在技術領域更進一步,一定要避免下面兩個問題。

面對沒見過的、一定規模的或者較高標準的問題時無所適從,具體表現為“領導,你看這樣行嗎?”。沒做過互聯網高並發應用,難道就不能對並發編程有相對深入的思考嗎?比如,習慣了使用 Executors,你有沒有思考過不同的線程池到底適合什麽場景?當前的實現在未來業務量增長下可能出現什麽問題?(參考第 21 講 | Java 並發類庫提供的線程池有哪幾種?分別有什麽特點?)

無法獨立提供有說服力的、有深度的分析、設計和實現,比如業務系統運行一段時間就變慢,調整 Heap 大小,似乎仍然 OOM。目前團隊處理的方式就是重啟伺服器,有沒有想過去發掘真正的原因,真正去解決它?(參考第 26 講 | 如何監控和診斷 JVM 堆內和堆外記憶體的使用?)

另外,我也推薦你看看專欄裡這些內容:

第 6 講 | 動態代理是基於什麽原理?

第 9 講 | 對比 Hashtable、HashMap、TreeMap 有什麽不同?

第 11 講 | Java 提供了哪些 IO 方式?NIO 如何實現多路複用?

第 18 講 | 什麽情況下 Java 會產生死鎖?如何定位、修複?

第 27 講 | Java 常見的垃圾收集器有哪些?

我建議不要滿足於這些表面的特徵,要學會用白盒的視角看待技術內部,系統性的思路掌握普遍規律。即使未來你不在一線編碼,或者未來不再使用 Java,同樣的思維習慣和積累也是很有幫助的。

三、勝任者

那如何才能算是擺脫了高級新手的階段呢?或者換句話說,如何成長為團隊的核心成員?這取決於你能背多大的鍋、填多大的坑,比如你已經可以:

獨立負責做 GC 調優,即使沒有歷史經驗,也能給出有說服力的方案。(參考第 28 講 | 談談你的 GC 調優思路?)

在 JVM 領域有充足的技術經驗和知識儲備。(第 25 講 | 談談 JVM 記憶體區域的劃分)

全面評估評估後台變慢等問題的複雜度、風險點、解決的可能性。(參考第 33 講 | Java 後台服務明顯變慢,談談你的診斷思路?)

對於所謂本質的思考和理解,能聽懂深入的抽象觀點。

並且,除了 Java/JVM,還要掌握更完整的技能樹,例如分布式系統設計、數據庫隔離級別選型等。

另外,我也推薦你看看專欄裡這些內容:

第 39 講 | 談談常用的分布式 ID 的設計方案?Snowflake 是否受冬令時切換影響?

第 36 講 | 談談 MySQL 支持的事務隔離級別,悲觀鎖和樂觀鎖的原理和應用場景?

其實,《Java 核心技術 36 講》專欄的內容也是為了提醒勝任者,在實際工作中往往不會界限分明,團隊核心往往要能夠 Hold 住不同技術領域、切換不同角色,比如架構設計、核心代碼開發、緊急線上問題突破等。

掌握將“OK”的事情做到“excellent”程度的能力,不斷地進行高效實踐、領域的擴展和精深,我們就可以達到並超過勝任者,逐步成為精通者和專家。

四、精通者和專家

如果你已經精通 Java 語言或者是特定領域的專家了,那這個專欄對你的幫助可能體現在不同角度,可以當作特定領域的、不同視角吧。例如,在這個階段,精通者或專家能夠:

提煉並發工具類的一般性指導方法。(參考第 19 講 | Java 並發包提供了哪些並發工具類?)

告訴團隊如何寫出安全的 Java 代碼,防範看似安全下隱藏的風險。(參考第 32 講 | 如何寫出安全的 Java 代碼?)

借鑒 Java/JVM 中的一些技術,從基礎能力上提高自身平台的能力。例如,PHP 7 中引入的 JIT,帶來了極大的性能提升,第 35 講中對 JIT 的介紹,就有了新的用武之地。(參考第 35 講 | JVM 優化 Java 代碼時都做了什麽?)

如何通過 Container-Aware 技術,提高 Kubernetes 集群中 JVM 負載的可靠性。(參考第 30 講 | Java 程序運行在 Docker 等容器環境有哪些新問題?)創造某一類問題的解決方法。例如,似乎 Java 工程師動不動就是 Happen-Before,除了耍酷,能不能從更高的高度看待:JMM 是如何實現了編譯器工程師、JVM 工程師、Java 開發者甚至不同廠商之間的一致性規範?

如何創造性地避免了早期 C++ 記憶體模型在不同廠商之間的混亂?(參考第 29 講 | Java 記憶體模型中的 happen-before 是什麽?)

《Java 核心技術 36 講》專欄讀者評價:

專欄訂閱量穩居極客時間 Top 3,好評多多,部分如下:

最後再強調一下,《Java 核心技術面試精講》現在訂閱只要¥64(加上 InfoQ 專屬優惠口令:infoq2020,僅限前100人),絕對是歷史最低價格,掃描下面二維碼即可訂閱:

獲得更多的PTT最新消息
按讚加入粉絲團