2020年中五面螞蟻金服、三面拼多多、頭條的面試總結

2020年中五面螞蟻金服、三面拼多多、頭條的面試總結

2020年中螞蟻、拼多多、頭條的面試總結mysql

文章有點長,請耐心看完,絕對有收穫!不想聽我BB直接進入面試分享:面試

  • 準備過程redis

  • 螞蟻金服面試分享算法

  • 拼多多面試分享sql

  • 字節跳動面試分享數據庫

  • 總結

提及來開始進行面試是今年三月的一個上午9點,我還在去公司的公交上,忽然收到螞蟻的面試電話,其實算不上真正的面試。面試官只是和我聊了下他們在作的事情(主要是作雙十一這裏大促的穩定性保障,偏中間件吧),說的很詳細,而後和我溝通了下是否有興趣,我表示有興趣,後面就收到正式面試的通知,最後沒選擇去螞蟻表示抱歉。編程

當時我本身也準備出去看看機會,順便看看本身的實力。當時我其實挺糾結的,一方面如今部門也正須要我,仍是能夠有一番做爲的,另外一方面以爲近一年來進步緩慢,沒有之前飛速進步的成就感了,並且業務和技術偏於穩定,加上本身也屬於那種比較懶散的人,骨子裏仍是但願可以突破現狀,持續在技術上有所精進。數組

在開始正式的總結以前,仍是但願各位同仁可否聽我繼續發泄一會,抱拳!安全

我翻開本身2018年初立的flag,以爲甚是慚愧。其中就有一條是保持一週寫一篇博客,奈何中間由於各類緣由沒能堅持下去。細細想來,主要是本身沒能真正靜下來心認真投入到技術的研究和學習,那麼爲何會這樣?說白了仍是由於沒有肯定目標或者目標不明確,沒有目標或者目標不明確均可能致使行動的失敗。性能優化

那麼問題來了,目標是啥?就我而言,短時間目標是深刻研究某一項技術,好比最近在研究mysql,那麼深刻研究必定要動手實踐而且有所產出,這就夠了麼?還須要咱們可以觸類旁通,結合實際開發場景想想平常開發要注意什麼,這中間有沒有什麼坑?能夠看出,要進步真的不是一件簡單的事,這種反人類的行爲須要咱們克服自個人弱點,逐漸造成習慣。真正牛逼的人,從不以爲認真學習是一件多麼難的事,由於這已經造成了他的習慣,就和早上起牀刷牙洗臉那麼天然簡單。

扯了那麼多,開始進入正題,前後進行了螞蟻、拼多多和字節跳動的面試。

準備過程

先說說我本身的狀況,我2016先在螞蟻實習了將近三個月,而後去了我如今的老東家,2.5年工做經驗,能夠說畢業後就一直老老實實在老東家打怪升級,雖然說有螞蟻的實習經歷,可是由於時間過短,仍是有點虛的。因此面試官看到我簡歷第一個問題絕對是這樣的。

「哇,你在螞蟻待過,不錯啊」,面試官笑嘻嘻地問到。「是的,還好」,我說。「爲啥才三個月?」,面試官臉色一沉問到。「嘩啦啦解釋一通。。。」,我解釋道。「哦,原來如此,那咱們開始面試吧」,面試官一本正經說到。

尼瑪,早知道不寫螞蟻的實習經歷了,後面仔細一想,當初寫上螞蟻不就給簡歷加點料嘛。

言歸正傳,準備過程其實很早開始了(固然這不是說我工做時老想着跳槽,由於我明白如今的老東家並非終點,我還須要不斷提高),具體可追溯到從螞蟻離職的時候,當時出來也面了不少公司,沒啥大公司,面了大概5家公司,都拿到offer了。

工做之餘經常會去額外研究本身感興趣的技術以及工做用到的技術,力求把原理搞明白,而且會本身實踐一把。此外,買了N多書,基本有時間就會去看,補補基礎,什麼操做系統、數據結構與算法、MySQL、JDK之類的源碼,基本都好好溫習了(文末會列一下本身看過的書和一些好的資料)。我深知基礎就像「木桶效應」的短板,決定了能裝多少水。

此外,在正式決定看機會以前,我給本身列了一個提綱,主要包括Java要掌握的核心要點,有不懂的就查資料搞懂。我給本身定位仍是Java工程師,因此Java體系是必定要作到心中有數的,不少東西沒有常年的積累面試的時候很容易露餡,學習要對得起本身,不要騙人。

剩下的就是找平臺和內推了,除了螞蟻,頭條和拼多多都是找人內推的,感謝螞蟻面試官對個人欣賞,之後說不定會去螞蟻咯 。

平臺:脈脈、GitHub、v2

螞蟻金服

2020年中五面螞蟻金服、三面拼多多、頭條的面試總結

  • 一 面
  • 二 面
  • 三 面
  • 四 面
  • 五 面
  • 小 結

一面

一面就作了一道算法題,要求兩小時內完成,給了長度爲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怎麼看

  • 對待遇有什麼預期麼

最後HR還對我說目前穩定性保障部挺缺人的,但願我儘快回覆。

小結

螞蟻面試比較重視基礎,因此Java那些基本功必定要紮實。螞蟻的工做環境仍是挺讚的,由於我面的是穩定性保障部門,還有許多單獨的小組,什麼三年1班,頗有青春的感受。面試官基本水平都比較高,基本都P7以上,除了基礎還問了很多架構設計方面的問題,收穫仍是挺大的。

拼多多

2020年中五面螞蟻金服、三面拼多多、頭條的面試總結

  • 面試前
  • 一面
  • 二面
  • 三面
  • 小結

面試前

面完螞蟻后,早就聽聞拼多多這個獨角獸,決定也去面一把。首先我在脈脈找了一個拼多多的HR,加了微信聊了下,發了簡歷便開始個人拼多多面試之旅。這裏要很是感謝拼多多HR小姐姐,從面試內推到offer確認一直都在幫我,人真的很nice。

一面

  • 爲啥螞蟻只待了三個月?沒轉正?(轉正了,解釋了一通。。。)

  • Java中的HashMap、TreeMap解釋下?(TreeMap紅黑樹,有序,HashMap無序,數組+鏈表)

  • TreeMap查詢寫入的時間複雜度多少?(O(logN))

  • HashMap多線程有什麼問題?(線程安全,死鎖)怎麼解決?( jdk1.8用了synchronize + CAS,擴容的時候經過CAS檢查是否有修改,是則重試)重試會有什麼問題麼?(CAS(Compare And Swap)是比較和交換,不會致使線程阻塞,可是由於重試是經過自旋實現的,因此仍然會佔用CPU時間,還有ABA的問題)怎麼解決?(超時,限定自旋的次數,ABA能夠經過原理變量AtomicStampedReference解決,原理利用版本號進行比較)超太重試次數若是仍然失敗怎麼辦?(synchronize互斥鎖)

  • CAS和synchronize有什麼區別?都用synchronize不行麼?(CAS是樂觀鎖,不須要阻塞,硬件級別實現的原子性;synchronize會阻塞,JVM級別實現的原子性。使用場景不一樣,線程衝突嚴重時CAS會形成CPU壓力過大,致使吞吐量降低,synchronize的原理是先自旋而後阻塞,線程衝突嚴重仍然有較高的吞吐量,由於線程都被阻塞了,不會佔用CPU )

  • 若是要保證線程安全怎麼辦?(ConcurrentHashMap)

  • ConcurrentHashMap怎麼實現線程安全的?(分段鎖)

  • get須要加鎖麼,爲何?(不用,volatile關鍵字)

  • volatile的做用是什麼?(保證內存可見性)

  • 底層怎麼實現的?(說了主內存和工做內存,讀寫內存屏障,happen-before,並在紙上畫了線程交互圖)

  • 在多核CPU下,可見性怎麼保證?(思考了一會,總線嗅探技術)

  • 聊項目,系統之間是怎麼交互的?

  • 系統併發多少,怎麼優化?

  • 給我一張紙,畫了一個九方格,都填了數字,給一個MN矩陣,從1開始逆時針打印這MN個數,要求時間複雜度儘量低(心裏OS:以前貌似碰到過這題,最優解是怎麼實現來着)思考中。。。

  • 能夠先說下你的思路(想起來了,說了何時要變換方向的條件,向右、向下、向左、向上,依此循環)

  • 有什麼想問個人?

二面

  • 自我介紹下

  • 手上還有其餘offer麼?(拿了螞蟻的offer)

  • 部門組織結構是怎樣的?(這輪不是技術面麼,不過仍是老老實實說了)

  • 系統有哪些模塊,每一個模塊用了哪些技術,數據怎麼流轉的?(面試官有點禿頂,一看級別就很高)給了我一張紙,我在上面簡單畫了下系統之間的流轉狀況

  • 鏈路追蹤的信息是怎麼傳遞的?(RpcContext的attachment,說了Span的結構:parentSpanId + curSpanId)

  • SpanId怎麼保證惟一性?(UUID,說了下內部的定製改動)

  • RpcContext是在什麼維度傳遞的?(線程)

  • Dubbo的遠程調用怎麼實現的?(講了讀取配置、拼裝url、建立Invoker、服務導出、服務註冊以及消費者經過動態代理、filter、獲取Invoker列表、負載均衡等過程(嘩啦啦講了10多分鐘),我能夠喝口水麼)

  • Spring的單例是怎麼實現的?(單例註冊表)

  • 爲何要單獨實現一個服務治理框架?(說了下內部剛搞微服務不久,主要對服務進行一些監控和性能優化)

  • 誰主導的?內部還在使用麼?

  • 逆向有想過怎麼作成通用麼?

  • 有什麼想問的麼?

三面

二面老大面完後就直接HR面了,主要問了些職業發展、是否有其餘offer、以及入職意向等問題,順便說了下公司的福利待遇等,都比較常規啦。不過要說的是手上有其餘offer或者大廠經歷會有必定加分。

小結

拼多多的面試流程就簡單許多,畢竟是一個成立四年多的公司。面試難度中規中矩,只要基礎紮實應該不是問題。但不得不說工做強度很大,開始面試前HR就提早和我確認可否接受這樣強度的工做,想來的老鐵仍是要作好準備

字節跳動

2020年中五面螞蟻金服、三面拼多多、頭條的面試總結

  • 面試前
  • 一面
  • 二面
  • 小結

面試前

頭條的面試是三家裏最專業的,每次面試前有專門的HR和你約時間,肯定OK後再進行面試。每次都是經過視頻面試,由於都是以前都是電話面或現場面,因此視頻面試仍是有點不天然。也有人以爲視頻面試體驗很贊,固然蘿蔔青菜各有所愛。最坑的二面的時候對方面試官的網絡總是掉線,最後很冤枉的掛了(固然有一些點答得很差也是緣由之一)。因此仍是有點遺憾的。

一面

  • 先自我介紹下

  • 聊項目,逆向系統是什麼意思

  • 聊項目,逆向系統用了哪些技術

  • 線程池的線程數怎麼肯定?

  • 若是是IO操做爲主怎麼肯定?

  • 若是計算型操做又怎麼肯定?

  • Redis熟悉麼,瞭解哪些數據結構?(說了zset) zset底層怎麼實現的?(跳錶)

  • 跳錶的查詢過程是怎麼樣的,查詢和插入的時間複雜度?(說了先從第一層查找,不知足就下沉到第二層找,由於每一層都是有序的,寫入和插入的時間複雜度都是O(logN))

  • 紅黑樹瞭解麼,時間複雜度?(說了是N叉平衡樹,O(logN))

  • 既然兩個數據結構時間複雜度都是O(logN),zset爲何不用紅黑樹(跳錶實現簡單,踩坑成本低,紅黑樹每次插入都要經過旋轉以維持平衡,實現複雜)

  • 點了點頭,說下Dubbo的原理?(說了服務註冊與發佈以及消費者調用的過程)踩過什麼坑沒有?(說了dubbo異常處理的和打印accesslog的問題)

  • CAS瞭解麼?(說了CAS的實現)還了解其餘同步機制麼?(說了synchronize以及二者的區別,一個樂觀鎖,一個悲觀鎖)

  • 那咱們作一道題吧,數組A,2*n個元素,n個奇數、n個偶數,設計一個算法,使得數組奇數下標位置放置的都是奇數,偶數下標位置放置的都是偶數

  • 先說下你的思路(從0下標開始遍歷,若是是奇數下標判斷該元素是否奇數,是則跳過,不然從該位置尋找下一個奇數)

  • 下一個奇數?怎麼找?(有點懵逼,思考中。。)

  • 有思路麼?(仍然是先遍歷一次數組,並對下標進行判斷,若是下標屬性和該位置元素不匹配從當前下標的下一個遍歷數組元素,而後替換)

  • 你這樣時間複雜度有點高,若是要求O(N)要怎麼作(思考一會,答道「定義兩個指針,分別從下標0和1開始遍歷,碰見奇數位是是偶數和偶數位是奇數就停下,交換內容」)

  • 時間差很少了,先到這吧。你有什麼想問個人?

二面

  • 面試官和善不少,你先介紹下本身吧

  • 你對服務治理怎麼理解的?

  • 項目中的限流怎麼實現的?(Guava ratelimiter,令牌桶算法)

  • 具體怎麼實現的?(要點是固定速率且令牌數有限)

  • 若是忽然不少線程同時請求令牌,有什麼問題?(致使不少請求積壓,線程阻塞)

  • 怎麼解決呢?(能夠把積壓的請求放到消息隊列,而後異步處理)

  • 若是不用消息隊列怎麼解決?(說了RateLimiter預消費的策略)

  • 分佈式追蹤的上下文是怎麼存儲和傳遞的?(ThreadLocal + spanId,當前節點的spanId做爲下個節點的父spanId)

  • Dubbo的RpcContext是怎麼傳遞的?(ThreadLocal)主線程的ThreadLocal怎麼傳遞到線程池?(說了先在主線程經過ThreadLocal的get方法拿到上下文信息,在線程池建立新的ThreadLocal並把以前獲取的上下文信息設置到ThreadLocal中。這裏要注意的線程池建立的ThreadLocal要在finally中手動remove,否則會有內存泄漏的問題)

  • 你說的內存泄漏具體是怎麼產生的?(說了ThreadLocal的結構,主要分兩種場景:主線程仍然對ThreadLocal有引用和主線程不存在對ThreadLocal的引用。第一種場景由於主線程仍然在運行,因此仍是有對ThreadLocal的引用,那麼ThreadLocal變量的引用和value是不會被回收的。第二種場景雖然主線程不存在對ThreadLocal的引用,且該引用是弱引用,因此會在gc的時候被回收,可是對用的value不是弱引用,不會被內存回收,仍然會形成內存泄漏)

  • 線程池的線程是否是必須手動remove才能夠回收value?(是的,由於線程池的核心線程是一直存在的,若是不清理,那麼核心線程的threadLocals變量會一直持有ThreadLocal變量)

  • 那你說的內存泄漏是指主線程仍是線程池?(主線程 )

  • 但是主線程不是都退出了,引用的對象不該該會主動回收麼?(面試官和內存泄漏槓上了),沉默了一會。。。

•那你說下SpringMVC不一樣用戶登陸的信息怎麼保證線程安全的?(剛纔解釋的有點懵逼,一下沒反應過來,竟然回答成鎖了。大腦有點暈了,此時已經一個小時過去了,感受狀況不妙。。。)

  • 這個直接用ThreadLocal不就能夠麼,你見過SpringMVC有鎖實現的代碼麼?(有點暈菜。。。)

  • 咱們聊聊mysql吧,說下索引結構(說了B+樹)

  • 爲何使用B+樹?( 說了查詢效率高,O(logN),能夠充分利用磁盤預讀的特性,多叉樹,深度小,葉子結點有序且存儲數據)

  • 什麼是索引覆蓋?(忘記了。。。)

  • Java爲何要設計雙親委派模型?

  • 何時須要自定義類加載器?

  • 咱們作一道題吧,手寫一個對象池

  • 有什麼想問個人麼?(感受我不少點都沒答好,是否是掛了(結果然的是) )

小結

頭條的面試確實很專業,每次面試官會提早給你發一個視頻連接,而後準點開始面試,並且考察的點都比較全。

面試官都有一個特色,會抓住一個值得深刻的點或者你沒說清楚的點深刻下去直到你把這個點講清楚,否則面試官會以爲你並無真正理解。二面面試官給了我一點建議,研究技術的時候必定要去研究產生的背景,弄明白在什麼場景解決什麼特定的問題,其實不少技術內部都是相通的。很誠懇,仍是很感謝這位面試官大大。

總結

從開始面試到頭條面完大概一個多月的時間,真的有點身心俱疲的感受。最後拿到了拼多多、螞蟻的offer,仍是蠻幸運的。頭條的面試對我幫助很大,再次感謝面試官對個人誠懇建議,以及拼多多的HR對個人囉嗦的問題詳細解答。

這裏要說的是面試前要作好兩件事:簡歷和自我介紹,簡歷要好好回顧下本身作的一些項目,而後挑幾個亮點項目。自我介紹基本每輪面試都有,因此最好提早本身練習下,想好要講哪些東西,分別怎麼講。此外,簡歷提到的技術必定是本身深刻研究過的,沒有深刻研究也最好找點資料預熱下,不打無準備的仗。

這些年看過的書

《Effective Java》、《現代操做系統》、《TCP/IP詳解:卷一》、《代碼整潔之道》、《重構》、《Java程序性能優化》、《Spring實戰》、《Zookeeper》、《高性能MySQL》、《億級網站架構核心技術》、《可伸縮服務架構》、《Java編程思想》

說實話這些書不少只看了一部分,我一般會帶着問題看書,否則看着看着就睡着了,簡直是催眠良藥 。

最後,附一張本身面試前準備的腦圖:

2020年中五面螞蟻金服、三面拼多多、頭條的面試總結

想獲取我的高清面試資料的能夠直接點擊【 石墨文檔 】領取及我的也準備了不少面試題含答案的資料提供供你刷!

2020年中五面螞蟻金服、三面拼多多、頭條的面試總結

相關文章
相關標籤/搜索