前期準備
校招在我看來是一件時間特別長的戰爭,爲什麼這麼說呢,因爲從你開始準備校招的那一刻開始,到你正式拿到offer的,並且確定去哪一家公司時,時間差不多一年左右,這個時間其實比考研、公務員等都要長,你可能會問爲什麼需要這麼長的時間,當然,這也跟個人的具體情況相關,每個人也會不一樣的,但是,也差不了多少,大神級別的除外了。
這篇文章主要還是講講校招的整個流程,需要準備什麼,遇到問題時怎麼去解決,怎麼去調整心態,這些都是很重要的,我也是把我個人的真實經歷告訴大家,希望能夠對大家有幫助。
選擇方向
在我看來,第一件事情應該就是選擇你找工作的方向,這件事情應該在你開始找工作的半年前左右確定,比如,你2021年3月開始春招找工作,那麼,我建議你最好在現在,也就是2020年10月就確定找工作的方向,爲什麼要這麼早,後面我會具體分析。
說到工作的方向,就現在的互聯網公司來說,其實可以選擇的方向還是特別多的,也是看個人的選擇,當然,也是可以有一些數據來做參考的;現在的校招的主流的方向有:算法,後端開發,前端開發,測試開發,運營開發,客戶端開發,測試等等,這些崗位通常來說是選擇最多的,對於幾個崗位,我也給一下自己的建議,可以供參考。
首先是算法,算法這個方向,在我剛剛讀研究生的時候也是有想過的,但是,隨着深入的瞭解,以及對於市場對於這個崗位的需求分析,後來,我就慢慢的放棄了,當然這只是一方面的原因;對於算法崗位,現在比較熱門的就是深度學習、機器學習了,由於CV方向特別火爆,這裏的火爆並不是說好找工作,而是競爭太大了,就今年的算法崗位來說,或者說從去年開始,基本上就是神仙打架了,沒有一兩篇頂刊論文,你都不好意思說你是搞算法的,所以,如果你想找算法的工作,我的建議是,第一,是不是研究生,第二,是不是211/985以上,或者更直接點是不是985以上的學校,第三,有沒有發過好的期刊的論文,我覺得這三點至少滿足兩點以上纔可以考慮去找算法的工作,否則,建議轉開發。
接下來說一下開發,開發現在其實競爭壓力也不小,想進大廠的壓力其實也很大,因爲需求就這麼多,當然,跟算法比起來就好很多了,後端畢竟方向很多,語言的選擇也是很多的,比如,Java、C++、Python、Go這些語言的方向都是可以選擇的,之前也說過,Go現在的需求也是在慢慢變大的,可以考慮一下這個方向,競爭可能小一些,其中,Java的競爭最大,可能是因爲大家都覺得Java好找工作吧,導致投遞的人數特別多,大廠就更不用說了,想找一個Java崗位的工作真的不容易,從我身邊的朋友來看,以及身邊同學找工作的感受來看,C++進大廠的難易程度還是小一些的,大家可以考慮一下,當然,這些選擇也是看你對哪個方向更喜歡了,或者更熟悉了,這裏只是給一些建議。
校招流程
上面說了如何選擇的問題,選擇好了之後,就應該熟悉一下目前的校招流程了,剛剛開始的時候如果不瞭解的話,或者沒有了解一些經驗之類的,還是會犯一些錯誤的,所以這裏給大家總結一下。
在現在的校招的模式下,校招分爲春招和秋招,春招基本上是找實習的,還是少量的校招補招的,補招就是上一年秋招沒有招滿,然後在春招繼續招人,而秋招基本上就是應屆生找工作的最佳時期了。
在今年的春天,2月份開始吧,春招就開始了,很多的公司就開始招是實習生了,特別是字節跳動,在2月初就開始了提前批,2月底提前批就結束了。
所以,春招找實習的黃金時間就是2-5月了,這個兩到三個月的時間都一直會有機會,也是拿實習offer的最佳時期。
接下來,6-8月這個時間段,如果你在春招找到了實習,那麼一般你就在公司實習了,實習結束後,到9月開始就是要開始秋招了。
但是,這裏其實有一個問題,在前面就講到過,現在的秋招一般都會很早,可能在7月的時候很多的公司提前批就開始了,而提前批又是很好拿offer的時候,所以,選擇去不去實習就顯得很重要了,或者,你去實習了,如果發現你所實習的公司不是你想留的公司,建議儘早離職準備秋招。從今年的情況來看,可能因爲疫情的影響,到了9月份開始秋招,發現其實已經晚了,拿我的情況跟身邊的同學來說,今年9月份開始秋招,一般都是投了一大堆的公司,結果最後只有可憐的5個面試機會,這個時候才發現,提前批真的很重要,再對比一些沒有實習的同學,通過提前批的面試,一般都有幾個offer斬獲,對比之下,發現實習的優勢竟然沒有了,可能這就是現在互聯網公司的找工作的現實寫照吧。
怎麼投遞,怎麼內推
前面講了校招的流程問題,這裏講一下在面試的過程中一定會遇到的問題,那就是投遞簡歷。
大家應該都知道,現在互聯網公司找工作,基本上都是在牛客網看相關的信息,這也是給大家提供了一個渠道。
關於投遞,現在不同的公司也有不同的形式。
第一種,大公司,大公司一般都會有自己的投遞官方網站的,都是在官方網站進行投遞,這個麻煩的就是,很多的簡歷信息都是需要手動輸入的,所以,還是比較耗時的,到時候遇到了你就會發現真的有點煩,有時候投遞個簡歷需要半天;但是,有一個好處就是,可以比較實時的查看面試進度,直接在官網上進行查看就可以了。
第二種,有一些公司因爲沒有自己的官方網站,所以,就託管在第三方來進行這個操作,比如,在牛客網上直接進行投遞,在牛客網上填寫簡歷,然後,就可以一鍵投遞了,這個方便一些,但是,就是感覺很多時候沒有消息,我也不知道爲什麼。
第三種,也是依賴第三方公司,今年投遞的感覺來說,一般都是依賴一個叫做https://www.mokahr.com/
,這個網站一般就是公司進行內推的,這個投遞網站好處就是方便投遞,而且有些公司只需要你上傳你的電子版的簡歷就可以,降低了投遞成本,但是,不方便的就是查詢投遞進度。
然後,說到內推,其實,方式也就那麼多。一般,如果有實驗室的師兄師姐在比較好的互聯網公司,那麼,我們可以通過這種渠道進行內推,一般也是比較靠譜的,成功率比較高;其次,現在很多內推也都是在牛客網進行了,我很多時候也是在牛客網看有沒有公司的內推,這種方式有一個問題就是一般內推的人很多,最終你能不能被篩選到是一個問題;最後,還有一種方式就是通過公衆號,官方的公衆號投遞,或者有一些公衆號也會提供內推碼。
最後,就算沒有內推,其實也不要緊,很多人直接在官網投遞,也是能夠機會的,而且,現在的內推跟前幾年還不一樣,現在就算是內推了,最多也就是有個筆試的機會,不會直接給面試機會,直接給面試機會除非是簡歷特別出衆。
校招知識儲備
這一部分我覺得是這篇文章的重點了,寫這篇文章也是爲了告訴大家怎麼準備校招,而其中的專業知識部分就決定你能不能拿到offer了,所以,接下來,我重點的跟大家聊聊校招的專業知識部分的準備工作。
算法
首先,我可以告訴大家一點就是,校招對於技術棧的要求並不會很高,校招就是招聘應屆生,只需要你有可塑性、可培養的空間,那麼,就很有可能給你offer,那麼,如果校招不強調技術棧的重要性,那麼注重什麼的考察呢?
沒錯,就是算法,對於計算機專業的學生來說,從大學開始接觸到計算機的必修課裏面一定是有數據結構和算法這門課程的,而且也是相當的重要,而校招,從我自身面試的經歷來說,算法可以說是十分的重要,再強調也不爲過。
在現在的招聘流程中,首先是有筆試,大公司的筆試一般就是2-4道編程題,題目的難度leetcode的hard以上,所以,筆試就是檢驗你的算法的能力;進入到面試階段後,基本上每一輪面試中,一定是會有算法題的,現在也是一般使用牛客網進行考覈,所以,大家可以先去牛客網適應適應,那麼,在一次面試中,算法的重要性怎麼樣呢?我這麼說吧,如果一輪面試中,面試官出了一道算法題,如果你做出來了,其他的專業知識點回答的很一般,你有可能進入到下一輪面試,如果你算法題沒有做出來,專業知識點就算回答的再好,基本上也是涼涼。因此,從我的經驗來看,面試中A出算法題,至少可以拿到60分,A不出來,那就是0分,無一例外。
那麼算法如何準備呢,這也是我想跟大家聊的一個話題,因爲我在找工作之前,算法的能力可以說太一般了,很多的算法都是不懂的,基本的題目也是很難做出來,但是,經過這一年的訓練,現在在面試中的算法題A出來基本上是沒有問題的,除非是特別難的題目,那當我沒說,有過幾次經歷,感覺被刷KPI了;因此,如果你現在也是對算法沒有任何的自信的話,不用太擔心,因爲我也是這樣過來的,只要你堅持,有方法的訓練,應對基本的面試是完全沒有問題的。
接下來就是講講怎麼去應付校招的算法難關,拿offer。
首先,如果你離秋招還有一年多的時間,也就是明年的秋天才參加秋招,或者時間更多,同時,你的數據結構跟算法的基礎也是不太好的話,我建議你先看看數據結構與算法的書籍,關於看哪些書籍,我之前已經寫過了,可以看這篇文章必須看的數據結構與算法書籍推薦。
其次,如果你的時間非常緊張,馬上就快要參加春招找實習了,這個時候其實我就不太推薦看書了,看書的效率其實是很難保證的,我建議你看一下牛客網左神的算法教程,左神的教程我是看過的,從基礎到進階的一整套課程,我覺得講的非常的精彩,能夠看得出來左神的功力,對於每一種算法的類型,每一個題目的講解都是細緻入微的,推薦去看看。
然後,如果你對於基本的算法通過看視頻或者看書有了一定的瞭解的話,那麼,接下來就是校招的刷題時間了。
講到刷題,其實方法很重要,這裏我就講一下我的這一年的刷題的經驗,其中也有自己的血與淚的故事,就不多說了,這裏告訴大家,避免踩坑。
不管哪個方向的,我都建議你刷題的第一本書是《劍指offer》,爲什麼這麼說呢,因爲面試的時候,很多的題目都是出自這本書的,不管哪個公司,另外我還要告訴你,特別是春招的時候,因爲大家準備的都不是特別好,所以,面試官出的題目也不會很難,一般就是選自這本書,一定要好好的把每一道題目都喫透。那麼怎麼樣纔算喫透呢,可能你看了幾遍這本書,但是還是不夠的,你還需要去牛客網找到劍指offer的專欄,進行線上的練習,只有當你自己可以在線上把每一道題都可以A出來的時候,並且都是最優解,這個時候,這本書就是過關了,那麼,你也是可以應付面試中的70%的算法題。
如果這一步你已經做到了,還想要提高的話,我還會推薦左神的書《程序員代碼面試指南:IT名企算法與數據結構題目最優解》,這本書的難度比劍指offer難很多,裏面有很多有難度的題目,但是各個章節都編排的非常合理,都是按照分類來的,非常適合進行刷題,訓練自己的算法思維。
當然,如果你不想看書,想直接刷題,那麼,我推薦你去leetcode進行刷題,去leetcode刷題也需要注意一點,儘量按照類型來刷,這樣可以更好的進行練習,同時,我也建議你先把hot100搞定,然後再去刷其他的,這樣可以先把最熱門的題目搞定,其他的有時間再去訓練。
以上就是應付算法的一些技巧,這當然只是針對大多數的人來說的,大佬可以跳過。
專業方向知識
這一部分接着上面的算法,可以算是比較合理的,只有在算法的基礎上,纔有資本談論專業知識,否則,沒有任何意義。首先聲明一下,下面的這一部分主要是針對Java開發的,其他的方向在這裏不討論。
Java大家都知道技術是非常的多的,也是比較費時間的,但是,結合校招的特點,狠毒的技術其實是不用討論的,主要的需要複習的在這裏都會講到,主要包括下面這些。
- 數據結構
- 計算機網絡
- 操作系統
- 數據庫
- Java基礎
- Java集合
- Java多線程與併發
- JVM
- Spring、Mybatis、SpringBoot等框架
- Redis
- Dubbo
- Zookeeper
- 消息隊列
以上的這些知識點其實都是考察的非常頻繁的,其中數據庫,數據結構,Java集合,併發,JVM,Redis這幾塊知識點,被問到的概率特別高,基本上是面試必問的。
不過,大家不用太擔心,因爲,通過這一年多的面試,我基本上把這些知識點都進行了總結,常見的面試題也都是進行了總結,只需要按照我總結的來進行復習,我覺得問題不大,互聯網前50應該是沒有任何問題的。
下面我給出一些我總結的常見面試題,都進行了分類,非常好進行復習。
-
一 Java基礎
- 一致性hash算法
- sleep和wait
- 強軟弱虛引用
- Arrays.sort原理
- 創建對象的方式
- 若hashcode方法永遠返回1會產生什麼結果
- 解決hash衝突的三種方法
- 爲什麼要重寫hashCode()方法和equals()方法以及如何進行重寫
- 動態代理
- sleep和wait的區別
- java 地址和值傳遞的例子
- Java序列化
- java NIO,java 多線程、線程池,java 網絡編程解決併發量
- JDBC 連接的過程 ,手寫 jdbc 連接過程
- 說出三個遇到過的程序報異常的情況
- socket 是靠什麼協議支持的
- java io 用到什麼設計模式
- serviable 的序列化,其中 uuid 的作用
- 什麼情景下會用到反射
- 淺克隆與深克隆有什麼區別,如何實現深克隆
- 反射能夠使用私有的方法屬性嗎和底層原理?
- 處理器指令優化有些什麼考慮?
- object 對象的常用方法
- Stack 和 ArrayList 的區別
- statement 和 prestatement 的區別
- 手寫模擬實現一個阻塞隊列
- util 包下有哪幾種接口
- 很常見的 Nullpointerexception ,你是怎麼排查的,怎麼解決的;
- 靜態內部類和非靜態內部類的區別是什麼?
- 怎麼創建靜態內部類和非靜態內部類?
- Xml 解析方式,原理優缺點
- 靜態變量和全局變量的區別
-
二 Java集合
- hashmap的jdk1.7和jdk1.8區別
- concurrenthashmap的jdk1.7和jdk1.8區別
- HashMap 實現原理,擴容因子過大過小的缺點,擴容過程 採用什麼方法能保證每個 bucket 中的數據更均勻 解決衝突的方式,還有沒有其他方式(全域哈希)
- Collection 集合類中只能在 Iterator 中刪除元素的原因
- ArrayList、LinkedList、Vector
- ConcurrentHashMap 和 LinkedHashMap 差異和適用情形
- ConcurrentHashMap分段鎖是如何實現,ConcurrentHashmap jdk1.8 訪問的時候是怎麼加鎖的,插入的時候是怎麼加鎖的 訪問不加 鎖插入的時候對頭結點加鎖
- ArrayDeque 的使用場景
- ArrayBlockingQueue 源碼
- hashmap 和 treemap 的區別
- rehash 過程
- HashMap 的負載因子,爲什麼容量爲2^n
- list,map,set 之間的區別
- 什麼時候會用到 HashMap
- 常見的線程安全的集合類
- 三 JVM
-
四 多線程併發
- volitale使用場景
- 可重入鎖,實現原理
- Java 無鎖原理
- 講講多線程,多線程的同步方法
- synchronized原理
- reetrantlock
- java 線程安全都體現在哪些方面
- 如果維護線程安全 如果想實現一個線程安全的隊列,可以怎麼實現?
- Java多線程通信方式
- CountDownLatch、CyclicBarrier、Semaphore 用法總結
- juc下的內容
- AOS等併發相關面試題
- threadlocal
- java 線程池達到提交上限的具體情況 ,線程池用法,Java 多線程,線程池有哪幾類,每一類的差別
- 要你設計的話,如何實現一個線程池
- 線程池的類型,固定大小的線程池內部是如何實現的,等待隊列是用了哪一個隊列實現 線程池種類和工作流程
- 線程池使用了什麼設計模式
- 線程池使用時一般要考慮哪些問題
- 線程池的配置
- Excutor 以及 Connector 的配置
- 五 Java框架(ssm)
- hibernate
-
spring&springmvc
- spring中的設計模式
- spring中bean的作用域
- BeanFactory和FactoryBean區別
- aspect的種類
- spring aop的實際應用
- spring實現多線程安全
- spring的bean的高併發安全問題
- ioc aop總結(概述性)
- Spring 的加載流程,Spring 的源碼中 Bean 的構造的流程
- Spring 事務源碼,IOC 源碼,AOP 源碼
- spring 的作用及理解 事務怎麼配置
- spring事務失效情況
- Spring 的 annotation 如何實現
- SpringMVC 工作原理
- 瞭解 SpringMVC 與 Struct2 區別
- springMVC 和 spring 是什麼關係
- 項目中 Spring 的 IOC 和 AOP 具體怎麼使用的
- spring mvc 底層實現原理
- 動態代理的原理
- 如果使用 spring mvc,那 post 請求跟 put 請求有什麼區別啊; 然後開始問 springmvc:描述從 tomcat 開始到 springmvc 返回到前端顯示的整個流程,接着問 springmvc 中的 handlerMapping 的內部實現,然後又問 spring 中從載入 xml 文件到 getbean 整個流程,描述一遍
- 六 微服務(springboot等)
- 七 數據結構
- 八 數據庫
-
MySQL
- 數據庫死鎖問題
- hash索引和B+樹索引的區別
- 可重複的原理MVCC
- count(1)、count(*)、count(列名)
- mysql的undo、redo、binlog的區別
- explain解釋
- mysql分頁查詢優化
- sql注入
- 爲什麼用B+樹
- sql執行流程
- 聚集索引與非聚集索引
- 覆蓋索引
- sql總結
- 有人建議給每張表都建一個自增主鍵,這樣做有什麼優點跟缺點
- 對 MySQL 的瞭解,和 oracle 的區別
- 500萬數字排序,內存只能容納5萬個,如何排序,如何優化?
- 平時怎麼寫數據庫的模糊查詢(由字典樹扯到模糊查詢,前綴查詢,例如“abc%”,還是索引策略的問題)
- 數據庫裏有 10000000 條用戶信息,需要給每位用戶發送信息(必鬚髮送成功),要求節省內存
- 項目中如何實現事務
- 數據庫設計一般設計成第幾範式
- mysql 用的什麼版本 5.7 跟 5.6 有啥區別
- 提升 MySQL 安全性
- 問了一個這樣的表(三個字段:姓名,id,分數)要求查出平均分大於 80 的 id 然後分數降序排序,然後經過提示用聚合函數 avg。
- 爲什麼 mysql 事務能保證失敗回滾
- 主鍵索引底層的實現原理
- 經典的01索引問題?
- 如何在長文本中快捷的篩選出你的名字?
- 多列索引及最左前綴原則和其他使用場景
- 事務隔離級別
- 索引的最左前綴原則
- 數據庫悲觀鎖怎麼實現的
- 建表的原則
- 索引的內涵和用法
- 給了兩條 SQL 語句,讓根據這兩條語句建索引(個人想法:主要考慮複合索引只能匹配前綴列的特點)
- 那麼我們來聊一下數據庫。A 和 B 兩個表做等值連接(Inner join) 怎麼優化
- 數據庫連接池的理解和優化
- Sql語句分組排序
- SQL語句的5個連接概念
- 數據庫優化和架構(主要是主從分離和分庫分表相關)
- 分庫分表
- 跨庫join實現
- 探討主從分離和分庫分表相關
- 數據庫中間件
- 讀寫分離在中間件的實現
- 限流 and 熔斷
- 行鎖適用場景
- Redis
-
九 計算機網絡
- cookie 禁用怎麼辦
- Netty new 實例化過程
- socket 實現過程,具體用的方法;怎麼實現異步 socket.
- 瀏覽器的緩存機制
- http相關問題
- TCP三次握手第三次握手時ACK丟失怎麼辦
- dns屬於udp還是tcp,原因
- http的冪等性
- 建立連接的過程客戶端跟服務端會交換什麼信息(參考 TCP 報文結構)
- 丟包如何解決重傳的消耗
- traceroute 實現原理
- IO多路複用
- select 和 poll 區別?
- 在不使用 WebSocket 情況下怎麼實現服務器推送的一種方法
- 可以使用客戶端定時刷新請求或者和 TCP 保持心跳連接實現。
- 查看磁盤讀寫吞吐量?
- PING 位於哪一層
- 網絡重定向,說下流程
- controller 怎麼處理的請求:路由
- IP 地址分爲幾類,每類都代表什麼,私網是哪些
- 十 操作系統
- linux
- 十一 框架其他
- 十二 設計模式
- 十三 分佈式
- 十四 其他
上面的這些就是我整理的互聯網公司的各個知識點的常見面試題,非常高頻的面試題,這裏因爲限於篇幅,不太好進行全部展示,如果想去看具體的解答或者質量高的博文解答,可以去我的github上查看:高頻面試題分類彙總。
上面的這些面試題可能不是特別的全面,有一些是沒有考慮到的,考慮到這個問題,我就把一些相關的面試題整理成了思維導圖,如果大家有需要也可以直接去這篇文章獲取,關於思維導圖有什麼好處我在這篇文章就不多說了,在上面這篇文章中有提到,總之,拿到這些資料,只要你好好去思考,對面試一定是大有幫助的,畢竟我就是這樣走過來的。
當然,這個github不止上面這些面試題,還有其他的關於我這一年的所有積累和總結,看了你就知道,一定會對你面試有很大的幫助的,因爲我就是靠上面的這些拿到大廠offer的。
面經
本來這篇文章最後還是想講講一些公司的面經的,但是,寫着寫着,發現這篇文章已經寫了幾天了,字數也快2W字了,考慮到文章篇幅太長了也不好,所以,這篇文章暫時就不分享一些公司的面經了,後面的文章再給大家分享,如果希望看到後面的公司的面經的話,比如,字節、阿里、騰訊等等,麻煩給個贊,這篇文章死磕了快一週了,原創不易,希望對大家有幫助。
最後,覺得不錯,點個讚唄!