一.拼多多
"備受爭議"的一家電商公司,發展很快,不過這不是我想說的重點,我想說的是,拼多多的兩位技術面試官很和藹(當然hr同學也很好了~),提出的問題很新穎,就拿Handler來說吧,大部分的公司都會直接問,說說你對訊息機制Handler的理解,拼多多的提問大概意思是:
1,讓你設計一個執行緒池,如果呼叫者在傳入的Runnable任務時,在run方法直接使用了Handler,會發生什麼?
2,1的問題還比較簡單,子執行緒不會預設給你一個looper,你需要呼叫prepar去建立,呼叫loop去開啟無限迴圈,這是一個正常的回答,問題又來了,面試官又問你,接下來又會發生什麼?
3,到這裡我相信會有一些同學暫時會"蒙"一下,心想,應該不會發生什麼了吧?2中已經提到loop是無限迴圈取訊息,如果到現在什麼都不做,這個執行緒會一直停留在run方法中,結束不了.到這裡還沒完。
4,知道IntentService嗎,它裡面也有一個Handler,它是如何結束執行呢,如果多次start這個IntentService,它又如何判斷什麼時候結束呢?
這系列問題都不難,但我想說的是答案並不重要,重要的是我們在學習的時候不但要多問為什麼,還要把各個知識點可以串聯起來,這個很重要,如果各個知識點都略知一二,都串不起來,說明沒有正真的理解。也體會不到學習的樂趣。
為了可以更加深刻的體會到"知識點串聯"的重要性,我這裡再舉一道題:
1,相信大家都被問過activity啟動流程,也被問過activity生命週期,也被問過ui繪製流程,當然也被問過在activity的oncreate方法中,為什麼獲取不到控制元件的寬高,如何才可以獲取,為什麼?
2,上面一口氣說了四道經典面試題,當然答案不重要,這裡我在追問一下:如果在onresume方法中可以獲取控制元件寬高嗎?在追問一下:ui繪製流程和activity生命週期有什麼關係,或者ui開始繪製的時機到底在什麼時候?
3,所以仔細想想,這些知識點都是有關係的,我們在複習的時候應該這樣去想,這樣才可以更加有效率的去學習,才可以更加快速的擺脫初級工程師的帽子。
這裡最後舉一道題,以結束拼多多面試給帶來的思考: 大家都知道子執行緒不能更新ui,我再追問一下,子執行緒真的不能更新ui嗎(答:是可以的,也不會報錯,當然答案不重要)
二.百度:
我心目中大廠中的大廠,正因為這樣也是我這麼多次面試中唯一緊張的一次,還好結果還很滿意。兩位面試官也給我提了很多建議,很感謝,這裡還是用一道現場面試題來表達我的思考吧。
你對網路請求做過哪些優化呢~
1, 對於我這種菜鳥來說,這道題真的很空洞,但是我不能就這樣簡單的回答,我不知道,我沒做過,網路這塊我只用了現成的框架,這樣回答肯定會掛的!
2, 我相信如果我是面試官,對面坐著一位工作經驗不足1年的同學,我也不期待他可以把這道題回答的很好,但我也不想聽到那麼簡單的我不知~
3, 所以,對於這道題而言,我首先回答了下okhttp中連結池複用,又簡單講了下對HttpDNS,IP直連的理解,以及對Http2.0多路複用,長連線的理解等等,當然我理解的非常淺,也當然答案並不重要,重要的是你面對一道不會的題目時,不要簡單的去說no,傾其所有,把你的想法和思路都列舉出來,不管對錯,讓面試官看到,你在思考~
當我簡單說完這些思路後,面試官又給我深入解釋了下,非常感謝~接下來我也會查盡資料去深入學習這塊知識,當然其他知識模組也都要慢慢去深入,去總結~
三.小米:
在去面試的路上,感覺小米總參好遠好偏僻,到了之後,環境還可以,不過接下來的面試就不是那麼順利了,這可能是我這次所有面試經歷中最糟糕的一次了…令人意外的是我居然還通過了面試,幸運~
小米這次面試經歷可能對我的影響最大,因為這次經歷算是重新整理了我一次認知(說是重新整理認知,可能誇大了些,但我找不到其他詞語來描述了,就這樣了),還是用一道現場面試題來:
依然答案並不重要,我記得我回答這道題目的時候有理有據,面試出來後,我總感覺哪不對,就又認真看了看原始碼,寫了個demo去驗證,果然我的回答大錯特錯,現在回想面試官聽我回答的時候是什麼想法,感覺好尷尬~
給我的啟示是,看原始碼的時候,要帶著問題去看,可能這個誰都知道吧,我就不著重提醒了。另外對我這樣初級程式設計師來說,看原始碼的時候不可避免的會去搜尋現有的文章幫助理解,這無可厚非,重要的是不要百分百依賴這些文章,我的意思不是說這些文章寫的不好,我可能更多的想要強調一個自主獨立性,因為你看原始碼時的思維模式可能和文章作者的不同,這樣可能就造成你一直在跟著作者走,沒有了自己的思考方向,因此也可能去忽視或者誤解其中某些知識點,造成我這次的尷尬~
還有看完原始碼後,如果可以,動手寫一個demo去驗證你所學到的知識就更好了,另外更加深層次的要求是,如果可以手動模仿寫一個大概的功能框架,相信會對其中實現的細節更加透徹,比如手寫Handler,手寫Retrofit等等。
四.網易:
對於網易,我的第一印象就是“豬廠”,自己養的豬一定很好吃,哈哈,可惜沒有吃過網易的食堂,一定很好吃^_^
網易的兩輪面試中沒有提問一個具體的知識點,這點有的意外,所以印象很深刻。
一面全程問的是我的專案經歷,重難點是什麼以及解決方案,在前面的“面試風格”那部分也提到過,感受也在前面說了,總結一句話就是:平時工作中一定要多積累專案中的重難點。雖然一面的最後也問了道演算法題,但很簡單,就不提了。
二面面試官我感覺是一名技術總監,因為全程問的是開放性問題,其中一個問題是:你如何看待flutter,flutter能否真正的普及。差不多是這個意思把。
五.頭條:
位元組跳動是我一直很嚮往的一家公司,創新、活力、強大、潛力,是目前為數不多可以挑戰bat地位的獨角獸。
在頭條的面試過程中,印象最深刻的一個問題是對MVC、MVP、MVVM的理解,以及MVVM的實現方式有哪些。雖然很多部落格也都介紹過三者的區別,以及MVVM的實現
我認為這道題目很重要,因為通過這道題目的考察,可以看出一名程式設計師是否在程式設計上有過自己的思考,而不是在工作中簡單的“搬磚”。
在Android架構設計中,大體上只有三種設計,元件化,外掛化,再加上MVVM(或mvp、mvc),如果再能夠熟練都應用各種設計模式,理解設計模式的六大原則,那麼你的程式碼寫的一定很漂亮。
同時由於頭條在面試中非常注重演算法,這段時間我也狠狠的總結了一下演算法相關的知識點。
陣列類、連結串列類、樹類,位運算類,大數處理,簡單的動態規劃,特殊的資料結構,如map,set
如果對演算法並不是那麼感興趣,僅僅想要應付面試而言,演算法其實並不可怕,大家都知道頭條可能是面試演算法最多的一家公司了吧,即使這樣,頭條演算法面試中的題目也都不難,無非是上面中的分類,陣列,連結串列,以及二叉樹的操作,最多加一些簡單的動態規劃題目~
例如中序遍歷二叉樹,使用非遞迴方式,就拿這道題而言,非常基本,也沒有難度,希望對演算法面試畏懼的同學提高信心,認真學習資料結構就可以了~(另外在補充一點,對於校招而言,因為有一個線上筆試環節,筆試中的演算法平均難度稍微高於面試中的~)
這裡我還想再囉嗦一點,因為對於演算法的準備大家大都不知到如何去複習,只知道一味的刷題,尤其是對於資料結構薄弱的夥伴來說,沒有目的的刷題並不能真正提高你的演算法能力,更多的是你的自我安慰,心理告訴自己在學演算法,然而並沒有效率。
首先一定先要認認真真學的資料結構,圖的那章如果不想看,對於演算法面試而言可以不去看,還過有精力的還是去看看,畢竟樹與圖之間還是有很多相似之處。
基礎不好的夥伴在刷題的時候一定要注意一下幾點:
- 開始時先按照型別去刷,諸如今天看陣列類演算法題,明天看連結串列類的等等
- 每刷一類題目時一定要去總結其中的知識點,將這類題目的特點,常用的方法,常考的方向一定要理解透徹,這樣才有效率,才會進步。
- 基本型別的題目都刷過一遍時,再回頭總結所有題目常用的思想
以上操作都應在資料結構學的比較牢固的基礎上進行才更有意義,所謂磨刀不誤砍柴功嘛
六.職業規劃:
“職業規劃”可能這四個字說的可能大了點,本質其實就是一個目標,包括你的當前目標,短期目標,長遠目標等等。同樣這也是面試中最常問到的一個問題,不管在技術面,還是在hr面都是有可能被問到的,並且概率很大,幾乎每家公司都會問,所以對於這個問題,我們必須有所思考和實際的規劃,不僅僅是為了應付面試,還關乎我們的未來,有了適合自己的方向,才能更有效率、更有動力的前進,畢竟我們都有夢想~
七.最後
我的面試經驗分享可能不會去羅列太多的具體題目,因為我依然認為面試經驗中最寶貴的不是那一個個具體的題目或者具體的答案,而是結束面試時,那一刻你的感受以及多天之後你的回味~