天天看點

再見深圳,你好杭州(送阿裡P7面經一份!)

我這篇文章并不是簡單的描述一些面試中的真題,或者總結一些Android的知識,而是一個普通人經曆過各種面試後的一個總結與反思。對技術面試這回事有一些體會,在此分享。(從我的角度,當然肯定有不合理的地方,大家借鑒就好)。

從兩個月前開始面試,先後面試了騰訊、抖音、美團等,最後隻拿到了阿裡釘釘一個offer;坦白說,我對我個人在這次求職中的表現并不十分滿意,面試前沒有做足夠充分的準備——數次被面試官出的題目“虐”、應對面試的壓力時沒能做到沉着冷靜、在面試中未能完整地把自己的積累與優勢表現出來……是以本篇文章并不能完全算一個“成功者”的經驗分享!

一、面試前的準備

1.1 履歷

履歷的重要性就不言而喻了,怎麼樣寫好履歷是個技術活,當然如果你有很好的背景(學校或者公司),那麼不管你怎麼寫,基本上都不刷掉你,我們作為一般的人還是需要下一番功夫的。拿我的履歷作為例子,大概有以下幾個部分:

  1. 個人資訊:姓名、出生日期、教育背景、部落格位址、github位址、聯系方式(手機、郵箱和微信号)
  2. 工作經曆:畢業後待過哪些公司,一般是倒序,項目盡量精簡明了,可以參考 SMART原則
  3. 專業技能:自己熟悉的一些技能,這個為什麼我寫到最後,因為對于工作三年的同學來說,面試官更加注重的是你的項目經曆,大部分面試都是看你的項目經曆來提問。
怎樣寫履歷

,這個開源網站不錯,教你怎麼寫履歷,而且有一個線上markdown線上網站,可以導出pdf。

另外,我個人在寫履歷時有一個還未做到的點是及時更新履歷。對于幾年前的項目早就記憶模糊了,幾年後再嘗試回憶項目細節寫進履歷其實很難。是以最佳方案是項目結束後及時把收獲更新進履歷裡。

1.2 基礎複習

對于基礎複習我這次最大的感觸就是,一定要早點做準備同時也要做全面完整的準備。

舉個例子, Java 中非常基礎的的四大引用。對 Android 開發來說平時可能用弱引用比較多,但真正作為面試題來問時面試官希望你能馬上回答出四大引用分别是什麼以及各自的使用場景。假如你能馬上回答出四大引用的特點及使用場景當然是合格的回答,假如你不止回答出四大引用的特點還能聯系到 ReferenceQueue,繼而延伸到在 leakcanary 的使用,那就是優秀的回答了 —— 但假如你被提問後一臉懵逼,說自己隻記得弱引用,就會比較尬(當然就這個知識點而言,我作為面試官的角色時還會嘗試“搶救一下”,由弱引用的使用延伸到記憶體洩露去,不會直接判定應聘者)。

因為在“面試”這個場景裡,面試官會預設你做了足夠的準備,對于一些中高端職位基礎題其實是作為送分題問的,當然希望你能快速反應、快速回答。而人不是機器,許久沒用或者沒複習的技術點想要在短時間内回憶起來并歸納成 N 個點說出來難度非常大。 是以基礎技術的面試其實就跟應試一樣,任你功力再高,也有必要好好複習一下。畢竟“武功再高,也怕菜刀”嘛(不恰當的比喻,哈哈)。

基礎複習可以分為兩大塊,一塊是 Android 和 Java 基礎,另一塊是計算機基礎,也就是算法、計算機網絡、計算機原理等。對于前一塊,經驗豐富的你一般花半個月就可以搞定;但對于後一塊,時間上就不好估計了(網上有非常完整的各種面經和題庫,聰明的你肯定具備最基本的資訊檢索能力,這裡我就不貼連結了)。

這裡我把我自己作為反面教材:由于前期對是否要跳槽猶豫不決,是以沒能早點進行充分的準備,導緻後面碰壁後需要在短期内急急忙忙去複習,其中的壓力可想而知。

個人認為比較舒服的姿勢是,不管跳槽與否,一些基礎的東西在平時就可以有計劃地複習,特别是刷算法題 —— 任你算法功力再高,沒有經過一定的訓練想要在面試這種場景下快速手寫出 bug free 的代碼也幾乎不可能。

1.3 項目複習

社招跟校招的一大差别是,社招中的基礎題部分隻是前菜,招聘方會非常重視你的項目經曆,通過詢問項目經曆會擴充到對技術、學習能力、溝通能力等的考察。

關于如何複習項目,從面試情況看,可以從總體架構、項目細節、項目亮點、碰到的問題以及場景複述等方面入手。

總體架構和項目細節不用過多解釋,前者是從宏觀角度向對方介紹你的項目的架構,用最短的時間讓對方了解項目通過哪些子產品或元件間的協作去實作功能的;後者是對方可能會提出一些感興趣的點詢問你項目細節 —— 是以千萬記得認真掌握項目關鍵細節,否則答不出來會很尴尬。

項目亮點和難題則是面試必備,基本大部分面試都會問到這塊,無他,對方不了解你的項目的情況下肯定希望你能展示出可以為自己加分的點。

1.4 履歷投遞

準備得差不多後就可以開始進入履歷投遞環節了,我覺得履歷投遞的途徑的優先級是這樣的:熟人内推 > 優秀獵頭推薦 > 普通網友内推 > 普通獵頭推薦 > 官網投遞。

假如你的履歷光芒閃閃,阿裡星那種級别,那随便投遞都可以很快有響應,否則投遞的途徑還是很重要的。

熟人内推當然是第一選擇,通過熟人你不止可以知道部門内部的業務發展、晉升、加班等情況,在走流程時也可以通過他直接接觸到你的未來 leader。而為什麼優秀獵頭的内推會比普通網友内推要好呢?我個人的感受是優秀獵頭會比普通網友更了解招聘情況且能更積極得幫你催流程,而真正優秀的獵頭,在對公司整體資訊的掌握上是高于普通員工的。

二、面試中常見的考察方向

面試中要沉着冷靜、面試前要确認面試時間并提前到……這些啰嗦的小 Tip 我就不說了,聰明的你一定能注意。這裡我嘗試總結一下碰到過的常見的考察方向(或者說“題型”)。

2.1 算法

對于算法的考察,從個人有限的經驗上看,貌似難度都是适中的。特别是對于我們用戶端開發而言,考察的算法都比較正常。(呃,某些很注重這塊的公司除外 —— 當然注重這塊也是好事,我們隻能去适應公司的風格而不能要求公司适應我們)

算法這塊我也是“低手”(這塊強的同學可以留言教授一下比較好的學習方案),多學習多練習吧。

這次求職中,比較高頻的題目是"第 TopK 大的數"(快排思想、能提到線性查找算法 BFPAT 更佳) 和 “前 TopN 個數” (堆排序、先分治再堆排序)。

2.2 技術基礎

就像面試前我們準備的,基礎題基本是必問的,就算不深究 Android 的基礎,問你一些計算機網絡的東西不為過吧。這塊我們必須拿出校招時的勁頭來,老老實實複習。至于具體的題目什麼的我就不羅列了,網上有一堆面經,github 上也有很多整理好的題庫。

對 Android 開發來說,可以分成兩塊,第一塊是 Android 相關基礎。跟初級開發的面試不同的是,這裡的基礎不會是簡單的“四大元件是哪些”,而是會問你具體的使用和碰到的問題。比如四大元件的考察會結合 ANR(四大元件是否都會産生 ANR、時間是多少等)、程序優先級、啟動模式 等等一起問。網上的面經和題庫命中機率還是蠻高的,大部分題目都似曾相識,畢竟 Android 常用知識點也就這些。當然不要是以掉以輕心,優秀的面試官是會針對細節深入挖掘的,是以不止要“知道”,還要“了解和掌握”。

另一塊是計算機網絡、計算機原理等。對用戶端開發來說,計算機網絡的考察會比較多,TCP 和 UDP 的差別、TCP 的擁塞控制、TCP 的握手與揮手流程、HTTP 與 HTTPS 的差别等等。基本面的所有公司都問到這塊了。

這塊需要特别注意的點就是你的覆寫面是否足夠,因為不同公司的不同部門的不同面試官都可能會有不同的提問姿勢。你不完整系統得把基礎過一遍,真不能保證你能信心十足(一兩個問題被問倒其實沒什麼,但能不被問倒更好不是)。

我可以舉幾個例子,比如在問大圖加載時順口問一下“同一個檔案,放到 drawable 目錄下和放到 SD 卡中,加載到記憶體時記憶體占用一樣麼” (這裡涉及到了 Bitmap decode 時的過程以及 Bitmap 記憶體占用的計算),比如 HashMap put 方法調用時内部的流程是怎樣(方法内部的流程、HashMap 的擴容等),比如 Http 1.1 和 2.0 的特點和差別 —— 這些例子都是我或者我朋友真實碰到的面試題,在沒經過充分的面試準備之前,你能答出多少呢?

2.3 技術原理

一般這類問題是在問基礎題時順勢往底層問,或者是你自己在回答時順便帶出來,比如螢幕繪制原理、幾種動畫的原理、布局加載原理等等,是展現個人的技術深度的。

我覺得這類題目不是死記硬背可以解決的,作為面試官,自然有辦法考察出你是“了解”還是“了解”。

其實系統地複習這些内容本身也是挺有趣的,你會很容易發現技術背後的實作存在深層的聯系。是以這塊不隻是面試題那麼簡單,它也是我們以後往“資深開發者”走的一個方向。

回答這類問題,主動比被動更好。一般面試官問你很基礎的問題時,你當然可以惜字如金隻回答對應的答案,但假如你能主動擴充到原理層面、甚至隐晦地表示你看過源碼,要我是面試官也會喜歡你(斜眼笑)。

2.4 項目介紹

我一開始也沒有經驗,面愛奇藝時讓我介紹項目我就簡單介紹了下項目需求是怎樣,可以看出面試官并不滿意。後面專門向一個牛逼的前同僚請教了這個,他的建議是注意項目細節準備,保持自信!後面面其他家時,果然感覺輕松了一些。

2.4.1 在面試前準備項目描述,别害怕,因為面試官什麼都不知道

面試官拿到我們的履歷的時候,是沒法核實你的項目細節的(一般公司會到錄用後,用背景調查的方式來核實)。更何況,我們做的項目是以月為機關算的,而面試官最多用30分鐘來從我們的履歷上了解項目經驗,我們對項目的熟悉程度要遠遠超過面試官,是以大可不用緊張。如果我們的工作經驗比面試官還豐富的話,甚至還可以控制整個面試流程。

既然面試官無法了解我們的底細,那麼他們怎麼來驗證我們的項目經驗和技術?下面總結了一些常用的提問方式。

2.4.2準備項目的各種細節,一旦被問倒了,就說明我們沒做過

一般來說,在面試前,大家應當準備項目描述的說辭,自信些,因為這部分我們自己說了算,流利些,因為我們在經過充分準備後,可以知道自己要說些什麼。而且這些是基于我們實際的項目經驗,那麼一旦讓面試官感覺我們都說不上來,那麼可信度就很低了。

不少人是拘泥于“項目裡做了什麼業務,以及代碼實作的細節”,這就相當于把後續提問權直接交給面試官。下表列出了一些不好的回答方式。

在避免上述不好的回答的同時,大家可以按下表所給出的要素準備項目介紹。

面試前,我們一定要準備,一定要有自信,但也要避免如下的一些情況。

三、阿裡釘釘面經(已拿offer)

阿裡釘釘一面(面試時長80min)

1.自我介紹,對自己項目的介紹,架構圖呈現

2.因為說自己以後的發展方向是音視訊,是以問了我用過哪些現有架構

3.項目中的一些優化問題,MVC -> MVP,Handler的記憶體洩漏情況分析等,對MVP和MVVM的了解。

4.項目中的第三方庫選擇的問題,因為履歷中寫了我對第三方庫選擇的問題,比如選ObjectBox和greenDao的問題,圖檔加載架構問題

5.HashMap和HashTable,引申ConCurrentHashmap的深入,version1.7和1,8的差別,以及高并發下HashMap發生的問題

四大啟動模式,以及場景對應

6.Handler的機制介紹,不存在消息時的IdleHandler的運作機制,為什麼不能在子線程初始化問題

7.設計模式中的單例介紹,使用場景(Okhttp的Seesion存儲等等),線上編寫

快排算法

8.OkHttp的源碼分析,及整體架構的流程圖繪制

9.四大元件的完整介紹,及深入,答了IntentService、LocalBroadcast

10.四大引用的問題和MVP架構相結合進行回答

11.網絡中的響應碼對大體進行回答,具體回答了200、404、500、304等

12.View繪制流程問題,如何不使用xml,來實作中間位置的定位

13.事件分發機制流程講解,以及如何實作單擊事件和長按事件的判定

14.關于為什麼選用mqtt協定的問題,優勢,原理等等(沒答上來,隻說針對性做過測壓,以及oceanlink和mqtt的對比)

阿裡釘釘二面(面試時長30min)

1.自我介紹,優缺點的,以及未來希望的發展方向

2.目整體介紹,如何做到分壓啊之類的問題

3.如果給我阿裡、騰訊、頭條、谷歌的offer的一個選擇(不摻雜地域性的問題),首先直接否定了google我就的一個企業的商業模式進行分析。

我對釘釘這個産品的了解,我的回答是就的是釘釘前身的對标項目微信,已經後期轉型的商業模式作出的分析,最後給出的我的結論是一個企業性質的辦公軟體

4.給出了釘釘一個mac平台的關于共享螢幕的耗CPU的問題

5.讓我提問,提的是關于音視訊發展方向的問題,具體是一個發展空間。

阿裡釘釘三面(面試時長60min)

1.自我介紹呗,還是一樣,項目介紹,項目的優缺點對比

2.對MVC和MVP的了解,還有Handler的記憶體洩漏問題具體是什麼,解決方案知道有什麼,空資料的時候Handler的阻塞問題,但是我還是沒在Looper的源碼中找到,這裡讓我好好再看一下。

3.另外為什麼使用MVP,他的優勢是什麼,記憶體洩漏是什麼樣的。

4.http的長連接配接和短連接配接這兩個概念,怎麼去了解。我把它了解為持久化連接配接是什麼,然後對http的3個版本的主要差別做一個介紹

5.http一整個流程,什麼Baidu.com輸入,經過了什麼。比較簡單的問題了,必答内容6.DNS、TCP的三次握手、四次揮手,當然我再答一些IP路由、鍊路還有實體層的内容

7.RecyclerView的一個複用機制,和ListView的一個差別在哪裡

8.HashMap、ConcurrentHashMap、Hashtable的問題,資料結構,線程安全啊之類的問題了,當然還是考了version 1.7和1.8。

9.一個app的啟動流程,冷啟動和熱啟動,我說底層我不太了解,隻知道會有AMS去調一些東西,但是具體内容不知道,後面就是一些初始化和Activitiy生命周期問題了。

10.一道算法題三值之和求目标值,沒寫暴力,因為大家都會寫,但是浪費了很多時間,剛開始是通過二值求和的方式,但是想做成O(n),其實不太可能,後面改成了O(n^2)

HR面

1.你對阿裡面試官的印象如何?

2.你從面試官上學到了哪些東西*

3.你每天的生活安排是什麼樣子的?*

4.你為什麼選擇來阿裡?*

5.你以後的技術規劃是什麼樣的?*

6.你最有成就的項目是哪個?*

7.為什麼選擇android開發?*

8.你有什麼要問我的嗎?

最後

學習技術是一條漫長而又艱苦的道路,不能靠一時激情,也不是熬幾天幾夜就能學好的,必須養成平時努力學習的習慣。是以:貴在堅持!

此外我也把近期搜集整理的騰訊、頭條、阿裡、美團、位元組跳動等公司2020年的高頻面試真題解析分享出來。

把這些技術點整理成了視訊和PDF(實際上比預期多花了不少精力),包含知識脈絡 + 諸多細節,由于篇幅有限,上面隻是以圖檔的形式給大家展示一部分。

Android學習PDF+學習視訊+面試文檔+知識點筆記

【Android思維腦圖(技能樹)】

知識不體系?這裡還有整理出來的Android進階學習的思維腦圖,給大家參考一個方向。

【Android進階架構視訊學習資源】

Android部分精講視訊領取學習後更加是如虎添翼!進軍BATJ大廠等(備戰)!現在都說網際網路寒冬,其實無非就是你上錯了車,且穿的少(技能),要是你上對車,自身技術能力夠強,公司換掉的代價大,怎麼可能會被裁掉,都是淘汰末端的業務Curd而已!現如今市場上初級程式員泛濫,這套教程針對Android開發工程師1-6年的人員、正處于瓶頸期,想要年後突破自己漲薪的,進階Android中進階、架構師對你更是如魚得水,趕快領取吧!

【Android進階學習視訊】、【全套Android面試秘籍】免費下載下傳位址:

https://shimo.im/docs/Q6V8xPVxHpkrtRtD