做者:石杉的架構筆記面試
寫在前面redis
春節長假轉眼已過,即將迎來的是一年一度的金三銀四跳槽季。算法
假如你準備在金三銀四跳槽的話,那麼做爲一個Java工程師,應該如何利用1個月的時間,快速的爲即將到來的面試進行充分的準備呢?spring
這兩篇文章,專門站在面試官的角度,給你們分析了平時互聯網公司是如何全方位的考察一個候選人的。數據庫
總結起來,面試官考察候選人的時候主要是從技術廣度、技術深度、基礎功底、系統設計、項目經驗幾個角度來進行的。緩存
那麼本文我們就針對每一塊內容,具體的來講一下考察的一些點。更重要的,是針對考察的這些點,如何來快速的進行準備。性能優化
技術廣度網絡
技術廣度,顧名思義,你做爲一個合格的工程師在開發一個系統,完成一些具體的技術任務的時候,必然是要使用到不少的技術的,並且針對這些技術還須要掌握一些很是常見,各類不一樣的系統可能都會涉及到的一些技術架構/技術方案。數據結構
舉個例子,一個互聯網公司的比較重要的系統,首先確定會用到分佈式服務框架,好比dubbo/spring cloud,這樣能夠將系統拆分爲分佈式的架構,或者說如今很流行的說法是微服務架構,這樣每一個人負責一個服務或者是一個子系統。架構
接着這個系統極可能爲了支撐一些特殊的技術場景會用到其餘各類技術。
常見的好比說爲了應對高併發的讀會用到Redis緩存技術,爲了作系統異步調用會用到RocketMQ技術,爲了支撐大數據量的高性能檢索會用到Elasticsearch技術,等等。
那麼假如這個互聯網公司在招聘Java工程師的時候,他的招聘要求是什麼?
是否是必須得要求候選人起碼在dubbo、Redis、RocketMQ、Elasticsearch等多個技術領域,都有實際的生產項目使用經驗,並且還對這些技術的各類特性以及落地項目的時候常見的技術架構/方案都比較熟悉,這樣招聘這我的進來以後才能上手立馬乾活。
要求一個候選人對各類常見的技術以及相關架構都有實際的項目經驗以及對技術自己也足夠熟悉,這就是所謂的技術廣度,站在招聘候選人的角度來分析一下,想必你們就理解這個「技術廣度」考察項了。
實際上技術廣度這個東西,都說了是技術廣度了,因此確定不只僅只是上面提到的那點東西。
實際上,一個合格的適合互聯網公司的工程師在技術廣度上,還須要掌握其餘不少東西。
好比分佈式事務、微服務架構、分佈式鎖、性能優化、Java虛擬機優化、Web Server優化、數據庫優化,等等。
越是大型的互聯網公司,就越是會針對技術廣度這塊,考察的可能會越普遍,要求更高一些。
技術廣度的快速準備
那麼既然已經瞭解了這個技術廣度是什麼以後,如今針對這個技術廣度,在短期內應該如何來快速的複習和準備呢?
這個問題,咱們分紅兩種狀況來講。
假如說你是一個平時就很勤奮很努力,過去幾年一直在不停的學習的人,那麼恭喜你了,這塊東西百分百難不住你,由於你過去幾年持續的學習,可能已經本身把技術廣度的每一個點的一些東西都研究過,並且或多或少都有一些使用的經驗
對於你學習過或者實踐過的東西,你確定都記錄了一些筆記。你最好的準備方式,就是快速的回顧本身的筆記,把各類常見技術的核心原理和項目實踐都經過筆記回顧的方式快速的回憶起來,在大腦裏造成一個知識網絡。
若是你是一個不那麼勤奮的工程師,或者是一個工做才兩三年,涉世未深的小年輕,還那麼多的積累,此時怎麼辦呢?
那也不要緊,記住一句老話:臨陣磨槍,不快也光。你雖然沒啥積累,可是你都要面試了,怎麼着也得臨陣突擊一下吧。
下面就是要教你的方法了:你能夠本身把技術廣度可能涉及到的各類點都羅列出來,而後上網百度一下各個技術點常見的一些面試問題,或者是基本的一些核心原理。
經過百度各個技術點,而後從各類技術博客中快速瞭解一個技術的方式,短期內能夠迅速創建起來對技術廣度中涉及到的各個點的一些基本認知、核心原理,這樣在面試的時候避免一問三不知。
固然,你們也清楚,技術這東西是無法速成的,你採用第二種方法來突擊,跟你第一種狀況下有幾年的積累厚積薄發,最後落地到面試的時候,表現是大相徑庭的,也會直接決定不一樣的人會進入不一樣層次的公司。
第二種狀況的同窗可能面試的時候問到一個問題,就只能說個一兩分鐘,可是第一種狀況的同窗,功夫都在平時,只要複習到位,面試的時候問到一個問題每每能夠觸類旁通,一會兒給你說個十多分鐘均可以。這就是區別所在。
不過,就算你只說一兩分鐘,總比一問三不知,和麪試官大眼瞪小眼好,對吧?
最後仍是給各位強調一下,成功無捷徑,做爲一個優秀的技術工程師,最重要的事情是一年365天,天天都不停的學習積累,堅持不少年。
吃得苦中苦,方爲人上人,筆者早年進行技術積累的時候,也是這樣過來的。天天晚上學習到凌晨一兩點,週六週日全天學習,堅持了不少年。
只有經過幾年的積累,你纔可以厚積薄發,量變產生質變,菜鳥變成大牛。
技術深度
技術深度是指的什麼呢?簡單來講,假如你有了上面第一條說的技術廣度,這不能說明你有多優秀,僅僅只能說知足了面試的最基本的要求,招聘進來事後立馬就能夠上手幹活了,沒太大的培養成本。
決定你將來技術的高度有多高,還有你可否成爲團隊裏頂樑柱的,是你的技術深度。
技術深度,顧名思義,就是說你對一個技術掌握的深度,舉個最簡單的例子。假如大家公司的一個系統裏用到了kafka這個技術,好那麼如今問題來了,線上生產環境中,每當高峯到來的時候,不知道爲啥寫kafka總會偶爾拋個異常出來,或者是說寫入到kafka中的數據不知道爲啥天天統計下來總會少一些。
線上生產環境遇到這種稀奇古怪的問題的時候,每每就是團隊裏技術大牛出場的時候。技術大牛,必定是對各類技術都有必定深度研究的人,可否在遇到技術問題的時候,直接從本質和底層出發,分析和定位問題,最後帶領團隊解決問題。
好比上面說的那些問題,那要解決的話,首先須要一個技術大牛對kafka的源碼有過必定深度的研究,接着就是在遇到問題的時候根據當時的故障現場以及一些日誌,結合源碼的運行流程,來一步一步分析和定位出來問題所在,最後可能就是經過一些kafka的參數的調整,就能夠解決上述棘手的生產問題。
上述描述的場景和能力,就是技術深度的體現,好比說你對某個技術有過完整的、全方位的、深刻底層的源碼研究,這就已是常人不可及的技術深度了。
由於不少人說是看過源碼,可是其實都是淺淺的看過一點點,理解不太深刻。
同時若是還有一些對某個技術在線上生產環境遇到過一些棘手問題,經過源碼分析來解決問題的經驗的,那麼就是更優秀的技術深度的體現。
技術深度的體現,不必定是說看過源碼,這只是其中一種表現形式而已,其餘的還有,好比說對某個特別有難度的技術場景,好比說公司雙11每秒幾十萬QPS併發請求下,你負責了其中支付系統,成功應對超高併發量。
在這個過程當中,你對系統架構的設計,對系統作的大量的併發優化、性能優化,均可以成爲你在某個技術領域的技術深度的體現。
技術深度的快速準備
如何爲了即將到來的面試快速的作技術深度的準備呢?
其實也很簡單,分爲兩種狀況來討論。
若是你在過去幾年,本身就深刻閱讀過大量開源技術的源碼,在閱讀源碼的過程當中,本身還把源碼的架構圖、流程圖,手工畫了大量的圖出來。
那麼此時你徹底就能夠把過去幾年的源碼研究筆記翻出來,快速過一下,練習如何在面試現場在白板上純手工把各類技術的源碼架構圖和流程圖現場畫出來。
或者在過去幾年,你對某個技術領域,針對很高的技術難度作過什麼複雜的系統,在那個技術領域紮下了很深的研究的話,那麼此時你也能夠針對過去的筆記快速的複習,在面試現場必定要現場畫圖把你作過的複雜系統以及技術難度都說清楚。
可是若是你過去幾年沒上述所說的任何積累,那咋辦呢?
仍是那句話:臨陣磨槍,不快也光。
通常面試官在考察技術深度的時候,極可能會問你:你對哪一個技術比較熟悉一些?
遇到這個問題的時候,但願你們頭腦清醒一些,千萬不要腦子發熱隨便亂說,由於你要作好一個心理準備,一旦你說出某個技術出來,好比你說你平時用dubbo用的比較多,接着面試官可能會開啓深刻源碼級別的10連擊模式。
好比說,面試官立馬就會開始問你對你熟悉的某個技術,各類底層的機制和原理,讓你說源碼的理解,給你出各類技術挑戰之下這個技術該如何應對,等等諸如此類的問題。
我見過太多沒經驗的同窗隨便說個熟悉的技術,其實他就僅僅只是會用罷了,可是一旦當我深刻提問的時候,基本就進入一問十不知的狀況了。
若是發生上述狀況,會讓面試官對你的印象和態度極其很差,你們必定切記切記!
因此,假如你要是確實沒有過對什麼技術的深刻的積累,這裏也教你一個臨陣磨槍的辦法:
你能夠從簡歷中挑選出某個你相對來講用的比較多,熟悉一點點的技術,而後直接用萬能的百度,搜索「XX技術源碼分析」,「XX技術底層原理」。
經過幾天的時間快速的 「 死記硬背 + 軟磨硬泡 」,力爭對某個技術相對有一些稍微底層一些的理解。
這樣作,起碼在面試的時候被要求問到一些技術深度的時候,能相對給出一些比普通工程師的回答更好一些的分析,起碼能在面試的時候,讓你拿到好點的offer機率會相對更大一些。
作,總比不作好。你能對底層作了準備,有一些瞭解,老是要賽過那些浮於表面,只會使用API的工程師吧!
一樣筆者這裏要說,迴歸技術的本質,對於技術深度的積累,那更是沒有任何捷徑可言,更不是幾個月能夠完成突擊的。
由於真要有技術深度的話,你可能須要花費至少2年的時間,從底層開始研究一些基礎性的技術。
在打通你的底層技術任督二脈以後,再去對常見的開源技術進行深刻的源碼研究,好比說:dubbo、zookeeper、spring cloud、redis、rocketmq、elasticsearch,等等。
有了幾年的積累事後,最後你在面試的時候,技術深度的體現,其實都是厚積薄發的。
基礎功底
這塊其實沒啥可多說的了,你們估計如今慢慢都感受到了,社招的有經驗的工程師去面試互聯網大廠的時候,不少時候但是都要考察數據結構和算法的。
基礎功底的快速準備
這塊如何快速準備呢?
個人建議是,若是真的還有1個月要去面試了,那你最起碼用幾天的時間,網上搜三五十個最多見、最典型的算法題,反覆練習、務必熟練。
熟練到什麼程度呢?你須要反覆練習,最後本身可以在白紙上一遍就手寫出沒有bug的代碼。
哪些題目是最多見、最典型的?舉個例子,經典排序算法以及其時空複雜度分析,經典查找算法,棧、隊列、鏈表、二叉樹等常見數據結構的算法題,這些相關的基礎題目都要熟練掌握。
固然最好的對於基礎的算法之類的東西的積累,仍是在平時,好比你要是堅持天天就在leetcode或者lintcode上花費半小時刷一個算法題,堅持一年,你就刷了至少300道算法題,堅持兩年,你就積累了七八百道算法題。
這個時候有了足夠的積累,起碼面試是不用擔憂任何基礎性手寫算法之類的問題了,功夫其實仍是在平時的。
至於算法題目的難度選擇,只須要LeetCode或者Lintcode上easy難度和medium難度便可。
社招對算法和數據結構的要求是低於校招的,校招是由於學生沒有太多項目經驗,只能考察你數據結構算法,看你聰不聰明。
這是一張lintcode上對應的數據結構算法題的難度 vs 求職的一個對照圖,你們能夠參考下。
仍是那句話,搞定easy和medium難度的題目便可。曾經網上流傳着一句話:若是你能手寫全部easy和medium的題目,3遍以內經過,能夠搞定硅谷大部分公司的技術面試,包括谷歌、Facebook等頂級公司的面試,這個在國內也差很少的狀況。
下篇預告
這篇文章從技術廣度、技術深度、基礎功底,三大塊出發,給你們講了講每一塊會如何考察,以及你們從長期積累和短時間突擊兩個方面來看分別應該如何準備。
不過,其實我我的一貫是秉持着技術是長期積累的事兒,不是短時間突擊的事兒的態度。
可是若是你真的就是沒長期積累,又要去面試,但願你們好好看下這篇文章,對你會被考察的東西有個思想準備。
就算是臨陣磨槍,怎麼磨,這裏面也是有很多學問。
我做爲一個面試官的角度,最反感的就是很差好準備就瞎面試的人,本身美化炮製一份簡歷,拿到不少面試機會。可是過去直接裸面,最後一問三不知,浪費你們的時間。
接下來會再寫一篇文章,來給你們聊一聊系統設計以及項目經驗這兩塊該如何優雅的準備。
這一樣是Java面試,尤爲是Java進階崗位的面試裏很是重要的部分,敬請期待。
免費Java資料領取,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo/Kafka、Hadoop、Hbase、Flink等高併發分佈式、大數據、機器學習等技術。
傳送門:https://mp.weixin.qq.com/s/Jz...