十七道IOS人員面試提問及注意事項
準備技術方面的面試:
在直接切入問題之前,我們先討論下一些基本的要領來確保你的技術面試儘可能順利進行。
為每個可能出現的問題準備好答案是不可能的。所以需要更加關注基礎方面的內容。確保你對Objective-C 2.0的特性都非常熟悉。可以猜的到會有一些關於通知(messaging),協議(protocols),動態型別(dynamic types),轉發(forwarding),分類(categories),posing, method swizzling等方面的問題。面試者想考察你對現有的或者是之前出現的問題了解有多少。花幾個小時去 StackOverflow 網站上看下最近經常提問到有關iOS方面的問題會對你有很大幫助。
讀一遍ofollow,noindex">Apple’s Objective-C guides ,確保你沒有任何覺得比較薄弱的主題。像google式問法的那種問題,比如說一個小車需要多少個高爾夫球才能填滿(250,000),或是在舊金山有多少扇窗戶(大於10億),現在大部分公司都停止問了。當你要面對這些型別的問題的時候,你的思路比你的答案要更重要,關於這個問題你是如何思考的 - 這才是面試官關心的問題。
準備好在白板上編碼
如果你是面對面的面試,他們可能希望你在白板上直接程式設計。確保在你面試之前做了一些練習,因為在一群人面前直接編寫程式碼會非常有壓力,沒有程式碼自動補全功能的編碼難度遠遠大於你的想象。
為你在簡歷上寫的熟悉的程式語言做好在白板上寫程式碼的準備。我的一個朋友在面試中被要求在白板上用Erlang來程式設計,Erlang是他在簡歷中列出來的程式語言。他得到了那份工作。地球上知道Erlang的僅有三個人,我確定他是其中的一個。
面試禮節
如果是進行面對面面試,先詢問下公司的著裝要求。如果面試官穿短褲T恤,而你穿著西裝,這樣就會比較尷尬,而且面試官也可能會很不愉快。如果你穿球衣而其他人穿西裝的話也會是同樣的結果。關於這點,可以事先詢問招聘經理,他會很樂意給你一些相關建議。
確保手機調成靜音。如果你知道我在面試的時候聽到過多少次電話響起的聲音,你一定會驚訝的。大多數情況下你都不應該在面試中接電話或者檢視下你的手機。如果有一些潛在的緊急情況,例如你的妻子馬上要分娩或者是你的丈夫正在做手術,請提前告訴你的招聘經理,這樣的話你接電話的行為還可以被接受。
在面試過程中,無論是身體還是精神都需要放輕鬆。儘量把面試時間定到一段你相對空閒的時間(之後你不會有其他的事情需要做)。如果你把面試定到你目前工作的午休時間,那肯定不會達到最好的效果。有時我甚至需要縮短面試時間就只因為面試者的現任老闆需要他去工作! 請避免增加你目前已有的壓力。
進行面對面的面試,請早到15分鐘左右,但不要太早。對於電話面試,如果是線上會議的話,確保提前兩分鐘撥號進入。直接打電話來的,確保能按時準備好。
準備好問題
在面試的結尾,面試官通常會問你關於公司和工作,你還有哪些問題。請事先準備好你的問題,把你想要問的問題寫到紙上。這會表明你對這份工作真的感興趣而不是僅僅走走過場。很多面試者在這個環節中都不會問任何內容,這讓我感到很驚訝。如果你覺得這個工作適合你的話,這是一個瞭解公司的很好的機會。
面試題目
你期待已久的內容到了 - 題目!
我們的技術性面試通常持續1個小時。有一張包含75個問題的表單,剛開始我會從裡面隨機抽取題目。之後我根據對候選人知識方面的瞭解,有選擇的縮小問題的範圍。例如,如果我懷疑候選人哪塊兒有薄弱的知識點,我會繼續深入的問那塊兒內容。
這篇文章發表之後,我最愛問的問題和我首選的問題將會被淘汰了。而我的第一個問題將會是:你讀過這篇文章嗎?
當回答這些問題的時候,儘量使你的答案簡明扼要,如果必要的話解釋下你的思路。面試官不是因為不知道答案而來問你這些問題的,他們要知道的是你對你所說的內容瞭解程度有多少。
請注意,我只會列出問題,沒有答案。你需要去回答,如果你還不是很瞭解這些內容的話, 記住學習的過程是極富有樂趣的一個過程! 如果你找到答案的話,你可以隨意的在論壇上進行分享。
直接進入正題,這些是技術性面試的一些樣例題目。
請解釋下method swizzling,並說出你一般什麼時候會用到它?- 我喜歡問這個問題因為這屬於較為深層次的語法。大多數人都沒有使用swizzling的需求(言外之意會用到swizzling的一般開發過一些核心的內容了)。而且通過開發者關於這個問題的回答,我還可以瞭解他們對複雜程式碼的執行有多大程度上的約束。一個人如果說他 swizzle所有的程式碼,那比那些說從來沒用過swizzle的人更可怕。(譯者注:瞭解更多 method swizzling )
假設有三個物件,一個父類的父類,一個父類和一個子類。父類的父類持有父類的引用(retain),父類持有子類的引用(retain),子類持有父類的引用(retain)。父類的父類釋放(release)父類,解釋下會發生什麼。 -——即使有ARC,我依然喜歡問一些記憶體相關的問題,這顯示了這個人有一定時間的開發經驗,而且明白核心的框架是如何運作的。
當一個空指標(nil pointer)呼叫了一個方法會發生什麼? ——瞭解處理基礎的Objective-C相關問題是很重要的,有好多次我都聽到了錯誤的回答,這很令我震驚。
為什麼retainCount絕對不能用在釋出的程式碼中?請給出兩個相對獨立的解釋 。—— 考察這個問題會有兩個好處:一是可以確定面試者目前確實沒有使用retainCount,並且看看他們是否知道為什麼他們不應該使用。
請說明一下你查詢或者解決記憶體洩露的處理過程。這個可以深入瞭解面試者對記憶體管理方面的知識,instruments的運用及其除錯的處理過程 。——有時候我會聽到一些可怕的回答:“註釋掉部分程式碼直到記憶體洩露問題被修復”。
解釋下自動回收池(autorelease pool)在程式執行時是如何運作的。 -——這型別的問題已經超出程式碼基礎了,一個程式設計師只有閱讀過一部分開發類書籍才能學到這些內容。這些問題也同樣能考察他對程式底層程式碼運作的瞭解程度。
當處理屬性申明的時候,原子(atomic)跟 非原子(non-atomic)屬性有什麼區別? -——好多人都不知道這個問題的答案,我又一次震驚了。很多人他們都是看別人是怎麼宣告的,他們就怎麼來宣告。類似這種的題目會暴漏出來很多問題。
在C語言中,你如何能用盡可能短的時間來倒轉一個字串? —— 我不大喜歡深入問計算機的核心內容, 但是通過這個問題可以讓我瞭解到他們是如何思考的,同樣也可以瞭解到他們的C語言背景。深入詢問時間複雜度(big O notation)也能讓我瞭解面試者的水平。
遍歷一個NSArray和一個NSSet,哪一個更快? ——另一個深入的提問。有時候一個類解決了問題並不能代表你就應該用這個類。
解釋程式碼簽名(code signing)是如何運作的。 —— 很多候選人都完全不瞭解程式碼簽名是如何運作的,然後抱怨說他們一直被一些程式碼簽名的一些問題所困擾。
Objective-C中的posing指的是什麼? —— Posing是一個Object-C的小眾語法特性。像 swizzling那個問題一樣,這個問題可以讓我瞭解面試者對語言的深入程度。
列舉標準Xcode版本中的6個工具。 —— 通過這個問題我可以大致的瞭解到面試者會在這些工具上花費多少時間。提示:至少得用10%的寫程式碼的時間來用這些工具。
copy跟retain有什麼區別? —— 最近好多開發者都開始用ARC了,記憶體方面的問題就更能反映出一個開發者的知識水平了。
frames跟bounds有哪些區別? -——我不會問很多介面相關 (GUI-type)的問題,我應該問的多一些,不過通過這個問題我差不多能瞭解到一個開發者做了多少介面工作。
執行如下的程式碼會發生什麼情況?
Ball *ball = [[[[Ball alloc] init] autorelease] autorelease];
另一個記憶體相關的問題,這個問題的答案不能單用會崩潰來回答,我想要知道為什麼崩潰,何時會崩潰。
列舉5個iOS app的狀態。 —— 幾乎沒有人能正確的回答出這個問題,通常我會給出一個例子,諸如後臺執行的狀態(background state),這樣他們就知道我在說的是那塊兒內容了。
你認為這次面試能很好的體現出來你作為開發者的能力麼? —— 一些人說可以測試的很好,但是有些人不這麼認為。我傾向於給面試者一些表達他們自己想法的機會。自信是非常重要的品質,而對應這個問題的回答也能很好的反應出一個人的自信程度。
我在提問這些問題的時候順帶會附加一些問題,類似“為什麼會發生這種狀況?”或者是“請解釋下你的解題思路”。技術性面試的關鍵取決於面試者對語言跟平臺方面瞭解的程度,這不僅僅包含技術的廣度,還有技術的深度。
實際編碼的面試
這是我們最重要的面試,這場面試可以直接反映出面試者是否可以勝任工作。我們將提供給面試者一個名為 The Dragon’s Test的app,目前已知這個app有很多問題。然後給面試者一個bug清單,根據面試者解決問題的能力和時間來評定面試者的等級。
我們公司給一些大的企業法人提供iOS開發服務,我們旨在用最快速的轉換模式來給客戶提供最可靠的結果。所以實際編碼的面試是有效評估面試者開發能力的重要面試, 因為它能讓我確定在公司盈利的前提下,應該支付給這個面試者多少薪水。對軟體面試本身來說,能找出快速解決問題的開發者就是最大的幸事。
在完成細節跟完成時間之間,有一個微妙的平衡點。如果有個人用1/3的時間完成了95%,另一個人用了更多的時間完成了100%的話,那我傾向於選擇前者。還有一個祕密可以告訴你,我們也是堅持通過這種實際編碼的測試來選擇員工主管的。
幸運的是(或者也可以說這是不幸的,取決於你是如何看待這個問題的),準備實際編碼的面試的最好的方式就是勤練習。你做的app越多,你越有可能更快的開發出更穩健的程式碼。所以要堅持練習和學習!
該何去何從?
總結一下:
請熟練掌握計算機語言的基礎知識,這樣可以讓你幫助你在面試中放鬆自己。在面試中,談論你要應聘的公司跟公司旗下的產品。始終保持面試答案簡明扼要、直奔主題。
在做編碼工作的時候,保持頭腦的快速運轉。你完成任務的速度會決定專案的成敗。如果你能更快速的編寫好優秀的程式碼,那你就更有價值,你更有價值,公司就更願意給你更多的薪水。
Ray 和我都希望你喜歡這個系列的文章!如果你喜歡看更多同類型的文章 - 比如說討論作為一個iOS開發者你要如何提升你的技能,怎樣找到iOS的工作,或者作為iOS開發者你應該期望自己拿多少薪水。如果你喜歡看到這些內容,請讓我們知道哦。
另外說一句,你知道我上面提出的那些iOS面試問題的答案麼?如果知道的話,加入我們的論壇討論組,對比下你的答案!