讓 BAT 的 Offer 不再難拿

發表於2016-04-04

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

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

讓 BAT 的 Offer 不再難拿

什麼是面試

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

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

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

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

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

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

面試要準備什麼

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

作為一名 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 函式了解過麼,果斷說已經忘了???
  4. 介紹自己用過哪些開源庫。——Masonry 和 SnapKit,AFNetWorking,MKNetworkKit,Alamofire,Mantle,SDWebImage
  5. 如果讓你寫,你能實現麼?——當然不能,不然還要實習?
  6. 讀過某個庫的原始碼麼?——扯了一點 SDWebImage,後來被告知這個庫用了 runloop 來保證滑動是載入資料的流暢性,自己看了原始碼後表示沒有發現,唯一用到 runloop 地方是保證後臺執行緒一直跑,也有可能是我理解錯了,如果錯誤歡迎指正。
  7. SDWebImage 下載了圖片後為什麼要解碼?——當時矇住了,面試官很 nice 的解釋了一下,說是要把 png 檔案建立一個什麼記憶體對映,目前還不太懂,有空研究一下。

本來以為面的這麼差肯定是掛了,沒想到還是過了一面。過了不到一個小時,HR 電話打過來,約了兩天後二面。

二面

純數學和演算法:

  1. 下面這段程式碼的輸出結果是:
int main() {
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf(“%d,%d”,*(a+1),*(ptr-1));
}
複製程式碼

答案是 2 和 5。a 是指向陣列開頭元素的指標,a + 1 就是指向下一個元素的指標,所以星號求值以後是 2。&a 相當於是陣列的指標,&a + 1 是陣列後面一個陣列的指標,然後轉換成int *型別是 5 這個數字後面的一個數字的指標。再減一就是指向 5 的指標,所以星號求值以後是 5。

  1. 某個地方天氣有如下規律:如果第一天和第二天都不下雨,則第三天下雨的概率為30%;如果第一天和第二天中有任 意一天下雨,則第三天下雨的概率為60%。問如果週一週二都沒下雨,那麼週四下雨的概率為___。

簡單的概率題,答案是:30% * 60% + 70% * 30% = 39%

  1. 某痴迷撲克的小團體喜歡用23456789TJQKA來計數,A後面是22,23,...,2A,32,...,AA,222,... 依次類推。 請用C/C++或Java寫個程式,將用字串表示這種計數法轉換成字串表示的10進位制整數。其中,該計數法的2就對應於十進位制的2,之後依次遞增。C/C++函式介面: char* pokToDec(char *)

我的解決思路是進位制轉換,類似於 16 進位制轉換 10 進位制這種,最後再把數字轉成 char * 型別。

然後好像沒結果了,可能是程式設計實現太渣了?

其他我知道的面試題

阿里一面:

  1. MVC 具有什麼樣的優勢,各個模組之間怎麼通訊,比如點選 Button 後 怎麼通知 Model?
  2. 兩個無限長度連結串列(也就是可能有環) 判斷有沒有交點
  3. UITableView 的相關優化
  4. KVONotificationdelegate 各自的優缺點,效率還有使用場景
  5. 如何手動通知 KVO
  6. Objective-C 中的 copy 方法
  7. runtime 中,SELIMP 的區別
  8. autoreleasepool 的使用場景和原理
  9. RunLoop 的實現原理和資料結構,什麼時候會用到
  10. block 為什麼會有迴圈引用
  11. 使用 GCD 如何實現這個需求:A、B、C 三個任務併發,完成後執行任務 D。
  12. NSOperationGCD 的區別
  13. CoreData 的使用,如何處理多執行緒問題
  14. 如何設計圖片快取?
  15. 有沒有自己設計過網路控制元件?

阿里二面:

  1. 怎麼判斷某個 cell 是否顯示在螢幕上
  2. 程式和執行緒的區別
  3. TCPUDP 區別
  4. TCP 流量控制
  5. 陣列和連結串列的區別
  6. UIView 生命週期
  7. 如果頁面 A 跳轉到 頁面 B,A 的 viewDidDisappear 方法和 B 的 viewDidAppear 方法哪個先呼叫?
  8. block 迴圈引用問題
  9. ARC 的本質
  10. RunLoop 的基本概念,它是怎麼休眠的?
  11. Autoreleasepool 什麼時候釋放,在什麼場景下使用?
  12. 如何找到字串中第一個不重複的字元
  13. 雜湊表如何處理衝突

面試收穫

1. 演算法題怎麼答

面試官可能會問到你聞所未聞的演算法,這時候你不應該自己瞎想,而是先和麵試官把問題討論清楚。要知道,通過溝通弄明白複雜的問題也是一種能力,在和麵試官交流的過程中,不僅僅可以搞清楚題目真正的意思是什麼,還可以展現自己良好的交流溝通能力。所以千萬不要因為緊張或者害羞而浪費這次大好的機會。

有些題目似曾相識,但是暫時沒有思路。這時候不妨告訴面試官,給我一些時間思考這個題。然後不要急,不要慌,就當他不存在,拿出紙和筆慢慢算(這充分說明了面試戴耳機的重要性)。你一定要堅定一個信念:“任何一道稍微有難度的演算法題,除非做過,否則一定是需要時間想的”。所以,合理的安排思考時間吧。如果十幾分鍾都想不出來,可以直接放棄。

有時候面試官會要求線上程式設計,相信我,他不會無聊到盯著你的程式碼看的,面試官一般都很忙,他也有自己的工作要完成,所以你就當是用自己的 IDE 就好。線上程式設計往往是一箇中等難度的問題,所以不要自己嚇唬自己。同時要注意程式碼格式的規範,適當的註釋,提前編寫好測試用例等,即使沒有解決問題,也至少要把自己良好的程式設計習慣展示給面試官。

2. 遇到不會的問題怎麼處理

這個問題有可能是面試官故意說得含糊不清,考察你的交流能力,也有可能是無意的,或者是你的理解方式出現了偏差。不管是以上哪種問題,你都應該先和麵試官交流,直到你搞懂了面試官要問你什麼,而不是按照自己的理解說了一堆無用的東西。

舉個例子,面試官可能會問了一道演算法題:“如何判斷兩個無限長度的連結串列是否有交點?”。對於“無限長度”可以有不同的理解,如果真的是有無窮多個節點,那顯然這個問題是無法解決的。但如果連結串列僅僅是有環,那麼還是可以解決的。如果面試官的本意是連結串列有環,但你錯誤的理解成了無窮多個節點,那麼必然會導致無法回答這個問題。而且這並非能力不足,而是屬於交流溝通方面的失誤,這也正是我想分享的“技巧”。

還有一些問題,雖然你沒有接觸過,但是由於對類似的問題或者情況有過思考,所以可以合理假設。比如面試官問 “ARC 會對程式碼做什麼樣的優化?”。我們知道 ARC 的本質就是在合適的地方插入 retainrelease 等方法,那麼就應該從這個角度出發去思考問題。

顯然分別執行 retainrelease 操作是沒有必要的,那麼就可以構造出相應的例子:

NSString *s1 = @"hello";
NSString *s2 = s1;
NSString *s2 = nil;
複製程式碼

由於這種問題我們沒有真正實踐過,所以可以委婉的告訴面試官:“根據我的推理,可能會有……”。

3. 遇到真的不會的問題怎麼處理

遇到不會的問題果斷承認啊。如果是基本問題,比如問你雜湊表怎麼實現,你說不會,那麼這次面試可能就懸了。如果是有一定難度的問題,那麼你承認不會,也是一種明智之舉,畢竟人無完人,一個問題不會並不能全盤否定一個人的能力。

但是比較糟糕的一種情況是,面試者由於過分緊張,擔心答不上面試官的問題會有嚴重後果,所以嘗試著去敷衍面試官。比如:“我猜是 xxx 吧”,“我覺得可能是 ……”,更有甚者直接裝逼:“這個我試過,不就是 xxx 麼”。要知道,此時的你,由於緊張,在心態上已經輸給了面試官,更何況面試官問你的問題一定是他有把握的,你覺得這時候你負隅頑抗會有幾成勝算呢?

所以,面試官問我“堆排序”的細節時,由於我當時忘了堆排序是怎麼實現的,所以我直接告訴他我記不清了。另一個主動認輸的例子是面試官問我 RAC 如何實現雙向繫結,我告訴他這個是我當時學習的時候寫過的 demo,因為不常用,已經只記得一些簡單的概念了。

最後,還需要保持一個平穩的心態:“面試時盡力就好,遇到自己不會的問題也是正常情況”。如果面試者順利答對了所有問題,難免會讓面試官感到一絲尷尬,面試者也有可能會產生一些別的情緒。所以,我們要做的只是把自己的能力展示給面試官,做到不驕不躁。

4. 準備殺手鐗

除了能夠回答上面試官的問題以外,我建議自己準備一兩個殺手鐗級別的話題。所謂的殺手鐗,至少具備以下幾個特徵:

  • 你親自動手試驗過。所謂實踐是檢驗真理的唯一標準,資料是不會說謊的。
  • 問題有足夠的深度。一面的面試官可能是你的直接上司,二面一般就是更改級別的。你的深度一定要遠超其他面試者,讓一面面試官覺得自己沒有十足把握,讓二面面試官覺得這是一個好話題,自己的手下都不一定能有這麼獨到深刻的見解。
  • 你對這個問題理解的足夠深入,無論是廣度還是深度都達到一定水平。

以 iOS 中的 UITableView 的調優為例,我自認為對它有一定的理解,同為 iOS 開發者的讀者可以閱讀這篇文章:UIKit效能調優實戰講解,同時我還仔細研究了 sunnyxx 大神的 優化UITableViewCell高度計算的那些事

這一類的話題通常需要仔細研究官方文件,iOS 開發者還可以觀看 WWDC 視訊,然後花上充足的時間去總結。比如我寫 iOS自定義轉場動畫實戰講解 這篇文章就花了至少三天時間,包括大年初一一整天。

由於此類話題數量不多,所以準備一個或數個即可,面試時可以有意識的將面試官引導到這些話題上去,從而充分的展示自己。

5. 心態

通常情況下,面試結果都會在 1 - 3 天內知道。有的面試官會當場告訴你通過了,有的公司面試結束後幾個小時就能出結果。

但有些時候,由於某些原因(我也不清楚。。。。可能是比較忙?),你遲遲無法獲知面試結果。這時候你可以選擇耐心等待,獲知直接給 HR or 內推者傳送郵件。一般來說面試結束後三天還沒收到通知,你可以傳送郵件詢問或者再等等。

複習資料

對於讀到這一段的讀者,為了感謝你耐心的聽我廢話了這麼久,送上一波精心整理的乾貨和資料。不敢說完全沒有錯,但是應該比自己去查要靠譜得多。主要涉及演算法、網路、作業系統、Objective-C 和 iOS 五個方面。如果你不是 iOS 開發者,相信前三部分的資料也或多或少能夠幫上你。

演算法

這一部分的內容主要分為以下幾個部分:字串、陣列與查詢、連結串列、樹以及其他基礎問題。

總的來說,演算法問題可以分為以下三類:

  1. 基礎問題:即使是新手,一眼看過去就有思路,只是實現的時候需要注意細節。
  2. 普通問題:這些問題通常屬於以上分類中的某一類,需要面試者掌握一些常見的思路,比如遞迴、動態規劃、BFS/DFS、雙指標、二分搜尋 等。或者是直接考察資料結構的使用,如:雜湊、棧和佇列、連結串列等,如果具備了這些基礎知識,此類題目通常能夠比較快速的解決。
  3. 進階問題:這些題的解題思路和普通問題相似,但是需要你事先有對應的知識積累,否則難以直接看出問題的本質。
  4. 疑難雜題:這類問題比較奇怪,解決它以後並不能給別的題目太多幫助,如果時間緊張可以暫時放棄。

一般來說,一類問題難度不大,面試前簡單複習一下,面試時小心仔細,全面思考即可。二三類問題是面試重點,需要提前準備。第四類問題通常出現較少,即使不會做,對最終評價的負面影響也不會有前三類那麼大。

如果時間充裕,我建議閱讀**《劍指 Offer》**這本書並配合 Leetcode 來鞏固知識,在我的面試過程中,出現很多書上的原題或者變體,我自認為沒有因為演算法而影響任何一次面試的成績。如果時間緊張,你也可以只完成我列出的一些經典題目,在“【】”中標記了我對此題型別的分類,如果加星號表示此題在實際面試中出現過

PS: 最近有小夥伴被問到了雜湊表的實現。這可以理解為演算法,也可以歸類為計算機基礎知識。總的來說你至少需要明白雜湊值的特點和兩種解決衝突的方式:拉鍊式和開放定址。

字串

  1. 【3】最長迴文子串
  2. 【3】最長無重複子串
  3. 【1*】字串轉數字
  4. 【4】KMP 演算法
  5. 【2】字串全排列
  6. 【2*】翻轉字串

動態規劃

  1. 【2】揹包問題
  2. 【3】連續子陣列的最大和
  3. 【4】實現簡單的正規表示式匹配

陣列

  1. 【3】求兩個等長、有序陣列的中位數(二分法)
  2. 【4】求兩個不等長、有序陣列的中位數
  3. 【3】旋轉陣列求最小值【3】旋轉陣列求查詢某個值是否存在(二分法)
  4. 【4*】每行從左到右,每列從上到下遞增的二維陣列中,判斷某個數是否存在(劍指 offer 第 3 題)
  5. 【3*】陣列中出現次數超過一半的數字
  6. 【3*】第 k 大的數(擴充:最大的 k 個數)
  7. 【3*】有序陣列中某個數字出現的次數(提示:利用二分搜尋)

連結串列

  1. 【2】反轉連結串列(使用遞迴和迭代兩種解法,瞭解頭插法)
  2. 【3】刪除連結串列的當前節點
  3. 【3】刪除倒數第 k 個節點
  4. 【1】兩個有序連結串列合併
  5. 【4】複雜連結串列的複製
  6. 【2*】判斷連結串列是否有環
  7. 【3*】兩個連結串列的第一個公共節點(提示:考慮連結串列有環的情況)
  8. 【3】刪除連結串列中重複節點

  1. 【3】根據中序和後序遍歷結果重建二叉樹【3】根據中序和前序遍歷結果重建二叉樹
  2. 【2】翻轉二叉樹
  3. 【2】從上往下列印二叉樹 (BFS 的思想)
  4. 【3】判斷某個陣列是不是二叉樹的後序遍歷結果 (劍指 offer 第 24 題)
  5. 【3】二叉樹中和為某個值的路徑
  6. 【3*】二叉樹中某個節點的下一個節點 (強烈推薦準備一下,劍指 offer 第 58 題)

  1. 【2】用兩個棧實現佇列【2】用兩個佇列實現棧
  2. 【2】實現一個棧,可以用常數級時間找出棧中的最小值
  3. 【3】判斷棧的壓棧、彈棧序列是否合法(劍指offer 第 22 題)

排序

瞭解以下排序的時間、空間複雜度,是否穩定,實現原理

  1. 歸併排序、擴充:求陣列中的逆序對個數
  2. 快速排序 重點:partion 函式的實現
  3. 堆排序
  4. 陣列元素值域已知時,考慮 基數排序桶排序

位運算

  1. 【2】給一個十進位制數字,求它的二進位制表示中,有多少個 1 (n &= n - 1)
  2. 【3】給一個陣列,所有數字都出現了偶數次,只有一個出現了一次,找出這個數
  3. 【4】給一個陣列,所有數字都出現了三次,只有一個出現了一次,找出這個數
  4. 【3】給一個陣列,所有陣列都出現了偶數次,只有兩個數字出現了一次,找出這兩個數

網路層

根據不同的面試崗位,側重點略有不同。對 iOS 和 Android 開發者來說,HTTP 考的略少,以 TCP 和 UDP 為主。其實 UDP 基本上只會考察和 TCP 的區別。

當然還有一些常見的基礎問題,比如 Cookie 和 Session 的考察,POST 和 GET 的考察,HTTPS 的簡單瞭解等。這些問題在我的部落格中都有簡單的總結。

總結了一些資料,數字序號越大的資料表示篇幅更長,耗時更久,難度更大,講解更細緻。破折線後表示預計需要多久可以讀完。

  1. 【部落格】我的六篇總結————不到一週
  2. 【書】圖解 TCP/IP————半個月
  3. 【書】TCP/IP 詳解————沒讀過,感覺至少需要一個月
  4. 【書】TCP/IP 協議簇————沒讀過,感覺至少需要一個月

光讀書是沒有用的,一問到實際問題很容易懵逼,以下是我總結的一些問題:

  1. 簡介 TCP 和 UDP 區別,他們位於哪一層?
  2. 路由器和交換機的工作原理大概是什麼,他們分別用到什麼協議,位於哪一層?
  3. 描述TCP 協議三次握手,四次釋放的過程。
  4. TCP 協議是如何進行流量控制,擁塞控制的?
  5. 為什麼建立連線時是三次握手,兩次行不行?如果第三次握手失敗了怎麼處理
  6. 關閉連線時,第四次握手失敗怎麼處理?
  7. 你怎麼理解分層和協議?
  8. HTTP 請求中的 GET 和 POST 的區別,Session 和 Cookie 的區別。
  9. 談談你對 HTTP 1.1,2.0 和 HTTPS 的理解。

作業系統與編譯

我被問到的作業系統問題很少,所以僅僅總結了一些自認為比較重要的問題。關於這一部分的知識,推薦閱讀**《程式設計師的自我修養》,如果時間有限,你可以閱讀我的《程式設計師的自我修養讀書筆記》**,並思考這些問題:

  1. 原始碼是怎麼變成可執行檔案的,每一步的作用是什麼?(預編譯,詞法分析,語法分析,語義分析,中間語言生成目的碼生成,彙編,連結)
  2. 應用層、API、執行庫、系統呼叫、作業系統核心之間的關係是什麼?
  3. 虛擬記憶體空間是什麼,為什麼要有虛擬記憶體空間。
  4. 靜態連結和動態連結分別表示什麼,大概是怎麼實現的?
  5. 可執行檔案的結構如何?(分為哪些段)
  6. 它是怎麼裝載進記憶體的,為什麼要分段,分頁,頁錯誤是什麼?
  7. 程式的記憶體格局是怎樣的?(堆、棧、全域性/靜態區,程式碼區,常量區)
  8. 堆和棧的區別,函式呼叫和棧的關係
  9. 程式和執行緒的區別
  10. 非同步和同步,序列,併發,並行的區別
  11. 多併發任務,僅多執行緒能加快速度麼(不能,會變慢,有執行緒切換的開銷)
  12. 多個執行緒之間可以共享那些資料
  13. 程式之間如何通訊
  14. 介紹幾種鎖,他們的用途和區別

關於多執行緒相關的,推薦閱讀這篇文章的前面一小部分——iOS多執行緒程式設計——GCD與NSOperation總結

關於作業系統和編譯方面的文章,除了讀原書和我的讀書筆記外,還可以參考這篇文章——修改一個數字破解Mac上的應用

OC

首先兩本必備的神書一定是要讀完的。一本是講 OC 的《Effective Objective-C 2.0》,中文名叫:“編寫高質量 iOS 與 OS X 程式碼的 52 個有效方法”。另一本書叫:《Objective-C 高階程式設計》。前者講解 OC 中各種細節,後者主要講了 ARC、Block 和 GCD。

光是讀書,思考不夠,很容易在面試時被問懵逼,所以建議一遍嘗試回答面試真題,一邊閱讀以下總結性的文章,重要性不分先後:

  1. 檢測記憶體洩露
  2. KVO與KVC原理KVO、Notification、Delegate優缺點最推薦的官方文件
  3. GCD 與 NSOperation
  4. Runtime
  5. block
  6. atomic 執行緒安全@synchronized
  7. 物件的深淺複製
  8. 招聘一個靠譜的iOS
  9. 訊息傳遞機制
  10. 深入理解Objective-C:Category

強烈推薦第八篇文章,做完這上面的題目基本上可以應付大多數 OC 方面的問題了。

iOS 開發

  1. RunLoop
  2. Cell 圖片非同步載入優化
  3. iOS 函數語言程式設計的實現 && 響應式程式設計概念
  4. 記憶體惡鬼drawRect
  5. UIKit 效能調優(主要是UITableView)
  6. 優化UITableViewCell高度計算的那些事
  7. 高效能圖片架構與設計
  8. 輕量化檢視控制器
  9. UIView的生命週期
  10. 高效設定圓角
  11. 事件的傳遞和響應機制
  12. ReactiveCocoa 和 MVVM 入門

其中需要重點了解 runloop,它不僅僅是簡單的“跑圈”的 概念,很多問題其實都與它有關,建議認真閱讀 ibireme 大神的總結

其他面經

  1. 我是如何同時拿到阿里和騰訊offer的
  2. 大三學生拿到阿里,百度實習offer面試經驗分享
  3. 2016年1月TX電面題

相關文章