作者:石杉的架構筆記
寫在前面
春節長假轉眼已過,即將迎來的是一年一度的金三銀四跳槽季。
假如你準備在金三銀四跳槽的話,那麼作為一個Java工程師,應該如何利用1個月的時間,快速的為即將到來的面試進行充分的準備呢?
這兩篇文章,專門站在面試官的角度,給大家分析了平時網際網路公司是如何全方位的考察一個候選人的。
總結起來,面試官考察候選人的時候主要是從技術廣度、技術深度、基礎功底、系統設計、專案經驗幾個角度來進行的。
那麼本文我們們就針對每一塊內容,具體的來說一下考察的一些點。更重要的,是針對考察的這些點,如何來快速的進行準備。
技術廣度
技術廣度,顧名思義,你作為一個合格的工程師在開發一個系統,完成一些具體的技術任務的時候,必然是要使用到很多的技術的,而且針對這些技術還需要掌握一些非常常見,各種不同的系統可能都會涉及到的一些技術架構/技術方案。
舉個例子,一個網際網路公司的比較重要的系統,首先肯定會用到分散式服務框架,比如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等高併發分散式、大資料、機器學習等技術。
傳送門:mp.weixin.qq.com/s/JzddfH-7y…