這次在CSDN Blink發表了幾篇關於Java程式設計學習的小作文,講述了Java工程師的成長路線、Java學習的技能樹和入門工作要關注的核心問題,我繼續做一次文章的整合與延展,以文章的形式發表出來,勉勵各位能在技術事業上不斷突破。
1. Java學習之路,我們該怎麼走?
我記得2002年的那一場雪之後快畢業了!有一天翻了一本雜誌,好像是《程式設計師》,裡面說Java將來牛逼,我就心動了,去招聘會面試Java開發,一點也不懂程式設計的我,被面試官懟得無地自容,就下定決心,買了本侯捷先生翻譯的《Java程式設計思想》開始自學Java。從那時候起到現在,我自認已經是很高階別的企業級Java架構師了,好了不自吹了!
Java學習需要經歷比較漫長的過程,才能達到高階別層次,具體來講就是:編碼級、效率級、模式級、架構級和骨灰級
編碼級:一般常見於學習程式設計兩年以內的Java程式設計師,當然不排除極高天賦的選手。在這個過程你並不追求程式碼質量(效率、結構和可擴充套件性),更多是模仿高工們的程式碼,實現應用邏輯。在這個過程一定要記住,要追求功能的完善與閉環,這個說起來簡單,做起來往往有很多細節,千萬不要指望產品經理,可能你們公司還沒有此崗位。但是這對初級別程式設計師的習慣養成是關鍵時期。
效率級:當你對Effective Java這本書看的津津有味的時候,那麼證明你開始進階了!這一般常見3-5年的程式設計師,因為你開始對自己寫的程式碼有講究了,什麼是單態,什麼是工廠,如何控制異常等等,明白了程式碼重構的重要性,開始對各種技術框架品頭論足,往往到了這個階段的程式設計師前途光明!
模式級:設計模式不是書裡面看出來的,而是經歷了上個階段的各種精益求精的技巧考究後,當你翻看不同的設計模式講義時,心裡會總有種似成相識的感覺,亦或者驚訝的讚歎:臥槽,原來可以這麼搞啊!請相信我,這時候你的程式碼進入到了晦澀難懂的時期,源於過度運用設計模式會導致別人看不懂,當懂得推己及人的時候,自然就跳出來了!
架構級:進入這個階段,應該有8-10年的開發經驗,這個過程很容易進入管理路線,這是好事,但若能把持住自己,主心骨仍然繼續深入技術探索當中,那麼你就會發覺架構師的真正意義了,一件產品從創世到面世,架構師努力開拓出整體結構,又始終陪伴在產品的身邊,守護著它的點點滴滴,就好像潤物細無聲一樣,不斷糾正和兜底技術團隊在開發過程中的錯誤,讓產品在正確的軌道靜靜等航行。
骨灰級:當你經歷了很多事情,內功深厚,手中、心中已無劍,來什麼新技術,直接瞭解技術框架就行了,再不成看看原始碼,甚至可以提幾個好的建議。這時候你更希望在某個應用領域成為名至實歸的專家,更希望能將自己的所知所學用一種方式,也許是開源,也許是知識,影響更多的技術人。
2. Java學習的技能點有哪些?
接著就有同學問了,著重應該學習那些技能呢?我作為Java老架構師今天就不廢話了,直接開講!
首先剛開始學習Java除了語法之外就是資料結構了,一定要深刻理解和會用Java.util.collection框架,這是Java教父Joshua Bloch的傳世之作,對於高頻使用的List,Map脈系原始碼建議通讀,看看大師鬼斧神工的手法。
其次就是要記住Doug Lea這位大師,他是Java併發包的作者,要把學習Java多執行緒和併發控制作為Java學習的基礎任務,因為這個複雜的網際網路雲平臺時代,懂得多執行緒就是程式設計師的標配。
再次談框架,很多新人一上來就是Springboot,殊不知它是一個技術棧的微型整合者。我們不要讓它把所有技術封裝遮蔽掉,而要從Servlet/Jsp規範,Tomcat容器的經典學起才能明白Web底層邏輯,再配上Springframework的Bean管理、ORM、AOP這才學到了根子上,當你明白了核心,看似高階的內容其實都是這些基本元件的整合!
Spring全家桶+Mybatis依然是主流,我至今依然認為這是一種程式設計師被碼農化(開發簡易自動)的趨勢,但沒辦法,學習它們是必須的。不同於Hibernate的侵入性,MyBatis用起來更簡易且更易於自定義,這是符合網際網路發展需求的,但我更喜歡前者,充分的物件導向。
另外Java的學習離不開一些外部資源的高頻結合:
第一就是資料庫了,而資料庫的學習重點在於設計正規化和事務例如隔離級別,NVCC這些;
第二就是Redis,純記憶體的K/V字典,主要為高併發查詢快取資料防止資料庫穿透,這就是網際網路發展的必然需求;
第三就是Http協議、SSL加密協議、操作Json和Restful架構風格的深刻理解,與前端主要的互動方式。
第四更高階別需要理解訊息MQ的非同步通訊機制和應用,Api閘道器對於微服務的排程,核心是Nginx,以及微服務的註冊發現、RPC呼叫的技術實現。
第五目前物聯網技術愈來愈普及,對於Netty,SocketIO這種網路通訊技術的掌握。
第六大資料技術方面,對於ES、Kafka、MongoDB、Cassandra這些適合與上層Java應用結合的框架會被大量應用。
最後就是容器技術,Docker必學,那麼Linux Shell程式設計就要掌握了,容器太多要考慮K8s編排!
3. 找工作,Java學習到什麼程度?
最後今天我再補充一點更實際的內容,就是Java學到什麼程度就可以找工作了!
如果要著眼於找工作,那麼就一定要了解真實的Java工作環境,在我二十年從業經驗中,大概換了不同型別的公司不下六七家,面向包括能源、網際網路、醫療、稅務、金融、軍工、政務等,都是以Java為主力,超過一半時間都是作為技術或專案管理者負責協助招聘。因此我說的更具有普適性。
Java的核心價值就在於網際網路與企業的雲應用,隨著移動網際網路時代成為主流,誘發了前後端分離的興起,逐漸前端從Java web體系中異化出來(形成了前端h5+js框架(例如Vue),iOS和Android原生,微信小程式,以及原生統一開發框架Flutter),這是未來很多年都難以替換的移動化開發體系。
那麼在以網際網路業務為主的企業中Java工作機會就一定是向後端看齊,作為初中級工程師,關鍵是在非常成熟的開發框架下,將最基本的增刪改查業務搞熟練。
很多程式設計師估計看到這裡會嗤之以鼻,哪有高併發、效能調優、演算法等等有難度,實際越高度複雜的問題往往在架構中會匯聚在很小的層面,需要的更少更富有經驗的高程去解決。但是最直接的搬磚工作在架構中是樹的枝葉,人體的毛細血管,遇到的業務問題比想象中要複雜得多。
重點就來了,熟練掌握Spring(Boot、IOC、MVC、Dao...)、Mybatis,僅僅是會用工具,
核心問題是流動在前後端之間的業務問題如何清晰的物件責任定義,就要對模型驅動、充血貧血有深刻的理解,不至於程式碼越寫類越耦合越強,邏輯越混亂。
核心問題是分層間如何清晰的分工,多少的邏輯應聚合在一個事務內,多少邏輯應止步於控制層,就要對MVC深刻的理解與運用,形成服務介面與資料介面漂亮的扇形聚合,這也是對事務管理的極大可靠性保障。
核心問題是外界對接的不斷干擾如何應對,可能今天要對接RPC,明天就是MQ,後天又是Restful,這些遠端通訊協議不僅要掌握清楚,更關鍵是物件設計,如何利用介面卡與主體結構解耦,如何避免遠端介面呼叫耦合進本地事務操作導致拖死Jdbc。
這些問題都是在具體問題中高頻發生,而又是毛細血管一樣牽一髮而動全身。因此作為實戰經驗豐富的開發組負責人,對新人在這些方面的考量才是重心。
因此作為初學者,不要一開始就把自己注水成胖子,什麼都學,什麼也學不好。另外不要忽視一個問題,這個行業還有大量傳統的專案如同長尾一樣,並不是目前網際網路開發框架,有更老的ssh架構,很多時候前後端並不分離,那麼對Web前端框架,例如像Struts這種JSP標籤的Web前端體系扔需要掌握與學習。
本文由「