假如你準備在金三銀四跳槽的話,那么作為一個Java工程師,應該如何利用1個月的時間,快速為即將到來的面試進行充分的準備呢?
總結起來,面試官考察候選人的時候主要是從技術廣度、技術深度、基礎功底、系統設計、項目經驗幾個角度來進行的。
本文就針對每一塊內容,具體說一下面試的考察點,更重要的是針對考察的這些點,如何來快速的進行準備。
一、技術廣度
技術廣度,顧名思義,作為一個合格的工程師,在開發一個系統,完成一些具體的技術任務時,必然要使用到很多的技術,而且針對這些技術還需要掌握一些常見,各種不同的系統可能會涉及到的一些技術架構/技術方案。
舉個例子,一個互聯網公司比較重要的系統,首先肯定會用到分布式服務框架,比如dubbo/spring cloud,這樣可以將系統拆分為分布式的架構,或者說現在很流行的說法是微服務架構,這樣每個人負責一個服務或者是一個子系統。
接著這個系統很可能為了支撐一些特殊的技術場景會用到其他各種技術。
常見的比如說為了應對高并發的讀會用到Redis緩存技術,為了做系統異步調用會用到RocketMQ技術,為了支撐大數據量的高性能檢索會用到Elasticsearch技術,等等。
那么假如這個互聯網公司在招聘Java工程師的時候,他的招聘要求是什么?
是不是必須得要求候選人起碼在dubbo、Redis、RocketMQ、Elasticsearch等多個技術領域,都有實際的生產項目使用經驗,而且還對這些技術的各種特性以及落地項目的時候常見的技術架構/方案都比較熟悉,這樣招聘這個人進來之后才能上手立馬干活。
要求一個候選人對各種常見的技術以及相關架構都有實際的項目經驗以及對技術本身也足夠熟悉,這就是所謂的技術廣度,站在招聘候選人的角度來分析一下,想必大家就理解這個“技術廣度”考察項了。
實際上技術廣度這個東西,都說了是技術廣度了,所以肯定不僅僅只是上面提到的那點東西。
實際上,一個合格的適合互聯網公司的工程師在技術廣度上,還需要掌握其他很多東西。
比如分布式事務、微服務架構、分布式鎖、性能優化、Java虛擬機優化、Web Server優化、數據庫優化,等等。
越是大型的互聯網公司,就越是會針對技術廣度這塊,考察的可能會越廣泛,要求更高一些。
二、技術廣度的快速準備
這個問題,我們分成兩種情況來說。
假如說你平時就很勤奮很努力,過去幾年一直在不停學習。那么恭喜你,這塊東西百分百難不住你,因為你過去幾年持續的學習,可能已經把技術廣度的每個點的一些東西都研究過,而且或多或少都有一些使用的經驗。
對于你學習過或者實踐過的東西,你肯定都記錄了一些筆記。你最好的準備方式,就是快速回顧自己的筆記,把各種常見技術的核心原理和項目實踐都通過筆記回顧的方式快速回憶起來,在大腦里形成一個知識網絡。
如果你是一個不那么勤奮的工程師,或者是一個工作才兩三年,涉世未深的小年輕,此時怎么辦呢?
那也沒關系,記住一句老話:臨陣磨槍,不快也光。你雖然沒啥積累,但是你都要面試了,怎么著也得臨陣突擊一下吧。
下面就是要教你的方法:你可以自己把技術廣度可能涉及到的各種點都羅列出來,然后上網百度一下各個技術點常見的一些面試問題,或者是基本的一些核心原理。
通過百度各個技術點,然后從各種技術博客中快速了解一個技術的方式,短時間內可以迅速建立起來對技術廣度中涉及到的各個點的一些基本認知、核心原理,這樣在面試的時候避免一問三不知。
當然,大家也清楚,技術這東西是沒法速成的,你采用第二種方法來突擊,跟你第一種情況下有幾年的積累厚積薄發,最后落地到面試的時候,表現是截然不同的,也會直接決定不同的人會進入不同層次的公司。
第二種情況的同學可能面試的時候問到一個問題,就只能說個一兩分鐘,但是第一種情況的同學,功夫都在平時,只要復習到位,面試的時候問到一個問題往往可以舉一反三,一下子給你說個十多分鐘都可以。這就是區別所在。
不過,就算你只說一兩分鐘,總比一問三不知,和面試官大眼瞪小眼好,對吧?
最后還是給各位強調一下,成功無捷徑,作為一個優秀的技術工程師,最重要的事情是一年365天,每天都不停的學習積累,堅持很多年。
吃得苦中苦,方為人上人,筆者早年進行技術積累的時候,也是這樣過來的。每天晚上學習到凌晨一兩點,周六周日全天學習,堅持了很多年。分享一個架構師圈子:854601507,適合兩年及以上朋友交流。
只有通過幾年的積累,你才能夠厚積薄發,量變產生質變,菜鳥變成大牛。
三、技術深度
簡單來說,假如你有了上面說的技術廣度,這不能說明你有多優秀,僅僅只能說滿足了面試的最基本要求,招聘進來后立馬就可以上手干活了,沒太大的培養成本。
決定你未來技術的高度有多高,還有你能否成為團隊里頂梁柱的,是你的技術深度。
技術深度,顧名思義,就是說你對一個技術掌握的深度,舉個最簡單的例子。假如你們公司的一個系統里用到了kafka這個技術,好那么現在問題來了,線上生產環境中,每當高峰到來的時候,不知道為啥寫kafka總會偶爾拋個異常出來,或者是說寫入到kafka中的數據不知道為啥每天統計下來總會少一些。
線上生產環境遇到這種稀奇古怪的問題的時候,往往就是團隊里技術大牛出場的時候。技術大牛,一定是對各種技術都有一定深度研究的人,能否在遇到技術問題的時候,直接從本質和底層出發,分析和定位問題,最后帶領團隊解決問題。
比如上面說的那些問題,那要解決的話,首先需要一個技術大牛對kafka的源碼有過一定深度的研究,接著就是在遇到問題的時候根據當時的故障現場以及一些日志,結合源碼的運行流程,來一步一步分析和定位出來問題所在,最后可能就是通過一些kafka的參數的調整,就可以解決上述棘手的生產問題。
上述描述的場景和能力,就是技術深度的體現,比如說你對某個技術有過完整的、全方位的、深入底層的源碼研究,這就已經是常人不可及的技術深度了。
因為很多人說是看過源碼,但是其實都是淺淺的看過一點點,理解不太深入。
同時如果還有一些對某個技術在線上生產環境遇到過一些棘手問題,通過源碼分析來解決問題的經驗的,那么就是更優秀的技術深度的體現。
技術深度的體現,不一定是說看過源碼,這只是其中一種表現形式而已,其他的還有,比如說對某個特別有難度的技術場景,比如說公司雙11每秒幾十萬QPS并發請求下,你負責了其中支付系統,成功應對超高并發量。
在這個過程中,你對系統架構的設計,對系統做的大量的并發優化、性能優化,都可以成為你在某個技術領域的技術深度的體現。
四、技術深度的快速準備
其實也很簡單,分為兩種情況來討論。
如果你在過去幾年,自己就深入閱讀過大量開源技術的源碼,在閱讀源碼的過程中,自己還把源碼的架構圖、流程圖,手工畫了大量的圖出來。
那么此時你完全就可以把過去幾年的源碼研究筆記翻出來,快速過一下,練習如何在面試現場在白板上純手工把各種技術的源碼架構圖和流程圖現場畫出來。
或者在過去幾年,你對某個技術領域,針對很高的技術難度做過什么復雜的系統,在那個技術領域扎下了很深的研究的話,那么此時你也可以針對過去的筆記快速的復習,在面試現場一定要現場畫圖把你做過的復雜系統以及技術難度都說清楚。
但是如果你過去幾年沒上述所說的任何積累,那咋辦呢?
一般面試官在考察技術深度的時候,很可能會問你:你對哪個技術比較熟悉一些?
遇到這個問題的時候,希望大家頭腦清醒一些,千萬不要腦子發熱隨便亂說,因為你要做好一個心理準備,一旦你說出某個技術出來,比如你說你平時用dubbo用的比較多,接著面試官可能會開啟深入源碼級別的10連擊模式。
比如說,面試官立馬就會開始問你對你熟悉的某個技術,各種底層的機制和原理,讓你說源碼的理解,給你出各種技術挑戰之下這個技術該如何應對,等等諸如此類的問題。
我見過太多沒經驗的同學隨便說個熟悉的技術,其實他就僅僅只是會用罷了,但是一旦當我深入提問的時候,基本就進入一問十不知的情況了。
如果發生上述情況,會讓面試官對你的印象和態度極其不好,大家一定切記切記!
所以,假如你要是確實沒有過對什么技術的深入的積累,這里也教你一個臨陣磨槍的辦法:
你可以從簡歷中挑選出某個你相對來說用的比較多,熟悉一點點的技術,然后直接用萬能的百度,搜索“XX技術源碼分析”,“XX技術底層原理”。
通過幾天的時間快速的 “ 死記硬背 + 軟磨硬泡 ”,力爭對某個技術相對有一些稍微底層一些的理解。
這樣做,起碼在面試的時候被要求問到一些技術深度的時候,能相對給出一些比普通工程師的回答更好一些的分析,起碼能在面試的時候,讓你拿到好點的offer概率會相對更大一些。
還是那句話,做,總比不做好。你能對底層做了準備,有一些了解,總是要勝過那些浮于表面,只會使用API的工程師吧!
同樣筆者這里要說,回歸技術的本質,對于技術深度的積累,那更是沒有任何捷徑可言,更不是幾個月可以完成突擊的。
因為真要有技術深度的話,你可能需要花費至少2年的時間,從底層開始研究一些基礎性的技術。
在打通你的底層技術任督二脈之后,再去對常見的開源技術進行深入的源碼研究,比如說:dubbo、zookeeper、spring cloud、redis、rocketmq、elasticsearch,等等。
有了幾年的積累過后,最后你在面試的時候,技術深度的體現,其實都是厚積薄發的。
除此之外,還需要一個系統的學習方法和交流經驗的架構圈子,平時的積累和技術擴展一定離不開交流,同時要將吸收的技術點進行系統整理。為此,針對當前互聯網公司的技術需求,我整理了一份系統的架構技術體系,大家可以進群Java資源分享群:(854601507)下載相關技術資料,群里有阿里大牛,也有一線互聯網的資深HR,或關注微信公眾號:Java資訊庫,免費領取架構資料。
五、基礎功底的快速準備
我的建議是,如果真的還有1個月要去面試了,那你最起碼用幾天的時間,網上搜三五十個最常見、最典型的算法題,反復練習、務必熟練。
熟練到什么程度呢?
你需要反復練習,最后自己能夠在白紙上一遍就手寫出沒有bug的代碼。
哪些題目是最常見、最典型的?舉個例子,經典排序算法以及其時空復雜度分析,經典查找算法,棧、隊列、鏈表、二叉樹等常見數據結構的算法題,這些相關的基礎題目都要熟練掌握。
當然最好的對于基礎的算法之類的東西的積累,還是在平時,比如你要是堅持每天就在leetcode或者lintcode上花費半小時刷一個算法題,堅持一年,你就刷了至少300道算法題,堅持兩年,你就積累了七八百道算法題。
這個時候有了足夠的積累,起碼面試是不用擔心任何基礎性手寫算法之類的問題了,功夫其實還是在平時的。
至于算法題目的難度選擇,只需要LeetCode或者Lintcode上easy難度和medium難度即可。
社招對算法和數據結構的要求是低于校招的,校招是因為學生沒有太多項目經驗,只能考察你數據結構算法,看你聰不聰明。
這是一張lintcode上對應的數據結構算法題的難度 vs 求職的一個對照圖,大家可以參考下。
還是那句話,搞定easy和medium難度的題目即可。曾經網上流傳著一句話:如果你能手寫所有easy和medium的題目,3遍之內通過,可以搞定硅谷大部分公司的技術面試,包括谷歌、Facebook等頂級公司的面試,這個在國內也差不多的情況。
這篇文章從技術廣度、技術深度、基礎功底,三大塊出發,給大家講了講每一塊會如何考察,以及大家從長期積累和短期突擊兩個方面來看分別應該如何準備。
不過,其實我個人一向是秉持著技術是長期積累的事兒,不是短期突擊的事兒的態度。
但是如果你真的就是沒長期積累,又要去面試,希望大家好好看下這篇文章,對你會被考察的能力有個思想準備。
-
工程師
+關注
關注
59文章
1569瀏覽量
68505 -
JAVA
+關注
關注
19文章
2966瀏覽量
104703
發布評論請先 登錄
相關推薦
評論