三年半Java後端面試經歷

經過半年的沉澱,加上對MySQL,redis和分佈式這塊的補齊,終於開始重拾信心去投了兩家之前心水已久的公司。

鵝廠

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

都知道鵝廠是cpp的主戰場,而以cpp爲背景的工程師大都對os,network這塊要求特別高,不像是Java這種偏重業務層的語言,之前面試Java的公司側重還是在數據結構、網絡、框架、數據庫和分佈式。所以OS這塊吃的虧比較大

一面基礎技術面

電話面試,隨便問了些技術問題,最後還問了個LeetCode裏面medium級別的算法題,偏簡單

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

自己的回答情況,redis這塊沒啥問題,具體rehash有印象是漸進式的,但是具體原理可能答的有點出入。tcp的time_wait這塊答的不是很好,之前沒有了解過quic機制的實現,所以問可靠性udp的時候,基本上腦子裏就照着tcp的實現在說。raft算法這個因爲剛好在刷6.824(才刷到lab2。。。),答的也湊合,不過paxos確實不熟悉,直接說不會。MySQL這塊很熟了,沒啥說的,協程和線程,主要說了go程和Java線程的區別以及go程的調度模型。面試官提示沒有提到線程的有內核態的切換,go程只在用戶態調度。最後一個算法題,首先說使用HashMap來做,說空間複雜度能不能降到O(1),後面想了大概5min才想出來原地置換的思路。

二面項目技術面
  1. 主要針對自己最熟悉的項目,畫出項目的架構圖,主要的數據表結構,項目中使用到的技術點,項目的總峯值qps,時延,以及有沒有分析過時延出現的耗時分別出現在什麼地方,項目有啥改進的地方沒有?
  2. 如果請求出現問題沒有響應,如何定位問題,說下思路?
  3. tcp 粘包問題怎麼處理?
  4. 問了下緩存更新的模式,以及會出現的問題和應對思路?
  5. 除了公司項目之外,業務有沒有研究過知名項目或做出過貢獻?

基本都沒有啥問題,除了面試官說項目經驗稍弱之外,其餘還不錯。

三面綜合技術面

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

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

後面等等的面試都是這種情況,結果就是回答的節奏全無,差不多都是上面這種形式,基本都能達到一點,但是深入的OS層面就GG了。

後面還問了一個問題定位的問題,服務器CPU 100%怎麼定位?可能是由於平時定位業務問題的思維定勢,加之處於矇蔽狀態,隨口就是:先查看監控面板看有無突發流量異常,接着查看業務日誌是否有異常,針對針對100%那個時間段,取一個典型業務流程的日誌查看。最後才提到使用top命令來監控看是哪個進程佔用到100%。果然陣腳大亂,張口就來,捂臉。。。
本來正確的思路應該是先用top定位出問題的進程,再用top定位到出問題的線程,再打印線程堆棧查看運行情況,這個流程換平時肯定能答出來,但是,但是沒有但是。還是得好好總結。

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

東南亞互聯網公司

TODO

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章