面試之前先刷幾篇面經,或者做幾道熱門面試題,想必是大家很熟悉的一種複習方式了,就像我們當年經常做五年高考三年模擬一樣。但是可不要把面試題和麵經當成你的主要複習方式,它只是錦上添花,絕非雪中送炭!
壹
面經的意義
面經是別人的面試經驗,所謂前車之鑑,後事之師。我們可以通過麵筋對自己的不足查缺補漏,卻不能把這些面試題等同於我們所要掌握的知識點。原因很簡單,兩篇面經可能會有很多的重複知識點,100篇面經也無法包含所有知識點,所以在只刷面經的問題就是:重複多、不全面。
其實筆者以前也很喜歡刷面經,在面試前幾天把該公司這個崗位的面經刷一遍,面試時還是可以遇到很多類似的問題的。這種做法短期內效果確實好,但是如果從長計議,只刷面經的複習方法實為下策。
作者在春招時才發現問題的嚴重性,吃了不少虧,簡單來說就是:別人的面試題和麵試總結看了又忘,忘了又看,本質性的東西沒有掌握。
貳
你還記得多少面試題?
在春招剛剛結束的這段時間,我總結了一下春招面試過程中的一些問題,主要就是:之前學過的東西忘記了很多,特別是那些理解的不夠深的知識點,總是特別容易忘記。另外我發現,雖然我在筆記中記錄了很多的知識點和麵試題,但是往往我只看過一次,不會再去看第二次。
這也意味著,雖然記錄的內容很多,但是真正消化吸收的內容很少,腦子裡充斥著總是那些零碎的知識點和麵試問題,對於完整的知識體系知之甚少。這些問題在春招期間也不斷地暴露出來,讓我思考了很久。
面對如此窘境,我想做出改變,趁著現在時間充裕,我想要為這些內容做一次減法,並且藉此機會,推翻自己原有的知識體系,重建新的知識框架。簡單說來,就是重新開始學習Java後端,這次我要用一種更高效的方式,避免走之前走的彎路,要用最高效,最合理的方式去複習。由於我之前已經有基礎,所以我對完成這一目標有信心,相應地我也為此做出了明確且詳細的學習計劃。
一、閱讀原始碼
閱讀、分析原始碼是程式設計師最基本的碼程式碼能力也是碼農的根本所在,學習經典原始碼中所用到的經典設計思想及常用設計模式,能夠幫你瞭解大牛是如何寫程式碼的,從而吸收大牛的程式碼功力。在阿里面試中,MyBatis,Spring等框架的底層原理是經常會被問到的
二、分散式架構
阿里巴巴有很多大團隊,這種大團隊裡有很多小團隊,到小團隊之後,做的業務都不相同,如果想立足成為一線網際網路公司中的萬能選手,最主流的分散式架構中有很多知識都是必須要去了解與學習的。並且在阿里面試過程中,面試官會問到實際應用場景的問題:比如微服務化、使用者量、併發量、業務複雜度以及可擴充套件程度等,這裡不多贅述。本屌提供一個分散式架構的學習思路也是自己目前還在學習中的體系:
三、微服務架構
微服務是現在網際網路架構技術中最火熱的話題之一,也是本屌目前正在學習研究的方向。在阿里面試過程中,面試官很少會問到關於微服務相關的問題。但作為一名開發者,一名有技術夢想的程式設計師微服務架構是現在必須要去了解的主流技術,小編給自己制定了一個微服務技術的學習計劃:
四、併發程式設計
併發程式設計幾乎是所有網際網路公司面試必問問題,併發程式設計是Java程式設計師最重要的技能之一,也是最難掌握的一種技能。它要求程式設計者對計算機最底層的運作原理有深刻的理解,同時要求程式設計者邏輯清晰、思維縝密,這樣才能寫出高效、安全、可靠的多執行緒併發程式。目前網上沒有系統的全面的併發程式設計學習大綱,我搜集了很多資料總結出來一個最全面的學習大綱:
五、效能優化
效能一直是讓程式設計師比較頭疼的問題。當系統架構變得複雜而龐大之後,效能方面就會下降,特別是阿里巴巴這樣的一線網際網路公司最為注重,因此想進入阿里,效能優化一定是要去深入學習與理解的一環,本屌在效能優化這一塊雖然不能算專家,也可以自信的說是精通了(注意:自己的簡歷上一定不要寫精通xxxx,要不然面試官會懟死你。好在本屌這一塊還算自信)
六、B2c商城專案實戰
七、底層知識
從架構設計,到應用層調優,再深入瞭解底層原理,紮實的Java基本功才能讓自己變為掃地神僧:
記憶體模型
併發模式
執行緒模型
鎖細節
以上七大知識體系是我從業多年總結出來的經驗,都是當前最主流的技術。如果對Java分散式、工程化、高併發、微服務,JVM等技術,歡迎大家來討論。
叄
忘掉過去,重拾基礎
忘記過去,才能更好地開始。當然,也不是真的要大家忘記以前學過的知識點,只是建議各位把之前學的不紮實的技術重新地學一遍,不要只憑著印象去記憶知識點。
前面提到我在秋招前完成了知識體系重建,那在這裡我也想跟大家分享一下我當時大致的知識體系構成。就跟我前面說的一樣,我選擇重新再學一遍Java後端相關的技術內容,因為我知道大致的學習方向,並且有一定的基礎,所以看很多文章變得更加得心應手,寫文章和做總結也更加有底氣了。
首先在Java基礎方面,我寫了20多篇原創部落格,主要是對Java核心技術的解析,比如"Java反射"、"Java序列化和反序列化"、"Java異常體系"等等。
在Java集合類方面,我原創了部分文章,另外整合了一些比較好的技術文章,其中最主要的就是關於hashmap的文章,當時我整合的文章幾乎沒有遺漏任何一個知識點。
在Java併發程式設計方面,我主要參考了併發程式設計網以及一些優質部落格的文章,先搞懂了Java併發原理,再一步步學習JUC併發包的元件,其中重點看了chm,併發工具類以及阻塞佇列等JDK原始碼的解析文章,除此之外,我還會在IDE中跑JUC相關的emo,畢竟這方面的內容非常需要實踐。
在Java網路程式設計方面,我先從最基礎的socket入手,再講到NIO,AIO,並且加入了幾篇對Linux IO模型解析的文章,讓整個知識體系更加完整(因為NIO是基於Linux Epoll實現的),接著我又加入了對Netty的探討,以及Tomcat中對NIO的應用,可以說是把Java網路程式設計一些比較重要的部分都囊括進來了。為了更好理解這部分內容,我也在網上參考了很多客戶端和服務端通訊的demo,最後我分別用Socket,NIO,AIO以及Netty把C/S 通訊的demo都寫了一遍。
在JVM虛擬機器方面,我則按照《深入理解JVM虛擬機器》這本書的行文脈絡進行文章的整理。在搞定JVM基本原理以後,我著重瞭解了JVM調優和實踐中常遇到的問題,並且整理了常用的JVM調優工具,場景問題以及調優實踐的案例,這也是因為面試中對JVM調優實踐越來越重視了。
在JavaWeb方面,我從Java Web相關技術的發展入手,一步步瞭解了每種技術存在的意義,比如JSP,Servlet,JDBC,Spring等等,然後對每種技術進行了比較全面的瞭解,並且著重地看了Spring和SpringMVC的原始碼分析文章,另外一方面,我花了很多時間去研究Tomcat的工作原理。除此之外,JavaWeb專案中常用的maven,日誌元件,甚至是單測試元件,也納入了我的系列文章裡。
在資料庫和快取方面,我主要學習了MySQL和Redis這兩種最常用的資料庫。對於Mysql,我從簡單的sql開始瞭解,然後開始瞭解sql優化,MySQL的儲存引擎和索引,事務及鎖,還有更復雜的主從複製,分庫分表等內容。對於Redis,我也是從簡單的api入手,然後去了解每一種資料結構的底層實現原理,接著嘗試去學習Redis的持久化方式,以及作為快取常需要考慮的技術點,當然,也包括Redis的分散式鎖實現,以及它的分散式叢集方案。
最後一部分就是分散式相關的理論和技術了,這個也是困擾我很久的一塊內容,我主要把這塊內容分為兩個部分,分別是分散式理論和分散式技術,理論方面,我先了解CAP,BASE等基本知識,然後開始學習一致性協議和演算法,接著探討分散式事務。
對於分散式技術,涉及的東西就更多了,例如分散式session,負載均衡,分散式鎖等內容,這些知識點我都會用一到兩篇文章去總結,對於分散式快取,訊息佇列,以及分散式服務等內容,我會花比較多的時間去全面學習,然後總結出一個系列的文章出來。當然,對於這些技術的學習主要還是停留在理論方面,在自己的專案中能用到的比較少。
至此,我的知識體系基本構建完成,這也是我在春招中能夠成功闖過那麼多面試的原因。