做技術一二三——新人如何做技術?

語言: CN / TW / HK

       今天吃完晚發在和下面的同學遛彎的時候,聊新一代技術人是怎麼做技術的,從而導致現在大部分新的技術人沒辦法對技術有一個很好的認識,也就導致很多人不願意去做基礎架構相關的東西。再聊正題之前,先看看當前我們整個技術體系是什麼樣的,我認為java的技術體系分為以下三類

  • Java基礎技術體系
  • 分散式中介軟體相關技術體系
  • 上層架構框架類技術體系

        其中中介軟體和上層框架的技術體系表現的特別卷,重複的輪子一個接著一個,重複的包裝一層一層的包,最終透露給實際業務研發的就可能是一個失去了整個技術完整性的配置或者註解甚至是引入一個二方包,至於整個功能是如何run起來的,以及逐漸的掌握在那些喜歡造輪子和喜歡包裝的人手裡。而這就導致,剛剛步入我們這個行業的人來說,用到的東西已經不知其所以然了,就更別說知道整個機制和原理。像我最近面試幾個海外建立,人家看似在Apple,Google做業務研發,但是聊下來,就是一個寫API的活,什麼spring原理是啥,jdk原始碼看過沒,都沒有。這或許是當前這個行業發展不可阻擋的趨勢,但是我認為作為一個技術人,還是需要有一點技術熱情,和技術追求。所以站在當前的技術體系下,我們應該怎麼去做技術?怎麼去知其所以然?

        新一代研發往往會陷入一個誤區,就是對當前用的框架往下扒,看整個機制。但是這個過程中,你往往會深陷其中無法自拔,最終放棄,也就導致了從入門到放棄。我以我自身的經驗來講述應該如何去梳理當前技術體系,當前Java技術體系裡面,不管是什麼中介軟體/什麼框架,他始終繞不開的就是那些Java基礎,這些框架和中介軟體無非就是對這些JDK提供的基礎功能進行組裝和抽象,基於模式化簡化使用過程,所以正確的做技術方式是先把Java那些基礎搞明白,這樣才能達到萬變不離其宗,那Java哪些基礎是經常會被框架和中介軟體用到呢?下面我簡單梳理一下:

  1. 反射:反射你會發現是各種框架類經常用到的,比如Spring裡面大量使用反射,反射可以做到無型別構造物件,方法呼叫,元資料獲取。等一些抽象層面的動作和行為,這樣很好的滿足了一些抽象框架層面的訴求。
  2. 代理:代理一般有兩種模式,一種是使用jdk自帶的,另一種是位元組碼增強。代理你會發現在很多工具元件以及框架和中介軟體中大量使用,比如spring的aop,RPC的消費端引用。另外位元組碼增強也會用在一些java agent的無感注入上,比如我們常用的arthas就是基於這個來做的。
  3. J2EE:瞭解j2ee,所有的mvc框架基本都破解了,所有的MVC框架的思想都是通過一個統一的servlet或者filter接觸所有HTTP請求,基於自身框架的規範進行二次路由,而為了滿足j2ee的filter特性,一般都會提供Interceptor疊加在二次路由過程中,然後在結合對request和reponse的裝飾去進行一些程度的抽象和元件定義。而J2EE裡面核心元件就是Servlet和Filter,其他的一些Listener在當前架構下基本很少用到,都被各種框架自身機制所替代。
  4. JDBC:我在面試的時候,經常會問,java事務管理的本質是怎麼實現的,很少有人回答的出來,說明你不瞭解JDBC,也沒用過JDBC進行程式設計,JDBC裡面基本上對資料庫操作的原始能力都記性了定義和實現,比如事務管理,事務回滾。而當前各種框架的事務管理,都是對這些能力的封裝。比如spring的事務管理,就是結合Threadlocal和Connection的事務管控,實現不同差異的事務傳播,實現事務的管理範圍和相應的能力。
  5. IO:IO是各類訊息中介軟體比較關注的地方,這裡涉及到直接記憶體和堆內記憶體,以及零IO訪問,以及隨機讀和隨機寫。瞭解好這一點,對於一些流操作的框架以及訊息中介軟體的訊息儲存基本也就能大致知道其本質。
  6. 網路:Java網路分為阻塞,非阻塞和非同步化。這部分把Netty原始碼研究一遍,基本上也就沒啥問題,以及網路IO執行緒的使用和策略。網路協議的拆包合包機制,自定義網路協議如何實現。這部分大量運用在一些分散式中介軟體中,比如RPC、MQ框架。
  7. Classloader:classloader核心要理解java classpath機制,以及classpath的目的。我們學java開始都會知道classpath,而這個classpath其實就是Classloader載入類的路徑,是被某個Classloader去用的,而Classloader其實是一個類似檔案系統的東西,只不過他是被JVM使用去發現相關資源(類或者其他檔案),他的相對路徑就是classpath。而Classloader一般用於我們再做一些高階的業務架構解耦,比如模組化載入,類隔離,熱部署等。比如OSGI就是Classloader的最佳時間方式,但是一般要做架構解耦,都會打破Classloader的雙親委派機制,重新建立框架自身的機制。瞭解Classloader後,對於一些類找不到的問題會提供更好的排查思路(比如有可能兩個類依賴不在一個Classloader中。)
  8. 其他:
    1. 其他比如SPI機制:用來進行架構分層的解耦,以及架構能力擴充套件
    2. Java相關基礎內容,比如與或運算,時間元件,集合類,併發控制,鎖,原子操作,多執行緒,泛型等。

       瞭解整個java技術體系,再去看當前研發過程中使用的各種框架和中介軟體,都能夠更好的知其所以然,並且在排查問題的時候,能夠提供最原始的依據去推到,也能夠對你當前所用的東西建立體系化的認識。最後,希望有更多新一代人投入到基礎架構建設中來,如果有你是這個人,可以私信我,可以和我一起聊技術,聊怎麼做技術。

分享到: