今天突然想聊聊面試了,最近有很多朋友讓我看履歷,也有很多朋友跟我吐槽說:面試被虐了,簡直慘不忍睹,都有點懷疑自己的能力了。其實,我想說:正常。之是以這麼說是很多朋友可能沒有認清一些問題,哪些問題呢?兩點:一是,沒有認清自己;二是,沒有了解公司。
其實說實話,作為程式員,最起碼得有 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 這樣的公司面試沒問題,可是,還是被打擊到了。人家回複說:學習能力,開源精神都挺好的,就是基礎太差。看到了嗎?會使用架構,封裝個簡單的庫,能夠做出産品來并不是多大的能力,做好是需要基礎的。
上面的例子的問題,典型就是不了解自己,也不了解大公司的套路,準備不足,是以才失敗的。平時學習的時候,應該要知其然知其是以然才行,然後再多學學算法,原理和一些計算機基礎就更完美了。并不是會做就行,基礎紮實,才能做得更好。
要想成就不敗金身,那我們就一起來知己知彼一下。那大公司到底喜歡面試什麼樣的問題呢?我該如何準備呢?我通過朋友了解到,總結之後就兩點:算法和原理。說這些都是概念,來點實際的,給大家舉一些例子:
好了,就先舉這些例子,以上的問題來自于 BAT , 小米,滴滴,360,今日頭條,愛奇藝等。你們先感受一下,是不是會被虐呢?通過上述面試題大家也基本看到了,有算法,有原理。
- 翻轉一個單項連結清單
- 合并多個單有序連結清單(假設都是遞增的)
- 堆排序過程,時間複雜度,空間複雜度
- 快速排序的時間複雜度,空間複雜度
- HashSet 與 HashMap 怎麼判斷集合元素重複
- 邏輯位址與實體位址,為什麼使用邏輯位址
- 一個無序,不重複數組,輸出 N 個元素,使得 N 個元素的和相加為 M,給出時間複雜度、空間複雜度。手寫算法
- 二叉樹,給出根節點和目标節點,找出從根節點到目标節點的路徑
- 資料結構中堆的概念,堆排序
- 圖:有向無環圖的解釋
- LRUCache 原理
- ThreadLocal 原理
- HashMap 源碼, SpareArray 原理
- Https 請求慢的解決辦法,DNS,攜帶資料,直接通路 IP
- https 相關,如何驗證證書的合法性,https 中哪裡用了對稱加密,哪裡用了非對稱加密,對加密算法(如 RSA)等是否有了解
- 是否熟悉 Android jni 開發,jni 如何調用 java 層代碼
- Android 系統為什麼會設計 ContentProvider,程序共享和線程安全問題
- RxJava 的功能與原理實作
- 擴充卡模式,裝飾者模式,外觀模式的異同?
- 靜态内部類的設計意圖。
- 多線程:怎麼用、有什麼問題要注意;Android 線程有沒有上限,然後提到線程池的上限
- 點選事件被攔截,但是想傳到下面的 view,如何操作?
- Android 中程序記憶體的配置設定,能不能自己配置設定定額記憶體
- 序列化的作用,以及 Android 兩種序列化的差別。
- 前台切換到背景,然後再回到前台,Activity 生命周期回調方法。彈出 Dialog,生命值周期回調方法。
你隻要在面試前,認真準備,充足準備,應該不會有多大的困難。其實大部分程式員面試大公司失敗的原因是自己準備不足。大公司去校招成功率比較大的原因是大學學的一些基礎沒有忘掉,而現在的你,隻注重實戰,而不注重基礎。但是在拼技術的時代,基礎很重要,基礎和原理懂得的更多,做的東西才會更加牢固。
積累才是根本
前面說了,通過了解面試準則,面試準備,那都是一種臨時抱佛腳的方法,讓你快速面試成功的一種捷徑罷了。其實平時的學習和積累才是根本。通過了解大公司的要求,我們在小公司也應該時刻嚴格要求自己,不要隻注重實戰,不要不在乎性能而僅僅去說我實作了就好。
我們在平時的工作和學習的過程中,要時刻保持學習之心,不僅僅注重業務的實作,有時間拿起書來看看基礎和原理,了解一些源碼,多做一些思考,其實總會慢慢進步的。
再啰裡啰嗦的舉個例子吧,比如:你最近看到社群裡流行使用 MVP 模式,你就會去看一下 MVP 後,找一個開源的模闆,下載下傳下來,自己也開始用,不要僅僅停留在使用上,你應該思考:為什麼大家都喜歡使用 MVP 模式?這樣做的好處是什麼?我還能在這樣的基礎上做優化嗎?舉一反三的把自己問倒,打破砂鍋問到底要用到自己身上。
總結
說一千道一萬,不如自己去行動。要想在移動網際網路的下半場是自己占有一席之地,那就得從現在開始,從今天開始,馬上嚴格要求自己,既重視業務實作能力,也重視基礎和原理。基礎夯實好了,高樓才能夠平地而起,穩如泰山。什麼高并發導緻的崩潰啊,什麼明星绯聞啊,你的前端不怕,後端更不用怕。下次吹牛可以這麼說:三對明星同時出軌,我的程式也不會癱瘓。
歡迎大家關注我的公衆号:非著名程式員。每天都會在裡面分享技術文章和程式設計經驗,是我們移動開發者的聚集地。特别聲明:未經允許,禁止任何形式的轉載!![]()
移動網際網路下半場的面試真經,讓你進入 BAT 不再是夢