今天忽然想聊聊面試了,最近有不少朋友讓我看簡歷,也有不少朋友跟我吐槽說:面試被虐了,簡直慘不忍睹,都有點懷疑本身的能力了。其實,我想說:正常。之因此這麼說是不少朋友可能沒有認清一些問題,哪些問題呢?兩點:一是,沒有認清本身;二是,沒有了解公司。前端
其實說實話,做爲程序員,最起碼得有 80% 的人都想進入大公司工做,好比:BAT ,小米,滴滴,今日頭條,美團等這樣的大公司或者移動互聯網界的明星企業。進大公司的好處顯而易見,福利好,待遇高,工做穩定,不像不少創業小公司說倒閉就倒閉,尤爲是移動互聯網進入下半場以後,不少創業公司都相繼倒閉,並且移動開發者也愈來愈飽和,隨着程序員愈來愈多,天然就進入了激烈競爭的惡劣環境,優勝劣汰的天然規律是不可逃避,也規避不了的。據 GitHub 統計,就今年一年加入 GitHub 的中國程序員就有 70 萬,本身想一想吧,競爭得有多激烈。java
即便有 20% 的程序員不想進入大公司,也無非就是要麼就是認清了本身的現實,本身並非那麼天賦異稟,也並非那麼熱愛編程,有自知之明的心態,在個小公司幹也挺好,倒閉了大不了再換,反正 BAT ,我也進不去。要麼就是人家就是 BAT 的大神想出來創業當移動互聯界的創業家,想功成名就,即便創業失敗,我依然能夠鶴立雞羣,瀟灑回到 BAT 的世界,帥氣的依靠本身在業界的名聲依然可以獲得一份好的工做。程序員
說着說着,好像有點二八定律的感受。NO,上面的 80% 和 20% 是我本身的不徹底統計,沒必要當真,舉個例子而已。具體關於程序員應該選擇大公司仍是小公司,請你們移步個人這篇文章《程序員是該選擇大公司,仍是小公司?你會如何抉擇呢?》。面試
關於面試這件事,咱們得知道一個面試準則,尤爲是在移動互聯網進入下半場的今天。最近不少朋友面試受挫,並非說技術有多差,可是就是很受打擊,由於在資本寒冬的今天,移動互聯網的下半場,程序員要想過上好日子,就得去大公司,如今已經逐步進入拼技術的時代了,因此技術依然愈來愈重要,這是在小公司沒法體現和提高的。而他們之因此受打擊是由於平時作項目,作產品也能夠獨立完成,甚至很好的完成,可是面試失敗的面試是基礎太差。因此,你在小公司確實能夠可以很好的掌握並作一個項目,可是大公司重視的是你的基礎啊。因此要清楚這麼一個準則:面試,大公司重基礎,小公司重能力(這裏的能力指:能不能立刻上手作一個項目的能力)。算法
進一步解釋一下,爲何我在上面說:如今已經逐步進入拼技術的時代了?首先,移動互聯網剛剛興起的前 10 年是一個高速發展,高速擴張,野蠻收割的時代,就是不論技術好仍是差,只要可以立刻作出產品來就好技術,就會經過營銷,運營,資本等手段得到用戶,而得到用戶,佔領市場以後,就到了拼技術,拼品質的時代了。而如今移動互聯網的下半場就是一個拼技術的時代了。舉個簡單的例子,微博,你作出來很容易,可是作好就很難了。明星出個軌,公佈個戀情分分鐘就會讓你癱瘓,這不是產品,營銷,資本可以解決的問題,這是技術纔可以解決的問題。你會作微博不是能力,你能讓微博不癱瘓纔是能力。前幾天在知乎上看到一個問題特別有意思,問:作一個微信很難麼?有一個回答很對,說:作一個微信,10 我的用不難,100 個不難,讓近 10 億的用戶用,就難了。此處省略一萬字,這個話題要是聊透,其實可以還寫一篇文章。編程
我在前面說了,面試慘不忍睹的就是由兩個問題致使的,一是,沒有認清本身;二是,沒有了解公司。總結成一句話就是準備不足。後端
咱們既然瞭解了面試準則,就應該對症下藥才行,這樣纔不至於慘不忍睹。大公司既然重基礎,那麼面試前必定要好好學習和準備一下這方面的知識。幹什麼事以前,必定要充分了解狀況,古人說的話,仍是挺對的,畢竟是 2000 多年來總結出來的經驗,面試就是戰場,知己知彼才能百戰不殆。數組
舉個例子:小猿在一家創業公司從事了兩年的 Android 開發,可以獨立開發一款軟件,技術仍是能夠的,效率挺高的,總能快速完成經理交給的任務,平時也會在 GitHub 上提交一些開源代碼,分享了一些開源庫,star 數五六百,好的上千,熟悉使用 RxJava,Retrofit 等網絡框架,還會 MVP,MVVM 這樣的架構。感受本身去 BAT 這樣的公司面試沒問題,但是,仍是被打擊到了。人家回覆說:學習能力,開源精神都挺好的,就是基礎太差。看到了嗎?會使用框架,封裝個簡單的庫,可以作出產品來並非多大的能力,作好是須要基礎的。安全
上面的例子的問題,典型就是不瞭解本身,也不瞭解大公司的套路,準備不足,因此才失敗的。平時學習的時候,應該要知其然知其因此然才行,而後再多學學算法,原理和一些計算機基礎就更完美了。並非會作就行,基礎紮實,才能作得更好。微信
要想成就不敗金身,那咱們就一塊兒來知己知彼一下。那大公司到底喜歡面試什麼樣的問題呢?我該如何準備呢?我經過朋友瞭解到,總結以後就兩點:算法和原理。說這些都是概念,來點實際的,給你們舉一些例子:
翻轉一個單項鍊表
合併多個單有序鏈表(假設都是遞增的)
堆排序過程,時間複雜度,空間複雜度
快速排序的時間複雜度,空間複雜度
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,生命值週期回調方法。
好了,就先舉這些例子,以上的問題來自於 BAT , 小米,滴滴,360,今日頭條,愛奇藝等。大家先感覺一下,是否是會被虐呢?經過上述面試題你們也基本看到了,有算法,有原理。
你只要在面試前,認真準備,充足準備,應該不會有多大的困難。其實大部分程序員面試大公司失敗的緣由是本身準備不足。大公司去校招成功率比較大的緣由是大學學的一些基礎沒有忘掉,而如今的你,只注重實戰,而不注重基礎。可是在拼技術的時代,基礎很重要,基礎和原理懂得的更多,作的東西纔會更加牢固。
前面說了,經過了解面試準則,面試準備,那都是一種臨時抱佛腳的方法,讓你快速麪試成功的一種捷徑罷了。其實平時的學習和積累纔是根本。經過了解大公司的要求,咱們在小公司也應該時刻嚴格要求本身,不要只注重實戰,不要不在意性能而僅僅去說我實現了就好。
咱們在平時的工做和學習的過程當中,要時刻保持學習之心,不只僅注重業務的實現,有時間拿起書來看看基礎和原理,瞭解一些源碼,多作一些思考,其實總會慢慢進步的。
再囉裏囉嗦的舉個例子吧,好比:你最近看到社區裏流行使用 MVP 模式,你就會去看一下 MVP 後,找一個開源的模板,下載下來,本身也開始用,不要僅僅停留在使用上,你應該思考:爲何你們都喜歡使用 MVP 模式?這樣作的好處是什麼?我還能在這樣的基礎上作優化嗎?觸類旁通的把本身問倒,打破砂鍋問到底要用到本身身上。
說一千道一萬,不如本身去行動。要想在移動互聯網的下半場是本身佔有一席之地,那就得從如今開始,從今天開始,立刻嚴格要求本身,既重視業務實現能力,也重視基礎和原理。基礎夯實好了,高樓纔可以平地而起,穩如泰山。什麼高併發致使的崩潰啊,什麼明星緋聞啊,你的前端不怕,後端更不用怕。下次吹牛能夠這麼說:三對明星同時出軌,個人程序也不會癱瘓。
歡迎你們關注個人公衆號:非著名程序員。特別聲明:未經容許,禁止任何形式的轉載!