1. 程式人生 > >4000字乾貨長文!從校招和社招的角度說說如何準備Java後端大廠面試?

4000字乾貨長文!從校招和社招的角度說說如何準備Java後端大廠面試?

插個題外話,為了寫好這篇文章內容,我自己前前後後花了一週的時間來總結完善,文章內容應該適用於每一個學習 Java 的朋友!我覺得這篇文章的很多東西也是我自己寫給自己的,比如從大廠招聘要求中我們能看到哪些重要的能力,我們該朝什麼方向努力? 共勉! 下面的文章的部分內容在我早期文章中出現過,老讀者應該一眼就可以看出來了。嘿嘿!廢話不多說,開始正文! ------ 我覺得每一個技術人的夢想大概就是能夠找一份大廠的 offer,我覺得這很正常,這並不是我們的飯後談資而是每個技術人的追求。像阿里、騰訊、美團、位元組跳動、京東等等大廠的技術氛圍還是要明顯優於一些創業型公司 / 小公司,如果說能夠在這樣的公司鍛鍊幾年,相信對自己能力的提升還是非常大的。 > ps:當然,很多創業公司的鍛鍊也很大,不過大部分都是 CRUD 的工作,你甚至還要同時去寫前端。剛畢業的時候做 CRUD 的工作沒什麼,如果一直這樣做下去就有問題了。 不論是筆試還是面試都是有章可循的,但是,一定要不要想著如何去應付面試,糊弄面試官,這樣做終究是欺騙自己。這篇文章的目的也主要想讓大家知道自己應該從哪些方向去準備面試,有哪些可以提高的方向。 網上已經有很多面經了,但是我認為網上的各種面經僅僅只能作為參考,你的實際面試與之還是有一些區別的。另外如果要在網上看別人的面經的話,建議即要看別人成功的案例也要適當看看別人失敗的案例。**看面經沒問題,不論是你要找工作還是平時學習,這都是一種比較好地檢驗自己水平的一種方式。但是,一定不要過分寄希望於各種面經,試著去提高自己的綜合能力。** “ 80% 的 offer 掌握在 20% 的人手 ” 中這句話也不是不無道理的。決定你面試能否成功的因素中實力固然佔有很大一部分比例,但是如果你的心態或者說運氣不好的話,依然無法拿到滿意的 offer。 運氣暫且不談,就拿心態來說,千萬不要因為面試失敗而氣餒或者說懷疑自己的能力,面試失敗之後多總結一下失敗的原因,後面你就會發現自己會越來越強大。 另外,筆主只是在這裡分享一下自己對於 “ 如何備戰大廠面試 ” 的一個看法,以下大部分理論/言辭都經過過反覆推敲驗證,如果有不對的地方或者和你想法不同的地方,請您敬請雅正、不捨賜教。 ### 從招聘要求看大廠青睞什麼樣的人? **先從已經有兩年左右開發經驗的工程師角度來看:** 我們來看一下阿里官網支付寶Java高階開發工程師的招聘要求,從下面的招聘資訊可以看出,除去Java基礎/集合/多執行緒這些,這些能力格外重要: 1. **底層知識比如jvm** :不只是懂理論更會實操; 2. 面**向物件程式設計能力** :我理解這個不僅包括“面向物件程式設計”,還有SOLID軟體設計原則,相關閱讀:[《寫了這麼多年程式碼,你真的瞭解SOLID嗎?》](https://insights.thoughtworks.cn/do-you-really-know-solid/)(我司大佬的一篇文章) 3. **框架能力** :不只是使用那麼簡單,更要搞懂原理和機制!搞懂原理和機制的基礎是要學會看原始碼。 4. **分散式系統開發能力** :快取、訊息佇列等等都要掌握,關鍵是還要能使用這些技術解決實際問題而不是紙上談兵。 5. **不錯的sense** :喜歡和嘗試新技術、追求編寫優雅的程式碼等等。 ![](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/支付寶-JAVA開發工程師-專家.jpg) **再從應屆生的角度來看:** 我們還是看阿里巴巴的官網相關應屆生 Java 工程師招聘崗位的相關要求。 ![](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/應屆生-alibaba-java.png) 結合阿里、騰訊等大廠招聘官網對於 Java 後端方向/後端方向的應屆實習生的要求下面幾點也提升你的個人競爭力: 1. 參加過競賽( 含金量超高的是 ACM ); 2. 對資料結構與演算法非常熟練; 3. 參與過實際專案(比如學校網站) 4. 熟悉 Python、Shell、Perl 其中一門指令碼語言; 5. 熟悉如何優化 Java 程式碼、有寫出質量更高的程式碼的意識; 6. 熟悉 SOA 分散式相關的知識尤其是理論知識; 7. 熟悉自己所用框架的底層知識比如 Spring; 8. 有高併發開發經驗; 9. 有大資料開發經驗等等。 從來到大學之後,我的好多閱歷非常深的老師經常就會告誡我們:“ 一定要有一門自己的特長,不管是技術還好還是其他能力 ” 。我覺得這句話真的非常有道理! 剛剛也提到了要有一門特長,所以在這裡再強調一點:公司不需要你什麼都會,但是在某一方面你一定要有過於常人的優點。換言之就是我們不需要去掌握每一門技術(你也沒精力去掌握這麼多技術),而是需要去深入研究某一門技術,對於其他技術我們可以簡單瞭解一下。 ### 技術面可能會問哪些方向的問題?  你準備面試的話首先要搞清技術面可能會被問哪些方向的問題吧!推薦一下[《70k Star Java開源專案出PDF閱讀版本啦!》](http://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486324&idx=1&sn=e8b690ddaedabc486bd399310105aad3&chksm=cea244bff9d5cda9a627fa65235be09e7b089e92cf49c0eb0ceb35b39bbed86c1fab0125f5af&token=1351080357&lang=zh_CN&scene=21#wechat_redirect) 。 **我直接用思維導圖的形式展示出來吧!這樣更加直觀形象一點,細化到某個知識點的話這張圖沒有介紹到,留個懸念,下篇文章會詳細介紹。** ![](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/Xnip2020-03-11_20-24-32.jpg) **上面思維導圖大概涵蓋了技術面試可能會設計的技術,但是你不需要把上面的每一個知識點都搞得很熟悉,要分清主次,對於自己不熟悉的技術不要寫在簡歷上,對於自己簡單瞭解的技術不要說自己熟練掌握!** ### 如何獲取大廠面試機會? 不論是對於社招還是校招,我們都有下面幾種方式來獲得面試機會: 1. 各種招聘網站上投遞簡歷或者關注大廠官網,隨時投遞簡歷(走流程的網申) 2. 找到師兄師姐/認識的人,幫忙內推(能夠讓你避開網申簡歷篩選,還是挺不錯的,不過也還是需要你的簡歷夠棒); 3. 部落格發文被看中 /Github優秀開源專案作者,大廠內部人員邀請你面試; ### 如何做自我介紹? 自我介紹一般是你和麵試官的第一次面對面正式交流,換位思考一下,假如你是面試官的話,你想聽到被你面試的人如何介紹自己呢?一定不是客套地說說自己喜歡程式設計、平時花了很多時間來學習、自己的興趣愛好是打球吧? 我覺得一個好的自我介紹應該包含這幾點要素: 1. 用簡單的話說清楚自己主要的技術棧於擅長的領域; 2. 把重點放在自己在行的地方以及自己的優勢之處; 3. 重點突出自己的能力比如自己的定位的bug的能力特別厲害; 從社招和校招兩個角度來舉例子吧!我下面的兩個例子僅供參考,自我介紹並不需要死記硬背,記住要說的要點,面試的時候根據公司的情況臨場發揮也是沒問題的。另外,網上一般建議的是準備好兩份自我介紹:一份對hr說的,主要講能突出自己的經歷,會的程式設計技術一語帶過;另一份對技術面試官說的,主要講自己會的技術細節和專案經驗。 **社招:** > 面試官,您好!我叫獨秀兒。我目前有1年半的工作經驗,熟練使用Spring、MyBatis等框架、瞭解 Java 底層原理比如JVM調優並且有著豐富的分散式開發經驗。離開上一家公司是因為我想在技術上得到更多的鍛鍊。在上一個公司我參與了一個分散式電子交易系統的開發,負責搭建了整個專案的基礎架構並且通過分庫分表解決了原始資料庫以及一些相關表過於龐大的問題,目前這個網站最高支援 10 萬人同時訪問。工作之餘,我利用自己的業餘時間寫了一個簡單的 RPC 框架,這個框架用到了Netty進行網路通訊, 目前我已經將這個專案開源,在 Github 上收穫了 2k的 Star! 說到業餘愛好的話,我比較喜歡通過部落格整理分享自己所學知識,現在已經是多個部落格平臺的認證作者。 生活中我是一個比較積極樂觀的人,一般會通過運動打球的方式來放鬆。我一直都非常想加入貴公司,我覺得貴公司的文化和技術氛圍我都非常喜歡,期待能與你共事! **校招:** > 面試官,您好!我叫秀兒。大學時間我主要利用課外時間學習了 Java 以及 Spring、MyBatis等框架 。在校期間參與過一個考試系統的開發,這個系統的主要用了 Spring、MyBatis 和 shiro 這三種框架。我在其中主要擔任後端開發,主要負責了許可權管理功能模組的搭建。另外,我在大學的時候參加過一次軟體程式設計大賽,我和我的團隊做的線上訂餐系統成功獲得了第二名的成績。我還利用自己的業餘時間寫了一個簡單的 RPC 框架,這個框架用到了Netty進行網路通訊, 目前我已經將這個專案開源,在 Github 上收穫了 2k的 Star! 說到業餘愛好的話,我比較喜歡通過部落格整理分享自己所學知識,現在已經是多個部落格平臺的認證作者。 生活中我是一個比較積極樂觀的人,一般會通過運動打球的方式來放鬆。我一直都非常想加入貴公司,我覺得貴公司的文化和技術氛圍我都非常喜歡,期待能與你共事! ### 如何介紹自己的專案經歷? 如果有專案的話,技術面試第一步,面試官一般都是讓你自己介紹一下你的專案。你可以從下面幾個方向來考慮: 1. 對專案整體設計的一個感受(面試官可能會讓你畫系統的架構圖) 2. 在這個專案中你負責了什麼、做了什麼、擔任了什麼角色 3. 從這個專案中你學會了那些東西,使用到了那些技術,學會了那些新技術的使用 4. 另外專案描述中,最好可以體現自己的綜合素質,比如你是如何協調專案組成員協同開發的或者在遇到某一個棘手的問題的時候你是如何解決的又或者說你在這個專案用了什麼技術實現了什麼功能比如:用redis做快取提高訪問速度和併發量、使用訊息佇列削峰和降流等等。 ### 我該如何學習? ![如何學習?](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/如何學習.jpg) 最最最關鍵也是對自己最最最重要的就是學習!看看別人分享的面經,看看我寫的這篇文章估計你只需要10分鐘不到。但這些東西終究是空洞的理論,最主要的還是自己平時的學習! 如何去學呢?我覺得學習每個知識點可以考慮這樣去入手: 1. **官網(大概率是英文,不推薦初學者看)**。 2. **書籍(知識更加系統完全,推薦)**。 3. **視訊(比較容易理解,推薦,特別是初學的時候。慕課網和嗶哩嗶哩上面有挺多學習視訊可以看,只直接在上面搜尋關鍵詞就可以了)**。 4. **網上部落格(解決某一知識點的問題的時候可以看看)**。 這裡給各位一個建議,**看視訊的過程中最好跟著一起練,要做筆記!!!** **最好可以邊看視訊邊找一本書籍看,看視訊沒弄懂的知識點一定要儘快解決,如何解決?** 首先百度/Google,通過搜尋引擎解決不了的話就找身邊的朋友或者認識的一些人。 ### 學會各種框架有必要嗎? **一定要學會分配自己時間,要學的東西很多,真的很多,搞清楚哪些東西是重點,哪些東西僅僅瞭解就夠了。一定不要把精力都花在了學各種框架上,演算法、資料結構還有計算機網路真的很重要!** 另外,**學習的過程中有一個可以參考的文件很重要,非常有助於自己的學習**。我當初弄 JavaGuide: https://github.com/Snailclimb/JavaGuide 的很大一部分目的就是因為這個。**客觀來說,相比於部落格,JavaGuide 裡面的內容因為更多人的參與變得更加準確和完善。** 如果大家覺得這篇文章不錯的話,歡迎給我來個三連(評論+轉發+在看)!我會在下一篇文章中介紹如何從技術面時的角度準備