一面是上海的小哥打來的,3.12 號中午確認的內推,下午就打來約時間了,也是惟一一個約時間的面試官。約的晚上八點。緊張的一比,人生第一次面試就獻給了阿里。java
幸運的是一面的小哥特溫柔。好像是個海歸?口語中夾雜着英文。廢話很少說,上乾貨:git
面試官: 先自我介紹下吧!github
我: 巴拉巴拉...。面試
關於自我介紹:從 HR 面、技術面到高管面/部門主管面,面試官通常會讓你先自我介紹一下,因此好好準備本身的自我介紹真的很是重要。網上通常建議的是準備好兩份自我介紹:一份對 HR 說的,主要講能突出本身的經歷,會的編程技術一語帶過;另外一份對技術面試官說的,主要講本身會的技術細節,項目經驗,經歷那些就一語帶過。redis
面試官: 我看你簡歷上寫你作了個秒殺系統?咱們就從這個項目開始吧,先介紹下你的項目。算法
關於項目介紹:若是有項目的話,技術面試第一步,面試官通常都是讓你本身介紹一下你的項目。你能夠從下面幾個方向來考慮:sql
- 對項目總體設計的一個感覺(面試官可能會讓你畫系統的架構圖)
- 在這個項目中你負責了什麼、作了什麼、擔任了什麼角色
- 從這個項目中你學會了那些東西,使用到了那些技術,學會了那些新技術的使用
- 另外項目描述中,最好能夠體現本身的綜合素質,好比你是如何協調項目組成員協同開發的或者在遇到某一個棘手的問題的時候你是如何解決的又或者說你在這個項目用了什麼技術實現了什麼功能好比:用 redis 作緩存提升訪問速度和併發量、使用消息隊列削峯和降流等等。
我: 我說了我是如何考慮它的需求(秒殺地址隱藏,記錄訂單,減庫存),一開始簡單的用 synchronized 鎖住方法,出現了問題,後來樂觀鎖改進,又有瓶頸,再上緩存,出現了緩存雪崩,因而緩存預熱,錯開緩存失效時間。最後,發現先記錄訂單再減庫存會減小行級鎖等待時間。數據庫
一面面試官很耐心地聽,並給了我一些指導,問了我樂觀鎖是怎麼實現的,我說是基於 sql 語句,在減庫存操做的 where 條件里加剩餘庫存數>0,他說這應該不算是一種樂觀鎖,應該先查庫存,在減庫存的時候判斷當前庫存是否與讀到的庫存同樣(可這樣不是多一次查詢操做嗎?不是很理解,不過我沒有反駁,只是說理解您的意思。事實證實千萬別懟面試官,即便你以爲他說的不對)編程
面試官: 我緩存雪崩什麼狀況下會發生?如何避免?後端
我: 當多個商品緩存同時失效時會雪崩,致使大量查詢數據庫。還有就是秒殺剛開始的時候緩存裏沒有數據。解決方案:緩存預熱,錯開緩存失效時間
面試官: 問我更新數據庫的同時爲何不立刻更新緩存,而是刪除緩存?
我: 由於考慮到更新數據庫後更新緩存可能會由於多線程下致使寫入髒數據(好比線程 A 先更新數據庫成功,接下來要取更新緩存,接着線程 B 更新數據庫,但 B 又更新了緩存,接着 B 的時間片用完了,線程 A 更新了緩存)
逼逼了將近 30 分鐘,面試官竟然用周杰倫的語氣對我說:
我忽然受寵若驚,連忙說謝謝,也正是由於第一次面試獲得了面試官的確定,才讓我信心大增,二三面穩定發揮。
面試官又曰: 我看你還懂數據庫是吧,答:略懂略懂。。。那我問個簡單的吧!
我: 由於這個問題太簡單了,因此我忘記它是什麼了。
面試官: 你還會啥數據庫知識?
我: 我一聽,問的這麼隨意的嗎。。。都讓我選題了,我就說我瞭解索引,慢查詢優化,巴拉巴拉
面試官: 等等,你說索引是吧,那你能說下索引的存儲數據結構嗎?
我: 我心想這簡單啊,我就說 B+樹,還說了爲何用 B+樹
面試官: 你簡歷上寫的這個 J.U.C 包是什麼啊?(他竟然不知道 JUC)
我: 就是 java 多線程的那個包啊。。。
面試官: 那你都瞭解裏面的哪些東西呢?
我: 哈哈哈!這但是個人強項,從 ConcurrentHashMap,ConcurrentLinkedQueue 說到 CountDownLatch,CyclicBarrier,又說到線程池,分別說了底層實現和項目中的應用。
面試官: 我以爲差很少了,那我再問個與技術無關的問題哈,雖然這個問題可能不該該我問,就是你是如何考慮你的項目架構的呢?
我: 先用最簡單的方式實現它,再去發掘系統的問題和瓶頸,因而查資料改進架構。。。
面試官: 好,那我給你介紹下我這邊的狀況吧
總結: 一面多是簡歷面吧,問的比較簡單,我在講項目中說出了我作項目時的學習歷程和思考,贏得了面試官的好感,感受他應該給個人評價很好。
說到這裏,也給你們推薦一個架構交流學習羣:614478470 點擊加入,裏面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化這些成爲架構師必備的知識體系。還能領取免費的學習資源,相信對於已經工做和遇到技術瓶頸的碼友,在這個羣裏會有你須要的內容。
然而開心了沒一會,內推人問我面的怎麼樣啊?看我流程已經到大大 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!緣由以下:
面試官: 好的,你有什麼要問個人嗎?
我: 我還有下一次面試嗎?
面試官: 應該。應該有的,一週內吧。還告訴我竟然轉正前要實習三個月?wtf,一個大三滿課的本科生讓我如何在八月底前實習三個月?
我: 面試官再見
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 面的技術面試和技術面的仍是有所區別的!
面試官人特別好,一聽就是很會說話的小姐姐!說我這裏給你悄悄透露下,你的評級是 A 哦!
接下來就是幾個經典 HR 面掛人的問題,什麼難給我來什麼,我看別人的 HR 面怎麼都是聊聊天。。。
面試官: 你爲何選擇支付寶呢,你怎麼看待支付寶?
我: 我從我的情懷,公司理念,環境氛圍,市場價值,趨勢導向分析了一波(說白了就是瘋狂誇支付寶,不過說實話我說的那些一點都沒撒謊,阿里確實作到了。好比我舉了個雷軍和格力打賭 5 年 2000 億銷售額,大部分企業家關注的是利益,而馬雲更關注的是真的爲人類爲世界作一些事情,利益不是第一位的。)
面試官: 明白瞭解,那你的優勢咱們都很明瞭了,你能說說你的缺點嗎?
缺點確定不能是目標崗位須要的關鍵能力!!!
總之,記住一點,面試官問你這個問題的話,你能夠說一些不影響你這個職位工做須要的一些缺點。好比你面試後端工程師,面試官問你的缺點是什麼的話,你能夠這樣說:本身比較內向,平時不太愛與人交流,可是考慮到之後可能要和客戶溝通,本身正在努力改。
我: 聽說這是 HR 面最難的一個問題。。。我當時翻了好幾天的知乎才找到一個合適的,也符合個人答案:我有時候會表現的不太自信,好比阿里的內推二月份就開始了,其實我當時已經複習了好久了,可是總是以爲本身還不行,不敢投簡歷,因而又把書看了一遍才投的,當時也是舍友慫恿一波才投的,面了以後發現其實本身也沒有不好。(劃重點,必定要把本身的缺點圓回來)。
面試官: HR 好像不太滿意個人答案,繼續問我還有缺點嗎?
我: 我說比較容易緊張吧,舉了本身大一面實驗室由於緊張沒進去的例子,後來不斷調整心態,如今已經好不少了。
接下來又是個好難的問題。
面試官: BAT 都給你 offer 了,你怎麼選?
其實我當時好想說,BT 是什麼?很差意思我只知道阿里。
我 : 哈哈哈哈開玩笑,就說了阿里的文化,支付寶給咱們帶來不少便利,想加入支付寶爲人類作貢獻!
最後 HR 問了我實習時間,如今大幾之類的問題,說確定會給我發 offer 的,讓我等着就行了,但願過兩天能收到好的結果。
推薦一個交流學習羣:614478470 點擊加入 裏面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化這些成爲架構師必備的知識體系。還能領取免費的學習資源,目前受益良多