剖析Java開發未來的出路在哪裡,面試總結
一面
一面就做了一道演算法題,要求兩小時內完成,給了長度為N的有重複元素的陣列,要求輸出第10大的數。典型的TopK問題,快排演算法搞定。
演算法題要注意的是合法性校驗、邊界條件以及異常的處理。另外,如果要寫測試用例,一定要保證測試覆蓋場景儘可能全。加上平時刷刷演算法題,這種考核應該沒問題的。
二面
- 自我介紹下唄
- 開源專案貢獻過程式碼麼?(Dubbo提過一個列印accesslog的bug算麼)
- 目前在部門做什麼,業務簡單介紹下,內部有哪些系統,作用和互動過程說下
- Dubbo踩過哪些坑,分別是怎麼解決的?(說了異常處理時業務異常捕獲的問題,自定義了一個異常攔截器)
- 開始進入正題,說下你對執行緒安全的理解(多執行緒訪問同一個物件,如果不需要考慮額外的同步,呼叫物件的行為就可以獲得正確的結果就是執行緒安全)
- 事務有哪些特性?(ACID)
- 怎麼理解原子性?(同一個事務下,多個操作要麼成功要麼失敗,不存在部分成功或者部分失敗的情況)
- 樂觀鎖和悲觀鎖的區別?(悲觀鎖假定會發生衝突,訪問的時候都要先獲得鎖,保證同一個時刻只有執行緒獲得鎖,讀讀也會阻塞;樂觀鎖假設不會發生衝突,只有在提交操作的時候檢查是否有衝突)這兩種鎖在Java和MySQL分別是怎麼實現的?(Java樂觀鎖通過CAS實現,悲觀鎖通過synchronize實現。mysql樂觀鎖通過MVCC,也就是版本實現,悲觀鎖可以通過select... for update加上排它鎖)
- HashMap為什麼不是執行緒安全的?(多執行緒操作無併發控制,順便說了在擴容的時候多執行緒訪問時會造成死鎖,會形成一個環,不過擴容時多執行緒操作形成環的問題再JDK1.8已經解決,但多執行緒下使用HashMap還會有一些其他問題比如資料丟失,所以多執行緒下不應該使用HashMap,而應該使用ConcurrentHashMap)怎麼讓HashMap變得執行緒安全?(Collections的synchronize方法包裝一個執行緒安全的Map,或者直接用ConcurrentHashMap)兩者的區別是什麼?(前者直接在put和get方法加了synchronize同步,後者採用了分段鎖以及CAS支援更高的併發)
- jdk1.8對ConcurrentHashMap做了哪些優化?(插入的時候如果陣列元素使用了紅黑樹,取消了分段鎖設計,synchronize替代了Lock鎖)為什麼這樣優化?(避免衝突嚴重時連結串列多長,提高查詢效率,時間複雜度從O(N)提高到O(logN))
- redis主從機制瞭解麼?怎麼實現的?
- 有過GC調優的經歷麼?(有點虛,答得不是很好)
- 有什麼想問的麼?
三面
- 簡單自我介紹下
- 監控系統怎麼做的,分為哪些模組,模組之間怎麼互動的?用的什麼資料庫?(MySQL)使用什麼儲存引擎,為什麼使用InnnoDB?(支援事務、聚簇索引、MVCC)
- 訂單表有做拆分麼,怎麼拆的?(垂直拆分和水平拆分)
- 水平拆分後查詢過程描述下
- 如果落到某個分片的資料很大怎麼辦?(按照某種規則,比如雜湊取模、range,將單張表拆分為多張表)
- 雜湊取模會有什麼問題麼?(有的,資料分佈不均,擴容縮容相對複雜 )
- 分庫分表後怎麼解決讀寫壓力?(一主多從、多主多從)
- 拆分後主鍵怎麼保證惟一?(UUID、Snowflake演算法)
- Snowflake生成的ID是全域性遞增唯一麼?(不是,只是全域性唯一,單機遞增)
- 怎麼實現全域性遞增的唯一ID?(講了TDDL的一次取一批ID,然後再本地慢慢分配的做法)
- Mysql的索引結構說下(說了B+樹,B+樹可以對葉子結點順序查詢,因為葉子結點存放了資料結點且有序)
- 主鍵索引和普通索引的區別(主鍵索引的葉子結點存放了整行記錄,普通索引的葉子結點存放了主鍵ID,查詢的時候需要做一次回表查詢)一定要回表查詢麼?(不一定,當查詢的欄位剛好是索引的欄位或者索引的一部分,就可以不用回表,這也是索引覆蓋的原理)
- 你們系統目前的瓶頸在哪裡?
- 你打算怎麼優化?簡要說下你的優化思路
- 有什麼想問我麼?
四面
- 介紹下自己
- 為什麼要做逆向?
- 怎麼理解微服務?
- 服務治理怎麼實現的?(說了限流、壓測、監控等模組的實現)
- 這個不是中介軟體做的事麼,為什麼你們部門做?(當時沒有單獨的中介軟體團隊,微服務剛搞不久,需要進行監控和效能優化)
- 說說Spring的生命週期吧
- 說說GC的過程(說了young gc和full gc的觸發條件和回收過程以及物件建立的過程)
- CMS GC有什麼問題?(併發清除演算法,浮動垃圾,短暫停頓)
- 怎麼避免產生浮動垃圾?(記得有個VM引數設定可以讓掃描新生代之前進行一次young gc,但是因為gc是虛擬機器自動排程的,所以不保證一定執行。但是還有引數可以讓虛擬機器強制執行一次young gc)
- 強制young gc會有什麼問題?(STW停頓時間變長)
- 知道G1麼?(瞭解一點 )
- 回收過程是怎麼樣的?(young gc、併發階段、混合階段、full gc,說了Remember Set)
- 你提到的Remember Set底層是怎麼實現的?
- 有什麼想問的麼?
五面
五面是HRBP面的,和我提前預約了時間,主要聊了之前在螞蟻的實習經歷、部門在做的事情、職業發展、福利待遇等。阿里面試官確實是具有一票否決權的,很看重你的價值觀是否match,一般都比較喜歡皮實的候選人。HR面一定要誠實,不要說謊,只要你說謊HR都會去證實,直接cut了。
- 之前螞蟻實習三個月怎麼不留下來?
- 實習的時候主管是誰?
- 實習做了哪些事情?(尼瑪這種也問?)
- 你對技術怎麼看?平時使用什麼技術棧?(阿里HR真的是既當爹又當媽,)
- 最近有在研究什麼東西麼
- 你對SRE怎麼看
- 對待遇有什麼預期麼
最後
既已說到spring cloud alibaba,那對於整個微服務架構,如果想要進一步地向上提升自己,到底應該掌握哪些核心技能呢?
就個人而言,對於整個微服務架構,像RPC、Dubbo、Spring Boot、Spring Cloud Alibaba、Docker、kubernetes、Spring Cloud Netflix、Service Mesh等這些都是最最核心的知識,架構師必經之路!下圖,是自繪的微服務架構路線體系大綱,如果有還不知道自己該掌握些啥技術的朋友,可根據小編手繪的大綱進行一個參考。
如果覺得圖片不夠清晰,也可來找小編分享原件的xmind文件!
且除此份微服務體系大綱外,我也有整理與其每個專題核心知識點對應的最強學習筆記:
-
出神入化——SpringCloudAlibaba.pdf
-
SpringCloud微服務架構筆記(一).pdf
-
SpringCloud微服務架構筆記(二).pdf
-
SpringCloud微服務架構筆記(三).pdf
-
SpringCloud微服務架構筆記(四).pdf
-
Dubbo框架RPC實現原理.pdf
-
Dubbo最新全面深度解讀.pdf
-
Spring Boot學習教程.pdf
-
SpringBoo核心寶典.pdf
-
第一本Docker書-完整版.pdf
-
使用SpringCloud和Docker實戰微服務.pdf
-
K8S(kubernetes)學習指南.pdf
需要下載的請點選傳送門:《出神入化——SpringCloudAlibaba》
另外,如果不知道從何下手開始學習呢,小編這邊也有對每個微服務的核心知識點手繪了其對應的知識架構體系大綱,不過全是匯出的xmind檔案,全部的原始檔也都在此,照樣可免費分享給有需要的你!