作者 | Artur
譯者 | 香檳超新星,責編 | 郭芮
以下為譯文:
我們都知道,面試可能會讓人感到壓力山大——不管你是第一次參加面試的新手,還是已經有幾年開發經驗做背書的業內人士,面試都會帶來壓力。
作為一名面試者,你必須好好準備,以展現出自己最好的一面,而想要在一場1小時左右的談話中做到這一點是很困難的。作為開發人員,我們通常不情愿去用心學習文檔,甚至很多簡單的東西還需要臨時去搜索。這沒關系,沒人會要求我們記住一切知識點……但如果是面試的話那就不一樣了。
作為一名面試官,面試可能也不是那么簡單的。你想為公司招募一個非常適合你們團隊的人,但你沒有太多時間去了解對方。你必須知道應該問哪些問題,以及注意自己舉止的方式——你不想讓面試者感到不舒服,否則你可能會因此而做出一些錯誤的判斷,從而錯過一個優秀的開發者。
差不多雙方都需要為面試做準備,我希望這篇文章能夠幫你在將來的面試中準備地更加充分一些。
問題
一條簡短的提示:我是不會提供這些問題的完整答案的(只有一些我個人預期你至少應該了解的基礎),因為我認為,如果你自己去尋找答案,應該能準備得更好。閱讀有關特定主題的文章會是一個不錯的選擇,可以為你提供更多信息,從而助你在面試中發揮得更好。
不過,或早或晚,我很可能會在自己的博客中對所有內容進行講解。
一般性問題
iOS(或任何其他平臺)的面試不會只涉及技術問題的。盡管你會在簡歷上寫一些有關以前的工作和項目的信息,但空間有限,無法把所有細節展開講。為這類問題做一些準備——避免自己在面試時手足無措。
1.到目前為止,你參與過哪些項目?都用到了哪些技術?你就詳細講講某些有趣的項目,談談這些項目用的是什么技術和框架就可以。
2.你是否參與過開源項目?你在其中擔任什么角色?即使你只是某個開源項目的貢獻者,這也會為你大大加分。如果你現在想得到第一份工作,開源項目是一種能證明你技術的好方法。如果你是某個廣受歡迎repo的維護者,那就更好了。
3.你以前所在的團隊有多大?你有過在任何一個項目中擔任的經歷嗎?這個問題只是為了了解你過去是獨自工作,在一個較大的團隊中工作,遠程協作,還是僅與本地的開發者合作。
4.你知識儲備的來源是什么?平時會看一些博客或者播客()內容嗎?舉幾個例子吧。如果你平時確實看,那就表明編程不僅是你的工作,還是你的一個業余愛好,所以相比其他不做這些事情的人,你就是更好的人選。
5.你是否曾有過Scrum / Agile開發經歷?你是怎么看待這種開發方式的?在你看來,什么時候該用,什么時候不該用?這只是一個簡短的問題,是為了了解你是否懂得Scrum自有其適用的地方,但不必一直使用。
6.你對code 有何看法?這也是一個簡短的問題,用來測試你是否屬于看重code 的那一類人。
7.你是否會去參加一些會議或一些當地的見面會?這些活動中你最喜歡哪個?我認為這并不是什么嚴肅的問題——如果你不喜歡參加,并不能代表你是一個糟糕的開發者,你可能只是內向而已。但是,如果你可以在那種會議上為公司做宣傳,或者發表個演講的話,那公司是會很喜聞樂見的。
Swift和-C
iOS開發并不僅僅意味著Swift。很多項目的某些部分仍然在用-C——甚至有的項目完全是用-C編寫的。而且,在某些(不太常見)的情況下,C和C ++技能也可能會有用。
但是,我倒不是很擔心這一點,因為如果面試針對某些特定的需要這些知識的項目,那么職位描述里面很有可能會提到。另外,一些有關Bash和Ruby的基礎知識可能會給你帶來巨大的優勢,因為有時我們可能需要寫一些腳本。
下面這些問題的順序是隨機的。
8.你如何描述Swift這門語言?這是一種面向協議編程的類型安全語言。然后對方可能會追問一些后續的問題,可能會讓你進一步解釋“面向協議”的含義等等。
9. var和let有什么區別?你會在中選擇哪個作為?為什么?第一個是非常基礎的問題解釋堆和棧的區別,請舉例說明,而第二個可能比較棘手,因為它需要視情況而定。
10.什么是lazy ?如果你寫Swift代碼已經有一段時間了,那至少要使用過一次lazy ,這樣才能更好地了解它的優點和缺點。
11.什么是?其背后的機制是什么?什么是 ?這個的答案你大概知道。
12.如何一個值?附加問題:什么是 , 以及nil- ?舉例說明你會在何種情況下選用哪種方法。這道題很簡單,但目的只在于看你是否知道其中的區別,而guard并不總是首選。
13. class和有什么區別?舉例說明分別什么情況下應該選用。你可以深入講講這一點,例如,它們是如何保存在內存中的(棧/堆)等等。
14.什么是?這個你應該知道的吧?
15.weak和是什么意思?二者有什么不同?最好知道它們之間的區別以及何時使用。雖然你每次都用weak可能也ok,但也是自有其用途的。
16.舉例說明從標準庫進行收集操作的方法。map和各有什么作用,以及這些方法如何在日常開發中發揮作用?
17.什么是?這可能看起來像是一個簡單的問題,但的內容可能比你想象的要多——比如,它是如何影響性能的。
18. 關鍵字是什么意思?舉一些例子說明一下。
19.和分別是什么意思?這是個簡單的問題。但你還記得哪個是默認選項嗎?
20.(如果求職者會-C):Swift和-C有什么區別?你分別喜歡這兩種語言的什么特性?隨便說點什么都行——如果你對兩種語言都有經驗,你就會知道在每種語言身上你最喜歡或最想念的是什么。
21.你聽說過 嗎?是什么意思?在Swift中可以用嗎?魔法……隨便說點你知道的信息——例如為什么這樣是危險的,等等。
22. 和NSSet有什么區別?不要只說集合包含獨特的元素,還要進一步說明它在不同情況下是如何表現的。
23.(如果求職者會-C):-C中的/是什么?
24.什么是KVO和KVC?這是另外一個很大的題目,所以至少要了解一些基本知識。
25.什么是應用程序和控制器生命周期?這是一個簡短的問題。
26.什么是核心數據(Core Data)?這是一個很大的話題——你可能永遠都用不到Core Data,但也要了解一些基本知識。
27.你在架構上有什么經驗?你最喜歡哪種,為什么?你可能需要了解MVVM(這是最常見的一種),因此,請閱讀此類內容以及與有關的內容。
28.你是否會將或class用在MVVM中的視圖模型里?視圖模型不一定總是一個class。
29.如何管理代碼中的依賴()?你是使用依賴注入框架/工具,還是手動進行?或者你只使用單例()?
30.什么是REST?POST和GET方法有什么區別?這個是必備知識。
31.你是否編寫過網絡層?簡要說明你以前是如何做的/將要如何做?你只需根據你自己的經驗來解釋即可。
32.你是否使用過,或其他任何網絡框架?有些人用網絡框架,有些人不用。你平時用不用?
33.如何在Swift中解析JSON?如何在Swift中解析XML?JSON的那一題很簡單。如果你知道的話,也順便討論一下你的密鑰解碼策略。XML有點被人們遺忘了,但是對于某些項目,你可能仍然需要XML。
34.什么是 ?如何在iOS應用程序中實現?這題不會也沒關系,但是如果知道會很加分!
35.如何允許不安全的連接?這是可行的嗎?能通過應用審查嗎?知道什么說什么就行——例如,可以談談在什么情況下是可以做到這一點的。
36.我們應該如何處理后臺操作?至少要知道一種方法。
37. GCD和之間有什么異同?GCD可能使用起來更方便,但是知道應該何時使用是加分項。
38.什么是串行/并行隊列(/ queue)?分別舉例說明應該何時使用。
39.什么是 group?知道會加分。
40.你最喜歡創建視圖的方式是什么?為什么?界面生成器( ),代碼約束( in code),手動框架計算( frame )——每種都各有什么優點和缺點?你傾向于用哪一種,為什么?
41.如何構建能夠支持不同屏幕尺寸的視圖?size class,用戶界面的術語等等
42.單元中的是什么,方法是做什么的?這題你必須會,因為table和通常都是應用程序中的核心元素。
43.什么是?你以前用過嗎?到目前為止你可能已經了解堆棧視圖(stack view)了,只需說出你對這個問題的了解即可,例如如何制作動畫,等等。
44.什么是?它真的很好用。
45.你是否曾經寫過自定義控制器轉換?怎樣才能做到?這個不經常用到,但是如果用到了,最好記得back 以及如何實現。
46.frame和有什么區別?這是“面試必問”的一道題。但是有些開發人員并不知道答案。
47. , , 以及 :它們是什么,以及它們是如何工作的?希望你不是那類一遇到約束沖突,就把所有約束的優先級都設置為999的人。
48.你在iOS中制作過的最復雜的動畫是什么?你是怎么做的?如果你做過一些精美的東西,那就自信地說出來吧。
49.在不嵌套多個.方法的前提下,如何做出復雜的動畫?我想我們雖然很少有機會(有需求)去做這件事,但是也許有一天你會需要去做。
50.(如果求職者懂-C):copy和之間有什么區別?也許知道答案的人會逐年減少,但是無論如何,如果你懂-C,大概就會知道。
51.你會怎樣存儲敏感的用戶數據?這題只是為了檢查你對數據安全性是否有所了解。
52.什么是defer?它們以怎樣的順序被執行等等。
53.什么是泛化()?描述一下泛化是如何改善我們的生活的,并從Swift標準庫里舉例說明。
面試問題可能并不僅僅與代碼有關,因此也需要在有關iOS開發的一般性知識方面做好準備。
54.請說出在創建一個新項目后,需要先做哪幾件事。拜托了,請不要說你要先設置。不要誤會解釋堆和棧的區別,請舉例說明,把作為依賴管理器( )并沒有錯,但首先應該做的不是這個。
55.你用依賴管理器嗎?你更喜歡哪個?這里的答案并沒有好壞——只是為了知道你的偏好而已。但是,最好了解每個管理器都各有什么優缺點。
56.什么是配置(debug,發布)?你是否會創建自定義的配置?我不清楚有多少項目會用自定義配置。無論如何,在某些情況下我們可能會用到。
57.你使用Xcode的工具嗎?哪些?希望你至少會用Leaks。
58.你如何找到并解決內存泄漏問題?如果你有響應性編程的經驗,那么你可以談談,并順便說說在響應式編程中這種問題更難解決。
59.什么是持續集成( ,CI)?你用過嗎?配置過嗎?有很多種類型,最好知道一兩個。
60.你是否有向App Store發布應用程序的經驗?你是否曾經在app審查方面遇到過任何問題?只需說自己的經驗之談即可。如果你曾經用IAP發布過應用程序,就可以提一提。如果你曾經與審查人員有過什么有趣的對話,也可以說說。
61.你在單元測試方面有過經驗嗎?UI測試呢?每個人都說他們會寫測試,但真的如此嗎?如果你曾使用過任何框架來幫助測試,也提一下。
62.你是否曾經開發過測試驅動項目(TDD)?做過的同學請舉手。
63.你每天都使用的開發工具有哪些?可以是一些代碼格式化程序或同步器之類的——隨便什么都行。如果你的工具是自己寫的,請務必提及!
64.什么是SOLID?你能列出并描述這些原則嗎?如果你知道它的含義,就說明你已經為面試做好了準備。但是,如果能舉出一些例子,那會更好。
65.什么是聲明式編程( )?你是否嘗試過?越來越受歡迎了,誰知道呢,也許幾年后,它將變成寫iOS應用程序的唯一方法。因此,最好至少知道它的存在。我認為現在還沒有人會要求開發者擁有豐富的開發經驗,但是如果你曾嘗試過,那會是加分項。
66.什么是響應式編程( )?你是否有使用Rx框架和/或Apple’s 的經驗?Apple也采用這種方式,所以如果你還沒有嘗試過,那么現在正是去了解一些基礎知識的好時機。
67.你為什么要離開原先的工作?你對新工作有什么期待嗎?坦誠地說就可以。你所追求的大概率是更高的薪水,但除此之外,一定還有其他東西吧!
以上只是面試官可能會提的一些問題。
結論
最好能始終跟上iOS世界的變化,那對你來說是很有利的。閱讀博客,收聽播客,關注有關Apple開發人員的新聞,即使你有很大概率在新工作中并不需要知道所有那些知識,對新知識持開放態度總是好的,并且,你可以讓面試官知道你一直在不斷的學習。
祝你在面試中能有好運氣——不管你是面試者還是面試官。
感謝閱讀。
原文:
作者:Artur ,iOS高級開發工程師, 創始人。