螞蟻金服2019實習生面經總結(已拿口頭offer)

Guide哥發表於2019-04-15

我自己總結的Java學習的系統知識點以及面試問題,已經開源,目前已經 35k+ Star。會一直完善下去,歡迎建議和指導,同時也歡迎Star: github.com/Snailclimb/…

本文來自 Anonymous 的投稿 。

一面 (37 分鐘左右)

一面是上海的小哥打來的,3.12 號中午確認的內推,下午就打來約時間了,也是唯一一個約時間的面試官。約的晚上八點。緊張的一比,人生第一次面試就獻給了阿里。

幸運的是一面的小哥特溫柔。好像是個海歸?口語中夾雜著英文。廢話不多說,上乾貨:

面試官: 先自我介紹下吧!

我: 巴拉巴拉...。

關於自我介紹:從 HR 面、技術面到高管面/部門主管面,面試官一般會讓你先自我介紹一下,所以好好準備自己的自我介紹真的非常重要。網上一般建議的是準備好兩份自我介紹:一份對 HR 說的,主要講能突出自己的經歷,會的程式設計技術一語帶過;另一份對技術面試官說的,主要講自己會的技術細節,專案經驗,經歷那些就一語帶過。

面試官: 我看你簡歷上寫你做了個秒殺系統?我們就從這個專案開始吧,先介紹下你的專案。

關於專案介紹:如果有專案的話,技術面試第一步,面試官一般都是讓你自己介紹一下你的專案。你可以從下面幾個方向來考慮:

  1. 對專案整體設計的一個感受(面試官可能會讓你畫系統的架構圖)
  2. 在這個專案中你負責了什麼、做了什麼、擔任了什麼角色
  3. 從這個專案中你學會了那些東西,使用到了那些技術,學會了那些新技術的使用
  4. 另外專案描述中,最好可以體現自己的綜合素質,比如你是如何協調專案組成員協同開發的或者在遇到某一個棘手的問題的時候你是如何解決的又或者說你在這個專案用了什麼技術實現了什麼功能比如:用 redis 做快取提高訪問速度和併發量、使用訊息佇列削峰和降流等等。

我: 我說了我是如何考慮它的需求(秒殺地址隱藏,記錄訂單,減庫存),一開始簡單的用 synchronized 鎖住方法,出現了問題,後來樂觀鎖改進,又有瓶頸,再上快取,出現了快取雪崩,於是快取預熱,錯開快取失效時間。最後,發現先記錄訂單再減庫存會減少行級鎖等待時間。

一面面試官很耐心地聽,並給了我一些指導,問了我樂觀鎖是怎麼實現的,我說是基於 sql 語句,在減庫存操作的 where 條件里加剩餘庫存數>0,他說這應該不算是一種樂觀鎖,應該先查庫存,在減庫存的時候判斷當前庫存是否與讀到的庫存一樣(可這樣不是多一次查詢操作嗎?不是很理解,不過我沒有反駁,只是說理解您的意思。事實證明千萬別懟面試官,即使你覺得他說的不對)

面試官: 我快取雪崩什麼情況下會發生?如何避免?

我: 當多個商品快取同時失效時會雪崩,導致大量查詢資料庫。還有就是秒殺剛開始的時候快取裡沒有資料。解決方案:快取預熱,錯開快取失效時間

面試官: 問我更新資料庫的同時為什麼不馬上更新快取,而是刪除快取?

我: 因為考慮到更新資料庫後更新快取可能會因為多執行緒下導致寫入髒資料(比如執行緒 A 先更新資料庫成功,接下來要取更新快取,接著執行緒 B 更新資料庫,但 B 又更新了快取,接著 B 的時間片用完了,執行緒 A 更新了快取)

逼逼了將近 30 分鐘,面試官居然用周杰倫的語氣對我說:

not bad

我突然受寵若驚,連忙說謝謝,也正是因為第一次面試得到了面試官的肯定,才讓我信心大增,二三面穩定發揮。

面試官又曰: 我看你還懂資料庫是吧,答:略懂略懂。。。那我問個簡單的吧!

我: 因為這個問題太簡單了,所以我忘記它是什麼了。

面試官: 你還會啥資料庫知識?

我: 我一聽,問的這麼隨意的嗎。。。都讓我選題了,我就說我瞭解索引,慢查詢優化,巴拉巴拉

面試官: 等等,你說索引是吧,那你能說下索引的儲存資料結構嗎?

我: 我心想這簡單啊,我就說 B+樹,還說了為什麼用 B+樹

面試官: 你簡歷上寫的這個 J.U.C 包是什麼啊?(他居然不知道 JUC)

我: 就是 java 多執行緒的那個包啊。。。

面試官: 那你都瞭解裡面的哪些東西呢?

我: 哈哈哈!這可是我的強項,從 ConcurrentHashMap,ConcurrentLinkedQueue 說到 CountDownLatch,CyclicBarrier,又說到執行緒池,分別說了底層實現和專案中的應用。

面試官: 我覺得差不多了,那我再問個與技術無關的問題哈,雖然這個問題可能不應該我問,就是你是如何考慮你的專案架構的呢?

我: 先用最簡單的方式實現它,再去發掘系統的問題和瓶頸,於是查資料改進架構。。。

面試官: 好,那我給你介紹下我這邊的情況吧

chat-end

總結: 一面可能是簡歷面吧,問的比較簡單,我在講專案中說出了我做專案時的學習歷程和思考,贏得了面試官的好感,感覺他應該給我的評價很好。

二面 (33 分鐘左右)

然而開心了沒一會,內推人問我面的怎麼樣啊?看我流程已經到大大 boss 那了。我一聽二面不是主管嗎???怎麼直接跳了一面。於是瞬間慌了,趕緊(下床)學習準備二面。

隔了一天,3.14 的早上 10:56 分,杭州的大大 boss 給我打來了電話,臥槽我當時在上毛概課,萬惡的毛概課每節課都點名,我還在最後一排不敢跑出去。於是接起電話來慫慫地說不好意思我在上課,晚上可以面試嗎?大大 boss 看來很忙啊,跟我說晚上沒時間啊,再說吧!

於是又隔了一天,3.16 中午我收到了北京的電話,當時心裡小失望,我的大大 boss 呢???接起電話來,就是一番狂轟亂炸。。。

第一步還是先自我介紹,這個就不多說了,提前準備好要說的重點就沒問題!

面試官: 我們還是從你的專案開始吧,說說你的秒殺系統。

我: 一面時的套路。。。我考慮到秒殺地址在開始前不應暴露給使用者。。。

面試官: 等下啊,為什麼要這樣呢?暴露給使用者會怎麼樣?

我: 使用者提前知道秒殺地址就可以寫指令碼來搶購了,這樣不公平

面試官: 那比如說啊,我現在是個黑客,我在秒殺開始時寫好了指令碼,執行一萬個執行緒獲取秒殺地址,這樣是不是也不公平呢?

我: 我考慮到了這方面,於是我自己寫了個 LRU 快取(劃重點,這麼多好用的快取我為啥不用偏要自己寫?就是為了讓面試官上鉤問我是怎麼寫的,這樣我就可以逼逼準備好的內容了!),用這個快取儲存請求的 ip 和使用者名稱,一個 ip 和使用者名稱只能同時透過 3 個請求。

面試官: 那我可不可以建立一個 ip 代理池和很多使用者來搶購呢?假設我有很多手機號的賬戶。

我: 這就是在為難我胖虎啊,我說這種情況跟真實使用者操作太像了。。。我沒法區別,不過我覺得可以通過地理位置資訊或者機器學習演算法來做吧。。。

面試官: 好的這個問題就到這吧,你接著說

我: 我把生成訂單和減庫存兩條 sql 語句放在一個事務裡,都操作成功了則認為秒殺成功。

面試官: 等等,你這個訂單表和商品庫存表是在一個資料庫的吧,那如果在不同的資料庫中呢?

我: 這面試官好變態啊,我只是個本科生?!?!我覺得應該要用分散式鎖來實現吧。。。

面試官: 有沒有更輕量級的做法?

我: 不知道了。後來查資料發現可以用訊息佇列來實現。使用訊息佇列主要能帶來兩個好處:(1) 通過非同步處理提高系統效能(削峰、減少響應所需時間);(2) 降低系統耦合性。關於訊息佇列的更多內容可以檢視這篇文章:snailclimb.gitee.io/javaguide/#…

後來發現訊息佇列作用好大,於是現在在學手寫一個訊息佇列。

面試官: 好的你接著說專案吧。

我: 我考慮到了快取雪崩問題,於是。。。

面試官: 等等,你有沒有考慮到一種情況,假如說你的快取剛剛失效,大量流量就來查快取,你的資料庫會不會炸?

我: 我不知道資料庫會不會炸,反正我快炸了。當時說沒考慮這麼高的併發量,後來發現也是可以用訊息佇列來解決,對流量削峰填谷。

面試官: 好專案聊(懟)完了,我們來說說別的,作業系統瞭解吧,你能說說 NIO 嗎?

我: NIO 是。。。

面試官: 那你知道 NIO 的系統呼叫有哪些嗎,具體是怎麼實現的?

我: 當時複習 NIO 的時候就知道是咋回事,不知道咋實現。最近在補這方面的知識,可見 NIO 還是很重要的!

面試官: 說說程式切換時作業系統都會發生什麼?

我: 不如殺了我,我最討厭作業系統了。簡單說了下,可能不對,需要答案自行百度。

面試官: 說說執行緒池?

答: 臥槽這我熟啊,把 Java 併發程式設計的藝術裡講的都說出來了,說了得有十分鐘,自誇一波,畢竟這本書我看了五遍?

面試官: 好問問計網咖如果設計一個聊天系統,應該用 TCP 還是 UDP?為什麼

我: 當然是 TCP!原因如下:

TCP VS UDP

面試官: 好的,你有什麼要問我的嗎?

我: 我還有下一次面試嗎?

面試官: 應該。應該有的,一週內吧。還告訴我居然轉正前要實習三個月?wtf,一個大三滿課的本科生讓我如何在八月底前實習三個月?

我: 面試官再見

saygoodbye-smile

三面 (46 分鐘)

3.18 號,三面來了,這次又是那個大大 boss!

第一步還是先自我介紹,這個就不多說了,提前準備好要說的重點就沒問題!

面試官: 聊聊你的專案?

我: 經過二面的教訓,我迅速學習了一下分散式的理論知識,並應用到了我的專案(吹牛逼)中。

面試官: 看你用到了 Spring 的事務機制,你能說下 Spring 的事務傳播嗎?

我: 完了這個問題好像沒準備,雖然之前刷知乎看到過。。。我就只說出來一條,面試官說其實這個有很多機制的,比如事務巢狀,內事務回滾外事務回滾都會有不同情況,你可以回去看看。

面試官: 說說你的分散式事務解決方案?

我: 我叭叭的照著資料查到的解決方案說了一通,面試官怎麼好像沒大聽懂???

阿里巴巴之前開源了一個分散式 Fescar(一種易於使用,高效能,基於 Java 的開源分散式事務解決方案),後來,Ant Financial 加入 Fescar,使其成為一個更加中立和開放的分散式交易社群,Fescar 重新命名為 Seata。Github 地址:github.com/seata/seata

面試官: 好,我們聊聊其他專案,說說你這個 MapReduce 專案?MapReduce 原理了解過嗎?

我: 我叭叭地說了一通,面試官好像覺得這個專案太簡單了。要不是沒專案,我會把我的實驗寫上嗎???

面試官: 你這個手寫 BP 神經網路是幹了啥?

我: 這是我選修機器學習課程時的一個作業,我又對它進行了擴充套件。

面試官: 你能說說為什麼調整權值時要沿著梯度下降的方向?

我: 老大,你太厲害了,怎麼什麼都懂。我壓根沒準備這個專案。。。沒想到會問,做過去好幾個月了,加上當時一緊張就忘了,後來想起來大概是....。

面試官: 好我們問問基礎知識吧,說說什麼叫 xisuo?

我:???xisuo,您說什麼,不好意思我沒聽清。(這面試官有點口音。。。)就是 xisuo 啊!xisuo 你不知道嗎?。。。尷尬了十幾秒後我終於意識到,他在說死鎖!!!

面試官: 假如 A 賬戶給 B 賬戶轉錢,會發生 xisuo 嗎?能具體說說嗎?

我: 當時答的不好,後來發現面試官又是想問分散式,具體答案參考這個:blog.csdn.net/taylorchan2…

面試官: 為什麼不考研?

我: 不喜歡學術氛圍,巴拉巴拉。

面試官: 你有什麼問題嗎?

我: 我還有下一面嗎。。。面試官說讓我等,一週內答覆。


等了十天,一度以為我涼了,內推人說我流程到 HR 了,讓我等著吧可能 HR 太忙了,3.28 號 HR 打來了電話,當時在教室,我直接飛了出去。

HR 面

面試官: 你好啊,先自我介紹下吧

我: 巴拉巴拉....HR 面的技術面試和技術面的還是有所區別的!

面試官人特別好,一聽就是很會說話的小姐姐!說我這裡給你悄悄透露下,你的評級是 A 哦!

panghu-knowledge

接下來就是幾個經典 HR 面掛人的問題,什麼難給我來什麼,我看別人的 HR 面怎麼都是聊聊天。。。

面試官: 你為什麼選擇支付寶呢,你怎麼看待支付寶?

我: 我從個人情懷,公司理念,環境氛圍,市場價值,趨勢導向分析了一波(說白了就是瘋狂誇支付寶,不過說實話我說的那些一點都沒撒謊,阿里確實做到了。比如我舉了個雷軍和格力打賭 5 年 2000 億銷售額,大部分企業家關注的是利益,而馬雲更關注的是真的為人類為世界做一些事情,利益不是第一位的。)

面試官: 明白瞭解,那你的優點我們都很明瞭了,你能說說你的缺點嗎?

缺點肯定不能是目標崗位需要的關鍵能力!!!

總之,記住一點,面試官問你這個問題的話,你可以說一些不影響你這個職位工作需要的一些缺點。比如你面試後端工程師,面試官問你的缺點是什麼的話,你可以這樣說:自己比較內向,平時不太愛與人交流,但是考慮到以後可能要和客戶溝通,自己正在努力改。

我: 據說這是 HR 面最難的一個問題。。。我當時翻了好幾天的知乎才找到一個合適的,也符合我的答案:我有時候會表現的不太自信,比如阿里的內推二月份就開始了,其實我當時已經複習了很久了,但是老是覺得自己還不行,不敢投簡歷,於是又把書看了一遍才投的,當時也是舍友慫恿一波才投的,面了之後發現其實自己也沒有很差。(劃重點,一定要把自己的缺點圓回來)。

面試官: HR 好像不太滿意我的答案,繼續問我還有缺點嗎?

我: 我說比較容易緊張吧,舉了自己大一面實驗室因為緊張沒進去的例子,後來不斷調整心態,現在已經好很多了。

接下來又是個好難的問題。

面試官: BAT 都給你 offer 了,你怎麼選?

其實我當時好想說,BT 是什麼?不好意思我只知道阿里。

我 : 哈哈哈哈開玩笑,就說了阿里的文化,支付寶給我們帶來很多便利,想加入支付寶為人類做貢獻!

最後 HR 問了我實習時間,現在大幾之類的問題,說肯定會給我發 offer 的,讓我等著就好了,希望過兩天能收到好的結果。

mengbi

公眾號

如果大家想要實時關注我更新的文章以及分享的乾貨的話,可以關注我的公眾號。

《Java面試突擊》: 由本文件衍生的專為面試而生的《Java面試突擊》V2.0 PDF 版本公眾號後臺回覆 "Java面試突擊" 即可免費領取!

Java工程師必備學習資源: 一些Java工程師常用學習資源公眾號後臺回覆關鍵字 “1” 即可免費無套路獲取。

我的公眾號

相關文章