1. 程式人生 > >Java後端面經總結:拿下螞蟻金服美團頭條 offer 祕訣

Java後端面經總結:拿下螞蟻金服美團頭條 offer 祕訣

筆者在面過 猿輔導,去哪兒,曠視, 陌陌,頭條, 阿里, 快手, 美團, 騰訊之後,除了收穫一大堆面試問題,還思考到如何成為面試官眼中的"愛技術,愛思考,靠譜,有潛力候選人的"一些"套路".


面試問題(Java 後端)

猿輔導

1.八皇后問題
2.求二叉樹的最長距離(任意兩個節點的路徑 中最長的)
3.lru 演算法的實現
4.設計一個數據結構 滿足 put 和 getMedium(中位數)兩個方法.
(時間複雜度分析, getMedium 在常數,n,log n 時間複雜度返回如何實現)
5.rabbitmq 腦裂問題,rabbitmq 延遲佇列實現, rabbitmq高可用策略
(因為專案中用到了 rabbitmq 和他們技術選型出現了重疊,問了這個問題)

  1. 死磕專案細節其中包括:
    設計方案時有沒有比較多種方案,為什麼選這個方案?
    你個人最有成就感,最有挑戰性的 工作是哪一個?
  2. Java架構/分散式:705127209(大牛交流群)沒有開發經驗勿加!

思考:

  1. 猿輔導問的演算法題屬於 leetcode easy, medium 級別的,基本不會太難

曠視(Python)

  1. Python 如何實現多執行緒/多程序程式設計
  2. Python GIL 鎖是什麼?為什麼會出現 GIL
  3. python 協程有麼有用過? 有哪些常見的協程庫,介紹一下
  4. python 裝飾器如何實現,原理,常見使用場景?
  5. python 一堆我沒聽見的庫,有沒有用過.(我沒記下來)
  6. 給你一個 Linux 路徑,求其最簡化的路徑,例如(/a/b/.. -> /a, a/b/./. -> a/b等)
  7. 給你一臺 16 核, 32G 的機器, 無限空間大的分散式儲存. 對1 個 16P 大小的文字檔案進行排序.
    檔案每行一條記錄, 空格分割例如
    key1
    key2
  8. 介紹一下什麼是外部排序
  9. Java架構/分散式:705127209(大牛交流群)沒有開發經驗勿加!

思考:

  1. 曠視的這位面試官 和我死磕 python. 一點專案經歷沒問.
  2. 除了 leetcode 也要多看看高併發,大資料相關的 系統設計題.

去哪兒(Java)

  1. 為什麼使用 MQ, MQ 如何選型, 訊息可靠性如何保證, 如何保證冪等
  2. 用過 dubbo嗎? 設計一個 rpc 框架.
  3. 介紹一下 https
  4. 資料庫執行緒池, http 連線池有沒有深入看過原始碼?介紹一下.(專案裡用得到了 http client)
  5. 給你十億條資料,如何最快的新增到資料庫中
  6. 分散式鎖的技術選型, 實現原理, 優劣勢比較, zookeeper 的一致性協議原理
  7. java 執行緒同步的幾種方式, countdownlatch 和 柵欄的區別
  8. synchronized和 aqs 如何實現可重入鎖

陌陌

1.分散式鎖的實現方案比較,為什麼選擇 zookeeper, zookeeper 一致性協議原理
2.一致性 Hash 原理,實現,專案中是如何使用一致性 Hash 的,引入了多少虛擬節點?
3.java synchronized和 AQS的原理,區別

  1. redis 有序列表
  2. redis 高可用架構是什麼? codis 和 redis cluster 分片的區別
  3. 兩個執行緒如何交替列印 0到99

頭條(Go)

  1. 給你一個 Linux 路徑,求其最簡化的路徑,例如(/a/b/.. -> /a, a/b/./. -> a/b等) 和曠視問重了
  2. top-k
  3. 實現字首樹
  4. 實現python裝飾器.方法實現,和類實現, 帶引數和不帶引數.以及對裝飾器的思考
  5. 如何實現對 多機房,多機架 之前的網路健康情況監控.
  6. 如何理解程序上下文切換, 程序地址空間,為什麼需要程序地址空間, 系統呼叫實現原理, top 命令介紹.

阿里

  1. mq 訊息可靠性,冪等如何保證
  2. 分散式鎖的實現方案比較,為什麼選擇 zookeeper, zookeeper 一致性協議原理
  3. 執行緒池引數,阻塞佇列實現.
  4. 一致性 Hash解決什麼問題, 如何實現? 虛擬節點的作用?
  5. Java 鎖的實現方式, 比較? AQS實現原理?公平非公平實現原理?
  6. CAS 實現原理
  7. volatile 實現原理, 單例模式
  8. java 記憶體模型, gc 調優的經歷. cms gc 的幾個階段, 為什麼會出現 stop the world. 常見可優化引數有哪些.
    為什麼需要優化 gc, gc 會導致什麼問題.
  9. mysql 事務隔離級別. mvcc 實現原理
  10. mysql 索引原理. 為什麼使用 B+樹. 及何時無法使用索引?
  11. mysql 架構, 引擎層和 server層 各自負責什麼.
  12. hashmap 及 concurrenthashmap 實現原理
  13. Spring aop原理,如何定義新的spring xml 標籤
  14. 合併兩個有序連結串列
  15. 如何設計一個 大型活動的安保系統(開放題)
  16. 你平常都在哪些論壇上學習?
  17. 如何學習一門未知的技術?
  18. Java架構/分散式:705127209(大牛交流群)沒有開發經驗勿加!

思考:

阿里面試官 雖然不面演算法,但是面試考察點全方位打擊,從淺入深,揪住不放,直到你不會為止.
是收穫最多的面試,也是感受到自己差距的面試.


快手

  1. 執行緒池實現原理,如何調優
  2. 如何實現一個延遲佇列
  3. mysql 索引
  4. mysql 事務隔離級別
  5. java 鎖和常見執行緒同步方式
  6. zookeeper 分散式實現方式及優劣,如何避免 多個客戶端同時獲取到鎖?
  7. 求二叉樹兩個節點的共同節點
  8. 求二叉樹的深度(非遞迴)
  9. java 集合常見類及原理
  10. tcc 原理
  11. netty 的請求處理流程.執行緒模型

美團

  1. HashMap 的實現原理?擴容原理? 為什麼 jdk 8修改了衝突連結串列的插入位置
  2. mysql 的高可用架構.主從同步過程.
  3. http 和rpc 呼叫的區別
  4. redis 如何用單執行緒支撐高併發, redis 的常見使用場景
  5. mq 如何選型. 為什麼用 mq
  6. 一致性 Hash 原理
  7. 美團外賣的支付 ,要求在 15 分鐘內取消未支付的訂單. 如何實現
  8. 列印 * 星號的等腰三角形
  9. 專案的全鏈路架構, 有沒有單點問題,解決單點問題有哪些常見的方案.
  10. 專案中有哪些可以衡量工作產出的指標.
  11. 說一下你負責的 最複雜,參與人數最多,週期對長.的專案是如何推進的
  12. 你認為自己的優勢,劣勢在哪裡.
  13. 你對未來的職業規劃,你期望的工作內容,方向是什麼?
  14. Java架構/分散式:705127209(大牛交流群)沒有開發經驗勿加!

騰訊(Java)

1.如何在物理機和容器中獲取 cpu 核數,如何設定執行緒數, 如何主動觸發 GC
2.一致性 Hash, Hash 的作用, 為什麼叫一致性 Hash,一致性體現在哪裡.
HashMap中還可以使用什麼方式處理 Hash 衝突
3.執行緒池引數,優化,原理
4.實現一個功能:
cat /usr/local/*.log|grep tencent
1. 併發 IO
2. 30 s 內必須返回結果

  1. 如何理解 Future模式?java 的實現原理
  2. Java 阻塞佇列實現原理
  3. java 鎖 volatile 實現原理
  4. mysql 索引原理,事務隔離級別, mysql 死鎖的場景會有哪些, 內部如何檢測死鎖的?
  5. java 執行緒同步共有哪幾種工具?
  6. 你認為 java 設計得比較優秀的地方有哪些?
  7. 如何理解面向物件設計,能用你看過得開原始碼或者實際專案介紹一下嗎?
  8. java 類載入器的原理及實際使用場景.
  9. java 記憶體模型, 虛擬機器棧預設大小.
  10. 說一下高可用架構的常見解決思路
  11. Java架構/分散式:705127209(大牛交流群)沒有開發經驗勿加!

思考:

騰訊一面面試官考察點非常深入,要求你具有歸納能力.例如分散式中常見的負載策略,
分散式中資料同步備份的常見方案.執行緒同步的幾種方式等等.
而且在你回答之後能繼續深入逼問.
不像其他面試官丟擲來問題,他就聽你吹. 你能吹多少,他就認為你會多少.


思考

  1. 手撕演算法需要準備,面試之前保證刷夠 100 題,及部分設計題.
  1. 無論會不會,一定不能慌.無論會不會,一定要和麵試官確認自己的理解是不是正確,這道題應該如何思考? 避免跑偏
  1. 面試重點在於溝通.

3.1 強行總結結論

一定要有條理性的和麵試官溝通. 避免東一笤帚,西一掃帚.最好提前想好一些結論,重複幾遍.這樣面試官可能直接用你的"結論"來 寫面試經過,結論,評價等. 說完一件事,最好有條理性的結論,讓面試官印象深刻. 即使強行 1,2,3的劃重點結論也比戛然而止強.

3.2 優雅的中斷當前問題,只在檢查點退出討論,響應面試官的中斷

當面試官出現了疑問,丟擲了問題,中斷你的回答,一定不要一味的回答,立即響應,把握自己的節奏,先面試官徵求意見,能否把剩下的說完.繼續快速的說完,記得總結結論 求同存異,避免爭論。

面試官沒有你熟悉你的專案,你的經歷. 說,聽,討論. 三個階段都會存在溝通訊息的損失. 給面試官講清楚, 讓他理解,認同你可能很難. 但是如果出現爭論,會降低對你的好感,降低溝通效率.所以你有責任及時的終止爭論.可以使用一下技巧:

  1. 重申 上下文, 目的, 現狀, 背景, 利弊抉擇.
  2. 坦誠的承認這塊我們的設計,實現並不是完美的.甚至做得不好.我們已經提出了哪些優化點(提出瞭解決方案).
    但是優先順序並不是很高(優先順序是最好的甩鍋方式).當初由於更專注於業務目標.技術前瞻性做得不足.你的意見確實一針見血,
    這個問題讓我們頭疼了很久.
  3. "這塊確實比較複雜,咱們總結一下,細化一下分歧再討論" 面試官一般不會拒絕,面試方向主動權重新由你掌握.(要有主動權意識)
  4. 細化分歧過程中, 其實就是取得共識, 某些細枝末節的爭論,直接和麵試官解釋,忽略掉即可. 把你們的共識擺出來.然後說:
    "咱們的分歧主要是什麼什麼,其實是我每說清楚,再針對面試官疑問解釋一下,或者甩鍋,我們想優化,因為優先順序.我們想這麼做,
    但是由於時間來不及,或者當時 XXX,沒有這麼做.不過後來我們確實吃了虧,算是技術債".
    (承認 low 沒有問題,強項裝逼不服輸才是最二百五的)

面試三千問

簡歷重要嗎? 隨便寫行不行

簡歷一定要認真寫.面試官丟擲的問題中,除了常見的高頻面試題,就是簡歷中你寫的東西.要保證簡歷中寫的東西,
透徹理解! 無論寫的是瞭解,還是精通都要精通. 否則別寫
我認為不用寫的
1.不熟悉的,僅僅是知曉的.
2.在學校整的東西,沒啥知名度就不要寫了
3.github 要有,但是我沒有被問過github 中的專案


專案經歷問嗎?

專案經歷一般是 面試必問的,重點問的. 所以第一步要優先發掘自己專案中的亮點, 把自己做的工作清晰的寫出來.
自我介紹階段重點介紹應該也是自己的專案經歷,這時最好自己提前準備一份演講稿把自己的專案亮點說出來.
多練幾遍.避免不過腦子,黃河決堤式回答,想到哪裡說哪裡.


常見高頻問題呢?

java 鎖,執行緒同步,Juc 包.執行緒池
記憶體模型,gc 調優
mysql 索引,鎖,事務隔離級別.
常見分散式高可用架構 redis, mysql, zk, mq等. 資料同步,資料分片,資料備份等


需要刷題嗎?

阿里一般不會問太多演算法題.
但是至少一半以上公司都會手撕演算法. 把leetcode 各個型別的題都刷十道以上基本沒太大問題. hard題一般不會問.
如果自己面試表現非常好,但是因為演算法題被刷掉是不是會很遺憾呢?
演算法題能擴充套件一個人的思路,還是有用的.也鍛鍊一個人編碼能力. 個人建議白板演算法用 python 非常簡潔.更聚焦解題思路

如果自己面試表現特別好,職位匹配度非常高. 演算法題是可以防水的,會挑簡單題問. 目的就是 留下你,怕你答不上來,避免尷尬

但是自己面試比較差, 演算法題答得特別好,會不會扭轉面試結果呢? 基本不會, 手撕演算法只是輔助.專案經歷和基礎面試題是核心.


面試結果可以問嗎?

如果沒有面試到 hr,或者 終面面試官沒有明確 hr 會聯絡,我基本都會問. 或者問一下自己的不足. 一般都會告訴自己.
另外, 手撕演算法OK,也會被刷掉. 我在陌陌就是 手撕演算法非常完美,結果還是掛了.


一般幾輪面試?

不算 hr ,基本都是三輪. 但如果二輪面試官開始扯虛的,和你介紹專案,問你職業規劃 也許二面就是終面. 不清楚就問一下面試官.


平時工作划水, 面試臨時抱佛腳行不行?

不行

當面試官逼問專案細節時, 如果平時沒有對細節特別熟悉,做事馬馬虎虎,技術深度不夠,例如 技術選型為什麼這麼做,其他方案?優劣勢是什麼?

如果沒有調研,面試時,很快會露出馬腳.

如果對專案的整體架構不熟悉,只熟悉自己的模組,也會可能被面試官問到關聯的模組,專案如果自己不熟悉,馬上就會支支吾吾.如果你回答,這塊不是我負責的,我不太熟悉,就會讓面試官對你產生 沒有大局觀,主動意識不夠的狐疑.評價時會被評"只能完成自己模組內的工作,對系統的全域性沒有了解,主動意識不強.自我驅動意識差"

工作時,可能僅僅聚焦業務,對於專案中應用的技術關注不足. 面試時候就會被面試官揪住.如果當時不思考清晰,並且面試前沒有意識到這塊技術風險, 就會給面試帶來很大風險.美團面試官曾問我,介紹一個你主要負責的 參與方最多,週期最長,最複雜的一個專案如何推進的? 如果平時工作不積極,不主動思考,面試被攤上這麼一個問題.基本上啞口無言. (我就目瞪口呆了)


僅僅看部落格,把高頻面試題搞懂行不行? (問題驅動式準備面試)

這是必須要做的事情.但是僅僅做到這些還遠遠不夠

例如:

阿里面試官問:gc 為什麼一定要 stop the world? 一般部落格沒有給出明確清晰直觀的原因.

一致性 Hash 如何實現? 手撕一下.為什麼叫一致性 hash,一致性體現在哪裡? 一般部落格沒有.

lru 演算法手撕一下. 部落格有,看一遍就能手撕了?

redis 和 zk 分散式鎖實現如何選型? 各自缺點,優勢?專案使用時如何避免缺點帶來的負面影響?

如何基於 AQS實現獲取鎖的公平性非公平性?

面試官甚至給你埋坑,故意說一個錯誤的,看你能否反駁.

我之前被帶坑過, 執行緒池問題
面試官問:是先到 max size 還是先新增到阻塞佇列?
我說 阻塞佇列滿了才會繼續建立執行緒到max size
面試官: 是這樣嗎? 那麼如果是無界佇列豈不是永遠無法到達 max size
我心想: 是啊,有道理,我可能記錯了.然後被面試官帶偏了.

所以結論是,光看懂記下來,不夠,要深刻理解.時刻帶著問題去學習.問題驅動式學習.

最後你會發現,

過了許久,你印象最深刻的還是自己當初提出來的疑問及其解決思路和答案.


以上就是面試過後收穫的一大堆面試題,希望可以幫到即將面