我,來自大山。
我,不甘平凡。
筆者80后,出生在江西一個偏遠的山村。雖然出生時已經不是那個溫飽都是問題的年代,但是也談不上有個幸福的童年。家里很窮。幼兒園并沒有讀,因為家里覺得花那個錢沒有必要,小學才開始學拼音字母。我的童年,就是和我的姐姐弟弟在山中的梯田里放牛,抓泥鰍,割魚草。
父親在廣東打工,母親一個人在家里帶著我們三個孩子。種種原因,在我從小學開始到高中畢業,我的學習一直很差。
直到我高考成績出來的那一天。我媽看著我不堪入目的成績哭成了淚人。我心都要碎了。也是從那一天開始,我決心要改變這種現狀。我要走出這個山窩窩。
為什么想去字節跳動
實際上,這次的工作變動并不在我計劃中。只是在四月份的時候偶然得知字節跳動上海要搬到合川路地鐵站附近,我就忽然心動了。為什么呢,因為我家距離合川路地鐵站步行只要十分鐘。本身宇宙條待遇高名聲在外,也就是說,只要我能來這里的話,人生最美滿的錢多事少離家近的不可能三角我能拿倆。所以在五月份的時候我就開始悄摸摸地準備面試頭條了。為的就是以后可以過上早上八點半起床,然后慢慢悠悠走到公司還不遲到(可能還是很早來的人之一)的生活。
當然,這是我為什么想去字節跳動的原因。換算到你們自己的時候,你們也要想一想是因為什么想要換一份工作、想要去某個公司。為了薪資?環境?平臺?還是大公司的名頭?記住,不管是為了哪一個,都OK的。談錢不傷感情,目標明確,心智堅定以后,才好圍繞著這個目標做一系列的準備。面試的過程中每次面試官問我為什么想來字節跳動,我都是直截了當地說離家近,還說假如這次面不上,準備準備,過段時間再面試好了。反正你們公司就在我家旁邊,三年五載的可能都跑不掉,哈哈。
因為這種面上OK,面不上也沒事的心態,所以感覺面試的時候我的發揮也好一些。本身就是一個互相選擇的過程,而且這個過程中,公司方相對來說固定一些,因為他的招人標準不太可能會有太大的變化。拿我經常用來懟人的一個例子來打比方:我常常和別人說,搞技術開發,英語很重要。你需要英語來看最新的技術文檔,并且有些翻譯并不準確,你可能需要看原文才能理解什么意思。有的人當時就會和我說,哎,可惜我英語不太好。這個時候我會回,沒事,你現在英語不好不是你的錯,但是如果我一年以后,甚至兩年三年以后再來問你英語怎么樣,要是你還和我說你英文不好的話,那你就得查一下自己的問題了。你根本就不想著學英語,英語怎么可能會好?
類比下來,如果你根本不想去這個公司,那你怎么可能來到這個公司?如果你真的想去一個公司,可能現在這個時候你暫時不滿足要求,但是沒事,只要咱知道別人是啥要求,咱認真學習,好好準備,一年以后再面試,兩年以后再面試,甚至三年、五年以后再來試試,都可以的。人最怕的不是沒有達成目標,而是沒有一個真正的目標。所以,換工作之前,你要想清楚為什么,并且提前開始準備。
我準備了些啥?
其實我有好長一段時間沒有正規地面試過了。三年前從數云換到GIO的時候,因為簡歷上的相關技術太過于匹配,所以基本上就和CTO聊了聊就確定過去了;后來再回數云的時候,也就和總監喝了一下咖啡就回來了。也就是大約5年的時間里面,我沒有正規地接受過面試。所以在準備投字節跳動之前,我投了幾個公司做了一下熱身活動。記住,這個時候其實不需要有啥心理包袱。因為本身候選人面試成功的可能性比較低,一個合適的可以面試的人選他們也很樂意看看,而且萬一你確實想換工作,但是心儀的公司面不上,而熱身活動的公司拿到了offer,你也可以考慮考慮去看下。并且這個時候你沒有任何的心理包袱,因為反正你也就是來面試看看的,所以面試時候的發揮可能也會更好點,因此說不定最終拿的offer會比最后想去的那家更好呢?
當然這里面不包括我。我第一次面試的時候就被血虐了T-T。參加中間件比賽的時候,我用的netty做的實現。個人感覺對netty還算有所了解的,結果面試官讓我直接寫出netty的源碼結構,包括哪幾個主要的類以及名稱還有互相之間的關系……工作的項目里面我使用了kafka來做消息隊列,來緩沖流量,保護系統,結果直接讓我描述kafka的存儲結構……比賽的時候我通過各種手段讓程序無GC,結果直接就要我說出各種GC算法的原理和應用場景……PolarDB比賽我們自己寫了KV,對標的是RocksDB,結果讓我描述RocksDB的索引結構……
當然,雖然基本上他問的東西我都有所了解,并且清楚應用場景在哪里,但是到了細節里面的時候,就稍微有點蒙圈了。雖然每個細節我確認我稍微看一下就能搞定的,但是架不住面試的時候無法張口就來呀。這個時候,感覺仿佛我變成了年輕時候的楊過,忽然身邊出現了一個金輪法王對我說:“楊兄弟,你的武功花樣甚多,不過我倚老賣老說一句,博采眾家固然甚妙,但也不免駁而不純。你最擅長的到底是哪一門功夫?要用什么武功去對付郭靖夫婦?”。對呀,我的知識面很廣,各種應用框架新技術可能都有所耳聞,但是我最擅長的是哪一個呢?雖然我深深地知道我最擅長的是Scala和Akka、Play、Lagom等,但是架不住沒有人會問呀T-T。
事已至此,雖然我帥如楊過,但是此時也不得不考慮一下整理一下平生所學,找出強點和弱點,然后在面試的時候有的放矢。所以第一次熱身面試之后的一個星期,我基本就在整理我的知識結構了。我大致按照如下結構做了一份思維導圖:
- JVM相關
- 運行時結構
- GC算法
- JVM調優
- 編程語言
- Scala
- Java
- 數據結構與算法
- 表、棧、隊列
- 樹
- 散列
- 優先隊列
- 排序
- 高級數據結構
- 并發編程
- Java內存模型
- 基本工具
- 無鎖并發
- 反應式工具
- 微服務
- 微服務設計
- 服務治理
- 中間件
- 分布式緩存
- 消息隊列
- RPC
- 數據庫
- 關系型數據庫
- NoSQL
- NewSQL
- 機器學習算法
- 推薦算法
其中JVM、Scala相關、并發編程、消息隊列什么的,我都仔細寫了一下;Java語言太簡單就沒弄,數據結構稍微看了一下感覺腦海里面塵封很久的記憶忽然就被喚醒了,所以也沒咋做筆記,微服務相關的太熟沒弄,推薦算法太難了也沒有弄;數據庫相關的內容太多了,也沒弄。但是大體來說索引結構在這里,拿到xmind之后,你可以按照自己的知識結構體系將其補全或者修改,然后學而時習之,甚至在面試之前也可以稍微看看加深一下記憶。(想要獲得我的索引筆記,關注我的公眾號,后臺回復"知識索引"即可。)
這之后我就進行了第二次面試。第二次面試技術相關的問題其實就沒啥太大的問題了,主要考驗我的是說話技巧相關的事情。我這人有點毛病,想的太多,想要做的事情太多。這些其實沒啥大問題,但是我不確定的事情我也喜歡和人說,還不分場合地就和人說了。比如,我面的是中間件團隊,但是我終面面試的時候卻說我因為之前搞推薦算法對深度學習產生了興趣,想要今年考個在職研究生學一下深度學習。可其實,這個時候我說這個干嘛呢?腦袋有點抽抽的嗎?并且他問了我一個手寫代碼的題,我想了半天沒有想出來。問題是如何去算根號2的值。我的第一反應很快,牛頓迭代法嘛!但是他說讓我在紙上把代碼寫出來的時候,我就一直在想辦法回憶牛頓迭代法是個什么鬼,應該怎么用來算根號2。然后一直在紙上推演導數啊什么鬼的……直到他提示我這個不是一個數學問題,二分查找就能算出來的時候,我才心不甘情不愿地開始弄二分查找的寫法(內心OS:牛頓迭代法肯定比二分查找好的呀!為什么不給我時間回憶一下牛頓迭代!)。這個時候又暴露了我一個問題,我好久沒有手寫代碼了。沒有IDE的時候,我基本上啥都不是……寫了半天勉勉強強地弄了個版本出來,估計也不是bug free的。所以,最終這個公司的offer也沒拿到。辛苦為我推薦的普架了。
這之后我又知道了我出來面試的幾個缺點。首先就是要合適地說話,與面試無關的話題不要扯;其次就是我得練習一下手寫代碼了。不至于要刷題,但是問到什么必須能至少寫出個大概吧。所以我就登錄了我好友邱嘉和個人制作的網站 AlgoCasts, 看了一下他精心錄制的小視頻。然后跟著敲了一下代碼。這之后,我就開始找人幫我推字節跳動了。
字節跳動面試體驗
字節其實我面試了兩個職位。第一個職位的一面感覺挺好的,面試官很親和,問的問題也蠻到位的,然后留給我的發揮空間也蠻大的,所以順利過了。二面的時候就有點聊不來了,而且越聊越感覺職位不合適。所以后來朋友幫我重新推了一個職位,就是我現在所在的數據平臺部門。一面的面試官又年輕又高大又帥氣,而且基本上是針對我的簡歷問的問題。當然,第一個問題讓我講Akka的時候,我是真的呆了。完全不按套路出牌呀!我從來沒有遇到過有人會問我Akka的!!!怎么會有人問我Akka!!!內心一陣狂喜和激動之后,我先收拾了一下心情,慢慢整理了一下自己腦海中一直在跳著舉手喊著"講我講我"的Akka特性。于是先從線程模型開始講起,講了它的M:N實質,Actor模型依賴的消息傳遞模式,層級結構劃分的監督職責,讓它垮的失敗處理,Akka集群支撐起的橫向擴展,等等等等。然后圍繞著Akka又問了一些小問題,基本很順利的過去了。后來又問了一下緩存相關的內容,其中講了一個緩存雪崩的問題我一時半會兒沒有反應過來。問題其實很簡單,就是忽然有一堆請求訪問同一個key,而這個key在緩存中不存在。如此所有請求就會同時去訪問數據庫然后又同時去更新緩存。這樣的緩存雪崩效應應該如何解決?這個問題聽起來其實很熟很熟很熟的,但是當時我腦袋短路了沒有想起來。后來想起來原來Akka-Http-Caching(以前的Spray-Caching)就是專門為這種情況服務的。老外給的說法是這種問題叫做驚群效應,講的是很多請求在第一個請求完成之前,一起訪問同一個鍵(This approach has the advantage of taking care of the thundering herds problem where many requests to a particular cache key (e.g. a resource URI) arrive before the first one could be completed.)。文檔上說的This approach指的是緩存的時候,不要緩存一個值,而是一個Future[T]
。這樣,第一個請求獲取值的過程也被緩存下了。后續的請求就會訪問到這個Future
,然后可以向其注冊回調,等待緩存動作完成再完成回調。當然,這個沒有答得特別好也沒事,后續又問了我一下關于JVM相關的一些東西,最后手寫了一個算法題。然后一面順利地就過了。
之后二面的話基本也是圍繞我的簡歷來問的,講了一下當時做的推薦算法的原理,講了一下Spark的基本原理,然后最后做了一個算法題,然后也順利過了(其實還有一些其他問題,但是我忘了問的是什么了……)。當然這個算法題的實現并不是最好的。題目內容是26進制的加法,其實要涉及單個字符的加減和進位的處理的,這樣實現下來細節就要處理好多東西,還很有可能出錯。所以我取了個巧,我先把字符數字都轉化成了整型,然后整型加減得到結果,然后再把結果轉化成了26進制字符。雖然結果不是最優的,因為數字大了肯定會溢出的嘛。但是起碼還是做出來了,所以二面也順利過了。
三面的時候也是先圍繞著我的項目問了一些相關的問題,所以答得蠻平淡的,但是也還行。然后他問了一下我如何做流量控制。問我流量控制哎!!!然后,我又強行按捺下了內心的喜悅,將《反應式設計模式》的第十六章流量控制的內容大致講了一遍。也許就是給了這樣一個我發揮的空間,所以我第三面也很順利地過了。沒多久就是HR面試大致談了一些技術之外的問題。
HR面我就中規中矩了。當時面完感覺就穩了,但是等了好久好久還沒有跟我溝通offer的事情,等的我有點難受了……之后HR聯系我說,還要給我加面試,說團隊老大要面我一下。原本字節面試一般3+1就OK了,然后突如其來地加面試讓我感覺有點忐忑,所以后面的面試發揮沒有前面好了。其實后來回想一下,我可能是以為前面面試表現不好,不能給我確定offer,才會有后來多的面試的。所以當時心態不好,答的感覺也沒有之前果斷。后來第五面完了以后,團隊老大還是不確定,還要加一面交叉面試,這個時候我就豁出去了。無所謂,面上面不上沒關系,反正字節跳動在我家旁邊,只要廟不搬,我就進得去。所以最后一面跟隔壁leader聊的時候相對來說還好一些。問題沒有問啥特別的,就是仔細問了下我最近做的一個項目,優點在哪里,缺點在哪里,難點在哪里。然后順著難點來進行擴展,為什么是難點,怎么解決,有哪些方案,這些方案有哪些優缺點。幸好我平時工作還是有思考的,所以最終答的還不錯。于是終于到了6月10號左右,HR和我確定要發offer了。
最后
簡歷首選內推方式,速度快,效率高啊!然后可以在拉鉤,boss,脈脈,大街上看看。簡歷上寫道熟悉什么技術就一定要去熟悉它,不然被問到不會很尷尬!做過什么項目,即使項目體量不大,但也一定要熟悉實現原理!不是你負責的部分,也可以看看同事是怎么實現的,換你來做你會怎么做?做過什么,會什么是廣度問題,取決于項目內容。但做過什么,達到怎樣一個境界,這是深度問題,和個人學習能力和解決問題的態度有關了。大公司看深度,小公司看廣度。大公司面試你會的,小公司面試他們用到的你會不會,也就是崗位匹配度。
面試過程一定要有禮貌!即使你覺得面試官不尊重你,經常打斷你的講解,或者你覺得他不如你,問的問題缺乏專業水平,你也一定要尊重他,誰叫現在是他選擇你,等你拿到offer后就是你選擇他了。
另外,描述問題一定要慢!不要一下子講一大堆,慢顯得你沉穩、自信,而且你還有時間反應思路接下來怎么講更好。現在開發過多依賴ide,所以會有個弊端,當我們在面試講解很容易不知道某個方法怎么讀,這是一個硬傷…所以一定要對常見的關鍵性的類名、方法名、關鍵字讀準,有些面試官不耐煩會說“你到底說的是哪個?”這時我們會容易亂了陣腳。正確的發音+沉穩的描述+好聽的嗓音決對是一個加分項!
最重要的是心態!心態!心態!重要事情說三遍!面試時間很短,在短時間內對方要摸清你的底子還是比較不現實的,所以,有時也是看眼緣,這還是個看臉的時代。
希望大家都能找到合適自己滿意的工作!
如果需要PDF版本可以在騰訊文檔中自行領取!
進階學習視頻
附上:我們之前因為秋招收集的二十套一二線互聯網公司Android面試真題?(含BAT、小米、華為、美團、滴滴)和我自己整理Android復習筆記(包含Android基礎知識點、Android擴展知識點、Android源碼解析、設計模式匯總、Gradle知識點、常見算法題匯總。)
d基礎知識點、Android擴展知識點、Android源碼解析、設計模式匯總、Gradle知識點、常見算法題匯總。)
[外鏈圖片轉存中…(img-XFo3yNuZ-1621071300425)]