iOS工程師:面試準備分享

接觸iOS開發半年內、以及考慮轉職的朋友,一些我希望能早點知道的資源。


2017轉職來到尾聲

部落格記錄著我從離職後,一路走過來的iOS學習資源和過程,來個結案報告囉!

去年五月離職,朝轉職為iOS App工程師前進,因為下班慢慢摸索進度太慢,決定All in。

當時我已經具備基礎網頁設計能力,如果單純以轉職工程師考量,就轉換難度來說,網頁工程師之於我門檻相對較低;考慮到實際就業環境,大部分公司和消費者對於網頁的使用需求大於App,自己使用時間佔比也是、所以就職缺數量來說,網頁工程師我想對新人相對友善。

基於上述兩點,我決定往iOS工程師前進,因為評估後覺得這條路對我來說比較難走。

我喜歡挑戰。

在離職八個月後,也就是2018年的1月,順利取得iOS工程師的offer。(後來變成APP產品相關企劃又是另個故事)

因為每次都必須搭台鐵轉高鐵到台北面試,面試過程又很耗神,所以每次只安排一間、總共只有面試個位數公司。


關於記錄這件事

我刻意從離職後就開始記錄,是因為常常讀到一些網友分享的成功案例,身為讀者的我們已經知道「結局」,回頭再看每個點好像就少了點什麼,感受更多的是水到渠成的喜悅感:

而在那不知道結局的當下,每個階段的他在做些什麼?好想知道過程中的發展、以及面對未知時記錄下的隻字片語,那會更加有臨場感。

我們都知道人生是在徬徨與不斷摸索中前進。

所以逐步寫下走過的歷程,在我不知道等著的「結局」是什麼前,紀錄著每個階段進展,試著把當下的自己透過文章盡可能保留下來。

這不會是什麼技術高招的開發者崛起之路,卻是一個相對「真實」的面對轉職過程:試著把我走過的路、分享給你。


早點準備會更好

接觸iOS開發半年內、以及考慮轉職的朋友,這三點是我當初沒注意到的,覺得早點意識到會更好。

  • 學習純程式碼刻畫面,雖然大多課程只教Storyboard
  • 找工作Objective-C頗重要,雖然全部課程都教Swift
  • 提早準備演算法考題,關乎面試成敗,雖然不懂也能做出應用

我離職進修的方式,就是在家看線上課程和書,自律學習。

那時很天真地想說有「上架作品」應該就可以開始找工作了,但是等到真正開始找,才發現「能寫出App」和「轉職為工程師」中間有蠻大鴻溝的,事情沒有我想的那麼簡單。

聽起來有點抽象嗎?

讓我舉個例子。

「能寫出App」就像是我們可以煮出些不錯的菜色,自己享用或是招待朋友是沒問題的;而「轉職為工程師」好比是要當專業廚師,需要照顧到更多環節,比如辦桌或是喜宴出菜的場合,整體人數、料理環境、食材管理都是更為複雜的。

前者就像是跟著食譜、或是美食料理節目,由專家一步步帶著完成預先設定好的目標;後者需要的是更硬底子內容,比如刀工、對於食材認知等,需要長時間的積累,面對更大的不確定性和找出適當解的能力。

我上架了兩款App後,依舊寫不出演算法的考題,兩個方向完全不同。

整個大~受~打~擊~∑( ̄□ ̄;)

讀者可以試著回想有沒有聽過Linked List?大O符號?Memory Leak?嘗試重現Filter函數?

或許沒有,但這無礙於我們跟著老師做出實際能操作的應用。

但在面試環節可能就有影響了。


用程式碼刻畫面

跟面試沒直接關係,但對於技術成長我覺得很有幫助。

Storyboard,是用類似簡報軟體的方式拖拉擺放元素的方式,直覺易懂、現在課程都是從這開始學。

對名詞困惑的讀者,請參考我以前的筆記:初探Xcode 8

在我學習幾個月後、首次放下Storyboard完成專案,有種完成里程碑的大大成就感。

推薦Lets Build That App 頻道,老師講解很清楚;可以先跟著影片練習看看。


教學影片有些隨著Swift語法更新舊了,需要額外花時間除錯。

建議在Lets Build That App 網站購買課程,老師會確保程式碼在當前的版本可以順利執行,專心把時間投注在學習,跟著架構出內容更複雜的應用。

從免費到收費,也是創作者把之前累積的大量教學經驗和回饋,再向上推高一個層次:更有系統的內容、更成熟的教學節奏。

課程會先從好理解但寫法比較長、或較多重複部分的方式入手,再逐漸重構成精要的版本,我很喜歡看老師重構的環節、覺得神奇。

我有買Kindle Basic Training、Intermediate Training Core Data、Instagram Firebase,如果只挑一個會選Instagram Firebase。

內容是應用範圍廣的CollectionView排版和Google的Firebase教學,處理基本的會員登入、雲端資料儲存與串接資料到畫面。



如果讀者還無法想像用Storyboard外的方法刻畫面,可以觀看下面這支影片,看老師示範用兩種方法的過程:


Swift與Objective-C語法

這幾年新課程「全部」都是教Swift,容易忽略掉OC的重要性,很後面我才補這個坑。

假設只是自己開發些應用,Swift就夠用了,但是在找工作時,OC是許多公司需要iOS工程師具備的技能。

兩者的關係我覺得可以用「手排車」和「自排車」比喻。

假設工程師是駕駛、OC是手排車,早期的公司必須買手排車讓工程師駕駛;而蘋果在2014年推出Swift這個新程式語言,像是自排車,讓操作的門檻更低,例如有針對孩童的程式教育遊戲。

因為較容易學習和使用的關係,現在大部分的人都是從自排車開始學,一般情況也就足夠。

但如果公司的專案稍有歷史,也就是已經買了很多手排車停著,有包袱、駕駛還是需要具備開手排車的技能。

所以從Swift入門後、回頭補OC的基礎;就像學完自排車、回頭學手排車,兩者適用同一個道路交通規則。

在我瀏覽職缺和面試的時候,多數公司是使用OC開發、新專案才比較有機會從頭用Swift寫;但就算新專案如此、舊專案還是需要維護的。

我能分享的部分偏Swift語法學習資源。

Amazon評價不錯的語法書,喜歡Swift那本教學風格,書中的練習範例我有寫在Github;簡體中文版,翻譯沒什麼問題。

關於語法,除了口頭的技術問答外,我也有在面試時寫過選擇題。

就是像考卷,每個題目都是一段程式碼,要選出這段程式碼最後執行的結果是哪個選項,記得選項好像是六選一或更多。

容易出錯的地方在以為可以成功執行,但程式碼放在編輯器其實是跑不起來的,有時候用看的看不太出來。

如果讀者沒有頭緒,可以想像在讀一段話時,雖然文字順序有顛倒或錯置,但不影響我們理解它的意思,我們還是看得出這段話想講什麼;但是如果丟到Google翻譯就翻不出來了,因為機器沒辦法腦補,需要規規矩矩的照文法次序輸入。類似這樣的感覺。


課程推薦Udemy的Learn Swift 4 with Bob,提到許多為什麼會有這個設計的思考方向,解釋得很詳盡。

最早會注意到是因為查資料常常翻到他的Medium:Bob the Developer

YouTube有他先前拍的影片,從播放清單點選,了解教學風格和口條再決定要不要購買。


演算法這個大坑

工程師的面試,就從技術測驗開始。

我有經歷過遠端共享螢幕測驗、Codility網站測驗、以及用筆在計算紙上寫程式碼的演算法測驗環節;有些公司則不考演算法。

從開始的超級不習慣,到多面試幾次後的還是不習慣但撐得下去,有整個炸掉的、也有因為炸掉很多次後寫得順手成功過關的,長了不少見識。

原來技術崗位的面試這麼硬(;゚д゚)

因為這個要花很長的時間準備,就像前面提到的,都要開始找工作我才發現面試要刷題,也是希望能早點意識到的事情。

傳說中的白板考題倒是沒有實際遇上。


《寫程式前就該懂的演算法》《演算法圖鑑》都是適合入門的選擇,前者我有寫過閱讀心得、後者推薦下載Algorithms App來玩,透過視覺化學習。


課程推薦Udemy的HWS Swift Coding Challenges,是Swift Coding Challenges電子書書的講解版,我兩個都有買,內容相同、擇一即可。

推薦原因很單純,我需要找「演算法題目+Swift解法」的組合,這個方案完全滿足。

可以替演算法解題開始暖暖身。

要注意的是,有些解法取巧,雖然可以解出答案、但過程不一定可以滿足面試者需求。

寫過一行秒殺解法,但是面試官要知道的是解題思路,請我換個方式解答,我就爆炸了。


在對於演算法有稍微的概念後,就可以開始進入LeetCode的世界了。

可以參考先前分享的什麼是LeetCode?

因為沒有答案,需要靠搜尋網友的分享,才會先建議前面那個有答案的資源先推個進度。

這個,難、很、多。

有些搜尋後的答案擺在眼前都要花時間參透。

「a + b = (a ^ b) + (a & b « 1)」

…(;´༎ຶД༎ຶ`)??

建議寫個十題左右感受一下。

有些雖然可以解出答案,但是運算速度太慢無法被系統接受、還有些數字上限的小坑,平常也不太會留意到。

部分題目蠻吃背景知識,會用到比較少見的方法去思考解法,例如「不使用加減號,完成兩個數字求和」

所以前面有提到,就算上架過作品、沒特別準備還是寫不出來的(°ཀ°)


在跟面試官聊天過程中,也有聽到比較難的LeetCode題目可以馬上解出來、但是簡單題目反而卡住的面試者,就有點小小尷尬。

這邊面試用意主要是看解題的想法,倒不是需要寫出完美到能放在編輯器一次就順利通過的成品。像我遇到在計算紙寫程式碼解題時,也是跟面試官溝通大致的解題方向,以及會怎麼處理,概略地描述,有缺漏的地方面試官會再追問。

如果讀者看到這邊有點難代入,就想像題目是問我們要搭捷運去某間餐廳,回答時候例如從忠孝復興幾號出口出站、出站後要走哪一條路、接著看到便利商店轉彎、直直走就到了;這是概略的描述,聽的人會知道能不能抵達目標、有沒有歪掉。

而編輯器執行需要的是精確描述,比如出站後走200公尺右轉、再向前走800公尺抵達目的地。

網路搜尋會看到重點放在和面試官的「溝通」,例如詢問題目細節、一些比較模糊的地方先釐清。

嗯,雖然講是這麼講…我也先查過。

但我第一次共享螢幕寫程式碼,緊張到近乎全程無聲、連基本語法都寫錯,意識到「要講點話啊」發出的聲音還抖抖的,後來多面試幾次後才比較可以冷靜下來。

要注意的是考試是在編輯器以外的環境測驗,例如Google Docs,所以不能依賴原來Xcode的錯誤提示。

如果讀者不知道Xcode是什麼,他是類似檢查文法的工具,像我們寫英文時單字拼錯或是文法有問題,編輯器會跳出警告,而考試時則像是在筆記本作答,沒有這些提示的輔助功能。


購買的Udemy課程

我幾乎把常見的iOS學習資源都買來翻過、再從中挑選出適合自己的細讀。

每個人程度和背景都大不相同,比較過才知道哪些對現階段的自己有幫助。

如果是比較資深的工程師大大翻到這篇,也可以看看有沒有感興趣的主題,像是用Swift學習區塊鏈等。


購買的電子書

ObjC中國出版的Swift進階,就我看得懂的部分蠻有收穫、推薦,其他進階部分離我有點遠;電子書有後續更新。

大部分都是查資料的工具書。


購買的部分書籍

主要是這幾本,後來新出的書就沒有特別翻了;照片切掉是還沒看完的。

中間《iOS11 App程式設計實戰心法》蠻推的,每年更新;《漫畫!圖解程式設計必學基礎》是本有趣的漫畫書,跟iOS開發沒太大的關係,介紹些程式基礎概念。

裡面iOS書只有一本是ObjcC,就像前面提到新出的書都是基於Swift;所以如果是求職導向,建議比重也分配一下。

關於面試準備,知名的有《Cracking the Coding Interview》、還有知乎看到的《劍指offer》;前者我沒翻過、後者買回來發現是用C++解題,稍微瀏覽覺得比我程度高太多就默默收起來。


結語

希望這些資源能幫助到你。

這篇文章讀完,可能會讓讀者高估我的技術能力。

我也就大約一年左右的經驗,而且還是看課程自己摸索、不是在真正的公司實戰;從我上架的作品來說,也是我從教學資源為基礎,再接著延伸擴展;許多書也就翻翻覺得暫時用不到就收著。

願意購買這麼多資源,為的是讓我短時間打開眼界、以及快速找到經過篩選的內容、並且在一本書看不懂時試著讀讀其他作者的解釋。

對有興趣的範例,就一個一個字跟著敲出來,沒有什麼特別的、只是需要點耐心和時間;每個開發者都是這樣走過來的,只是我把過程留下紀錄。

沒有專業是可以速成的。

還有很多想說的話,但是最後只提一個點就好:在大部分的人生轉折點上,我們都是被選擇的角色。

像是工作求職是被老闆選、參加比賽由評審決定名次、選秀節目由導師決定誰能留下來;我們能做的就是站到那個候選位置,僅此而已。

老闆也好、評審也好、製作單位也好,他們總會經過層層篩選,挑到能滿足需求的人。

就像先前摘要的《一個月就辭職:一個北大女生的求職悲歡》這篇提到:

世界很大,我們很渺小。

一家公司選擇不要我,淘汰了我,能有什麼損失呢?它招到的其他人難道不優秀嗎?難道會不能勝任嗎? 好像並不會有任何損失。

我不是世界的中心,世界也並沒有苛待我。

我的失敗正如同每個人的失敗,是一件雖然不幸,但又再正常不過、完全有可能發生的事情。


沒有路會白走。

就像我這次面試工程師,也有幾間公司問我對產品相關職缺有沒有興趣。

無論結局如何,都能走到更寬廣的世界。

祝福所有讀者。


過往足跡