1. 程式人生 > >iOS面試之杭州網易

iOS面試之杭州網易

週三接到網易電話,說上次電話面試通過了,讓我週末過去杭州總部面試,於是週末就去了趟杭州。這篇文章是關於網易這次面試的相關內容和自己面試後的感想,寫出來和大家分享一下。

面試過程

3.4號接到網易的電話,說預約第二天下午三點進行電話面試,然後自己就開始準備自我介紹什麼的。這裡有個烏龍事件,之前投了份網易遊戲的實習生,原來以為是遊戲實習生的面試,幾天之後接到網易遊戲部的“雖然您很優秀…”的郵件,才知道原來遊戲是招至少碩士學歷的,這次電話面試並不是網易遊戲的面試(後來才想起是之前投的網易iOS開發工程師實習生的職位,真囧~~)。

下面是第二天電話面試的大致內容,記得不是很清楚了,我大致還原一下當時的情景。忽略一些客氣語,下面直接進入正題。

面試官(以下以Q代替):你學習iOS多長時間了?

我(下面以A代替):十個月的樣子。

Q:你瞭解MRC和ARC嗎?

A:對他們都有一定的瞭解,但用的更多的是ARC,當然也知道MRC的規則及用法,也有做過相關Demo,由於開始學習iOS的時候ARC已經成為一種趨勢,所以用的更多的是ARC。

Q:好的。你熟悉autorelease嗎?談談它和ARC的區別是什麼?

A:autorelease是將物件新增到NSAutoReleasePool裡面,然後在呼叫[pool drain]方法後,所有在釋放池裡面的物件均被release。而ARC看起來的效果是一樣的,但是實質是不一樣的,ARC是系統在適當時候來釋放一個物件的。

Q:嗯。你瞭解NSObject和NSObject Protocol嗎?他們有什麼區別,為什麼要有NSobject Protocol?

A:NSObject幾乎是iOS開發過程中所有類的根類,NSObject協議是為了方便一些並沒有繼承自NSObject的自定義類,來實現NSObject的一些方法,因為二者的方法大部分是一樣的。

Q:那你知道哪些類是不繼承自NSObject的?以及這樣做的原因是什麼?

A:據我目前見到的情況來看,貌似沒有,但肯定有這種類。至於這樣做的原因我不太清楚。(面試完後google了一下,大概瞭解了相關情況

Q:你瞭解執行時嗎?

A:瞭解一點點。

Q:嗯,沒事,那你說說你瞭解的。

A:執行時就是在執行時來進行判斷,比如內省。像respondeToXXX這些方法應該都是執行時才執行的。我知道的大概也就這麼多了。

Q:你用過哪些開源庫?

A:暑假做一個遊戲客戶端的時候用過CocoaAsyncSocket。

Q:你有仔細看過它的原始碼嗎?你認為它的哪些方面可以優化呢?

A:當時專案比較緊,所以直接拿過來就用了,就看了一些自己需要用到的方法的實現。優化的話,暫時還沒有想過。

Q:那如果你現在再去看這個開源庫的時候你覺得你會學到哪些東西?

A:這個庫是分TCP和UDP的,當時我們用的是TCP,這次如果再去看的話,應該對UDP也會有一定的瞭解和學習,同時也可以考慮一些可以優化的地方。

Q:對於其他的比較經典的關於網路方面的開源庫還用過哪些?

A:AFNetwork,ASIHttp。

Q:嗯,其他的開源庫呢?

A:用過那個在ios5,6下實現ios7扁平風格的控制元件的庫,其他的都不記得名字了。

Q:你瞭解越獄嗎?該怎麼判斷裝置是否越獄?

A:瞭解一點點。您說的是隻用程式碼判斷嗎?程式碼的話我不太清楚。(面試後google了一下,大致思想是檢測是否多出越獄的檔案目錄,網上現成的程式碼也有,隨便一搜就能搞定)

Q:瞭解copy和mutableCopy嗎?談談二者的區別

A:瞭解。copy只是指標的複製,屬於淺拷貝,mutableCopy是深拷貝。(之後他舉了個例子,忘記了,反正就是NSString和NSMutableString的一些東西。如果你有疑問,可以看看我之前的文章—>OC記憶體管理學習

Q:怎麼判斷一個類是否遵循某個協議?

A:可以用respondTo協議裡的某個方法來實現。

Q:還有沒有其他的方法呢?

A:其他的應該有但是我不知道。因為我最常用的就是上面的這個方法。

Q:假如我有一個物件不想實現系統預設的方法,我能夠做到嗎?

A:可以用分類(categrey)吧,(遲疑片刻後想想不對),應該不行。(面試之後,自己再想了下應該可以複寫其父類方法就行,不知道對不對)

Q:你用過GCD和NSOperation嗎?它們常用的場景是什麼?談談你的看法。

A:都用過。NSOperation是對GCD的封裝,屬於類級別的,GCD是底層的屬於C級別的。GCD的效率可能會更高,因為基本上全是執行block。

Q:你平時用哪種方式呢?

A:一般圖片載入用的是GCD,而其他下載任務用的是NSOperation。

Q:GCD能夠隨時停止嗎?NSOperation呢?如果能的話又是呼叫什麼方法呢?

A:GCD由於呼叫的是block,所以它一旦開始在執行完之前是不能停止或取消的。而Operation是可以的,通過KVO即可。當然如果要取消的話,我記得有個方法,名字貌似是close?(面完後查了下是cancel)

之後就是換了一個人,問了下我的相關情況和實習時間的安排,然後讓我等電話通知。

五天之後,接到電話,說讓我週六下午去杭州面試。然後問了下費用問題,是不報銷路費的,本來不打算去了,回來看看車費也不貴,於是想想覺得還是去吧。就算不過,也當長次經驗還可以順帶去西湖看看。

坐了一晚的火車,第二天到網易大廈,一進大廳感覺自己是土鱉進城(哎,沒見過世面)。下午一點到,在大廳等了45分鐘,就有人過來叫我去面試,沒想到這次還是技術面,本以為是HR面了。

進到玻璃間,面試官先問了我的一些情況,怎麼來的,來這之後住哪裡,看你精神不太好啊。我回“坐了通宵火車”等等。聽聲音感覺是和上一次電面的是同一個。

Q:上次面完之後你有什麼感想?面完之後有沒有寫blog什麼的。

A:感覺自己很多方面的知識很薄弱,有待提高,blog倒是還沒整理好,只是網上查了一下上次那些不知道的。

Q:那現在你對那些問題有了什麼新的認識?

A:然後我就說了一下我對於那些知識的一個總結。

Q:有沒有相關的專案經驗呢?

A:幫一個公司做過一個類似QQ遊戲大廳的客戶端。實現登入以及各個遊戲的線上人數顯示,主要是從安卓端到iOS端的移植。

Q:那你對安卓應該也有所瞭解吧,說說他們之間的區別?

A:。。。談了下自己的認識。

Q:除了這些,你自己平時有沒有做過小的東西來玩一玩?

A:我掏出iTouch,然後拿出幾個月前寫的計算器給他看,然後介紹了下這個計算器實現的功能。

Q:(把玩了一下)嗯,看起來還不錯,主要精力應該是花在瞭解析字串上吧,UI有點。。。

A:確實,幾乎都是字串的解析,然後通過用陣列來模擬棧進而實現括號的匹配。UI設計當時確實沒怎麼在意。(關於計算器,原始碼戳這裡

Q:這個好像是單機的,有沒有做過網路方面的?

A:有過,去年的時候加校內的iOS團隊,然後他們給我的任務是做一個RSS音樂播放器,主要實現XML的解析,然後下載,還有就是播放器的實現。

然後我也記不清還問了哪些問題,緊接著他拿出一張紙,說這裡有兩個題目,你看下。先做第一題。一看全是邏輯題,突然覺得自己智商不夠用。

1.你到了一個十字路口,不知道該往哪邊走。路口有兩個人,一人只說真話,一人只說假話,但不知道誰說真話,誰說假話。問:你如何才能只問其中一個人問題,就能知道該走哪條路。

2.你到了一個是字輪芤,不知道該往哪邊走。一條路通往真話村,一條通往假話村,真話村的人只講真話,假話村的人只講假話。這個時候你發現路口有一個人,很顯然他不是真話村就是假話村的村民,現在你如何只問他一個問題,就能知道那條路通往假話村。

看到第一題我想,這種題目應該是問其中一個人自帶矛盾的問題,然後通過回答的內容來得出答案。雖然點子是對的,但是就是不知道怎麼提問。這時候面試官在旁邊說,你可以把你的想法說出來,然後我就說了一些。。但是又被自己否定了。然後他就開始提示我,一步步把我往答案的方向帶,最後終於在他的點撥下得出了答案。第二題也是一樣的情況,只不過一開始他說,這個題目我不會再給你提示了。然後。。我又開始想,好幾分鐘後,他又開始提示了,這樣,又得出了答案。

最後他拿出一個演算法題出來讓我寫,大致就是數電裡面的摩根定理,比如NOT AND A,B轉化為NOT A OR NOT B這樣子。。我一開始說可以用棧來實現,但是仔細想想又不好確定,然後他又提示了,你看看二叉樹會不會比棧方便些。大致思路如下

    AND(not)             OR
     /  \       --->    /    \
    A    B             NOT   NOT
                        /     \
                       A       B
就是把前面有NOT的AND,將NOT作為它的tag,然後運算元分別作為其
左右孩子,這樣進一步轉化,將AND(not)轉換成OR,not下移,操
作數隨之移動。到最後,not均被移到底層,即可實現摩根定律。

然後就問我為什麼要從事iOS開發?這之後就問我實習時間,然後問我還有沒有什麼疑問,說結果到時候會通知我。之後就是”Say GoodBye”了。

一些感受

這次面試之後總結了一下,發現自己的基礎知識掌握的還不是很牢固,專案經驗匱乏。尤其是邏輯推理題,自己的思路還不是很清晰,有待於訓練。然後覺得很多面試,筆試有些片面,用這種演算法題來考。如果有大量時間的話,那些刷題的人對於這些問題豈不是分分鐘就解決了,工作後上手專案如果不能靈活運用是不是和當初的選拔目的相違背了。然後仔細想想,這也是沒辦法的辦法,只能通過這種方式來篩選。這裡僅僅是個人觀點,如果讓你覺得不爽請忽略。這兩次面試過程中自己都沒有緊張感產生,覺得不可思議,可能都是自己比較熟悉的東西,然後現場的氣氛也很好的緣故吧,希望這種狀態能延續下去。

最後,其實面試官人很好,很nice,在我回答不上的時候一直提示我。更重要的一點,此人有點像一初中同學,一見面就有種親切感。