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
我心想: 是啊,有道理,我可能記錯了.然後被面試官帶偏了.

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

最後你會發現,

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

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