https://www.nowcoder.com/share/jump/2764630231719583704126
大家好,我是白露啊。
今天我們要分享一個非常勵志的故事,它證明了雙非背景的畢業生也可以通過努力和堅持,進入夢想中的大廠。
下面是這位網友的真實經歷,希望能為正在找工作的你提供一些激勵和參考。
背景介紹
這位網友的背景并不特殊,他是一名雙非本科畢業生。實習經歷包括順豐和貨拉拉。
在秋招時,他只有一個秋招期間爛大街的博客項目,而在春招期間,他換成了一個短鏈接項目。
秋招和春招的面試與Offer
秋招: 他參加了多個面試,但能拿到的中大廠后端面試僅有貨拉拉(零星的一兩個小廠就不提了)。
春招: 春招期間情況有所好轉,他陸續拿到了汽車之家、樹美科技、小黑盒和美團的面試機會。
相比秋招,春招確實多了很多機會,感覺一部分是因為項目更具吸引力了,而且他也積累了更多的經歷。
秋招和春招的感悟
學歷重要,但不是決定因素:
對于校招生來說,學歷、實習經歷、優秀的項目或開源經歷確實是非常重要的。
但是,他自己的經歷證明了,學歷低并不完全意味著無法進入中大廠。
在秋招時,他看著周圍的人不斷拿到面試機會,而自己卻機會渺茫,這讓他極度焦慮。
然而,他沒有放棄。
不斷完善自己,抓住每個機會:
他在實習的同時,一邊投遞秋招的簡歷,一邊學習八股算法,還忙著尋找耗時短但亮眼的項目。這一切都是因為他深知自身簡歷的劣勢,無論是學歷還是項目經歷,均不占優勢。
因此,他不斷尋找機會去完善自己。
貨拉拉給了他一個機會,他抓住了。
盡管那時候他的簡歷還很一般,使用的項目也是爛大街的博客項目,但他憑借毅力和勤奮成功獲得了這次難得的機會。
提升自我,增加面試機會:
轉到春招時,由于他完善了個人項目并且提前去貨拉拉實習,豐富了履歷,他的面試機會顯著增加。
他拿到了美團和快手的面試機會,并最終選擇了美團的offer。不得不說,馬哥的短鏈項目在短時間內快速掌握并且有很多亮點,非常適合用來充實簡歷。
給24屆校招生的建議
把握機會,提升自我:
雖然學歷無法改變,但我們可以把握住各種機會。
沒有面試機會不可怕,最可怕的是,當機會來臨時沒有好好把握。如果他在秋招時沒有把握住貨拉拉的機會,沒有提前去實習增加履歷,春招的機會可能也會少很多。
不斷增加履歷,提升自我:
我們要做的就是不斷豐富自己的履歷,不斷提升自己。
當機會來臨時,一定要抓住。這個網友的經歷告訴我們,雙非背景確實有可能進入大廠。關鍵在于如何利用每一個機會,如何通過不懈的努力去追求自己的目標。
總結一下,這個網友的分享證明,學歷背景并不是決定你能否進入大廠的唯一因素。
通過努力、堅持和不斷自我提升,每個人都有機會實現自己的職業夢想。
希望他的經驗和建議能激勵更多的24屆校招生,讓大家在求職路上更加堅定和自信。
如果你有任何問題或想法,歡迎在評論區和我討論分享。
美團一面面經
面試官: 你好,先簡單介紹一下你在實習經歷中覺得最有價值的一個case吧。
求職者: 當然。我在實習期間參與了一個對CompletableFuture多線程接口進行優化的項目。這個項目的背景是我們在處理大量并發任務時,發現現有的多線程實現存在性能瓶頸和資源浪費的問題。我們希望通過使用CompletableFuture來優化多線程處理。
面試官: 那么,你們為什么選擇使用CompletableFuture進行優化?它解決了哪些關鍵問題?
求職者:
-
背景:我們原先的多線程實現采用的是傳統的Thread和ExecutorService,在處理大量并發任務時,出現了線程資源浪費和性能瓶頸的問題。
-
關鍵問題:
-
線程管理復雜:傳統的線程管理需要手動控制線程的創建和銷毀,容易導致資源浪費。
-
任務依賴:處理任務依賴關系復雜,手動管理任務之間的依賴關系容易出錯。
-
阻塞:傳統的多線程方法容易出現阻塞,降低了整體性能。
面試官: 使用CompletableFuture進行優化后,帶來了哪些問題?使用它時需要注意哪些點?
求職者:
-
帶來的問題:
-
調試難度增加:由于異步執行,調試和排查問題變得更加復雜。
-
異常處理復雜:異步任務中的異常處理需要特別注意,容易遺漏。
-
注意點:
-
線程池選擇:需要合理選擇和配置線程池,以避免線程資源的浪費和性能瓶頸。
-
任務依賴管理:需要特別注意任務之間的依賴關系,確保任務能夠正確執行。
-
異常處理:需要在每個異步任務中進行適當的異常處理,避免異常傳播影響整體流程。
面試官: 你們在使用CompletableFuture時,線程池是怎么考慮的?
求職者: 我們選擇了ForkJoinPool作為默認的線程池,因為它能夠更好地利用多核CPU資源。同時,我們也根據任務的具體需求,創建了自定義的ThreadPoolExecutor,用于處理一些特定的任務。
進程間通信
面試官: 看你是科班出身,我們聊聊進程間通信(IPC)吧。你能介紹一下進程間通信的方式嗎?
求職者: 當然。進程間通信的方式主要有以下幾種:
- 管道(Pipe):用于父子進程之間的通信,單向傳輸。
- 命名管道(Named Pipe):用于任意進程之間的通信,雙向傳輸。
- 消息隊列(Message Queue):用于不同進程之間通過消息傳遞數據。
- 共享內存(Shared Memory):多個進程共享同一塊內存區域,速度快,但需要同步機制。
- 信號量(Semaphore):用于進程間的同步,控制對共享資源的訪問。
- 套接字(Socket):用于不同主機之間的通信,也可以用于本地主機的進程間通信。
面試官: 那么從操作系統設計者的角度考慮,為什么需要設計這么多種進程間通信的方式?
求職者:
- 不同的應用場景:不同的通信方式適用于不同的應用場景。例如,管道適用于簡單的父子進程通信,而共享內存適用于需要高效數據傳輸的場景。
- 性能需求:不同的通信方式在性能上有差異,共享內存速度快但復雜,而消息隊列和信號量則相對簡單但速度慢。
- 同步需求:有些通信方式如信號量和消息隊列提供了同步機制,適用于需要嚴格同步的場景,而共享內存則需要額外的同步機制。
- 網絡通信:套接字不僅適用于本地通信,還可以用于網絡通信,具有廣泛的應用范圍。
TCP和UDP
面試官: 好的,我們再聊聊網絡協議。TCP和UDP主要有什么差別?
求職者:
-
TCP(Transmission Control Protocol):
-
連接型協議:在傳輸數據之前需要建立連接。
-
可靠性:提供可靠的數據傳輸,確保數據包按順序到達,并且沒有丟失。
-
流控制和擁塞控制:TCP具有流控制和擁塞控制機制。
-
應用場景:適用于需要可靠傳輸的應用,如HTTP、FTP、郵件等。
-
UDP(User Datagram Protocol):
-
無連接協議:無需建立連接,直接傳輸數據包。
-
不可靠:不保證數據包的順序和完整性,可能會丟失或重復。
-
低開銷:由于沒有連接建立和維護,傳輸效率高。
-
應用場景:適用于對實時性要求高但不要求可靠傳輸的應用,如視頻流、在線游戲、DNS等。
面試官: 那么,怎么基于UDP實現一個可靠的通信協議?
求職者: 可以基于UDP實現一個可靠的通信協議,以下是一些關鍵點:
- 序列號:為每個數據包分配一個序列號,接收方可以根據序列號重組數據包,并檢測丟失的數據包。
- 確認機制:接收方在接收到數據包后發送確認(ACK)給發送方,發送方在超時未收到確認時重新發送數據包。
- 重傳機制:發送方在超時未收到確認時,重新發送數據包。
- 流控制:根據接收方的處理能力,調整發送數據包的速率,避免接收方過載。
- 擁塞控制:通過檢測網絡擁塞情況,動態調整發送速率,避免網絡擁塞。
線程安全的單例模式
面試官: 請寫一個線程安全的單例模式,需要使用final
、private
構造函數、volatile
和雙重檢查。
求職者: 這是一個使用Java
實現的線程安全單例模式示例:
public class Singleton {private static volatile Singleton instance;private Singleton() {// 私有構造函數,防止外部實例化}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
解釋:
- volatile:確保多線程環境下的可見性,防止指令重排序。
- private構造函數:防止外部實例化。
- 雙重檢查:在同步代碼塊內外都進行檢查,以提高性能。
數據庫隔離級別
面試官: 你了解數據庫隔離級別嗎?
求職者: 了解。數據庫的隔離級別決定了事務之間的隔離程度,共有四種常見的隔離級別:
- 讀未提交(Read Uncommitted):最低的隔離級別,允許讀取未提交的數據,可能會導致臟讀。
- 讀已提交(Read Committed):只允許讀取已提交的數據,避免臟讀,但可能會出現不可重復讀。
- 可重復讀(Repeatable Read):在一個事務內多次讀取相同數據時,結果是一樣的,避免不可重復讀,但可能會出現幻讀。
- 可序列化(Serializable):最高的隔離級別,完全隔離事務,避免幻讀,但性能開銷最大。
聯合索引
面試官: 聯合索引在不滿足最左匹配原則時為什么會失效?
求職者: 聯合索引在不滿足最左匹配原則時會失效,這是因為數據庫在創建聯合索引時,是按照索引列的順序進行排序的。只有按照最左前綴順序查詢時,才能有效利用索引。如果查詢條件不包含最左邊的列,數據庫無法利用索引的排序信息,導致索引失效,退化為全表掃描。
算法題
面試官: 最后我們來做一道算法題。一個變形的二分查找,做法是根據mid
所處的下標奇數偶數決定是去mid-1
還是mid+1
。你可以試著寫一下代碼嗎?
求職者:當然,我們繼續。
求職者: 好的,我來寫一下這個變形的二分查找的代碼。假設我們有一個已經部分排序的數組,并且我們需要根據mid
的位置是奇數還是偶數來決定下一步的搜索方向。
public class Solution {public int modifiedBinarySearch(int[] nums, int target) {int left = 0;int right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {return mid;}if (mid % 2 == 0) { // 如果mid是偶數if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}} else { // 如果mid是奇數if (nums[mid] < target) {right = mid - 1;} else {left = mid + 1;}}}return -1; // 如果沒找到,返回-1}
}
解釋:
-
初始化左右指針:
left
指向數組的左端,right
指向數組的右端。 -
計算中間位置:
mid = left + (right - left) / 2
,避免直接相加可能導致的整數溢出。 -
比較中間值和目標值:
-
如果
nums[mid] == target
,返回mid
。 -
如果
mid
是偶數且nums[mid] < target
,則目標值在右半部分,移動left
指針。 -
如果
mid
是偶數且nums[mid] >= target
,則目標值在左半部分,移動right
指針。 -
如果
mid
是奇數且nums[mid] < target
,則目標值在左半部分,移動right
指針。 -
如果
mid
是奇數且nums[mid] >= target
,則目標值在右半部分,移動left
指針。 -
循環終止條件:當
left > right
時,停止循環,如果沒有找到目標值,返回-1
。
面試官: 很好,今天的面試就到這里了,感謝你的回答。我們會盡快通知你結果。祝你好運!
參考原文:https://offernow.cn