天天看點

大廠經典高頻面試題體系化集合,專題解析前言

前言

最近有不少人問我這樣一個問題:「我剛接觸程式設計,準備學習下Android開發,但是擔心現在市場飽和了,Android開發的前景怎麼樣?」

想着可能有很多人都有這樣的擔心,于是就趕緊寫篇文章,來跟你們談下Android開發的前景到底怎麼樣?

面試官的問題:

(1)問:點選一個圖示到這個應用啟動的全過程(前面是項目經驗沒啥好說的)。

答:點選圖示後通過startActivity遠端調用到ams中,ams中将新啟動的activity以activityrecord的結構壓入activity棧中,并通過遠端binder回調到原程序,使得原程序進入pause狀态,原程序pause後通知ams我pause了。ams再根據棧中activity的啟動intent中的flag是否含有new_task的标簽判斷是否需要啟動新程序,啟動新程序通過startProcessXXX的函數。啟動新程序後通過反射調用ActivityThread的main函數,main函數中調用looper.prepar和lopper.loop啟動消息隊列循環機制。最後遠端告知ams我啟動了。ams回調handleLauncherAcitivyt加載activity。在handlerLauncherActivity中會通過反射調用Application的onCreate和activity的onCreate以及通過handleResumeActivity中反射調用activity的onresume。一個應用就此啟動。

(2)問:Retrofit原理。

答:主要是通過動态代理将接口直接轉換成代理對象。動态代理和靜态代理的差別,動态代理直接在虛拟機層面建構位元組碼對象。

(3)問:View自定義的流程,實作哪些方法。

答:1.實作OnMeasure,onlayout,onDraw. 繼續問“onMeasure中會用哪些方法?”(我覺得這題可能沒大好,我是想回答的詳細點的,結果還沒打到點他就說好,繼續下一題,不知道是認可了還是覺得我答的過于啰嗦,如果覺得太啰嗦可以提出來啊。。。) 我回答onMeasure 中傳入兩個int數值,這個數值32位,前2位表示模式,後30位表示寬度、高度。這是外表容器給内部view的限制。一種模式是容器給你多大的值,你就是多大的值(match_parent),第二種,容易給内部view多大的空間,内部view不用管,是多大就是多大。第三種,容器給子view多大的空間,和子view自己算出來的占用空間,選擇小的那個(wrap_content).說到這我正打算說onMeasure會調用measureChildwithmargin類的函數,他說好了,然後下一題.

(4)問:問我怎麼設計app的。

答:基本都用的mvc架構,曾經有個項目使用mvp。還有其它一些整體設計上的問題,很零碎,但都答的差不多。

(5)算法題,面試官的表述不是很清晰,是以開始沒了解他的意思,我歸納一下題目:有1,3,7三個面值的金錢,現在要取n元。怎麼取個數最少。(n是已知數) 意思就是 1a+3b+7*c=n 什麼情況(a+b+c)最小。當然這是我自己歸納出來的,他開始的描述讓我想哭。

答:開始腦子有點沒反應過來,把它當邏輯題做了,想了5分鐘後才反應過來,這是程式設計題啊。周遊呀。 a的取值範圍(0n)b的取值範圍(0n/3) c的取值範圍(0~n/7) 周遊取最小值。當然這種情況效率并不高,我當時也和面試官說了,沒太考慮效率,如果需要可以再改。感覺他也認可,思路對就行了。 其它一些零碎的問題沒印象了,主要就這些。

我們很多程式員都有一個大廠夢,但如何針對大廠進行面試準備,很多程式員就顯得手足無措了。本文就根據自己一些見解談談如何準備面試。

關于筆者: 阿裡巴巴 Android 用戶端開發工程獅一枚,喜歡技術、熱愛開源。

細節雜談

之是以是細節雜談,說實話,是因為真的不知道可以寫什麼,網上關于面試的文章很多,大概看了幾篇之後,更不知道寫什麼了。而根據自己的面試經驗來看,發現其實有很多細節,在面試的時候都沒有被好好重視起來。是以,這裡針對這些細節做個總結,也希望可以對你們有所幫助。

1. 準備一個良好的開場白

首先筆者了解的自我介紹的作用是緩解初次交談的尴尬以及過渡開場,然後才是擴充為對候選人的口才、邏輯以及表達能力的判斷。

如果你實在不知道怎麼說,即便是把你履歷上的姓名、年齡、愛好、工作經驗複述一遍,至少也是起到了暖場的作用。當然要是能基于此,表現出一定出彩的地方,那自然是再好不過,多花點心思準備是值得的。

PS:最近看到一個有趣的分享,唐僧每次介紹自己:貧僧唐三藏,從東土大唐而來,去往西天拜佛取經。其實這幾句話包涵了每人都要問自己的三個問題:我是誰?我從哪裡來?我要到哪裡去?

2. 謙虛是必要的,因為這是禮節

很大程度上,面試官還有一個身份就是以後可能要一起共事的同僚或者老闆,是以切忌不要表現的心高氣傲,尤其在電話面試中,很難在短時間就能了解一個人,你所表現出的态度就顯得非常重要,如果和面試官産生了争論,要注意談話技巧,可以在你的觀點前加上我了解的是什麼什麼…

就連牛頓說他不過是站到了巨人的肩膀上了,是以永遠不要覺得自己有多牛,真正牛的人隻會更謙虛。這裡手動,他是我很喜歡的一個 Android 開發同學。

3. 大招放的好,工作何愁找

嗯,标題起的挺押韻,容筆者小小的驕傲下 😃

筆者在面試中,有時候和候選人聊了很久,覺得候選人基礎知識紮實、項目經曆也能娓娓道來,但是就是沒有讓人眼前一亮的東西,而且往往連續出現好幾個類似的候選人之後,這種情況真的很難抉擇,對于面試官來說,幾個候選人表現的都差不多,你會發現…舉個不太恰當的比喻,食之無味,棄之可惜。

是以,如果你有個大招就顯得非常重要,讓你和其他的候選人差別開來,而對于面試官來說,也會更偏向于你,甚至可以直接鎖定勝局。

何謂大招,首先對于候選人來說,技術面試所涉及的深度和廣度是很難全部顧及的,加之每個面試官的問題又會多種多樣,是以與其擔心被問到自己不熟悉的領域,不如挑幾個自己的熟悉的技術點深挖下去,總結和形成自己的一套理論。

之前看到一句話說的很好,**面試的本質不是一問一答,而是亮點展示(放大招)。**是以要學會掌握面試的主動權,把話題盡量往自己擅長的地方引,當然陳述的時候記得一定要簡潔扼要。

筆者當時在準備阿裡面試的時候,就花了很多精力把 GitHub 一個優秀的開源架構,從設計模式、原理以及細節都琢磨了個透。

4. 算法題 — 知之為知之,不知為不知

面試中問到算法題,如果不知道就明确表示不知道,切記不要裝做知道,然後不知所雲的說了一大推,這樣反而會給面試官留下比較差的印象,面試評價上也會比較難看,很有可能也會影響你後續的面試。

不用擔心回答不知道,就感覺沒戲了。這裡一般有兩種情況:一種确實是對算法要求高的職位,那沒辦法了,隻能回去好好加強一下,來日再戰。還有一種情況主要是考察你的綜合能力,你其他方面的能力表現的非常好,可以彌補。不會有影響的。嗯,筆者當時就屬于第二種(強行炫耀)。

算法真的是筆者的一大弱項,之前每次面試被問到算法題的時候,我都很頭疼,不過後來索性想明白了,把更多時間放在自己所擅長的地方了。

5. GitHub — “不隻是全球最大的同性交友網站“

因為 GitHub 上的開源項目,筆者多次收到過 Facebook、Twitter、英偉達 (NVDIA) 的面試邀約郵件,盡管隻是一封郵件,但是對于筆者來說,自身的能力得到認可還是很開心的。

是以,如果你的 GitHub 首頁足夠漂亮,帶來的價值遠超出你的想象,尤其是對于一無學曆,二無大廠背景的同學來說,就顯得更重要了,一定要利用好這個平台去展示自己的能力。

6. 還有一些小細節

  • 履歷遵循 STAR 法則,内容才是王道。對于某些大廠來說,都會有自己的招聘系統,而你精心打造的酷炫履歷在導入到背景後,會變得面目全非。你的履歷樣式做的再好看也沒用,少在樣式上下功夫,多在内容上下功夫。
  • 聽到面試官的問題後,先不要急于回答,給自己幾秒的思考時間,多站在面試官的角度去思考這個問題應該怎麼答,比如當問到你覺得你最大的優勢是什麼?有些同學會直接回答熱愛技術……然後…然後就沒有了。這樣顯然毫無說服力,如果加上一句,經常浏覽國外優秀的技術部落格、在 GitHub 參與和貢獻自己的開源力量,是不是就好很多了。
  • **面試結束後,不要覺得不好意思,或者覺得沒有必要,對面試官說一聲:“謝謝,辛苦您了”。**就我個人經驗來說,畢竟大部分負責的面試官都會和你聊比較長的時間,也會盡可能挖掘你的技術亮點。結尾給面試官留個好印象,如果沒有通過,至少對你的面試評價上也不會太難看。

寫在最後

最後我想說:對于程式員來說,要學習的知識内容、技術有太多太多,要想不被環境淘汰就隻有不斷提升自己,從來都是我們去适應環境,而不是環境來适應我們!

這裡附上上述的技術體系圖相關的幾十套騰訊、頭條、阿裡、美團等公司2021年的面試題,把技術點整理成了視訊和PDF(實際上比預期多花了不少精力),包含知識脈絡 + 諸多細節,由于篇幅有限,這裡以圖檔的形式給大家展示一部分。

相信它會給大家帶來很多收獲:

大廠經典高頻面試題體系化集合,專題解析前言
大廠經典高頻面試題體系化集合,專題解析前言

上述【高清技術腦圖】以及【配套的架構技術PDF】可以點選下面連結免費擷取

Android學習PDF+架構視訊+面試文檔+源碼筆記

術PDF】可以點選下面連結免費擷取**

Android學習PDF+架構視訊+面試文檔+源碼筆記

當程式員容易,當一個優秀的程式員是需要不斷學習的,從初級程式員到進階程式員,從初級架構師到資深架構師,或者走向管理,從技術經理到技術總監,每個階段都需要掌握不同的能力。早早确定自己的職業方向,才能在工作和能力提升中甩開同齡人。