歡迎光臨
每天分享高質量文章

如何面試一名 iOS 開發

授權轉載自公眾號[後廠村路上]


背景


最近一段時間因為有小夥伴離職,需要補充新的同事,所以斷斷續續地面試了幾位同學。從應聘者的角色轉變成面試官,這種變換帶給了我一些新的體驗和思考。現在網路上有很多大牛都分享過如何面試iOS開發。實話實說,有些題目我自己也做不出來。當然了,大牛的面試題中很多都是平時開發應該掌握,問起來好像聽說過,但是實際又沒有深入研究的問題。比如OC語言中的Category,是否可以增加成員變數,是否可以增加屬性,可以的話原因是什麼,不可以的話原因又是什麼。我覺得很多人都只是知道個結論,內部的實現就不清楚了。其實這種問題屬於典型的送分題,因為只需要你有一個打破砂鍋問到底的鑽研勁兒,然後研究一下Category的C語言實現,一切就都明白了。可惜的是,我這段時間面試的幾位同學,別說到這一步了,就是錶面的結論都模稜兩可,無法給出一個確定的答案。


書歸正傳,今天的文章就來介紹一下我們團隊的面試標準,都著重於考查哪些方面的能力。


基礎知識


我比較看中的基礎知識包括兩方面,一方面是語言相關的,包括常見的記憶體管理、修飾符的使用和區別、多執行緒、事件的傳遞和響應鏈、應用的生命週期、Notification、Block、Delegate。這一塊基礎如果回答的不錯,就追問一些TableView的最佳化方案、Runtime相關、對Runloop的理解、OC與JS之間的互相呼叫和通訊方案、靜態庫的打包和整合、Crash日誌的收集和分析等等。我個人理解這些內容並沒有涉及高深複雜的東西,更多的是平時開發中的研究和總結。


另一方面,我比較關註計算機基礎,這其中包括計算機網路、作業系統、資料結構、編譯原理。註意我這裡列舉的都是我們大學本科階段學習的課程,本來就應該是掌握的。而且上面的順序也是根據我個人的經驗,按照工作中接觸的頻繁程式從高到低排序的。比如我並不會要求面試者精通編譯原理(如果真是這樣的大神,應該也不會來我們這邊面試,哈哈),但是計算機網路中HTTP/HTTPS,TCP/IP,DNS解析這些內容應該是熟練掌握的。我也不會讓面試者手寫快排或者堆排,或者問一些類似於 行程和執行緒有什麼區別 這種問題,並不是說這些問題不好,而是僅僅對面試這個事兒來說,這些東西完全可以在面試前上網查到,然後默寫幾十遍記在心裡,這種行為是我一直以來都非常鄙視的,所以我對這類問題完全摒棄,我們的問題都希望是盡可能的貼近實戰,貼近每天的開發場景,真真切切就是你加入團隊後遇到的問題,這樣更能看出面試者的能力。所以我更傾向於問一些有用的東西,比如OC中的方法呼叫涉及到Hash表的實現,在、圖片下載場景中的記憶體快取,記憶體中堆區和棧區的差別,多執行緒中序列和併發佇列,同步和非同步的方式差異等等。


這裡特別要提一下,之前閱讀過bestswifter大神的部落格文章,有一個問題我覺得說的特別好,他提到很多計算機的基礎知識,可能你平時不會也並不影響你的業務功能開發,但是它會影響你看問題的高度和深度。我們現在看到的很多大牛也並不是天生的,更多的是從無數次的問題排查中磨練和總結出來的,遇到了自己不懂不會的再回過頭去學習和研究。這就是為什麼有的同事一看問題現象,大致就能做出比較準確的定位判斷,這裡面固然有經驗積累的因素,但是很重要的一方面是他們的基礎足夠扎實。而同樣的問題你給其他沒有基礎的人,可能他們連線索在哪兒都不知道。


看到這裡的同學,沒事兒別看那些亂七八糟的快餐書了,趕緊把墊顯示器的那本《TCP/IP詳解》拿出來。


開發除錯能力


對於一個做開發的同學來說,具備很好的開發除錯能力是基本的素質,也是我個人最看重的一點。但是這個點在現有的面試流程中比較難考察,因為我們目前還沒有達到讓面試者現場寫程式碼的程度,而且我本人對這種方式也持有一些個人看法,畢竟大家都是面試過的人,在面試的過程中寫程式碼和平時寫程式碼,心態上是不一樣的,僅僅以這樣的方式就得出面試結論可能也有失公允。


那麼應該怎麼辦比較好呢,我調研了網上一些前輩的做法,比較贊同的是場景引導方案,也就是說在面試中我會提出一些開放性的場景,先丟擲去問題,然後引導面試者提供解決方案。比如以最常見的登入場景為例:


使用者輸入了使用者名稱和密碼,點選登入按鈕之後,客戶端發出請求,伺服器端接收請求傳迴響應,客戶端收到響應進行後續處理。


在這個過程中,有這麼幾個問題:


  • 使用者輸入的內容需要加密嗎?如果需要,選擇什麼樣的加密演演算法,金鑰是固定秘鑰還是隨機秘鑰,如何儲存或者傳輸的。如果不需要加密,原因是什麼。

  • 傳送和接收HTTP請求,是呼叫AFNetWorking或者其他第三方庫,還是自己實現。如果是AFNetWorking,是否有瞭解過其內部的實現機制。如果是自己實現,具體是如何設計的。

  • 這個HTTP請求的傳送方式是POST還是GET,原因是什麼,各自的優缺點是什麼。除了Method,HTTP請求是否還包含其他的資料或者資訊。

  • 伺服器端介面如果是HTTPS的話,是否需要設定證書校驗,客戶端需要做哪些配置修改,HTTPS與HTTP的差別在哪兒,跳過證書校驗的話應該怎麼做。

  • 如果這個場景是使用者點選H5活動頁面,但是要求登入完成之後回到原來的H5頁面,涉及到OC呼叫JS,這部分怎麼做。如果是需要跳轉其他的應用,又如何實現。

  • 如果業務層面有新的需求,要求登入按鈕的點選範圍太小想要擴大一些,如何實現,是否有更好更優的解決方案……


這樣的場景都是從我們團隊的工作中抽象出來的,只不過隱去了業務上的一些資訊,重點關註在技術層面的實現。如果面試者能夠很好的回答上面這些問題,我會認為他是有一定的技術積累和經驗的,不光是停留在這個功能我做完就結束了,而是對內部的實現有過自己的思考和學習。稍微差一點的,可能因為做過的專案都比較淺,但是能夠提出他的想法和方案,我們共同去探討交流,這說明對方具備學習的想法,即便說的不對也沒關係,我更看重對方的思路和表達。最差的就是第三種同學,要不就是非常基礎的東西說的都不對,其他東西是一問三不知,要不就是態度傲嬌,口頭禪一般是這個問題那不就是XXX嘛,各種不屑一顧,那我也只能在心裡呵呵了。


專案經歷


專案經歷重要麼,當然重要。從業務上說,iOS領域的開發有很多的細分領域,有的是做類似於快手抖音這種短影片的,所以對音影片這塊的要求會比較高。有的是做淘寶京東這一類電商的,就更關註應用能否快速靈活的支援活動運營,應用的質量和體驗能否得到有效的保障。有很多的公司在招聘時都比較看重專案經歷的相關性。從公司成本的角度考慮,招聘一個做過類似專案的同學,會更加容易上手,更快速融入開發團隊,甚至有的小公司本身就缺少這塊業務,直接釋出職位給獵頭和HR,定向從大公司挖人。而且好的專案經歷本身就是一張名片,確實是很重要的加分項。


從iOS開發的現狀來說,由於前幾年移動網際網路興起,大小公司全部開始轉型或者All in無線。所以單說專案經歷,那確實是各行各業無所不包,這幾次面試也真的是讓我見了世面。比如有一位同學的簡歷,光是專案經歷就寫滿了4頁A4紙,真的是“經驗”豐富,仔細一看,好像又是把第一年的經驗復用了4年。


所以面試的過程中,我們關註專案經歷,本質上是關註專案中遇到的技術問題和解決方案。面試者既然寫到了簡歷上,那麼肯定是他比較熟悉的專案。一般會先介紹一下專案的背景,自己在專案中負責的模組。然後聊一下簡歷上寫到的技術點,比如FMDB、網路最佳化等等,關註對方的技術方案實現。最後擴充套件一下相關的知識,這方面沒有固定標準,可以問的深入一些,比如涉及頁面卡頓最佳化,可以再聊一下RunLoop的相關內容。也可以問的廣一些,比如網路最佳化中是否瞭解DNS劫持,HTTPDNS,證書鏈等等。


溝通能力


溝通能力是貫穿在面試過程中的,最後我們會根據整體的面試表現得出結論。基本上從自我介紹開始,到中間的回答問題,重點關註能否表達順暢、思路清晰。


有的同學可能覺得這樣不太公平,明明自己的技術很好,只是因為面試的時候比較緊張,或者自身並不太善於表達,導致面試沒有透過。其實我個人建議,如果你是一個優秀的開發人員,覺得自己能力超群,不需要加入任何的團隊進行協作開發,那麼溝通能力差一些也不影響你的光輝。但是如果你過來參加面試,加入的是一個多人團隊,以後的工作中要和領導、同事等等各種人員打交道,那麼溝通能力就成為了很重要的一方面,甚至有些時候的重要程度是遠超你自身的技術水平。另一方面,我們終歸是技術面試,不是面試銷售或者運營,並不會要求面試者說的天花亂墜,所以儘量調整好心態,有條理有思路的闡述即可。這方面的技巧可以參考STAR原則,網上相關的資料一大堆,這裡就不多說了。


學習能力


學習能力是技術人員進步的原動力,尤其是現在的技術浪潮變化這麼快,如果沒有很好的學習能力,總是吃老本,很容易就會被更年輕的小同學拍死在沙灘上。


關於學習能力我會著重於兩個方面,一個是在實際解決問題的過程中,是否展現出了面試者的學習能力,比如在面試者遇到的問題超過了其當時的技術水平線,但是透過學習和研究成功的解決了問題,能清楚的知道自己學到了新的知識和技能,這個會比較加分。因為在平時的開發工作中,每天都在跟各種問題打交道,這其中有些問題是你從未碰到過的,解決問題的過程就是自身的技術水平上升的最佳實踐,如果最後能總結到自己的部落格或者分享出來就更好了,這比起你fork10個開源專案,寫10個小demo要強的多,因為是你親身體驗並解決的問題。


另一方面關註面試者的過往經歷是否反映出他的態度,對待工作,對待技術的一種態度。我很喜歡一類同學,可能因為工作年限太短或者基礎比較差,或者限於公司是個小作坊沒有正規的開發流程,自身的技術水平確實一般,但是他有對技術的好奇心和鑽研精神。遇到了問題,並不是去直接複製貼上,而是自己去認真思考,這樣做的原因是什麼, 有沒有其他更好的方案,會不會對現有的功能和以後的擴充套件造成影響。這些思考並不是無意義的,所有的努力都是在養成自己的技術思維,給自己的知識體系添磚加瓦。對於我們團隊來說,技術不好不可怕,學習的態度不好才是真的大黑洞。


面試禮貌


最後談一下麵試禮貌,從我參加工作到現在為止,參與面試過的同學差不多也有20個左右了,大部分的同學都是非常有禮貌的,不論面試成功與否,都可以有一個比較良好的溝通氛圍。因為我自己也參加了不少面試,也確實碰到過很多的奇葩,所以有一個好的面試禮貌,應該是雙方都有的基本素質。


作為應聘者,我覺得比較好的態度是不卑不亢。並不會因為我是來參加面試的,希望能順利透過這個面試而變得唯唯諾諾,過分的謙卑。這樣會讓面試官認為你對自己不夠自信,對自己的技術水平也不夠自信。另一方面,也不能表現出一副老子天下第一,你們都是渣渣的態度,這本身就對面試官不夠尊重,面試更多的是一個相互選擇,相互學習的過程,並不是邀請你來這裡華山論劍,來爭個技術的高低。


作為面試官,我覺得比較好的態度是友善和尊重,對技術比較弱的同學,即便你的問題對方沒有回答出來,也應該先考慮下對方的背景和經歷,只要不是基礎的,公共的,應知應會的東西,都不要輕易的Pass掉這個人,也許只是他做的方向和你不同,你更熟悉罷了。對技術比較強的同學,就更要關註他的訴求和個人感覺,我們的團隊能否滿足他技術上提升的空間,他的整體感覺和性格特點能否融入我們的團隊。


不管怎樣,我們都應該在友好、輕鬆、愉快的氛圍中進行面試,尊重自己,也尊重他人。


招合適的人


之所以要說這一點,是因為起初我過於看重了應聘者的技術能力,標準過於單一。後來與同事交流了之後,才明白麵試的目的並不是非要招一個技術大牛,而是招一個與這個崗位相匹配的合適人選。這讓我反思了一下自己之前的面試經歷,確實沒有從整個專案和團隊的角度去考慮問題。個人的力量再強,他也沒有三頭六臂,也不可能將我們的專案全都接過來自己乾。這就好比我們是團隊作戰,有的時候是士兵離開了,有的時候是排長離開了,所以為了保持戰鬥力我們需要補充人員進來,但是前提一定是搞清楚我們補充的是士兵還是軍官。如果我想要招的是士兵,那就應該看重單兵作戰素養,而不是要求豐富的戰鬥經驗。如果我想要招的是排長,那就應該看重實戰中的表現,能否帶領團隊完成任務。反之如果面試之前沒有想清楚,那就是埋下了一個隱患,即使招進來了這個人,也可能因為不合適而再次離開,造成公司和團隊的二次損失。


小結


一不小心就寫了這麼多,感謝能看到這裡的小夥伴。總結一下就是我們團隊在面試中,更看重基礎知識、開發除錯能力、專案經歷、溝通能力、學習能力這些元素,我們堅持的原則是招聘合適的人。其實技術上有很多的細節沒有再展開,比如一些開發除錯的工具使用,指令碼語言的使用等等。因為我自己也還是一個技術領域的小學生,深知行業內多的是藏龍臥虎的大牛,越是懂得多一些,就越是感覺自己懂得太少。所以這篇文章只是分享一些個人現階段的思考,如果能給大家帶來啟發和思考就更好了。不管我們處在哪一個階段,都要有一個好的態度,加上一份努力和一份堅持,相信付出總會有回報。


編號269,輸入編號直達本文

●輸入m獲取文章目錄

推薦↓↓↓

Web開發

更多推薦18個技術類微信公眾號

涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

贊(0)

分享創造快樂