本文是公衆號讀者再見伐木機投稿的面試經歷
mysql
在此感謝伐木機同窗的分享程序員
===================================面試
掃描下方海報二維碼,試聽課程:
redis
(課程詳細大綱,請參見文末)算法
寫在前面:spring
首先作個自我介紹,樓主男,渣本畢業,座標帝都,差 4 個月 4 年工做經驗。本次面試了幾家獨角獸和一線大廠,都拿了offer,幾乎100%的命中率。sql
在整個面試過程當中,石杉老師的指導給了我很大的幫助,所以將這次面試的經歷以及我的學習方法經過老師的公衆號分享出來,但願能幫到我們更多的程序員兄弟。數據庫
首先想說說我寫本文的思路,不少朋友的面經多是本身的一些經驗之談,也多是一坨很長的各個公司遇到的面試題設計模式
我很瞭解你們的這種訴求與渴望,畢竟本身也看過N篇面經。然而,並非說你看了這篇文章就能夠馬上變強,飯要一口一口吃,路要一步一步走數組
下面的內容第一部分是經驗+學習方法,第二部分是如何準備你的面試
個人複習歷程:
階段一(學習方法之「記憶宮殿-聯想記憶」):
在我一年前給本身定下要去XX公司的目標以後,不間斷的準備了一年
這一年中,我處處在知乎,脈脈,各類技術羣中搜尋着別人的面試題,而後看,作,遇到不會的去查閱資料進行回答,而後儲備到本身的知識庫裏....
一年多下來,據不徹底統計,我看過的面試題可能超過上千道,一個驚人的數字(因此如今別人問我一個題目,基本上都能回答出來)
固然,一年之中的週六日大部分時間都是去公司學習,日常的節假日回家以後固然也是看書和學習,工做日通常會下班以後到家抽出1-2個小時繼續學習
這一年中我讀了大概六七個框架的源碼,看了很多的書,全部的學習視頻都是兩倍速的速度來訓練
有些人看到這裏會以爲很瘋狂,兩倍速聽課?語速這麼快你聽得懂麼?
這個其實也是訓練出來的,一開始是1.2倍,到1.5倍,到1.8倍,到最後的2倍,再快的話聲音就會失真了;固然讀書的速度也是成倍的提高,我記得在機場候機的兩個小時刷完了一本書;
依稀記得過年的幾天假期也仍然保持着一天至少6個小時以上的學習時間,致使一些親戚朋友過來串門的時候都以爲我很冷漠,不理別人。
固然這不算什麼,由於周圍遇到的幾我的會更拼,有些人工做日一天持續3-4個小時學習,非工做日10個小時,有些人甚至一天可能只睡4-5個小時的時間.....
正所謂 取法其上,得乎其中;取法其中,得乎其下,這一年的成長遠超過我前兩年渾渾噩噩的工做及生活。
tips:我當年考駕照的科目一也是這樣,一夜刷了上千道題目,次日去考試,你能夠理解爲題海戰術
但不只僅是題海戰術,這個時候我引伸出個人學習方式的第一大殺器----「記憶宮殿」之「空間聯想」
我其實高中甚至大學的學習方法很爛,由於一直找不到我本身的學習方法,都是題海戰術,靠熬夜,靠多寫題目去和別人拼
後來發現成績並無提升,當時的我多渴望有人直接告訴我一個完美的學習方法,那我直接按照作就行了,然而事實是我在畢業以後,工做的時候才真正找到了屬於個人學習方法。
所謂「記憶宮殿」之「空間聯想」,並非像卷福那樣把知識點都放在腦子中,想像成本身熟悉的各個地方存放
我這裏的「記憶宮殿」也是腦海中的一片連續的內存空間,像數組同樣,這時候我每吸納一個知識點,我會馬上在這片連續的內存空間中找到能和這個知識點強引用,軟引用,弱引用關聯的地方,將他們像樹形結構同樣串起來
因此當我之後想到一個知識點以後,我會當即聯想到與他各類關聯的知識點,脫口而出的再也不是某個單一的知識點,而是既有水平橫向的對比,又有縱向垂直分析的過程。
上述描述可能會有點抽象,我舉一個例子:
假設我如今腦海中有一個知識點(爲了通俗易懂,個人例子儘可能平易近人),這個知識點是這樣:
一個結構CopyOnWriteArrayList,基於一把獨佔鎖的讀寫不互斥的線程安全的結構 [不清楚的能夠專門看一下源碼或者找網上博客去看一下]
而這裏咱們要汲取的知識點並非它做爲一個結構被咱們記住,而是它其中的思想(寫時複製),因此每次當我聽到COW這個東西,我大腦中的那COW一片區域會有大量相關的知識點出來
好比redis的RDB主從複製也是用的COW這種思想,說白了是一個快照的思想
而我這時候忽然又提到了「快照」,這時候腦殼中的知識點很快的將關聯的mysql的MVCC涌現出來
就這樣一層關聯一層,錯綜複雜,層巒疊嶂,但也絲絲入扣,環環相連,成爲一顆不斷壯大的知識樹......
階段二(學習方法之「滔滔不絕-刻意練習」)
上面說過了第一階段其實已經把本身的目標定下來了,可是遇到一個很現實的問題:
你全部遇到的面試其實都是一個和別人交流的過程,你必須將本身的優點徹底展現出來,而且是讓人能聽的簡單易懂的方式
因此第二階段的「刻意練習」分爲兩部分:
第一部分我會將本身學到的知識點刻意拿出來和別人討論,好比同事,好比在一些技術羣
這樣不只在交流的過程當中,你會發現本身哪裏說的不夠嚴謹,不夠規整,不夠深刻,或者說別人也會依據你所說的提出一些問題,若是你不能遊刃有餘的回答出來,說明這個知識點掌握的仍是不夠好;
第二部分其實就是「技術分享」,在團隊中技術分享,或者參加線下的技術分享
這裏有個好處就是,當你進行技術分享的時候,你會帶着壓力
你必須不只僅是分享這個知識點,他相關的點,他橫向涉及的點,以及你分享過程當中別人會提問你的點,還有若是將這個知識點講給一點都沒接觸過這個知識點的人等等
分享一次挑戰難度會很是的大,你必須花十倍百倍的精力去準備一場面試分享
後來面試的時候發現,這其實也算一個加分項,你說你進行過技術分享,有時候別人會讓你聊聊,甚至讓你再進行分享一次,別人會以爲你是一個熱愛技術,願意進行交流的人......
tips: 一些技術氛圍比較好的技術羣裏面你們會常常討論一些生產上遇到的或者面試中遇到的問題。
這時千萬不要視而不見,參與進去,說出本身的想法,而且和別人討論,讓被人給你進行糾正等等,時間長了也是一種變相鍛鍊的過程
階段三(學習方法之「兵臨城下-三輪決戰」):
我是裸辭,因此各位朋友們,搞清楚本身目前的狀態,好好分析本身的狀態,我分析了一下本身的狀況:
1.沒有經濟壓力
2.回家去家裏附近的圖書館複習準備一個月,只管複習不用去考慮別的什麼瑣事
天天起很早開車去圖書館佔座,八點到圖書館的時候,一層就已經排了將近200我的的隊伍,等八點半正式開門,咱們就一擁而上,衝進去搶佔座位
我30天時間只有兩天沒有搶到座位,又返回家中去學習,剩下的28天幾乎是風雨無阻,雷打不動的從早上八點到晚上七點時間學習
固然目標很重要,第一天就把這一個月內要複習的東西所有羅列好,天天按計劃進行
我上面說的三輪是這樣子,我離職以前首先審視了一下本身,發現我整個知識棧體系相對於外面問的東西有幾個薄弱環節,我就專門針對性的去複習
舉個例子,JVM比較薄弱,我就第二遍刷了周志明的書
而後同時天天跟着救火大隊長的JVM專欄,而且我會主動去把全部同窗提出的問題都在評論區給予他們回答,來鍛鍊本身
而後回去知乎上把全部R大關於JVM的回答都瀏覽一遍,至此爲止JVM常見,經常使用的在我這裏都能解答。
第二輪是把本身簡歷上每個點吃透,項目吃透,能把機器配置到流量大小,每個應用層的流量,極限的一些基本參數都得記住,同時天天挑一個重點面試題看,而後能表述出來。
第三輪也就是最後一輪,自我面試,假設本身是面試官看到你的簡歷會問什麼,越詳細越好
找你的簡歷的每個漏洞去問(下面我會詳細的分析你該如何準備你的簡歷,你的項目,你所寫的知識點)
而後我以前收集的不少整輪面試題,我會專門挑一個小時時間,自我進行回答複述,算是自我演練面試的過程,過後進行復盤......
總結學習方法:
至此我要總結一下學習方法:
構建好本身的知識體系,空間聯想,不斷重複,記憶曲線
刻意練習,多交流,多接受不一樣的意見,拓展思路
明白本身哪個環節薄弱,專項針對,好比我redis弱,那我這一段時間就狠抓redis,不要又看redis,又看zk,又學netty的
重點:下面是你該如何準備你的項目?
這裏我就不說單一的技術棧,知識點,這並無什麼意義,網上都能找到,不少面經都會有不少題目,這也是我整篇文章沒有任何一道面試題的緣由
並且如今慢慢的已經逐漸不太會問你單一的技術點了,都是結合生產實際,要你對你本身作的項目知根知底
下面我以問答的方式讓你來準備你的項目。
1.首先,你要簡單能描述出你的項目
業務模式是什麼?上下游的業務有了解麼?
這種業務模式你以爲會有什麼問題?
你的項目解決了什麼問題?
可否在牆上畫出你的項目結構圖,架構圖
tips:軟件工程很重要,我是被問到畫出ER圖,系統流程圖,泳道圖等等
項目的日活?GMV?
天天的訪問量?一年營業額?
合做商家大概多少?租戶有多少?
目前數據量多大?
系統部署了多少臺,機器是什麼配置?
每一層的流量大概是多少?
好比打到mysql的流量有多大,mq的流量,redis的流量?
線上的超時時間怎麼配置的?
重試怎麼配置?冪等怎麼作?
db和cache在一致性怎麼作?
jvm垃圾收集用的什麼算法?
老年代新生代給了多大,這樣有什麼問題麼?
cms和g1的區別?
線上爲何不用g1?
目前的架構模型對於現有業務量有什麼可優化的?有什麼難點?之後如何擴容?
數據庫表的設計是怎麼樣的?違反了三範式會有什麼問題,有什麼好處?
當前的數據庫表設計有什麼問題,有什麼可優化的點?
項目中有你負責模塊的設計模式如何運用?可否畫出這個設計模式的uml圖?
相比之下這種設計模式和另外一種有什麼區別?有什麼優缺點?
tips:我這裏沒有細化任何一個框架知識點的問題,是由於一個知識點好比分庫分表都會帶來大量的問題
我這裏着重總體的項目問題,這裏起碼要準備三個項目的亮點難點,尤爲是大廠面試官,很挑剔,那種比較通常的難點就不要拿出來講了,反而會降分
2.第二,對於你項目中運用技術的思考,架構選型,爲何選它,架構設計,爲何這麼設計?
拆分微服務的理由?
爲何XX模塊和XX模塊沒有拆開,或者拆開了?
舉個例子zk和eureka做爲註冊中心,大家選型用哪種?
針對大家業務量,和服務實例的數量應該選擇哪種?
這兩種模型不一樣,爲何說一個偏向於AP一個偏向於CP?會帶來什麼問題?
引入新框架是否會帶來新的挑戰?出了問題是否能有人hold住?團隊成員開發可否快速上手這個框架?
若是在面試官問你一個技術,你能夠將爲何用它?你是怎麼用的?用它有什麼優勢,缺點?備份方案?
這種方式表達出來,別人會以爲你是有思考的,你相比其餘競爭者是有優點的。
3.常見問題的梳理
這部分就是很常見,外面也會必問的問題,很簡單,好比:
spring相關的aop,ioc,mybatis相關的
dubbo,zk,netty,springcloud,springboot的starter
線程池,hashmap,併發相關的集合
CAS,volatile,synchronized(1.6以後的鎖升級),原子類
網絡的NIO,類加載過程,三次握手四次握手,一次http請求的過程
這些常見的問題起碼應該爛熟於心,固然有些東西說的越深刻越好,最好能涉及到硬件,震懾到面試官
舉個例子,每次我聊到CAS:
我會提到底層的MESI協議
會聊到高速緩存的結構
會聊到Modified,Exclusive,Shared,Invalid四種狀態如何切換
會聊到緩存加鎖以後引入的一些寫緩衝器,和無效隊列問題
再提到release,acquire,store,load屏障分別作了什麼,怎麼保證可見性,有序性等等等
因此聊到你擅長的,你就狠狠的噴。
4.稍微深刻的題目拓展
日常作一些稍微難的題目其實會拔高本身的思考的能力,我來舉幾個例子,我以AQS爲例子
addWaiter和enq方法中新增一個節點爲何先將新節點的prev置爲tail,再嘗試cas,而不是cas成功以後來構造節點之間的雙向連接?
喚醒節點爲何從tail往前遍歷?
unparkSuccessor有新線程爭鎖是否有漏洞?
aqs如何保證隊列活躍?
Propagate狀態的節點存在的意義?
等等等
5.本身簡歷上寫的每個知識點要吃的透透的,而且可以獨立描述5min,仍是要把別人能講懂的那種
6.自我攻防戰,天天最好能針對你的項目找漏洞,再找到解決方案,相似「左右互搏」
有些遊戲大神不都這樣,天天可能只打兩三把遊戲,可是水平很高
那是由於別人在腦海中打遊戲,演練每一種狀況,每個細節,同時結合一些網上的面經,進行模擬考試,自我演練。
時間過得很快,文章已經接近了尾聲,在複習和快速成長的一年中認識到了不少大佬,你們也對我都進行了不少的幫助,這裏要十分感謝他們
也有不少朋友催我出一份面經,目前能想到的只有這麼多,後續會繼續補充,但願這篇文章對你們有幫助,你們有什麼問題能夠後續加微信進行詢問......
寫在最後的一點感悟:
我這我的挺愛玩遊戲的,愛玩dota,玩了七八年了,也玩LOL。
我常常把遊戲比作是人生,歷來沒有主動點投降,即便背靠的世界之樹已經快凋謝,但我堅信必定能找到對手失誤的時候,而後一波把別人打趴下。
我常常掛在嘴上的口頭禪:怕,你就會輸一生。因此不管什麼時候何地,保持本身的競爭意識,和本身比,亦或是和優秀的人比,都會不斷促進本身的前進......
不服輸,你就不會輸!
END
《21天互聯網Java進階面試訓練營(分佈式篇)》詳細目錄,掃描圖片末尾的二維碼,試聽課程