本文來自作者投稿(原作者:小胖兒),原作者是一位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就完全沒有機會了,但是,其實通過本文作者的經歷就能知道,機會是自己努力創造的。
最后,送給本文的作者——小胖兒、我自己以及所有讀者一句話:
願你一生努力,一生被愛。想要的都擁有,得不到的都釋懷。