iOS 開發面試通關指南:67 個必知問題

作者 | Artur Rymarz

譯者 | 香檳超新星,責編 | 郭芮

出品 | CSDN(ID:CSDNnews)

我們都知道,面試可能會讓人感到壓力山大——不管你是第一次參加面試的新手,還是已經有幾年開發經驗做背書的業內人士,面試都會帶來壓力。

作為一名面試者,你必須好好準備,以展現出自己最好的一面,而想要在一場1小時左右的談話中做到這一點是很困難的。作為開發人員,我們通常不情願去用心學習文檔,甚至很多簡單的東西還需要臨時去Google搜索。這沒關係,沒人會要求我們記住一切知識點……但如果是面試的話那就不一樣了。

作為一名面試官,面試可能也不是那麼簡單的。你想為公司招募一個非常適合你們團隊的人,但你沒有太多時間去了解對方。你必須知道應該問哪些問題,以及注意自己舉止的方式——你不想讓面試者感到不舒服,否則你可能會因此而做出一些錯誤的判斷,從而錯過一個優秀的開發者。

差不多雙方都需要為面試做準備,我希望這篇文章能夠幫你在將來的面試中準備地更加充分一些。


01

問題


一條簡短的提示:我是不會提供這些問題的完整答案的(只有一些我個人預期你至少應該瞭解的基礎),因為我認為,如果你自己去尋找答案,應該能準備得更好。閱讀有關特定主題的文章會是一個不錯的選擇,可以為你提供更多信息,從而助你在面試中發揮得更好。

不過,或早或晚,我很可能會在自己的博客中對所有內容進行講解。


02

一般性問題


iOS(或任何其他平臺)的面試不會只涉及技術問題的。儘管你會在簡歷上寫一些有關以前的工作和項目的信息,但空間有限,無法把所有細節展開講。為這類問題做一些準備——避免自己在面試時手足無措。

1.到目前為止,你參與過哪些項目?都用到了哪些技術?你就詳細講講某些有趣的項目,談談這些項目用的是什麼技術和框架就可以。

2.你是否參與過開源項目?你在其中擔任什麼角色?即使你只是某個開源項目的貢獻者,這也會為你大大加分。如果你現在想得到第一份工作,開源項目是一種能證明你技術的好方法。如果你是某個廣受歡迎repo的維護者,那就更好了。

3.你以前所在的團隊有多大?你有過在任何一個項目中擔任leader的經歷嗎?這個問題只是為了瞭解你過去是獨自工作,在一個較大的團隊中工作,遠程協作,還是僅與本地的開發者合作。

4.你知識儲備的來源是什麼?平時會看一些博客或者播客(podcast)內容嗎?舉幾個例子吧。如果你平時確實看,那就表明編程不僅是你的工作,還是你的一個業餘愛好,所以相比其他不做這些事情的人,你就是更好的人選。

5.你是否曾有過Scrum / Agile開發經歷?你是怎麼看待這種開發方式的?在你看來,什麼時候該用,什麼時候不該用?這只是一個簡短的問題,是為了瞭解你是否懂得Scrum自有其適用的地方,但不必一直使用。

6.你對code review有何看法?這也是一個簡短的問題,用來測試你是否屬於看重code review的那一類人。

7.你是否會去參加一些會議或一些當地的見面會?這些活動中你最喜歡哪個?我認為這並不是什麼嚴肅的問題——如果你不喜歡參加,並不能代表你是一個糟糕的開發者,你可能只是內向而已。但是,如果你可以在那種會議上為公司做宣傳,或者發表個演講的話,那公司是會很喜聞樂見的。


03

Swift和Objective-C


iOS開發並不僅僅意味著Swift。很多項目的某些部分仍然在用Objective-C——甚至有的項目完全是用Objective-C編寫的。而且,在某些(不太常見)的情況下,C和C ++技能也可能會有用。

但是,我倒不是很擔心這一點,因為如果面試針對某些特定的需要這些知識的項目,那麼職位描述裡面很有可能會提到。另外,一些有關Bash和Ruby的基礎知識可能會給你帶來巨大的優勢,因為有時我們可能需要寫一些腳本。

下面這些問題的順序是隨機的。

8.你如何描述Swift這門語言?這是一種面向協議編程的類型安全語言。然後對方可能會追問一些後續的問題,可能會讓你進一步解釋“面向協議”的含義等等。

9. var和let有什麼區別?你會在struct中選擇哪個作為property?為什麼?第一個是非常基礎的問題,而第二個可能比較棘手,因為它需要視情況而定。

10.什麼是lazy property?如果你寫Swift代碼已經有一段時間了,那至少要使用過一次lazy property,這樣才能更好地瞭解它的優點和缺點。

11.什麼是optional?其背後的機制是什麼?什麼是unconditional unwrapping ?這個的答案你大概知道。

12.如何unwrap一個optional值?附加問題:什麼是optional chaining,optional binding以及nil-coalescing operator?舉例說明你會在何種情況下選用哪種方法。這道題很簡單,但目的只在於看你是否知道其中的區別,而guard並不總是首選。

13. class和struct有什麼區別?舉例說明分別什麼情況下應該選用。你可以深入講講這一點,例如,它們是如何保存在內存中的(棧/堆)等等。

14.什麼是closure?這個你應該知道的吧?

15.weak和unowned是什麼意思?二者有什麼不同?最好知道它們之間的區別以及何時使用unowned。雖然你每次都用weak可能也ok,但unowned也是自有其用途的。

16.舉例說明從標準庫進行收集操作的方法。map和reduce各有什麼作用,以及這些方法如何在日常開發中發揮作用?

17.什麼是autoclosure?這可能看起來像是一個簡單的問題,但autoclosure的內容可能比你想象的要多——比如,它是如何影響性能的。

18. mutating關鍵字是什麼意思?舉一些例子說明一下。

19.escaping和unescaping分別是什麼意思?這是個簡單的問題。但你還記得哪個是默認選項嗎?

20.(如果求職者會Objective-C):Swift和Objective-C有什麼區別?你分別喜歡這兩種語言的什麼特性?隨便說點什麼都行——如果你對兩種語言都有經驗,你就會知道在每種語言身上你最喜歡或最想念的是什麼。

21.你聽說過method swizzling嗎?是什麼意思?在Swift中可以用嗎?魔法……隨便說點你知道的信息——例如為什麼這樣是危險的,等等。

22. NSArray和NSSet有什麼區別?不要只說集合包含獨特的元素,還要進一步說明它在不同情況下是如何表現的。

23.(如果求職者會Objective-C):Objective-C中的atomic/nonatomic是什麼?

24.什麼是KVO和KVC?這是另外一個很大的題目,所以至少要了解一些基本知識。

25.什麼是應用程序和控制器生命週期?這是一個簡短的問題。

26.什麼是核心數據(Core Data)?這是一個很大的話題——你可能永遠都用不到Core Data,但也要了解一些基本知識。

27.你在架構上有什麼經驗?你最喜歡哪種,為什麼?你可能需要了解MVVM(這是最常見的一種),因此,請閱讀此類內容以及與coordinator有關的內容。

28.你是否會將struct或class用在MVVM中的視圖模型裡?視圖模型不一定總是一個class。

29.如何管理代碼中的依賴(dependency)?你是使用依賴注入框架/工具,還是手動進行?或者你只使用單例(singleton)?

30.什麼是REST?POST和GET方法有什麼區別?這個是必備知識。

31.你是否編寫過網絡層?簡要說明你以前是如何做的/將要如何做?你只需根據你自己的經驗來解釋即可。

32.你是否使用過Alamofire,或其他任何網絡框架?有些人用網絡框架,有些人不用。你平時用不用?

33.如何在Swift中解析JSON?如何在Swift中解析XML?JSON的那一題很簡單。如果你知道的話,也順便討論一下你的密鑰解碼策略。XML有點被人們遺忘了,但是對於某些項目,你可能仍然需要XML。

34.什麼是certificate pinning?如何在iOS應用程序中實現?這題不會也沒關係,但是如果知道會很加分!

35.如何允許不安全的連接?這是可行的嗎?能通過應用審查嗎?知道什麼說什麼就行——例如,可以談談在什麼情況下是可以做到這一點的。

36.我們應該如何處理後臺操作?至少要知道一種方法。

37. GCD和NSOperation之間有什麼異同?GCD可能使用起來更方便,但是知道應該何時使用NSOperation是加分項。

38.什麼是串行/並行隊列(serial/concurrent queue)?分別舉例說明應該何時使用。

39.什麼是dispatch group?知道會加分。

40.你最喜歡創建視圖的方式是什麼?為什麼?界面生成器(Interface builder),代碼約束(constraints in code),手動框架計算(manual frame calculating)——每種都各有什麼優點和缺點?你傾向於用哪一種,為什麼?

41.如何構建能夠支持不同屏幕尺寸的視圖?size class,用戶界面的術語等等

42.單元中的reuseIdentifier是什麼,prepareForReuse方法是做什麼的?這題你必須會,因為table和collection通常都是應用程序中的核心元素。

43.什麼是UIStackView?你以前用過嗎?到目前為止你可能已經瞭解堆棧視圖(stack view)了,只需說出你對這個問題的瞭解即可,例如如何製作動畫,等等。

44.什麼是internalContentSize?它真的很好用。

45.你是否曾經寫過自定義控制器轉換?怎樣才能做到?這個不經常用到,但是如果用到了,最好記得back gesture以及如何實現。

46.frame和bounds有什麼區別?這是“面試必問”的一道題。但是有些開發人員並不知道答案。

47. Constraint priorities, hugging priority, 以及compression resistance priority:它們是什麼,以及它們是如何工作的?希望你不是那類一遇到約束衝突,就把所有約束的優先級都設置為999的人。

48.你在iOS中製作過的最複雜的動畫是什麼?你是怎麼做的?如果你做過一些精美的東西,那就自信地說出來吧。

49.在不嵌套多個UIView.animate方法的前提下,如何做出複雜的動畫?我想我們雖然很少有機會(有需求)去做這件事,但是也許有一天你會需要去做。

50.(如果求職者懂Objective-C):copy和retain之間有什麼區別?也許知道答案的人會逐年減少,但是無論如何,如果你懂Objective-C,大概就會知道。

51.你會怎樣存儲敏感的用戶數據?這題只是為了檢查你對數據安全性是否有所瞭解。

52.什麼是defer?它們以怎樣的順序被執行等等。

53.什麼是泛化(generics)?描述一下泛化是如何改善我們的生活的,並從Swift標準庫裡舉例說明。

面試問題可能並不僅僅與代碼有關,因此也需要在有關iOS開發的一般性知識方面做好準備。

54.請說出在創建一個新項目後,需要先做哪幾件事。拜託了,請不要說你要先設置CocoaPods。不要誤會,把CocoaPods作為依賴管理器(dependency manager)並沒有錯,但首先應該做的不是這個。

55.你用依賴管理器嗎?你更喜歡哪個?這裡的答案並沒有好壞——只是為了知道你的偏好而已。但是,最好了解每個管理器都各有什麼優缺點。

56.什麼是配置(debug,發佈)?你是否會創建自定義的配置?我不清楚有多少項目會用自定義配置。無論如何,在某些情況下我們可能會用到。

57.你使用Xcode的工具嗎?哪些?希望你至少會用Leaks。

58.你如何找到並解決內存洩漏問題?如果你有響應性編程的經驗,那麼你可以談談,並順便說說在響應式編程中這種問題更難解決。

59.什麼是持續集成(continuous integration,CI)?你用過嗎?配置過嗎?有很多種類型,最好知道一兩個。

60.你是否有向App Store發佈應用程序的經驗?你是否曾經在app審查方面遇到過任何問題?只需說自己的經驗之談即可。如果你曾經用IAP發佈過應用程序,就可以提一提。如果你曾經與審查人員有過什麼有趣的對話,也可以說說。

61.你在單元測試方面有過經驗嗎?UI測試呢?每個人都說他們會寫測試,但真的如此嗎?如果你曾使用過任何框架來幫助測試,也提一下。

62.你是否曾經開發過測試驅動項目(TDD)?做過的同學請舉手。

63.你每天都使用的開發工具有哪些?可以是一些代碼格式化程序或同步器之類的——隨便什麼都行。如果你的工具是自己寫的,請務必提及!

64.什麼是SOLID?你能列出並描述這些原則嗎?如果你知道它的含義,就說明你已經為面試做好了準備。但是,如果能舉出一些例子,那會更好。

65.什麼是聲明式編程(declarative programming)?你是否嘗試過SwiftUI?SwiftUI越來越受歡迎了,誰知道呢,也許幾年後,它將變成寫iOS應用程序的唯一方法。因此,最好至少知道它的存在。我認為現在還沒有人會要求開發者擁有豐富的SwiftUI開發經驗,但是如果你曾嘗試過,那會是加分項。

66.什麼是響應式編程(reactive programming)?你是否有使用Rx框架和/或Apple’s Combine的經驗?Apple也採用這種方式,所以如果你還沒有嘗試過,那麼現在正是去了解一些基礎知識的好時機。

67.你為什麼要離開原先的工作?你對新工作有什麼期待嗎?坦誠地說就可以。你所追求的大概率是更高的薪水,但除此之外,一定還有其他東西吧!

以上只是面試官可能會提的一些問題。


04

結論


最好能始終跟上iOS世界的變化,那對你來說是很有利的。閱讀博客,收聽播客,關注有關Apple開發人員的新聞,即使你有很大概率在新工作中並不需要知道所有那些知識,對新知識持開放態度總是好的,並且,你可以讓面試官知道你一直在不斷的學習。

祝你在面試中能有好運氣——不管你是面試者還是面試官。

原文:https://medium.com/better-programming/67-useful-ios-developer-interview-questions-3cb15973b71

作者:Artur Rymarz,iOS高級開發工程師,Ordinary Coding創始人。

本文為 CSDN 翻譯,轉載請註明來源出處。


分享到:


相關文章: