本文來自作者投稿(原作者:小胖兒),原作者是一位2021屆本科畢業生,就讀於一所雙非(非985、非211)院校,在今年2月份的時候,我曾經幫他指導過簡歷,並且根據他的簡歷內容幫他提了一些可能會問到的問題。
4月份的時候說是已經通過了阿里的四面,最近又得知已經順利的拿到了阿里的Offer,非常為他感到高興。他還順便總結了一下自己面試經歷,介紹了一下自己是如何準備的,也希望能夠給大家帶來一些幫助。
以下是他的原文內容,我也對其中的部分內容做了些批註。
前言
前兩天,我收到了阿里巴巴的暑假實習offer,從學長內推開始面試到拿到最後offer經歷了4面技術、一面交叉面和一面HR面。經過了漫長的等待和幾次幾乎折磨的面試之後,終於拿到了暑期實習offer。
H哥:阿里的校園招聘一般會經歷4-5輪的面試,大概會持續一個月左右,每一輪結束之後到下一輪面試的時間一半不會超過兩週,如果等待時間過長,不用著急,可以聯絡一下自己的內推人,他們可以幫忙檢視進度。
自我介紹
本人來自西南某雙非本科學校,在校學的專業是物聯網工程。我的專業與Java開發關係不大,學校也只教過一些簡單的程式設計課,其餘的程式設計相關知識都是自己在課餘時間在實驗室學習和自學的。技術不是大牛,專案做得多但是大部分都是自己練手的小專案或者一些有意思的小專案,沒有接觸過真正意義上的大專案。平時沒事的時候喜歡逛一逛微信公眾號、簡書、掘進等平臺,看一看技術類文章,自己也偶爾寫過一些文章。在校期間在實驗室的時間偏多,喜歡寫程式碼的過程和攻克難題的過程。
H哥:和本人的經歷有點像,我也是畢業於某雙非本科學校,相同點都是會利用自己大學的課餘時間,去鑽研程式碼。現在看來,真的要感謝那個時候努力的自己。
學習過程
Java基礎最開始是在菜鳥教程和其他的一些教程網站上自學的,後來又通過閱讀《Java程式設計思想》、《Effective Java》、Hollis大神的“成神之路”系列文章等強化鞏固Java程式設計基礎。對於Java基礎一定要學的紮實,這是程式設計的基本功,和練武功時候的扎馬步一樣,雖然枯燥但是必須紮實。
H哥:沒錯,Java基礎一定要紮實,這是基本功,如果基礎不紮實,基本沒有可能通過阿里的前幾輪技術面。
框架方面最開始是實驗室老師讓學習jfinal框架(但是當時看到網上很多地方都在說spring,自己一直沒有去主動學習),後來我的人生導師讓我去學習SpringBoot和Vue這兩個框架,由於之前有框架學習經驗,且這兩個框架對新手很友好,學習過程很快。當時學習也就是從網上找了幾個系列文章一邊看一邊學,然後在開始學習的兩週之內做了一個留言板(做了兩版,一版前後端分離,一版使用thymeleaf)。
JVM方面,大二下學期買了《深入理解Java虛擬機器》,那時候第一遍閱讀,裡面幾乎所有東西都不懂,後來大三又讀了一遍,複習面試的時候又讀了一遍,對書中的知識終於有了一點點認識。除了閱讀這本書,其他時候還經常瀏覽一些面經,然後根據面經中的JVM問題來查閱資料,瞭解JVM相關知識。
Java併發程式設計,大三從B站上找了一個併發程式設計的教程,後來自己又買了一本《Java高併發程式設計》,這本書的前半部分看了2、3遍,對高併發有了上一定的認識。
設計模式也是一直在B站上找視訊學習,同時網上查閱資料對設計模式進一步理解。
以上就是我的整個大學期間的學習過程,學習過程中也一直在做專案,從專案中發現錯誤並改正,從重構中找到更合適的解決方式,從除錯中發現程式碼的真正執行原理才是最關鍵的。
H哥:我當年準備校招的時候,也是看了很多書籍,還有重點看了很多面經,然後自己通過書籍或者部落格去學習。
面試準備
首先準備校招之前一定是要好好準備的,長期的就是自己的程式設計基本功以及對各個方面知識點的瞭解程度,短期的就是突破一下自己不會的知識點。
我是投簡歷之前一個半月就開始做準備了,首先就是刷leetcode,演算法這一關還是比較重要,而且阿里還有筆試成績,面試的時候也會問到一些不是太難的筆試題;
然後就是多找幾篇面經,看看學長學姐當初面試的時候面試官都問了哪些問題,如果遇到會的,自己嘗試回答一遍,如果遇到不會的,那就去學習一下;
不過網上找的面經可能因為大家的學習過程不一樣,找到類似的面經的概率個人感覺不太大,我恰巧在H大的知識星球裡面,就找H大做了一下簡歷指導(不是在打廣告,是真心感謝H大);
最後還是在H大的知識星球裡面找到了一個很完整的Java面試題及答案的文件(付費資源,但是很值)用來做複習資料。
面試過程
第一次技術面(60min)
- 說一說你使用的是什麼樣的執行緒池,自定義執行緒池的幾個引數是什麼
- 說一說執行緒池的執行流程
- 你的專案中定義的核心執行緒數、最大執行緒數和佇列大小是如何定義的?為什麼這樣定義?(這道題根絕我導師給我說是一個加分項)
- 在專案中如何防止超賣現象
- 你的下訂單的sql語句如何編寫的?(考察MySQL的樂觀鎖)
- 如果有使用者反饋說整個系統的反饋比較慢,你是如何排查和如何解決問題的?
- 影響系統響應慢的原因有哪些?
- 演算法題:給定一個無序陣列和一個目標值,找出陣列中兩個數之和等於目標值的所有組合,並指出其時間複雜度。(很簡單的一個演算法題,leetcode easy難度)
- 瞭解過JVM記憶體模型麼?說說哪些是執行緒獨享、哪些是執行緒共享的?
- 詳細說一下Java堆的分割槽,他們的比例,以及如果把比例調大以後會有什麼樣的後果?
- 說一下JVM的GC演算法,以及為什麼“標記-整理”法更好一些,他能解決什麼樣的問題?
- 瞭解過Java類載入機制麼?一共有哪幾種類載入器?
- 如果你想檢視線上正在執行的服務的GC日誌,你需要輸入什麼指令?
- 瞭解過HashMap麼,說一下HashMap的原理。
- 如果兩個物件hashCode相同,則一定是相同物件麼,如果是兩個相等的物件,那麼他們的hashCode相同麼?
- 如何解決hash衝突?
- HashMap是執行緒安全的麼,如何把HashMap變成執行緒安全的類?
- 說一說MySQL資料庫有哪些資料庫引擎?
- InnoDB的索引的資料結構是什麼,說一說他的原理
- 資料庫事務等級以及他們解決了什麼問題,請舉例說明一下
- MySQL預設的事務等級是什麼?
- MySQL如何開啟慢查詢?
- 說一下Spring主要包含哪些模組?
- 說一下你對Spring的IOC容器的理解以及啟動流程
- 有了解過RPC框架或分散式的東西麼?(這個後來問面試官,就是考察對新技術的瞭解以及對網際網路發展的一個關注度)
- 說一下你讀過的有關Java的書籍
H哥:一面一共問了26個問題,資訊量還是很大的,但是可以看到這些問題都不難,主要是考察基礎知識的掌握情況,這一輪面試的難度資料阿里一面的正常難度,持續的時長也算是正常範圍。圍繞的都是Java基礎、MySql資料庫以及Spring框架。
第二次技術面(30min)
- 介紹一下你做的專案中你覺得最好的那個;說一下你這個專案中的技術難點和挑戰。
- 如何解決商城專案中出現的超賣、少賣問題?
- 說一下什麼是冪等性
- Redis如何保證高可用的
- Redis的哨兵模式知道嗎?
- 你用Redis覺得有什麼缺點嗎?
- 你是如何做壓力測試的?壓力測試的資料是什麼?
- 線城池有哪些引數?
- 核心執行緒數和最大執行緒數有什麼區別?
- 常見的拒絕策略有哪些?
- 介紹一下SpringBoot的特性
- 說一下什麼是單例模式
- 什麼是餓漢模式、懶漢模式
- 使用懶漢模式的注意事項以及如何解決
- 說一下volatile關鍵字的作用和原理
- 說一下自旋鎖和一些常見的自旋鎖的實現
- 說一下資料庫的左外連線
- 資料庫索引優化
- 資料庫索引的資料結構
H哥:二面在一面的基礎上開始包含一些如何做優化、底層原理、以及相關框架的優缺點等。希望考察面試者是否有鑽研精神,是否有自己獨立的思考,而不是那種只會用技術而不會思考的人。
第三次技術面(25min)
- 如何解決商城專案中出現的超賣、少賣問題?
- 在開發專案中,遇到了那些問題?
- Redis與資料庫同步時候出現問題是如何解決的
- 說一下Java當中執行緒有哪些狀態
- 執行緒的阻塞和等待有什麼區別
- 介紹一些Java的鎖機制
- 你瞭解過哪些鎖的型別
- 為什麼
wait
、notify
這個方法會在Object這個類下面 - 分散式、RPC框架有了解過嗎
- Redis的執行緒模型是什麼(考察NIO)
- Redis實現的訊息佇列是如何保證訊息不丟
- 介紹一下堆排序是如何實現的
- 介紹一下TCP/IP協議是如何保證訊息可靠傳輸的
- TCP/IP協議做了什麼優化(擁塞控制和流量控制)
H哥:這一輪和上一輪面試的範圍差不多,主要目的也是在做一輪篩選。從這一輪和上一輪整體看,重點都考差了併發程式設計和Redis的相關知識。
第四次技術面(15min)
- 說一下你投稿的文章寫得是什麼內容
- 介紹一下訊息佇列
- 超賣是如何解決的?
- 下單過程是如何設計的?
- 介紹一下雪花演算法
- 你怎麼理解分散式?
- 分散式之間怎麼通訊?
- 生產者、消費者模型是怎麼工作的?
- Java裡面建立執行緒的方式
- 程式碼場景:給一個字串,統計每個大寫字母出現的次數,按著次數排序,從小到大輸出字母和其出現的次數
H哥:這一輪開始問到了一些和分散式有關的知識,這部分知識點對於本科生來說確實會有些難度,因為大部分人都沒有接觸過,所以要求也不會太高,一般會關注一些理論知識或者概念的理解
交叉面試(30min)
- 你在學校學習過程中,哪些可能成績更好一些以及為什麼這些課程成績更好一些
- 你學習Java多長時間了
- 你是如何學習Java的?
- 你看過哪些開源框架原始碼?
- 你是怎麼看開源框架原始碼的?
- 介紹一個你參與較多或者比較有難度的專案
- 你們團隊開發專案的時候有沒有大家一起解決的某些技術問題
- 你們做的這個專案有沒有借鑑過其他已經成熟的專案
- 說一下你們專案的要求和指標大概是多少
- 你們專案中的執行緒池佇列容量是如何確定的
- 專案中的某些解決方案是個人想出來的還是團隊討論的結果
- 如果再讓你做一個商城系統,你會做哪些技術選型
- 專案中做過哪些安全方面的措施
- 你會如何設計一個淘寶會員系統?
- 你未來的發展方向是什麼?
H哥:這一輪的問題就都比較開放了,因為能到達這一輪的說明技術都是還可以的,這一輪一般會給出一些問題,詢問解決方案等,更好的考察面試者的全方面知識的理解以及如何靈活運用。
面試總結
每一次面試都感覺是煎熬,雖然之前看過很多阿里的面經,都說阿里面試官會抓住某一點一直問下去,直到問到你不會為止,但是當第一次親身體會的時候,還是感覺很煎熬。
不過最終的結果還是好的,至少收到了心儀的offer,能在這個疫情期間,大環境不好的情況下找到實習工作。
對於整個的學習過程和麵試過程,最大的感悟有四:
- 基礎知識要紮實,尤其是Java和資料庫的基礎知識,如果基礎知識不紮實,後面什麼框架和實戰不會有太好的結果
- 多看一些技術類的部落格或者文章,但是要有自己的思考,因為很多技術類文章都是跟緊網際網路發展的,多看一些能夠更加了解網際網路的發展方向;同時自己的思考也能讓自己過濾掉某些文章中的較差的觀點,做到取其精華去其糟粕
- 主動很重要,給我內推的學長是我主動認識的,我的導師是我主動認識的,學技術也是我主動學習的,這世上沒有天上掉餡餅的好事,主動才會有故事
- 一個合適的導師真的很重要,我在遇到我的導師之前,學習方向很迷茫,對於很多東西都不知道如何入手,很多文章也沒有解決我的問題;老師這時候就可以指明方向,讓我的學習之路少了很多崎嶇
H哥:這4點,總結的很到位,如果很多人能夠像本文作者一樣,在大學期間就能按照這4點要求去努力的話,相信都可以拿到很好的Offer
以上就是我暑期實習的應聘全過程,當然了,作為技術人員就要保持終生學習的態度,不斷提高自己的核心競爭力,才能不被時代所淘汰。
以上,就是作者的一些總結,其實,從他開始準備校招到最後拿到阿里的Offer,我們一直都有些交流,可以看得出來,他拿到滿意的Offer除了和自己實力有關之外,自己的努力也起到了很大的作用。
從剛開始的準備簡歷、到準備筆試面試、到後來拿到Offer,一直到最近他寫的這篇面經,都看得出來他有認真努力對待找工作這件事情。
很多人說,現在阿里要求越來越高了,是不是非985/211就完全沒有機會了,但是,其實通過本文作者的經歷就能知道,機會是自己努力創造的。
最後,送給本文的作者——小胖兒、我自己以及所有讀者一句話:
願你一生努力,一生被愛。想要的都擁有,得不到的都釋懷。