2021 面試心得
提筆已經是2022年1月1號,想了想還是準備寫一遍文章記錄一下,因為疫情的影響,可能很多小伙伴已經在自己公司待了至少2年以上吧,然后就是今天的一個跳槽高峰,從身邊朋友或者獵頭就能看出,除了金三銀四,金九銀十,感覺找工作的是從年頭到年尾,招聘的也是從年頭到年尾,Everyday~
今非昔比
還記得3年前跳槽,出去面試,基本上當天就有結果,要么過,要么不過,而現在真是各種拖延,也可能和跳槽的時間有關系, 我是9月份開始面試的,可能有些公司招人已經不是很著急了,所以建議看機會的大佬們,可以換個時間,我是深有體會??
面試時間變長,對于看機會的你來說,這將是一個很大的心理考驗,面試過的應該有同感吧!
此外還有一個比較重要的就是技術了,從boss上能看到,現在薪資很高,但是要求也很高,所以,想要入坑一個比較滿意的公司,那你的技術也要讓別人滿意,總結一句話:就是問的很深. 比如,我面阿里的螞蟻財富,因為我簡歷上寫了網絡協議相關的內容, 面試管就問,HTTP 1.0,HTTP2.0/HTTP3.0 一個接一個的問,可能有些公司只會問到HTTP1.0和HTTP2.0,然后就over了,后面再說具體面試題
準備
這次的跳槽我準備的時間確實很長,也與我自身平時的工作有關系吧,平時開發(fā)只做業(yè)務代碼開發(fā),沒有深入研究底層邏輯,具體準備的就是OC的底層原理,runtime,runLoop,多線程,鎖,性能優(yōu)化,離屏渲染,等等,這些,你可以看下小碼哥的課程,確實不錯,還有邏輯教育,不過邏輯教育的課程沒有接觸過深,只是試聽過幾節(jié),感覺還是有點東西,不過就是有的老師講課的方式,不好接受.除此之外,我還把swift重新溫習了一遍,這個還是必備的,因為Swift是一個趨勢,一些公司慢慢從OC轉到Swift,你可以從boss上看出來,比如得物就是純Swift,還有小紅書,最后也還是最重要的一部分就是算法,如果你想進大廠,那算法是必備的,我看的算法也是小碼哥的課程,講的確實很全面.
努力奮斗的五個月
如果自己有一個很強烈的想法,你想實現,那么對于平凡的我們來說,只有努力奮斗,沒有第二條路,除非,馬云爸爸是你家親戚(??),準備的幾個月基本上是每天早上做地鐵就是看自己準備的一些文檔,白天工作,中午休息的一個半小時,我會抽出來刷抖音的半小時,直接看視頻學習,然后晚上下班,那就是9點到11點,差不多每天晚上要花3小時,想想那一段時間,雖然很辛苦,但是確實也學習到了很多東西,也感謝媳婦對我的支持!
看視頻學習,其實這種高強度的大腦輸入,說真的,你可能很快就忘記了,那么怎么辦:
- 看第二遍
- 寫代碼,自己根據老師所講,進行源碼跟讀
- 自己總結,做筆記
很多東西,只是聽聽是不行的,一定要自己去寫代碼,還有應用,要想想在平時開發(fā)的過程中,能不能把這些底層知識也運用到.舉個栗子:在使用NStimer的時候,持有self會出現循環(huán)應用的情況,那么解決這個問題,可以使用NSTimer+block的形式做,還有另外一種方式是使用NSProxy,我在目前的項目中去搜索發(fā)現很多三方庫也是使用的NSProxy
對于Swift,有些公司除了問你OC的問題,也會問一些Swift的問題,所以Swift你也是必須掌握的,比如:訪問權限,面向協議拷沸,閉包十绑,函數式編程,結構體和類的區(qū)別這些,當然不會問這么簡單,還有可選型的本質?lazy是怎么實現的,泛型的本質?
對于算法,只是看視頻聽課,是不夠的,我面試下來,B站,阿里的,還有百度的,其實問的算法沒有我們想象的那么難,問的比較多的就是二叉樹,鏈表,排序,對于大廠的面試,就是給你一個和leetCode一樣的編輯文本,直接敲出來,另外還要說出時間復雜度和空間復雜度
對于網絡,確實面試過程中問的比較多,也是一些常見的問題,HTTP/HTTPS的原理,為什么進行3次握手,TCP/UDP的區(qū)別,使用場景,后面再詳細說
下面我把自己要準備的一些清單,分享一下,希望可以幫到你,當然這只是一部分
遇到的問題
對于面試,不同面試官,由于個人喜好,不同,所以問問題也不同,有的會問的很細,有的可能只要你答出來思路就可以了,下面我列舉一些比較有代表性的問題,上面說的面試問的很深,怎么理解呢? 比如得物,當時面試官問我一個關于RunLoop的問題:使用RunLoop如何監(jiān)測頁面發(fā)生卡頓?這個面試題的答案就是新創(chuàng)建一個線程,并將這個線程加到RunLoop中,然后在這個創(chuàng)建的線程中加一個Timer,每隔1秒進行監(jiān)測,設置一個變量隨著定時器遞增,同時在RunLoop的kCFRunLoopBeforeWaiting
和kCFRunLoopAfterWaiting
之間設置一個變量,然后將兩個變量進行比較,如果兩值的差值大于2秒,則說明有卡頓發(fā)生,具體代碼編寫,可以參考簡單監(jiān)測iOS卡頓
那么問題來了,你回答這些,面試官感覺還可以,然后會繼續(xù)問,如果監(jiān)聽到卡頓,怎么知道那地方有卡頓,堆棧信息怎么獲取呢?所有堆棧信息都可以獲取嗎?有沒有更好的獲取堆棧的方案? 一連三問,童靴們,你該有何感想?? 這就是我所說的面試深度,這個問題的答案可以參考下獲取任意線程調用棧的那些事,其實就是使用系統(tǒng)的backTrace_symbols
作為iOS開發(fā),對于鎖,應該都知道,包括互斥鎖, 自旋鎖,遞歸鎖,問的比較多的就是者的區(qū)別,以及在開發(fā)中使用到的鎖都是那些,NSLock是比較常用的,也是面試問的最多的,它是互斥鎖,是對mutex
普通鎖的封裝,那么問題來了,這些你都知道,是不是感覺準備的OK了,我想說的是我也這么覺得哈哈~,然而現實就會打臉,在我面試餓了嗎的時候,面試官對于鎖的最后一個問題就是,如果出現了死鎖,我們如何檢測,如果去解決呢? 苦笑過
在面試京東的時候,有一個問題是這樣的:iOS的內存是有不同區(qū)域組成的,那么對于一個全局變量,初始化和未初始化的時候,所在的是同一塊區(qū)域嗎?
分析下這個問題,在iOS中內存主要是分為五大區(qū)域的:棧區(qū)峻凫、堆區(qū)、靜態(tài)區(qū)、常量區(qū)、代碼段,然而你不知道的是:
- 未初始化的全局變量和靜態(tài)變量在BSS區(qū),即未初始化區(qū), .bss(Block Started by Symbol segment)
- 已初始化的全局變量和靜態(tài)變量, 在數據區(qū), 即初始化區(qū), .data
其他詳細的介紹,可以看下iOS內存管理-內存五大區(qū)
MultiThreading 多線程
我把多線程單獨拿出來說,那么它的重要性就不言而喻了,不管是移動端或者后臺,面試是必問的,因為在面試之前,我準備的其實時間挺長的,對于多線程的各種使用以及面試問題,我都是寫代碼實踐過的,感覺,只要是多線程的面試問題,我絕對OK,信心滿滿,然后現實很骨感~
有一個經典的多線程的總結,我在這放一下:
中通快遞面試官的一個問題:如何中斷一個線程? 其實這個問題,在平時開發(fā)中遇到的可能性不大,但可能業(yè)務需求,所有面試官才會問,那么如何作答呢?在OC中,是沒有直接中斷線程的方法可以調用的,如果用Swift,可以使用
DispatchWorkItem
,但是如果是使用URLSession進行的網絡請求,每個task都有cancel方法,直接cancel掉就可以,如果是耗時的計算類線程,需要在合適的地方加上flag,在cancel時把flag置為false,線程就能及時終止.你學廢了嗎???????
還有一個我印象比較深刻的就是小紅書的面試官問的問題:對于全局隊列,
dispatch_queue_global_t dispatch_get_global_queue(intptr_t identifier, uintptr_t flags);
這個全局隊列使用的時候,可以根據傳入的參數不同,來讓線程按照一個優(yōu)先級來執(zhí)行,面試官的問題是,如何使用全局隊列來創(chuàng)建一個有序的任務隊?
在dispatch_get_global_queue(intptr_t identifier, uintptr_t flags)
使用時,第一個參數是可以傳入不同的值,官方提供的幾個如下:
-
define DISPATCH_QUEUE_PRIORITY_HIGH 2
-
define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
-
define DISPATCH_QUEUE_PRIORITY_LOW (-2)
-
define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
傳入不同的值,所得到的線程執(zhí)行的順序是不同的,代碼如下:
- (void)_test
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"start task 1");
[NSThread sleepForTimeInterval:3];
NSLog(@"end task 1");
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSLog(@"start task 2");
[NSThread sleepForTimeInterval:3];
NSLog(@"end task 2");
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"start task 3");
[NSThread sleepForTimeInterval:3];
NSLog(@"end task 3");
});
NSLog(@">>>>>>>>>");
}
打印結果如下:
2022-01-02 11:51:11.734788+0800 Interview03-RunLoop[14921:446533] >>>>>>>>>
2022-01-02 11:51:11.734831+0800 Interview03-RunLoop[14921:446730] start task 1
2022-01-02 11:51:11.734852+0800 Interview03-RunLoop[14921:446729] start task 2
2022-01-02 11:51:11.734876+0800 Interview03-RunLoop[14921:446735] start task 3
2022-01-02 11:51:14.737209+0800 Interview03-RunLoop[14921:446729] end task 2
2022-01-02 11:51:14.737209+0800 Interview03-RunLoop[14921:446730] end task 1
2022-01-02 11:51:14.737220+0800 Interview03-RunLoop[14921:446735] end task 3
PS: 一定是有耗時的任務存在的呛踊,一定要3個任務都在同一個線程里面,否則就會有問題,路過的大佬,可以試試~
算法
今天最流行的詞就是"卷",算法的面試也是一樣,童鞋們,稍微有點規(guī)模的公司,多多少少都會問一些,大廠基本上是要求你手寫算法,或者給你一個編輯工具直接寫,對于一些小型公司,可能會問一些思路,我遇到的公司,分享一下:
B站
手寫算法,一共4面,寫了3個算法
- 合并兩個有序的鏈表
- 二叉樹翻轉
- 在數組中找出和為9的值(leetCode原題)
小紅書
手寫算法,因為我是現場面試的,如果是視頻,應該是遠程編輯
- 給一個4位數,寫一個算法,找出該數中是否包含4和7
大致是這個意思,我記不太清楚了
百度
手寫算法:
- 給一個ip地址,然后寫一個函數將ip作為字符串返回,并實現字符串轉回原來的ip(就是ip <=> string 之間相互轉換)
阿里本地生活
視頻面試,提供編輯代碼工具,自己寫代碼:
具體我記不清楚了,大致的意思是:
- 給你一個亂序的數組,然后將數組中的元素,按照小啦撮、大谭网、小、大的順序排序
上面是我印象比較深刻的,還有一些小公司會問一些排序的,就不多說了.
那么如何應對,我分享一下我的經驗,之前在沒有學習算法的時候感覺應該挺難的,其實,如果你去研究學習,花時間投入,一些面試常問的二叉樹,鏈表,排序,并沒有那么難,除非一些動態(tài)規(guī)劃的,如果你是年薪60W+的,可能會問,還有算法的難度還和你面試的部門有關系,看面試部門的要求,你是高級還是專家,或者架構師,要求都是不一樣的,考察的難度也是不一樣的,具體的情況要具體分析
如果你刷題多了,會發(fā)現很多題目是有套路的,比如排序的,或者鏈表,很大部分題可以使用雙指針或者多指針去做,還有一些"基本功" 就是一些基本的要求,你一定要在沒有參考的情況下,達到手寫代碼,比如,反轉二叉樹,前序遍歷,后序遍歷,層序遍歷,計算二叉樹的高度和寬度,求一個鏈表的倒數第k個節(jié)點等,這些東西你一定要胸有成竹,然后再去刷題,效果會更好~
還有一個最大的好處就是,你可能在面試的時候,會遇到原題或者比較類似的題目, 那豈不是一舉兩得~
在這推薦一個大佬的公眾號:labuladong,里面文章不錯,希望對你有所幫助~
如何面試
準備算法的時候,需要刷題,面試也是一樣,需要刷,但刷面試,是有套路的,那就是,你要先面試小公司,我有一個朋友,感覺面試小公司沒有意義,其實我感覺并不是,比如我,因為我之前準備的時候,是看了很多視頻,很多東西對于你的大腦來說都是輸入的過程,而面試,對于大腦來說,是輸出的過程,也是一個痛苦的過程,面試過的童鞋應該都深有體會!我記得我面試第一家是追書神器,一個小公司,他們那邊iOS團隊就3個人,但是那個面試官問的就很全面,基本上把我準備的都問了一遍,面試了1個小時,面試后的感覺是,我頭痛[捂臉],把所有的輸入轉化為輸入,這種感覺,你懂的~
一定要把你最想要的公司放在最后去面試,這樣你整個的面試狀態(tài)以及面試的心情是不一樣的,Good Luck To You!
大廠的要求
越是比較有名氣的公司,要求越高,高在哪里呢? 有可能簡歷都不過,如果簡歷過了,面試的每一輪,都有可能不過,我這次面試,機會也不少,讓我感觸最深的就是,越是大公司,面試官就越低調,而且人都很隨和,沒有一點架子,讓我印象最深的就是現場面試小紅書,當我等在面試會議室的時候,面試官進來,先給我握手,然后再讓我坐,還有B站的面試,面試法都很nice,會讓你感覺很好!
上面說好的一面,下面說不好的一面,那就是技術要求很高,在給你出的面試問題中,特別是一些死的東西,你一定要百分百的答對,如果能舉一反三最好,特別是一些大廠,比如阿里,京東,如果問你10個問題,你答對9個,那么不好意思,你這次面試還是失敗的,這就是大廠的要求,還有就是手寫代碼的能力,如果讓你手寫一段代碼,然后你可能不會寫,或者激動等其他原因,你給面試官說,可以說下思路嗎?基本面試官會答應,但是就算你說的再好,這次面試還是失敗的,因為面試官不知道你手寫代碼的能力, 現實就是這樣殘酷!
一個人的運氣
不知道是不是10月之后,企業(yè)是不是只做人才儲備,還是不著急,所有的面試安排,給人的感覺就是拖拉,再加上一些假期,時間就更長,然后還有中途停招的[捂臉],不光是我遇到過,我朋友也遇到多,面試都三輪了,說崗位沒有了,我遇到的是平安的,一面過了,然后HR給我打電話說,職位停招了,還有百度的,二面的郵件都發(fā)了,等到快面試的時候,給我說職位停招了,想哭的心都有,所以,在你沒有收到offer之前,一切都是未知,這次對我來說還有一個最大的遺憾就是被B站給拒了,去B站現場面試,從下午1點一直面試到晚上6點多,出去的時候,外面天都黑了,等我走的時候,第四個面試官還加我微信,讓我準備薪資證明,有圖為證:
B站的面試,最終還是沒有給offer??,當時我的心情是如此的奔潰~,但現在我雖然沒有去B站,目前還是在一個我感覺不錯的公司,這就是傳說中的上帝給你關了一扇門,然后給你開了一扇窗吧!
我說這些并不是讓你感覺到灰心,恰恰相反,希望路過的大佬,把握每一次機會,珍惜珍惜再珍惜,有些大廠沒有給offer,并不是你不優(yōu)秀,技術不行,心態(tài)要調整好~ 你是最棒滴~
本次面試對自己的影響和后期計劃
這次面試,其實對我影響挺大的,告訴了我,切莫要揮霍青春了,如果我早在一年前就開始做知識的儲備積累,早一些去學習研究各種算法,這次面試也不必花費這么長時間去準備,還有就是在開發(fā)中就要思考,實現業(yè)務功能或者遇到問題時,這個代碼的實現方式,底層是怎么實現的,原理是什么,有沒有更好的解法,其他的大佬遇到這個問題是怎么解決的,就如上面我說的多線程,如果你不自己去寫Demo,你永遠不知道還能這么玩,而且里面還有坑,大廠的大佬,也就是在日常開發(fā)中,多做了研究,總結,踩坑,思考~
只是幾個月的努力,其實遠遠不夠的,貴在平時吧~ 一起加油!
這次面試花費的時間挺長的,也感謝之前努力的自己,在此面試了阿里,B站,京東,得物,聲網,百度,合合(掃描全能王app),哈羅出行,小紅書等在文章末尾,我將自己的一些面試遇到的問題,整理了一份放在github上,有需要的請自取!寫作不易,還望各位大佬,點贊支持,哈哈~