2018年 iOS 面試心得

J_Knight_發表於1970-01-01

面試了幾家公司之後,最後來到了愛奇藝(座標上海),工作的內容是筆者個人非常感興趣的領域。能拿到這個結果對於入行兩年半&非科班的筆者來說無疑是幸運的。

很感謝面試官給我這次機會,因為並不是所有人都會認可你的努力,生活本來就沒有任何理所應當。

具體的面了哪些公司,有哪些面試題在這裡就不分享了,因為感覺借鑑意義並不是很大。

  • 面了哪些公司還是不方便在這裡公開的。
  • 這幾家公司的面試題相差並不大,主要還是需要重視答題質量;而且即便是同一個面試官,在面對不同面試者的時候問的問題也很可能不一樣,因為很可能受到答題者的回答影響會問一些計劃之外的題,這點我在作面試官的時候有體會。

面試題方面筆者會專門在下一篇出一套自己認為可以用來面試高階 iOS 的面試題,連結:出一套 iOS 高階面試題

本篇主要分享的是筆者在這階段是如何準備面試的。可能每個人都有適合自己的學習方法,筆者的這套方法更談不上十分高效,但還是希望對大家可以有一定的借鑑意義。

準備面試

準備面試主要從三個點展開:

  • 使用的工具
  • 面試題的整理
  • 時間管理

使用的工具

在準備面試的過程中使用頻率最多的工具有兩個:

  • 有道筆記
  • 奇妙清單

1. 有道筆記

  • 用途1:用來收集知識源:有道筆記瀏覽器外掛可以一鍵快速儲存網頁,也可以收藏公眾號的文章。
  • 用途2:用來整理面試題:支援多級資料夾,可以清晰看到知識結構;支援MarkDown,可以儲存程式碼。

筆記的整理過程就是理解的過程,反覆咀嚼自己的筆記可以幫助理解。

2. 奇妙清單

  • 用途1:用來記錄突然想到的問題點:有的時候可能在頭腦出蹦出一個問題來,但是沒辦法立刻想出答案。這時候需要在一個自己熟悉的位置儲存一下。
  • 用途2:羅列現在為止沒有攻克的面試題:可以更直觀地看到距離複習完成還有多少任務。

清單這種工具是為了解放大腦,因為大腦是用來思考的,不是用來記憶的。把需要惦記的事情先扔進去,讓大腦脫離出來~

這兩個工具還有一個非常大的優勢就是跨平臺:都支援(Mac,Windows,Android,iOS)系統,同步的功能做的也都很好。所以使用它們可以在不方便用電腦的時候隨時更新,特別是有一個好想法的時候可以馬上在手機上記下來

面試題的整理

面試題分類

筆者儘可能蒐羅了網上所有的iOS面試題,難度從低到高,當然也有介紹某個知識點的一些文章。筆者將這些題彙總以後分成了幾個主題放在了有道筆記裡面:

  • iOS 基礎題:例如“KVO的實現原理?”等等。
  • iOS 應用題:例如“可能導致崩潰的幾個原因以及如何避免崩潰?”等等。
  • Block:例如:“基本型別的變數和物件被__block修飾與否各有什麼區別?”等等。
  • RunLoop:例如“利用RunLoop可以實現哪些功能?”等等。
  • Runtime:例如“從一個物件收到一個它無法響應的方法到崩潰之間發生了什麼?”等等。
  • 網路:例如“HTTPS的握手流程?”等等。
  • 多執行緒:例如“執行緒同步的幾個策略?知道哪幾種鎖及其它們之前區別?”等等。
  • 計算機系統:例如“記憶體的幾塊區域以及職能?”等等。
  • 設計模式:“iOS SDK裡面有哪些設計模式的實踐?”等等。
  • 架構:例如“MVVM和MVP的區別?”等等。
  • 資料結構:例如“雜湊表的實現原理?如何解決衝突?”等等。

演算法題的準備

最後還要說一下演算法題:筆者因為沒有演算法方面的基礎,而且時間上也比較緊,所以只准備了陣列,連結串列,二叉樹為主的演算法題,語言是C++。這些題目的來源主要是《劍指offer》和LeetCode上面的題目,一共學習了大概一個月的時間。

筆者把已經掌握的演算法題放在了我的GitHub庫上面(有答案,而且都是正確的):awesome-algorithm-question-solution。這個庫裡面的演算法題大部分都是移動端面試比較常考的演算法題。

目前都基於C++語言,有興趣的同學歡迎提交Java和Swift的答案。

相關書籍

還有就是可以用來準備面試的書籍:

  • iOS基礎

  • 網路

    • 《圖解HTTP》:講解了HTTP相關的知識,淺顯易懂。
    • 《圖解TCP/IP》:講解了TCP/IP相關的知識,風格和《圖解HTTP》類似。
  • 設計模式

    • 《Objective-C程式設計之道:iOS設計模式解析》:這本書介紹了 iOS SDK 中使用的設計模式,將理論和實踐結合到了一起,是筆者本人比較喜歡的一本書。有一定的 iOS 基礎的同學看這本書會比較順暢一點。不建議基礎稍薄弱,業務場景遇到的不多的同學看這本書,因為會感到很晦澀。
  • 資料結構和演算法

    • 《劍指offer》:這本書的難度不是很大,如果沒有任何基礎,可以挑幾個感覺是上比較簡單的基於陣列的演算法題去學習。而且這本書中也介紹了一些面試演算法題的一些技巧和需要注意的地方(俗稱套路)。就算是沒有看這裡的演算法題也會有所收穫。
    • LeetCode演算法題:如果時間比較緊,可以直接看筆者上面的GitHub倉庫(awesome-algorithm-question-solution),因為這裡大部分都是移動端比較常考的演算法題。然而並不保證演算法效能一定是最好的,因為提升演算法效能也需要一些時間成本來學習,這裡暫時只能保證效能適中,而且肯定是正確的輸出結果。

    總的來說如果時間很緊迫,建議先看一些《劍指offer》裡面關於演算法面試的“套路”方面的講解。然後就直奔主題,找一些常考的演算法題去學習。

  • 計算機系統方面知識

    • 《程式設計師的自我修養》(俞甲子,石凡,潘愛民):第一章對程式,執行緒安全,各種鎖的講解比較好。後面的部分偏深一些,如果時間不允許的話可以先不看。

時間管理

好的時間管理策略可以更好地幫助計劃的落地。在這裡從兩個點來介紹筆者的時間管理策略:

  • 每天都做哪些事情
  • 不做哪些事情

每天都做哪些事情

因為當時在職的關係準備面試的時間比較有限,但是每天對不同型別的知識點都有比較固定比例的時間分配:

  • 型別一:全新的知識點。這類知識點是每天都要看的,因為對於新知識需要時間去消化和吸收。所分配的時間大概佔一天總學習時間的一半左右。

  • 型別二:不熟悉的知識點。這類知識點是指那些剛理解好的全新的知識點或者比較難以理解的,需要反覆看和消化的知識點。大概佔一天總學習時間的一半以內。

  • 型別三:很熟悉的知識點。這部分知識點屬於理解的比較透徹的,但也需要抽時間複習,是這部分時間佔比不是很重,簡單掃一眼即可。

另外還要費分配出整理知識點的時間:對於上面這三種知識點其實都需要反覆的整理和吸收,嘗試著用自己的話表示出來,需要的時間佔比也不是很重,但是卻很有用。

不做哪些事情

在時間管理這塊,筆者個人比較贊同的一個觀點是:比起知道做什麼,首先知道不做什麼更重要。因為人的精力是有限的,一天就只有24個小時,當某件事很重要的時候,其他的事情就要做個讓步。

為了準備面試,筆者在今年上半年放棄了很多事情:

  1. 健身卡雖然快過期了,但是一次都沒有去。
  2. 同學,家人聚會也婉言謝絕了。
  3. 沒有玩兒“吃雞”,也沒有去過電影院。

坦白說在筆者拿到offer以後才去了健身房,和同學家人聚會,也見了老朋友,算是都補上了。他們也都表示比較理解,所以筆者也感覺也蠻欣慰的。

找一份工作並不難,但是找一份目前最適合自己的工作卻非常難,希望大家也能夠做一些取捨,列好計劃並付諸實踐,應該是會有好的結果的。

簡單講完了這階段的面試經歷和準備面試的方法策略,下面說一下筆者對一些同行的某些想法想說的。因為這些也包括這上半年面試別人和自己去面試體會到的,所以在這裡就和麵試心得一起說了。某些地方可能有些主觀。

對一些同行的某些想法想說的

“行業不景氣了”

這句話每個月都會聽到一兩次。 今年上半年很多朋友在面試,可能因為有些朋友不是很順利,有感而發了。 而且筆者上半年也在給公司招人,招的是高階 iOS 開發,有一個感覺就是很難招。雖然年限已經有3,4年了,但是關於設計模式,資料結構,iOS 底層方面的知識瞭解的甚少,開源庫也只看過SDWebimage(或許只是看了網上的解析而已),總之沒有達到筆者個人對一個高階 iOS 開發的要求。

但是反過來我也聽到好多人去了很不錯的公司,比如今日頭條,BAT等等,評級也比較高。

所以筆者個人覺得並不是這個行業不景氣,而恰恰是很多開發者沒有保持一個持續學習的狀態,只是將一年的經驗重複多年,最終導致自己的能力小於所屬年限的能力標準的情況出現

筆者認為既然做為一名軟體開發人員,就要不斷地突破自己。對於前端的開發人員,要儘可能地多學一些脫離UI層面上的通用性的知識,比如資料結構和演算法,網路協議,設計模式,看一些好的開源庫也是不錯的(上半年面試了不少於10個人,問看過哪些開源庫沒有一個不說SDWebImage的)。在這裡推薦筆者之前寫的一些原始碼解析的部落格:

“因為我學歷不好,所以很難拿到面試機會”

這些話在跟我比較熟的同行裡面聽到比較多,他們覺得自己的面試機會受限於學歷。

但其實簡歷上面可以吸引人的地方可以有很多:高質量的部落格,高質量的Github程式碼,優秀的專案經驗,有深度的技術分享等等。

有句話筆者個人非常喜歡:

Alter what is changeable, and accept what is immutable

意思是改變能改變的,接收不能改變的。學歷既然很難改變了,那就接受它,不去抱怨,不去拿它當藉口,應該把精力放在能改變的事情上:

  1. 部落格:現在自己搭建部落格都是很容易的事情,有現成的框架(hexo),學習成本很低,如果你有一定的技術積累可以在這裡做一下介紹。
  2. GitHub:這個就不用介紹了,如果你封裝了好用的元件就可以放在上面,不斷更新優化,能體現出個人的成長。如果能參與大型的開源專案就更好了。
  3. 專案經驗:這個可能也是個人無法掌控的,但是你可以將某個功能點做到極致不是麼?
  4. 技術分享:如果你研究了一個新技術,是否可以給同事們分享一下呢?同時也可以鍛鍊下自己。

筆者個人是比較看重1,2點的:從這兩點可以看出這個人對技術的追求,是否熱衷於分享,是否有比較好的表達能力和思路。而3,4點由於客觀方面的影響比較多一些,所以相對來說筆者個人並不是很側重。

筆者看到過一項調查:相對來說學歷越高,畢業學校越好的開發者往往在GitHub和部落格上面產出更多。這不失為一個值得思考的問題,同時也更加說明了學歷和畢業學校相對來說不是那麼太靠前的開發者更要注重GitHub和部落格這兩塊。

“(大公司)面試造火箭,工作擰螺絲。”

這句話也聽過不少次了,能聽出來說這句話的人多數帶著些許負面情緒說的。

筆者個人認為大公司的這種招人策略是非常道理的:因為既然是大公司,有豐富的資源,它要麼是正在造火箭,要麼就是準備造火箭,所以招人的話肯定是招那些已經具備造火箭能力的人或者是那些培養之後可以造火箭的基礎比較好的人。而且萬丈高樓平地起,總不會大家都是圍著設計圖討論吧?每個人都有每個人的職責,況且哪個將領不是從士兵開始做起的呢?

所以我們應該以正確的態度去對待這件事情:

  • 如果你真的想進大公司,那麼就削尖了腦袋,好好準備底層知識和演算法題去爭取:拿到offer最好,就算拿不到也肯定會有收穫,畢竟你努力了,你也切身體會了一次大公司的要求。
  • 如果你真的不想進大公司,那麼就儘量不要去惦記這件事情,更不要去傳播這種負面情緒。
  • 如果你還沒確定要不要去大公司,那麼最好現在就定一下方向,方向有了計劃才會有,計劃有了才會有成果出來。

“這部分工作中我沒遇到過,所以不瞭解”

今年上半年也為公司招了人,上面這句話是筆者做面試官的時候經常聽到的,比如問“NSSet和NSArray的區別”,“iOS有哪些反射實踐?”這樣的問題的時候,面試者通常把自己沒有做過作為自己不會的藉口

其實筆者覺得上面這兩個知識點和做沒做過相應業務沒有太直接的關係(筆者本人在實際專案中也沒有做過)。

  • 對於第一個問題,如果你學習了雜湊表,並順帶去了解其在iOS SDK的實現,或者是調研過除了陣列,字典以外的其他集合類的話,就一定會遇到NSSet。再或者你如果看過AFNetworking的原始碼的話也可以接觸到它。
  • 對於第二個問題,如果你知道Java中有反射的概念,那麼你如果舉一反三去探索iOS的反射的話,就可以知道使用執行時的一些函式就可以實現反射。

所以說無論學習哪個語言,如果可以從一些通用性知識點裡探索出該語言對該知識點的實現的話,會更有助於加深對該語言本身的理解,也可以提高相應的業務能力:

比方說如果你僅僅需要一個集合,將來只需要判斷元素在不在其中的話,你只需要用NSSet就好了;但是如果你不知道NSSet的存在的話,你可能就只會用NSArray來做,要知道陣列的查詢速度是要比雜湊表低的多的。

所以說做學問最怕的是不知道自己不知道:多接觸,多探索總還是好的。

“我不是科班的,所以資料結構和演算法我不會”

筆者作面試官的時候發現:在非科班的群體裡想主動學習資料結構和演算法的人並不是很多。因為每當筆者問一些關於資料結構和演算法方面的知識的時候,總會聽到以自己不是科班出身作為不會這類題的藉口。

筆者認為如果想要在寫程式這條路上面走遠,這一塊是肯定繞不過去的。 有一個公式:

程式 = 資料結構 + 演算法

一個好的程式往往跟這兩者是分不開的。即是說若想寫出好的程式,就要選擇好合理的資料結構和演算法(至少也要選擇正確的資料結構)。

舉一個例子: 現在需要你用一個集合來儲存一些人名,並提供一個介面來判斷傳入的人名是否在這個集合裡。那麼如果讓你來實現這個功能,這個集合的資料結構你會用陣列,字典,還是Set呢?

如果你不瞭解Set的優勢,那麼你很可能就會用陣列來做了(通過返回的index來判斷)。但是陣列查詢的時間複雜度是O(N),遠不如Set的O(1),所以這就說明了使用合適的資料結構對於效能的幫助會有多大。

筆者也不是科班出身的,但是學習了資料結構和演算法之後,發現自己在設計功能,以及理解程式碼的能力上提高了一大截。像上文所說的筆者也只是掌握了30到LeetCode題,和一些比較基礎的資料結構而已。所以很希望各位非科班的同學也可以好好規劃自己這一塊的學習。而且有一些科班出身的同學,恰恰因為自己是科班出身,所以在工作之後反而就沒有主動去精進這方面知識了,所以非科班的同學更要主動去規劃自己,以最快速度填補自己的這塊漏洞。

以上就是筆者這段時間的一些思考和想法了。

這篇總結就在這裡寫完了,一共兩個部分,希望您能有所收穫,也非常歡迎能跟我一起交流~

本篇已同步到個人部落格:2018年iOS 面試心得


筆者在近期開通了個人公眾號,主要分享程式設計,讀書筆記,思考類的文章。

  • 程式設計類文章:包括筆者以前釋出的精選技術文章,以及後續釋出的技術文章(以原創為主),並且逐漸脫離 iOS 的內容,將側重點會轉移到提高程式設計能力的方向上。
  • 讀書筆記類文章:分享程式設計類思考類心理類職場類書籍的讀書筆記。
  • 思考類文章:分享筆者平時在技術上生活上的思考。

因為公眾號每天釋出的訊息數有限制,所以到目前為止還沒有將所有過去的精選文章都發布在公眾號上,後續會逐步釋出的。

而且因為各大部落格平臺的各種限制,後面還會在公眾號上釋出一些短小精幹,以小見大的乾貨文章哦~

掃下方的公眾號二維碼並點選關注,期待與您的共同成長~

2018年 iOS 面試心得

相關文章