三年經驗Java程序員記一次失敗的面試分享:鵝廠三面讓我體無完膚!

通過半年的沉澱,加上對MySQL,redis和分佈式這塊的補齊,終於重拾面試信心,再次出征。面試

鵝廠

面試職位:go後端開發工程師,接受從Java轉語言redis

都知道鵝廠是cpp的主戰場,而以cpp爲背景的工程師大都對os,network這塊要求特別高,不像是Java這種偏重業務層的語言.算法

以前面試Java的公司側重仍是在數據結構、網絡、框架、數據庫和分佈式。因此OS這塊吃的虧比較大數據庫

一面:基礎技術面

電話面試,隨便問了些技術問題,最後還問了個LeetCode裏面medium級別的算法題,偏簡單。大概整理回憶了一下:後端

  • redis有沒有用過,經常使用的數據結構以及在業務中使用的場景。
  • redis的hash怎麼實現的?
  • rehash過程講一下和JavaHashMap的rehash有什麼區別?
  • redis cluster有沒有了解過,怎麼作到高可用的?
  • 說說redis的持久化機制,爲啥不能用redis作專門的持久化數據庫存儲?
  • 了不瞭解tcp/udp,說下二者的定義,tcp爲何要三次握手和四次揮手?
  • tcp怎麼保證有序傳輸的,講下tcp的快速重傳和擁塞機制
  • 知不知道time_wait狀態,這個狀態出如今什麼地方,有什麼用?
  • udp是不可靠的傳輸,若是你來設計一個基於udp差很少可靠的算法,怎麼設計?
  • http與https有啥區別?說下https解決了什麼問題,怎麼解決的?說下https的握手過程。
  • 看你項目裏面用了etcd,講解下etcd幹什麼用的,怎麼保證高可用和一致性?
  • 既然你提到了raft算法,講下raft算法的基本流程?raft算法裏面若是出現腦裂怎麼處理?
  • 有沒有了解過paxos和zookeeper的zab算法,他們以前有啥區別?
  • 大家後端用什麼數據庫作持久化的?有沒有用到分庫分表,怎麼作的?
  • 索引的常見實現方式有哪些,有哪些區別?
  • MySQL的存儲引擎有哪些,有哪些區別?
  • InnoDB使用的是什麼方式實現索引,怎麼實現的?說下聚簇索引和非聚簇索引的區別?
  • 有沒有了解過協程?說下協程和線程的區別?
  • 算法題一個,劍指offer第51題,數組中的重複數字?

大概說下我本身的回答狀況,redis這塊沒啥問題,具體rehash有印象是漸進式的,可是具體原理可能答的有點出入。 tcp的 time_wait 這塊答的不是很好,以前沒有了解過quic機制的實現,因此問可靠性udp的時候,基本上腦子裏就照着tcp的實如今說。 https這塊沒啥說的,以前項目裏面有用到相似的東西,研究的比較清楚了。 raft算法這個由於恰好在刷,答的也湊合,不過paxos和zab算法確實不熟悉,直接說不會。 MySQL這塊很熟了,包括索引,鎖,事務機制以及mvcc等等,沒啥說的,都已經補齊了。 協程和線程,主要說了go程和Java線程的區別以及go程的調度模型。面試官提示沒有提到線程的有內核態的切換,go程只在用戶態調度。 最後一個算法題,首先說使用HashMap來作,說空間複雜度能不能降到O(1),後面想了大概5min纔想出來原地置換的思路。數組

總得來講,答的還行,一面就這麼過了緩存

二面:項目技術面

二面從基礎技術考察轉移到了項目,主要問了我下面一些問題:服務器

  • 針對本身最熟悉的項目,畫出項目的架構圖,項目主要的數據表結構。
  • 說說項目中使用到的技術點,項目的總峯值qps,時延。
  • 有沒有分析過期延出現的耗時分別出如今什麼地方,項目有啥改進的地方沒有?
  • 若是請求出現問題沒有響應,如何定位問題,說下思路?
  • tcp 粘包問題怎麼處理?
  • 而後還問了下緩存更新的模式,以及會出現的問題和應對思路?
  • 除了公司項目以外,業餘時間有沒有研究過知名項目或作出過貢獻?

這一面答的也比較順利,由於都是圍繞項目,本身很熟悉,基本都沒有啥問題,除了面試官說項目經驗稍弱以外,其他還不錯。網絡

三面:綜合技術面

這面面的是陣腳大亂,面試官採用刨根問底的方式提問,終究是面試經驗不夠,致使面試的節奏有點亂。舉個例子:數據結構

其中有個題:go程和線程有什麼區別? 答:起一個go程大概只須要4kb的內存,起一個Java線程須要1.5MB的內存;go程的調度在用戶態很是輕量,Java線程的切換成本比較高。 接着問爲啥成本比較高?由於Java線程的調度須要在用戶態和內核態切換因此成本高?爲啥在用戶態和內核態之間切換調度成本比較高?我簡單說了下內核態和用戶態的定義。 接着問,仍是沒有明白爲啥成本高?內心瞬間崩潰,沒完沒了了呀,OS這塊依舊是痛呀,支支吾吾半天放棄了。

後面全部的提問都是這種模式,結果回答的節奏全無,感受被套路了。大多度都能回答個一二甚至是一二三,可是再日後或者再深刻的OS層面就GG了。

後面問了下項目過程當中遇到的最大的挑戰,以及怎麼解決的?

還問了一個問題定位的問題,服務器CPU 100%怎麼定位?

多是因爲平時定位業務問題的思惟定勢,加之處於矇蔽狀態,隨口就是:

  • 先查看監控面板看有無突發流量異常
  • 接着查看業務日誌是否有異常,針對CPU100%那個時間段,取一個典型業務流程的日誌查看
  • 最後才提到使用top命令來監控看是哪一個進程佔用到100%。

果真陣腳大亂,張口就來,捂臉。。。 原本正確的思路應該是先用top定位出問題的進程,再用top定位到出問題的線程,再打印線程堆棧查看運行狀況,這個流程換平時確定能答出來,可是,可是沒有可是。仍是得好好總結。

最後問了一個系統設計題目(朋友圈的設計),白板上面畫出系統的架構圖,主要的表結構和講解主要的業務流程,若是用戶變多流量變大,架構將怎麼擴展,怎樣應對? 這個答的也有點亂,直接上來自顧自的用了一個通用的架構,感受毫無亮點。後面反思應該先定位業務的特色,這個業務明顯是讀多寫少,而後和麪試官溝通一期剛開始的方案的用戶量,性能要求,單機目標qps是什麼等等?在明確系統的特色和約束以後再來設計,而不是一開始就是用典型互聯網的那種通用架構自顧本身搞本身的方案。

面試結果:3天后收到短信,被拒

總結:

  • tcp/udp,http和https還有網絡這塊(各類網絡模型,已經select,poll和epoll)必定要很是熟悉
  • 必定要有拿的出手的項目經驗,並且要可以講清楚,講清楚項目中取捨,設計模型和數據表
  • 分佈式要很是熟悉
  • 常見問題定位必定要有思路
  • 操做系統,仍是操做系統,重要的事情說三遍
  • 系統設計,思路,思路,思路,必定要思路清晰,必定要總結下系統設計的流程
  • 一點心得,平時blog和專欄看的再多,若是沒有本身的思考不過是過眼雲煙,根本不會成爲本身的東西,就像內核態和用戶態,日常也看過,可是沒細想,忽然要本身說,還真說不出來,這就很尷尬了。勿以浮沙築高臺,基礎這種東西仍是須要時間去慢慢打牢,多去思考和總結。
相關文章
相關標籤/搜索