從移動端測試開發實習到微信後臺和字節基礎架構開發實習(春招總結)

一、曾經

1.1 回顧

  今天是 2020年3月10日,在晚上五點多的時候我終於如願以償的收到了夢寐以求的騰訊 wxg 後臺開發的 Offer Call,其實很難想象在一年前的這個時候,我還是一個主攻 Android 開發的菜鳥,也是在 2019年3月28日我收到了人生中的第一份實習 Offer ,崗位是移動端的測試開發,對於那段經歷我當時也有寫博文進行記錄【實習面試結束後的一些思考(已拿騰訊實習 offer)】。那個時候的自己充滿了稚嫩,也對未來和自己的發展一無所知,包括當時去實習後其實也是從 Android 開發轉到了 Ios 開發,而那段實習帶給自己的最大影響就是讓自己真正的瞭解了在大廠中一個產品被開發出來的完整流程,也是第一次聽到像 Kafka 這樣的著名中間件。

二、轉變

2.1 初次接觸 SSM 框架

  在 2019 年的 4 月份,也就是在我完成實習面試後,我第一次接觸到了 Spring 、SpringMVC 和 MyBatis 這一套框架,之前總是聽別人說後端開發經常會涉及到 SSH 和 SSM 框架,而當時的自己的對於這些其實也只是一知半解,出於自己的興趣開始進行了學習,不斷地嘗試摸索,並在熟悉後順便開發了一個【基於 SSM 的網上購物系統(源碼 + 開發文檔 已開源)】項目,而在這個項目開發的過程中我也算是首次接觸到了一些比較熱門的中間件,並在實踐開發的過程中逐漸熟悉了後端開發的流程,但其實歸根到底也還是一個單機的項目,並沒有涉及到向分佈式這樣比較高大上的概念,這也是後面在春招中每次被問及到這個項目時,我都比較尷尬的一個原因吧。

2.2 嘗試閱讀 Spring 和 Zookeeper 的源碼

  網上購物系統的開發一直持續到了六月份,接下來的七八月份我都在騰訊進行實習,實習的內容主要是對內部 IOS 測試框架和測試庫的完善和擴展,並編寫一些測試的用例,所以在這個過程中可能對自己的技術提升不是特別的大,但是卻讓自己第一次真實的接觸到了大廠的開發流程。

  在完成實習回到學校的九月份,一次偶然的機會讓自己接觸到了一篇關於 Spring 源碼剖析的博文,在閱讀後覺得很有趣,就想着自己是不是也可以嘗試着去閱讀一些這樣比較著名的開源框架的源碼。開始的時候是挺難的,因爲畢竟是閱讀別人寫的代碼,在閱讀的過程中需要不斷的去揣測編碼者的設計思路,同時因爲這些著名的開源框架內部的功能代碼都很繁雜,所以很容易讓自己迷失在源碼中,而如果在閱讀的過程中你對每一行的代碼都刨根問底,一直追尋到最底層,那麼可能你很快就會不知所以,一頭霧水。所以在這個過程中最重要的就是明確你的目的和目標是什麼,你閱讀源碼是爲了解決哪個問題,這樣當你在解決了幾個問題後,你就會慢慢的發現整個源碼的框架都清晰了起來,從而慢慢的開始理解開發者的編程思想和設計思想。

  在源碼閱讀的過程中,對我自己感受最深的大概有這麼幾個部分。首先是對於 Spring 中的 BeanPostProcessor 的理解,其實網上對於 Spring 中 BeanPostProcessor 介紹的博文數不勝數,但當你閱讀之後你就會發現大多是浮於表面的一些介紹,要麼是直接拷貝官方文檔,要麼是直接拷貝別人的文章,而當我自己去真正的閱讀了 Spring 的源碼,才發現其實 Spring 中的很多功能都是跟 BeanPostProcessor 息息相關的。再比如對於 Spring 中 Bean 的生命週期,對於這個問題其實也算是面試中的必問題了,網上的解析文章一樣是數不勝數,但還是一樣的問題,當你閱讀過之後可能轉頭就忘記了,這主要是因爲這些東西並不是你自己真正理解的,而僅僅是靠死記硬背的,這個時候如果你自己去實例化一個 ApplicationContext ,然後自己去跟蹤一步一步的 debug 一個 Bean 從實例化到銷燬的全過程,我相信你會有更深的理解。

  對於源碼的閱讀不僅增加了自己對於代碼設計的認識,並讓自己真切的感受到了什麼纔是編碼的藝術。對於源碼閱讀的這方面內容就不做過多的敘述了,如果感興趣的話可以去看我的源碼分析系列博文,而對於源碼閱讀的方法我後面會專門寫一篇博文來幫助大家尋找閱讀源碼的最佳方法。

2.3 閱讀 Raft 和 Zab 等 Paper

  對於論文的閱讀是從實踐 MIT Lab 開始的,因爲在那個 Lab 中需要自己去實現一個 Raft 算法,而 Raft Paper 就提供了一套比較可行的實現思路,也就是從那段時間開始,我第一次開始認真地讀論文。跟閱讀源碼一樣,開始的時候是煎熬的,因爲論文大多是全英文的,所以想要閱讀一遍就理解它的內容基本是不可能的,所以對於每篇論文大多是需要反覆的閱讀好幾遍,對其中比較關鍵的語句甚至要反覆的推敲幾十遍才能確定其要表達的真正含義。尤其在進行復現的時候,可能因爲你理解錯了論文中的一句話,就導致整個系統無法正常運行。

  最開始閱讀的只有 Raft 這個 Paper,主要是爲了自己去用 Golang 實現一個可用的 Raft 算法。後面爲了進行對比,自己又去閱讀了 Zab 協議的 Paper,並在閱讀的 Paper 的過程中也對 Zookeeper 的源碼進行了閱讀,通過 Zookeeper 的源碼去探索它是怎樣實現 Zab 的。

  對於 Paper 的閱讀帶給自己最大的感受就是,Paper 將很多我們平時難以理解且找不到解決方案的問題以很直觀的方式展示給我們,並且發現其實很多平時我們覺得寫得很好的書籍和文章,很多也僅僅是對於 Paper 的翻譯而已。

2.4 實踐分佈式鍵值存儲系統

  這個項目其實是 MIT 的一個 Lab,總體來說就是自己使用 Golang 去實現一個 Raft 算法,並在該算法的基礎上搭建一個分佈式的鍵值存儲系統。因爲我們都知道其實 Raft 算法可以算是一種主備的系統結構(系統中僅由 Leader 對外提供服務,Follower 僅作爲故障轉移的備份,這一點其實跟 Zab 協議還是很不相同的),因此實質上我們是使用 Raft 算法去避免單點問題,能夠讓系統在發生故障時實現動態的數據遷移。

  這個項目的週期大概是從十月開始的兩個月,因爲從這個項目開始我纔算是真正的接觸到了底層的分佈式項目的搭建,所以那兩個月基本是每天從早到晚都泡在圖書館,又因爲分佈式項目在 debug 時存在的侷限性,因此經常是一個 bug 就要不停的 debug 很多天才能解決。但是這個項目帶給我的成長也是顯而易見的,經過這個項目的洗禮,自己對分佈式的理解有了一個本質的提升。

2.5 大量底層技術資料的閱讀

  對於底層技術資料的閱讀其實都是集中在十二月,因爲一月初是最後的期末考試,按照我自己的習慣來說每學期的最後一個月都是要用來複習的,也恰好大三上的課程都是專業性比較強的課程,因此在這個階段不僅通過學習自己實踐設計了一個包含九條指令的 CPU ,也通過在極客時間上對於算法、計算機組成原理、操作系統等一系列專欄的閱讀使自己的專業素養得到了極大的提升(因爲最後一個月都留給了期末複習,但其實需要複習的東西並沒有那麼多,所以更多的時間還是留給了自己去閱讀極客時間的專欄)。

三、春招

3.1 記述

  我的春招最早是從一月中旬年前開始的,一共經歷了兩輪的騰訊雲測開(Golang 後臺)和兩輪的騰訊微信(Cpp 後臺)面試,對於騰訊微信的面試基本都是四十分鐘的四至五道的算法題,接着是一個小時二十分鐘的面試,一面基本是基礎面試,二面是項目面試,三面是 HR 面試,但因爲 HR 這段時間比較忙,所以總體上後半段的進度會比較慢一些。

  其餘的面試還有兩輪的度小滿測開(Java 後臺)、三輪技術面+一輪HR面的字節跳動基礎架構和兩面的阿里淘系技術面。

  • 騰訊微信後臺開發 Offer
  • 字節基礎架構開發 Offer

3.2 感受

  我對於春招的準備,還是比較佛系的吧,因爲對於面試中經常問到的計網和操作系統的一些內容自己經常也會通過一些文章的閱讀而有所瞭解,所以在準備春招的過程基本就是每天早上六點半起牀開始刷 LeetCode,然後八點多開始喫飯,之後一杯咖啡,然後一上午會去複習一些相關的內容,之後中午午休後出去轉一圈,回來再複習一些,反正每天十點半之前是一定要睡覺的,從而保證自己第二天能夠按時起來且一天都具有充足的動力,因此感覺整個春招的過程還是比較自然的。

3.3 總結

  嗯,又到十點半了,該睡覺了,最後的就用一句話來總結吧。

  機會總是留給有準備的人的,越努力越幸運,共勉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章