前言
最近有些朋友在面試阿里,加上 Java-Interview 專案的原因也有小夥伴和我討論,近期也在負責部門的招牌,這讓我想起年初那段長達三個月的奇葩面試經歷?。
本來沒想拿出來說的,畢竟最後也沒成。
但由於那幾個月的經歷讓我瞭解到了大廠的工作方式、對候選同學的考察重點以及面試官的套路等都有了全新的認識。
當然最重要的是這段時間的查漏補缺也讓自己精進不少。
先交代下背景吧:
從去年 12 月到今年三月底,我前前後後面了阿里三個部門。
其中兩個部門通過了技術面試,還有一個跪在了三面。
光看結果還不錯,但整個流程堪稱曲折。
下面我會盡量描述流程以及大致的面試題目大綱,希望對想要跳槽、正在面試的同學帶來點靈感,幫助可能談不上,但啟發還是能有。
以下內容較長,請再次備好瓜子板凳。
A 部門
首先是第一次機會,去年 12 月份有位大佬加我,後來才知道是一個部門的技術 Leader 在網上看到我的部落格,問我想不想來阿里試試。
這時距離上次面阿里也過去一年多了,也想看看現在幾斤幾兩,於是便同意了。
在推薦一週之後收到了杭州打來的電話,說來也巧,那時候我正在機場候機,距離登記還有大概一個小時,心想時間肯定夠了。
那是我時隔一年多第一次面試,還是在機場這樣嘈雜的環境裡。多多少少還是有些緊張。
一面
以下是我印象比較深刻的內容:
面試官:
談談你做過專案中印象較深或自認為做的比較好的地方?
博主:
我覺得我在 XX 做的不錯,用了 XX 需求實現 XX 功能,效能提高了 N 倍。
面試官:
你說使用到了 AOP ,能談談它的實現原理嘛?
博主:
它是依靠動態代理實現的,動態代理又分為 JDK 自身的以及 CGLIB 。。。。
面試官:
嗯,能說說他們的不同及優缺點嘛?
博主:
JDK 是基於介面實現,而 CGLIB 繼承代理類。。。
就是這樣會一直問下去,如果聊的差不多了就開始問一些零散的問題:
- JMM 記憶體模型,如何劃分的?分別儲存什麼內容?執行緒安全與否?
- 類載入機制,談到雙親委派模型後會問到哪些違反了雙親委派模型?為什麼?為什麼要雙親委派?好處是什麼?
- 平時怎麼使用多執行緒?有哪些好處?執行緒池的幾個核心引數的意義?
- 執行緒間通訊的方式?
- HashMap 的原理?當談到執行緒不安全時自然引申出 ConcurrentHashMap ,它的實現原理?
- 分庫分表如何設計?垂直拆分、水平拆分?
- 業務 ID 的生成規則,有哪些方式?
- SQL 調優?平時使用資料庫有哪些注意點?
- 當一個應用啟動緩慢如何優化?
大概是以上這些,當聊到倒數第二個時我已經登機了。最後不得不提前結束通話,結束之前告訴我之後會換一個同事和我溝通,聽到這樣的回覆一面應該是過了, 後面也確實證實了這點。
二面
大概過了一週,二面如期而至。
我聽聲音很熟,就嘗試問下是不是之前一面的面試官,結果真是。
由於二面的面試官臨時有事所以他來替一下。於是我趕緊問他能否把之前答的不好的再說說?的到了肯定的答覆後開始了我的表演。
有了第一次的經驗這一次自然也輕車熟路,原本感覺一切盡在掌握卻被告知需要筆試突然被激醒。
筆試是一個線上平臺,需要在網頁中寫程式碼,會有一個明確的題目:
從一個日誌檔案中根據關鍵字讀取日誌,記錄出現的次數,最後按照次數排序列印。
在這過程中切記要和麵試官多多交流,因為筆試有時間限制,別到最後發現題目理解錯了,這就和高考作文寫完發現方向錯了一樣要命。
而且在溝通過程中體現出你解題的思路,即使最終結果不對,但說不定思考的過程很符合面試官的胃口哦。這也和今年的高考改卷一樣;過程正確得高分,只有結果得低分。
三面
又過了差不多一週的時間接到了三面的電話,一般到了三面會是技術 Leader 之類的角色。
這個過程中不會過多強調技術細節,更多的考察軟體能,比如團隊協作、學習能力等。
但我記得也問了以下一些技術問題:
- 談談你所理解的 HTTP 協議?
- 對 TCP 的理解?三次握手?滑動視窗?
- 基本演算法,Base64 等。
- Java 記憶體模型,Happen Before 的理解。
一週之後我接到了 HR 助理的電話約了和 HRBP 以及產品技術負責人的視訊面試。
但是我卻沒有面下去,具體原因得往下看。
B 部門
在 A 部門三面完成後,我等了差不多一星期,這期間我卻收到了一封郵件。
大概內容是他在 GitHub 上看到的我,他們的技術總監對我很感興趣(我都不敢相信我的眼鏡),問我想不想來阿里試試。
我對比了 A B 部門的區別發現 B 部門在做的事情上確實更加有誘惑力,之後我表達了有一個面試正在流程中的顧慮;對方表示可以私下和我快速的進行三面,如果一切沒問題再交由我自行選擇。至少對雙方都是一個雙贏嘛。
我想也不虧,並且對方很有誠意,就答應試試;於是便有了下面的面試:
一面
面試官:
對 Java 鎖的理解?
博主:
我談到了 synchronize,Lock 介面的應用。
面試官:
他們兩者的區別以及優缺點呢?
博主:
synchronize
在 JDK1.6 之前稱為重量鎖,是通過進出物件監視器來實現同步的;1.6 之後做了 XX 優化。。。
而 ReentrantLock
是利用了一個巧妙資料結構實現的,並且加鎖解鎖是顯式的。。。
之後又引申到分散式鎖,光這塊就聊了差不多半個小時。
之後又聊到了我的開源專案:
- 是如何想做這個專案的?
- 已經有一些關注了後續是如何規劃的?
- 你今後的學習計劃是什麼?
- 平時看哪些書?
之後技術聊的不是很多,但對於個人發展卻聊了不少。
關於鎖相關的內容可以參考這裡:ReentrantLock 實現原理 synchronize 關鍵字原理
二面
隔了差不多一天的時間,二面很快就來了。
內容不是很多:
- 執行緒間通訊的多種方式?
- 限流演算法?單機限流?分散式限流?
- 提到了 Guava Cache ,瞭解它的實現原理嘛?
- 如何定位一個線上問題?
- CPU 高負載?OOM 排查等?
聊完之後表示第二天應該會有三面。
三面
三面的面試官應該是之前郵件中提到的那位總監大佬,以前應該也是一線的技術大牛;聊的問題不是很多:
- 談談對 Netty 的理解?
- Netty 的執行緒模型?
- 寫一個 LRU 快取。
筆試
本以為技術面試完了,結果後面告知所有的面試流程都得有筆試了,於是又參與了一次筆試:
這個相對比較簡單,基於鎖、等待喚醒機制都是可以的。最後也告知筆試通過。
之後在推薦我的那位大佬的幫助下戲劇般的通過了整個技術輪(真的很感謝他的認可),並且得知這個訊息是在我剛好和 A 部門約好視訊面試時間之後。
也就意味著我必須拒掉一個部門!
沒看錯,是我要拒掉一個。這對我來說確實太難了,我壓根沒想過還有兩個機會擺在我面前。
最後憑著個人的愛好以及 B 部門的熱情我很不好意思的拒掉了 A 部門。。。
HR 面
在面這之前我從來沒有面過這樣大廠的 HR 流程,於是瘋狂搜尋,希望能彌補點經驗。
也許這就是樂極生悲吧,我確實猜中了 HR 問的大部分問題,但遺憾的是最終依然沒能通過。
後來我在想如果我沒有拒掉 A ,會不會結局不一樣了?
但現實就是如此,沒有那麼多假設,並且每個人也得為自己的選擇負責!
大概的問題是:
- 為什麼想來阿里?
- 個人做的最成功最有挑戰的事情是什麼?
- 工作中最難忘的經歷?
- 對加入我們團隊有何期待?
C 部門
HR 這關被 Pass 之後沒多久我居然又收到了第三個部門的邀約。
說實話當時我是拒絕的,之前經歷了將近兩個月的時間卻沒能如願我內心是崩潰的。
我向聯絡我的大佬表達了我的想法,他倒覺得我最後被 pass 的原因是個小問題,再嘗試的話會有很大的機率通過。
我把這事給朋友說了之後也支援我再試試,反正也沒啥損失嘛,而且面試的狀態還在。
所以我又被打了雞血,才有了下面的面試經過:
一面
面試官:
服務化框架的選型和差異?
博主:
一起探討了 SpringCloud、Dubbo、Thrift 的差異,優缺點等。
面試官:
博主:
將資料 Hash 之後落到一個 0 ~ 2^32-1
構成的一個環上。。。。
面試官:
談談你理解的 Zookeeper?
博主:
作為一個分散式協調器。。。
面試官:
如何處理 MQ 重複消費?
博主:
業務冪等處理。。。。
面試官:
客戶端負載演算法?
博主:
輪詢、隨機、一致性 Hash、故障轉移、LRU 等。。
面試官:
long 型別的賦值是否是原子的?
博主:
不是。。。
面試官:
volatile 關鍵字的原理及作用?happen Before?
博主:
可見性、一致性。。
二面
一面之後大概一週的時間接到了二面的電話:
原以為會像之前一樣直接進入筆試,這次上來先簡單聊了下:
- 談談對微服務的理解,好處以及弊端?
- 分散式快取的設計?熱點快取?
之後才正式進入筆試流程:
這次主要考察設計能力,其實就是對設計模式的理解?能否應對後續的擴充套件性。
筆試完了之後也和麵試官交流,原以為會是演算法之類的測試,後來得知他能看到前幾輪的筆試情況,特地挑的沒有做過的方向。
所以大家也不用刻意去押題,總有你想不到的,平時多積累才是硬道理。
三面
又過了兩週左右,得到 HR 通知;希望能過去杭州參加現場面試。並且阿里包了來回的機票酒店等。
可見阿里對人才渴望還是捨得下成本的。
既然都這樣了,就當成一次旅遊所以去了一趟杭州。
現場面的時候有別於其他面試,是由兩個面試官同時參與:
給一個場景,談談你的架構方式。
這就對平時的積累要求較高了。
還有一個印象較深的是:
在網頁上點選一個按鈕到伺服器的整個流程,儘量完整。
其實之前看過,好像是 Google 的一個面試題。
完了之後讓我回去等通知,沒有見到 HR 我就知道涼了,果不其然。
總結
看到這裡的朋友應該都是老鐵了,我也把上文提到的大多數面試題整理在了 GitHub:
廠庫地址:
最後總結下這將近四個月的面試心得:
- 一定要積極的推銷自己,像在 A 部門的三面時,由於基礎答得不是很好;所以最後我表達了自己的態度,對工作、技術的積極性。讓面試官看到你的潛力值得一個 HC 名額。
- 面試過程中遇到自己的不會的可以主動提出,切不可不懂裝懂,這一問就露餡。可以將面試官引導到自己擅長的領域。比如當時我正好研究了鎖,所以和麵試官一聊就是半小時這就是加分項。
- 平時要主動積累知識。寫部落格和參與開源專案就是很好的方式。
- 部落格可以記錄自己踩過的坑,加深印象,而且在寫的過程中可以查漏補缺,最後把整個知識體系鞏固的比較牢固,良好的內容還可以得到意想不到的收穫,比如我第一次面試的機會。
- GitHub 是開發者的一張名片,積極參與開源專案可以和全球大佬頭腦風暴,並且在面試過程中絕對是一個加分利器。
- 面試官一般最後都會問你有什麼要問我的?千萬不要問一些公司福利待遇之類的問題。可以問下本次面試的表現?還有哪些需要完善的?從而知道自己答得如何也能補全自己。
還有一點:不要在某次面試失利後否定自己,有時真的不是自己能力不行。這個也講緣分。
塞翁失馬焉知非福
我就是個例子,雖然最後沒能去成阿里,現在在公司也是一個部門的技術負責人,在我們城市還有個窩,溫馨的家,和女朋友一起為想要的生活努力奮鬥。
歡迎關注作者公眾號於我交流?。