我如何用三個月備戰春招 | 掘金技術徵文。

bestsort發表於2020-04-05

前言

本文所有內容均為bestsort個人總結。不一定適合所有人,請注意甄別

bestsort 目前大三,就讀於山東某二本院校軟體工程專業。大一、大二期間參加過ACM並有幸擔任了一年的負責人。以下是我自己覺得稍微能看的地方。

  1. 拿到的獎項有藍橋杯(國二)、ACM省賽(二等獎)、區域賽優勝獎(這是炮灰哈哈,簡歷上沒寫這條)。
  2. 在大三上花了2個月時間寫了個半成品專案, 其中大部分功能都是我自己參考知乎、掘金、CSDN設計的。
  3. 我還有一個個人部落格,訪問量預估應該是15W左右(去年暑假沒用CSDN了,搭在了自己伺服器上,這是CSDN的統計),總字數11W左右。
  4. 我給開源專案Halo貢獻過兩個Pull Request, 其中一個PR對某一模組效能提升較明顯,減少了附件上傳時的記憶體開銷(不過這是開始面試後的事情了,大概在3月10號左右的樣子)

目前到手的 offer 只有 CVTE, 騰訊約了4.7的HR面,阿里週五剛結束三面。需要注意的是:本文不涉及面試題目,如果是因為想看面試題目而進來的同學可以直接右上角退出。 因為我覺得千人千面,別人遇到的不一定自己能遇到,至於一些基礎知識,反正是都要考的嘛~ 瞭解了面試官想考察的點,問題自然就會了,哪怕不會(其實騰訊一面問我的問題我大部分都不會)也能夠在分析的過程中體現你的能力,對於校招生來說這就夠了。而對於一些基礎,其他面經都有寫,我就不再贅述了。如果現在提起SQL中的事務特性、JVM記憶體區域劃分、索引的底層結構這些基礎你都一頭霧水的話,建議抓緊抓緊抓緊時間學習。別感慨這些上課的時候聽都沒聽過, 現在的大學教育和實際應用有較大的脫節。

本文適合人群

本文適合準備衝刺大廠的應屆生,需要讀者有一定辨別能力(因為本文只是從筆者的角度去分析、總結。可信,但不可全信)和一丟丟丟丟的毅力,筆者準備面試排除專案和演算法用了3個月左右(這三個月還打了近150聯盟~)還有一點點檢索能力。

由於作者投遞的均是Java相關崗位,所以Java崗位的同學食用更佳,其他語言的同學可適當參考。

我準備了什麼?

一月份

在整個一月份期間,我做了以下事情:

  1. 閱讀了JDK、CGLIB動態代理的原始碼並將JDK原始碼分析寫了一篇文章釋出在我的部落格
  2. 瞭解了MySQL常見的面試問題包括MVCC、事務、隔離性、索引資料結構、InnoDB和MyISAM的區別等一些較基礎的知識,當時對於間隙鎖、意向鎖、optimizer trace、回表、聚簇索引非聚簇索引這些都沒有了解過。
  3. 將《深入理解Java虛擬機器》粗讀了2-3遍並且我認為可能成為面試考點的地方我做了紙質筆記。
  4. LeetCode刷題,每天3道。這個沒堅持下來,20天做了Top100裡的50道題左右。
  5. 將《TCP/IP詳解卷一》的17-24章看了兩遍(這一部分主要是講TCP協議)並做筆記。
  6. 和在牛客群裡結交的小夥伴進行了5場左右的模擬面試,每一場針對某一塊詳問,持續時間每次大概1H左右。

整個一月份是我準備時間最多的一個時間段,包括接下來的二、三月份工作量都減少了很多。

二月份

二月份我沒有準備太多,因為這個時間點一些公司已經在開始進行面試了,所以這一時間段主要圍繞面試過程中遇到的不會的知識點去進行一個查漏補缺。在整個二月份我做了下面的事情:

  1. 回顧我的整個專案,因為時間一長一些專案細節可能就記不太清楚了,這在面試中是非常致命的問題。
  2. 思考專案中有哪些可擴充套件點以及優化空間,和在大流量下的一些解決方案。
  3. 看完了《Java併發程式設計的藝術》和《Redis設計與實踐》這兩本書,針對Redis的底層資料結構畫了個導圖同時複習了一下《深入理解Java虛擬機器》。
  4. 掘金購買了《從根上理解MySQL》這本小冊並試讀了幾節。
  5. 面了CVTE、東方金信(一個小公司)和阿里淘系的一面+CBU一面。二月底收到了前兩個公司的Offer。
  6. 寫了一點畢設(一個整合各物件儲存的個人網盤,想用做秋招專案就提前寫了),同時看了Halo部分模組的原始碼。

三月份

三月份的筆試漸漸多了起來,這時候我反而沒做什麼事情。。

  1. 給Halo提了倆PR並被專案成員merge進主分支
  2. 看完了《從根上理解MySQL》(只是粗讀了一遍)
  3. 各種筆試+面試(面試其實也就阿里、騰訊~)
  4. 學習了作業系統的一些知識,包括I/O模型、程式執行緒這些基礎。這部分主要是面向面試~使用的話我其實還好,因為我一直都是在Linux環境下開發。
  5. 完善了HTTP、HTTPS相關的一些知識。
  6. 看了一些設計模式並且自己寫了一下(這個主要是因為給Halo提交PR的時候和我寫網盤的時候用到的)

如何去準備?

首先要明白一點,面試的幾個重點:基礎、演算法/資料結構、專案、發展潛力,任何一場面試都是圍繞這幾塊進行的。其中基礎和演算法/資料結構是核心中的核心,而演算法這東西是沒辦法短時間提高的。三個月的時間內也很難真正拿出一個可用的專案(哪怕拿出來了,能保證大多數是自主思考的嗎?又會消耗多少精力?)所以我們需要定下一個大致的複習路線:

1. 演算法是不可或缺的,推薦每天刷固定題數。3個月的時間已經足夠提升到一定水平了。

2. 基礎是重中之重,包括但不限於網路、作業系統、語言相關、資料庫、中介軟體等。對於某些點可以適當多挖掘一點,突出自己的學習能力和潛力。比如說大多數人可能會在簡歷中填:熟練使用MySQL,能夠調優什麼的。那我們準備的時候就可以去專門建立一個百萬級/千萬級的大表嘗試調優,然後總結調優過程。比如說一般的同學可能用explain檢視,我們就可以用optmizier trace去檢視具體的執行路徑,進行一個較深的一次探索,絕對比花時間去背面試題亮眼得多。
3. 推薦大家找一些志同道合的小夥伴,四五個即可,約定好複習哪一模組,然後定期進行模擬面試,不管是作為模擬面試中的面試官還是被面試者都應該盡力嘗試一下,一是鞏固知識,二是在這過程中挖掘自己可能沒顧及到的地方,三是提升自己的表達能力。
4. 多看書,不要以為書上的都是又臭又長。恰恰相反,看完一整本優秀的書籍能夠在腦海中形成一個完整的知識體系,而且書中會介紹很多坑點。如果面試的時候是背面經的話很容易一擴充套件問就露餡。
5. 在複習的過程中多問為什麼。比如說雜湊表這個東西,為什麼Java中的HashMap是用的紅黑樹+連結串列?相對於Redis的字典又有哪些不同和優劣點,漸進式擴容和多執行緒協作擴容的細節這一類。再比如說MySQL的索引使用的是B+樹,為什麼不是二叉樹?在排除I/O次數的情況下兩者誰更優?(這裡我是真的算過。。)
複製程式碼

上面為什麼沒有提到框架?

我可以毫不猶豫地講:我面過的所有面試官沒有一個問我框架的,原因我認為在於2點:

  1. 我簡歷上沒有寫任何關於框架的條目(有的同學可能會納悶這樣怎麼過的,參照如何去準備裡的第二條)。
  2. 面試官覺得我的潛力、基礎都不錯,對於框架要求不大。
  3. 我太菜了 這裡我覺得主要是第二和第三點,現在真的很多專案都是秒殺/商城,很多同學說關鍵點全對著視訊裡講的一陣亂抄,沒有經過自己的一個較深的思考。這就好比抄作業,都抄的一樣怎麼去區分?

我的專案只是一個半成品,但是單單是快取這一塊,我自己的選型就從用MyBatis的二級快取 -> Spring Boot Redis Cache -> 手寫aop註解,每一次換元件都經歷過了我自己的思考,對於其中的優點和痛點都有我自己的想法。 再比如說我做的是一個社群,為了設計評論和點贊這些功能我參考了掘金、知乎、CSDN等一堆社群網站,每一個網站我都用攔截器去檢視了他們這些介面的返回值和設計,而這些我覺得是跟著視訊做的同學所不能體會到的。

我自己的缺點很明顯,不會IO不會分散式沒寫過微服務沒有實習還是個二本本科。但是我明白自己的優勢在哪裡,我的學習能力和潛力我能夠在面試中通過回答讓面試官清楚的瞭解到。我覺得這就是我為什麼能拿到Offer的原因。

如何準備一個專案

這部分專案在絕大多數情況下都是不可或缺的,但是對於大多數應屆生,並沒有能力去獨立的完成一個比較優秀的專案。這時候就可以多多參看一些資料。包括但不限於:已上線且有大量使用者的產品、視訊、各技術部落格。 其中多數同學可能都會選擇 視訊 的方式去學習,因為跟著視訊走能夠避免很多的坑,但是我需要提醒的是當心舒適區陷阱(自造組合詞~)。

私以為當你在學習過程中發現某些邏輯、設計、思想和之前學習的過程中有重合的時候,就應該停下視訊了。 然後自己嘗試去實踐一下某個模組的實現,寫完後再回頭對比視訊中的設計,並且可以嘗試著去比對一下各自的優缺點和看看有沒有什麼優化空間。

其實和刷演算法題的時候是很簡單的道理,有些題可能想破頭皮也不知道怎麼去做。但是看到人家的解法的一瞬間自己就懂了。那為什麼大家刷演算法題的時候不一開始就點開答案?我相信刷過題的諸位都有自己的答案。AC某一道題並不是我們刷題的目的,目的是通過刷題提升自己的思維能力,讓我們能夠在面試的時候舉一反三快速AC(格局小了、小了哈~)。 同樣,對於大多數而言專案也並不是目的,目的是在面試過程中能夠展現自己的實際操作能力、學習能力、工程化思維、發展潛力、etc... 如果只是單純的照著視訊把上面的程式碼搬運下來,記了記常見面試題而沒有經過自己的深入思考的話,面試過程中很容易暴露問題的。這裡我列舉幾個問題,如果你簡歷裡有以下關鍵詞,可以檢驗一下自己的學習成果。問題瞎想的,別當真...我比較菜想不出比較妙的問題,大佬無視即可。

  1. 動態代理: JDK動態代理中的快取是如何實現的, 有什麼好處
  2. ConcurrentHashMap: ConcurrentHashMap的擴容機制, 為什麼選擇從後往前
  3. HashMap: Redis也有類似的Hash結構,二者實現的區別,為什麼
  4. 事務: 為什麼InnoDB的預設隔離級別是RR,出於什麼考慮
  5. 單例: 為什麼列舉實現要優於Double Check
  6. MySQL: MySQL 的 Redo Log 和 Redis 的 RDB、 AOF 兩種持久化方式的對比
  7. MySQL: SQL語句有些時候即使避開了會引起索引失效的查詢方式也可能不會走索引,那麼查詢優化器是如何選擇執行路徑的?
  8. CAS: CAS操作中,到底會不會上鎖,單核和多核環境下進行CAS有沒有區別?

限於水平,只能提出這有限的幾條問題拋磚引玉。如果大家有更好的問題,歡迎評論區留言~

相關文章