移動網際網路下半場的面試真經,讓你進入 BAT 不再是夢

澀郎發表於2017-10-23

今天突然想聊聊面試了,最近有很多朋友讓我看簡歷,也有很多朋友跟我吐槽說:面試被虐了,簡直慘不忍睹,都有點懷疑自己的能力了。其實,我想說:正常。之所以這麼說是很多朋友可能沒有認清一些問題,哪些問題呢?兩點:一是,沒有認清自己;二是,沒有了解公司。

其實說實話,作為程式設計師,最起碼得有 80% 的人都想進入大公司工作,比如:BAT ,小米,滴滴,今日頭條,美團等這樣的大公司或者移動網際網路界的明星企業。進大公司的好處顯而易見,福利好,待遇高,工作穩定,不像很多創業小公司說倒閉就倒閉,尤其是移動網際網路進入下半場之後,很多創業公司都相繼倒閉,而且移動開發者也越來越飽和,隨著程式設計師越來越多,自然就進入了激烈競爭的惡劣環境,優勝劣汰的自然規律是不可逃避,也規避不了的。據 GitHub 統計,就今年一年加入 GitHub 的中國程式設計師就有 70 萬,自己想想吧,競爭得有多激烈。

即使有 20% 的程式設計師不想進入大公司,也無非就是要麼就是認清了自己的現實,自己並不是那麼天賦異稟,也並不是那麼熱愛程式設計,有自知之明的心態,在個小公司幹也挺好,倒閉了大不了再換,反正 BAT ,我也進不去。要麼就是人家就是 BAT 的大神想出來創業當移動互聯界的創業家,想功成名就,即使創業失敗,我依然可以鶴立雞群,瀟灑回到 BAT 的世界,帥氣的依靠自己在業界的名聲依然能夠得到一份好的工作。

說著說著,好像有點二八定律的感覺。NO,上面的 80% 和 20% 是我自己的不完全統計,不必當真,舉個例子而已。具體關於程式設計師應該選擇大公司還是小公司,請大家移步我的這篇文章《程式設計師是該選擇大公司,還是小公司?你會如何抉擇呢?》。

面試準則

關於面試這件事,我們得知道一個面試準則,尤其是在移動網際網路進入下半場的今天。最近很多朋友面試受挫,並不是說技術有多差,但是就是很受打擊,因為在資本寒冬的今天,移動網際網路的下半場,程式設計師要想過上好日子,就得去大公司,現在已經逐步進入拼技術的時代了,所以技術依然越來越重要,這是在小公司無法體現和提升的。而他們之所以受打擊是因為平時做專案,做產品也可以獨立完成,甚至很好的完成,但是面試失敗的面試是基礎太差。所以,你在小公司確實可以能夠很好的掌握並做一個專案,但是大公司重視的是你的基礎啊。所以要清楚這麼一個準則:面試,大公司重基礎,小公司重能力(這裡的能力指:能不能馬上上手做一個專案的能力)。

進一步解釋一下,為什麼我在上面說:現在已經逐步進入拼技術的時代了?首先,移動網際網路剛剛興起的前 10 年是一個高速發展,高速擴張,野蠻收割的時代,就是不論技術好還是差,只要能夠馬上做出產品來就好技術,就會通過營銷,運營,資本等手段獲得使用者,而獲得使用者,佔領市場之後,就到了拼技術,拼品質的時代了。而現在移動網際網路的下半場就是一個拼技術的時代了。舉個簡單的例子,微博,你做出來很容易,但是做好就很難了。明星出個軌,公佈個戀情分分鐘就會讓你癱瘓,這不是產品,營銷,資本能夠解決的問題,這是技術才能夠解決的問題。你會做微博不是能力,你能讓微博不癱瘓才是能力。前幾天在知乎上看到一個問題特別有意思,問:做一個微信很難麼?有一個回答很對,說:做一個微信,10 個人用不難,100 個不難,讓近 10 億的使用者用,就難了。此處省略一萬字,這個話題要是聊透,其實能夠還寫一篇文章。

面試準備

我在前面說了,面試慘不忍睹的就是由兩個問題導致的,一是,沒有認清自己;二是,沒有了解公司。總結成一句話就是準備不足。

我們既然瞭解了面試準則,就應該對症下藥才行,這樣才不至於慘不忍睹。大公司既然重基礎,那麼面試前一定要好好學習和準備一下這方面的知識。幹什麼事之前,一定要充分了解情況,古人說的話,還是挺對的,畢竟是 2000 多年來總結出來的經驗,面試就是戰場,知己知彼才能百戰不殆。

舉個例子:小猿在一家創業公司從事了兩年的 Android 開發,能夠獨立開發一款軟體,技術還是可以的,效率挺高的,總能快速完成經理交給的任務,平時也會在 GitHub 上提交一些開原始碼,分享了一些開源庫,star 數五六百,好的上千,熟悉使用 RxJava,Retrofit 等網路框架,還會 MVP,MVVM 這樣的架構。感覺自己去 BAT 這樣的公司面試沒問題,可是,還是被打擊到了。人家回覆說:學習能力,開源精神都挺好的,就是基礎太差。看到了嗎?會使用框架,封裝個簡單的庫,能夠做出產品來並不是多大的能力,做好是需要基礎的。

上面的例子的問題,典型就是不瞭解自己,也不瞭解大公司的套路,準備不足,所以才失敗的。平時學習的時候,應該要知其然知其所以然才行,然後再多學學演算法,原理和一些計算機基礎就更完美了。並不是會做就行,基礎紮實,才能做得更好。

要想成就不敗金身,那我們就一起來知己知彼一下。那大公司到底喜歡面試什麼樣的問題呢?我該如何準備呢?我通過朋友瞭解到,總結之後就兩點:演算法和原理。說這些都是概念,來點實際的,給大家舉一些例子:

  1. 翻轉一個單項鍊表

  2. 合併多個單有序連結串列(假設都是遞增的)

  3. 堆排序過程,時間複雜度,空間複雜度

  4. 快速排序的時間複雜度,空間複雜度

  5. HashSet 與 HashMap 怎麼判斷集合元素重複

  6. 邏輯地址與實體地址,為什麼使用邏輯地址

  7. 一個無序,不重複陣列,輸出 N 個元素,使得 N 個元素的和相加為 M,給出時間複雜度、空間複雜度。手寫演算法

  8. 二叉樹,給出根節點和目標節點,找出從根節點到目標節點的路徑

  9. 資料結構中堆的概念,堆排序

  10. 圖:有向無環圖的解釋

  11. LRUCache 原理

  12. ThreadLocal 原理

  13. HashMap 原始碼, SpareArray 原理

  14. Https 請求慢的解決辦法,DNS,攜帶資料,直接訪問 IP

  15. https 相關,如何驗證證照的合法性,https 中哪裡用了對稱加密,哪裡用了非對稱加密,對加密演算法(如 RSA)等是否有了解

  16. 是否熟悉 Android jni 開發,jni 如何呼叫 java 層程式碼

  17. Android 系統為什麼會設計 ContentProvider,程式共享和執行緒安全問題

  18. RxJava 的功能與原理實現

  19. 介面卡模式,裝飾者模式,外觀模式的異同?

  20. 靜態內部類的設計意圖。

  21. 多執行緒:怎麼用、有什麼問題要注意;Android 執行緒有沒有上限,然後提到執行緒池的上限

  22. 點選事件被攔截,但是想傳到下面的 view,如何操作?

  23. Android 中程式記憶體的分配,能不能自己分配定額記憶體

  24. 序列化的作用,以及 Android 兩種序列化的區別。

  25. 前臺切換到後臺,然後再回到前臺,Activity 生命週期回撥方法。彈出 Dialog,生命值週期回撥方法。

好了,就先舉這些例子,以上的問題來自於 BAT , 小米,滴滴,360,今日頭條,愛奇藝等。你們先感受一下,是不是會被虐呢?通過上述面試題大家也基本看到了,有演算法,有原理。

你只要在面試前,認真準備,充足準備,應該不會有多大的困難。其實大部分程式設計師面試大公司失敗的原因是自己準備不足。大公司去校招成功率比較大的原因是大學學的一些基礎沒有忘掉,而現在的你,只注重實戰,而不注重基礎。但是在拼技術的時代,基礎很重要,基礎和原理懂得的更多,做的東西才會更加牢固。

積累才是根本

前面說了,通過了解面試準則,面試準備,那都是一種臨時抱佛腳的方法,讓你快速麵試成功的一種捷徑罷了。其實平時的學習和積累才是根本。通過了解大公司的要求,我們在小公司也應該時刻嚴格要求自己,不要只注重實戰,不要不在乎效能而僅僅去說我實現了就好。

我們在平時的工作和學習的過程中,要時刻保持學習之心,不僅僅注重業務的實現,有時間拿起書來看看基礎和原理,瞭解一些原始碼,多做一些思考,其實總會慢慢進步的。

再囉裡囉嗦的舉個例子吧,比如:你最近看到社群裡流行使用 MVP 模式,你就會去看一下 MVP 後,找一個開源的模板,下載下來,自己也開始用,不要僅僅停留在使用上,你應該思考:為什麼大家都喜歡使用 MVP 模式?這樣做的好處是什麼?我還能在這樣的基礎上做優化嗎?舉一反三的把自己問倒,打破砂鍋問到底要用到自己身上。

總結

說一千道一萬,不如自己去行動。要想在移動網際網路的下半場是自己佔有一席之地,那就得從現在開始,從今天開始,馬上嚴格要求自己,既重視業務實現能力,也重視基礎和原理。基礎夯實好了,高樓才能夠平地而起,穩如泰山。什麼高併發導致的崩潰啊,什麼明星緋聞啊,你的前端不怕,後端更不用怕。下次吹牛可以這麼說:三對明星同時出軌,我的程式也不會癱瘓。

歡迎大家關注我的公眾號:非著名程式設計師。特別宣告:未經允許,禁止任何形式的轉載!

相關文章