讓 BAT 的 Offer 不再難拿

發表於2016-04-04

隨著各大公司春招的開始,很多小夥伴都行動起來了,我有幸能夠加入百度並和大家分享自己的經驗心得。由於我面試的都是比較大的公司,所以自然也是做了這方面的準備,因此這篇總結並不一定適合想去創業公司的同學。另外,由於經驗本來就是主觀性極強的東西,加之筆者水平有限,所以如果有不認可的地方,萬望諸君呵呵一笑,拋之腦後。

接下來,我就斗膽分享一下自己在準備和參加面試的過程中的收穫、對面試的思考,以及一些可能對大家有用的建議。最後附贈一份大禮包,希望能幫助每位讀者找到自己心儀的工作。

什麼是面試

有些人可能會把面試看的太重,覺得面試過了就能進入大廠,技術和財富兼得……

我倒是覺得,面試沒有這麼誇張(抱歉做了一回標題黨),它其實是一次你和麵試官互相瞭解的絕佳機會,藉此機會你還可以對未來的工作有初步的瞭解。

試本身並不能完全評價一人個的實力。面試通過的人,也許只是恰好在面試時遇到了自己熟悉的問題,面試不通過,也有可能是面試官自身的問題,並非每個面試官都具備客觀評價別人的能力。

換句話說,面試沒通過也許是面試官沒有發現你的才華,面試通過了也並不代表你就能勝任工作,因為進入企業之後可不是每天負責回答面試題!

所以從這一點來看,面試有點像相親。你滿意我,我滿意你,王八對綠豆——看上眼了,那就一拍即合,否則就分道揚鑣。我本人非常希望能夠多幾輪面試(實際並不總是能做到),這樣大家都有充足的時間互相瞭解,決定去留。

網上某些面經中,介紹了一些“裝逼”的方法,還有所謂的“面試技巧”,我是不太認可的。技巧需要有,這是為了讓你更好的展示自己,而非坑蒙拐騙,無理取鬧,無中生有。我更想展現一個真實的自己,如果面試官不認可,說明我們沒有緣分,或者說自己的能力還不夠。

面試要準備什麼

有一位小夥伴面試阿里被拒後,面試官給出了這樣的評價:“……計算機基礎,以及程式設計基礎能力上都有所欠缺……”。但這種籠統的回答並非是我們希望的答案,所謂的基礎到底指的是什麼?

作為一名 iOS 開發者,我所理解的基礎是 作業系統、網路和演算法這三大塊,不同的開發方向可能有不同的側重,但基礎總的來說就是這些。我不推薦通過去網上看教程來學習這些基礎知識,因為能用短短几篇文章講明白的事情不叫基礎,至少我沒見過寫得這麼深入淺出的文章。

不知道有多少讀者和我一樣有過這樣的困擾:“我知道某些東西很重要,所以去百度查了資料,但是查到的文章質量很差,正確率沒有保證”。這其實是正常的,優秀的文章一般都放在優秀的作者的個人部落格上,這恰恰是搜尋引擎的盲區,所以一般只能搜到 CSDN、部落格園這種地方的文章。自然就無法保證文章質量。

出於這種考慮,我在文章最後的複習資料中,提供了用於學習相關基礎知識的書籍,如果您恰好是 iOS 開發者,還可以閱讀我收集的一些高質量文章,正確性比較有保證(我寫的除外)。

除了準備通用的基礎知識以外,簡歷也是一個很重要的環節。一直很仰慕唐巧老師的猿題庫,無奈簡歷太差,都沒有收到面試邀請。後來好好改了簡歷以後,就沒有這種問題了。關於簡歷的書寫,推薦兩篇文章:如何寫面向網際網路公司的求職簡歷程式猿簡歷模板。你也可以參考我的簡歷,沒有亮點,就當是拋磚引玉。

最後,當然是準備好相關崗位的基礎知識了。作為 iOS 開發者,雖然 Swift 已經發布了快兩年,但是大公司轉向 Swift 的動作還不明顯,所以 Objective-C 幾乎是必備項,Swift 都不一定能算是加分項。iOS 方面的知識也必不可少,雖然招聘資訊上寫著如果基礎紮實,零 iOS 基礎也可以,但是現實往往是比較殘酷的。

我的面試經歷

扯了這麼多,終於進入正題了,分享一下我的面試經歷。題目如下,破折線後面是簡單的解決思路

百度

一面:約 1.5 小時

首先是四個演算法題:

  1. 不用臨時變數怎麼實現 swap(a, b)——用加法或者異或都可以
  2. 二維有序陣列查詢數字——劍指 offer 第 3題
  3. 億級日誌中,查詢登陸次數最多的十個使用者——(不確定對不對,我的思路是)先用雜湊表儲存登陸次數和ID,然後用紅黑樹儲存最大的十個數。劍指 offer 第 30題
  4. 簡述排序演算法——快排,partion 函式的原理,堆排(不穩定),歸併排序,基數排序。

然後有一個智力題,沒完整的答出來,好像影響不是很大。

最後是 iOS 相關,面試官問的很開放,都是談談自己的理解:

  1. 說說你對 OC 中 load 方法和 initialize 方法的異同。——主要說一下執行時間,各自用途,沒實現子類的方法會不會呼叫父類的?
  2. 說說你對 block 的理解。—— 三種 block,棧上的自動複製到堆上,block 的屬性修飾符是 copy,迴圈引用的原理和解決方案。
  3. 說說你對 runtime 的理解。——主要是方法呼叫時如何查詢快取,如何找到方法,找不到方法時怎麼轉發,物件的記憶體佈局。
  4. 說說你對 MVC 和 MVVM 的理解。—— MVC 的 C 太臃腫,可以和 V 合併,變成 MVVM 中的 V,而 VM 用來將 M 轉化成 V 能用的資料。
  5. 說說 UITableView 的調優。——一方面是通過 instruments 檢查影響效能的地方,另一方面是估算高度並在 runloop 空閒時快取。
  6. 談談你對 ARC 的理解。ARC 是編譯器完成的,依靠引用計數,談談幾個屬性修飾符的記憶體管理策略,什麼情況下會記憶體洩露。

一面的問題非常基礎,主要是演算法和 Objective-C,因為準備比較充分,基本上答出來 80% 吧。大約一週後突然二面。

二面:約 0.5 小時

二面比較突然,顯示簡單的自我介紹,然後問了三個問題:

  1. 野指標是什麼,iOS 開發中什麼情況下會有野指標?——野指標是不為 nil,但是指向已經被釋放的記憶體的指標,不知道什麼時候會有,如果有知道的讀者還望提醒。
  2. 介紹 block。—— (接第一問) 我讓面試官提示我一下什麼時候會有野指標,他說用 block 時,我表示還是不知道,只知道 block 會有迴圈引用。於是就扯回了一面的問題。
  3. 說說你是怎麼優化 UITableView 的。——還是一面的問題。。。。。。。。。。。

雖然通過了,但是幾乎又問了一遍一面的問題讓我感覺對方不太認真。

三面:北京 onsite,約 2.5 小時

首先是給一個小時,手寫演算法兩個演算法題。接下來問了 TCP 握手相關的。最後問了 OC 的一些細節問題。

網易

筆試

主要是計算機方面的大雜燴,涉及作業系統,網路,移動開發,演算法等。難度不大,目測是為了淘汰渾水摸魚的人,就不列出題目了,演算法有三題,直接線上寫(木有 IDE 表示很憂傷):

  1. 很長一道題,讀了很久才讀懂,目測是 DFS,但是最後沒時間了,寫了個思路。
  2. 把 “www.zhidao.baidu.com” 這樣的字串改成 “com/baidu/zhidao/www”。——老題目了,劍指 offer 的,兩次逆序排列即可。
  3. 求陣列中和為某個值的所有子陣列,比如陣列是 [5,5,10,2,3] 一共有四個子陣列的和是 15,比如 [5,10][5,10][10,2,3][5,5,2,3]。這個就是簡單的遞迴了,分兩種情況,當前位置的數字在子陣列中,以及不在子陣列中。

一面

全部是 iOS 題,可能是覺得演算法已經面過了:

  1. 介紹 block。——我提到棧上的 block 在 ARC 下會自動複製到堆上,面試官問我從 iOS 4 還是 5 開始支援這一特性,表示不知道,我又不是學 OC 歷史的,後來想想可能是公司內部老專案有這個坑。
  2. ARC 會對程式碼做什麼優化?——比如 NSString *s2 = s1; s2 = nil 這樣的語句,可能就不會有 retainrelease 方法了。
  3. 介紹一下 MVVM 和 RAC。——可能是我簡歷的某個角落寫了用過 RAC,被挖出來了,大概談了一下,結果面試官問我資料的雙向繫結怎麼做,bind 函式了解過麼,果斷說已經忘了

相關文章