Android 開發面經,歷時兩月斬獲BAT+頭條四個公司 Offer

拿了 BAT+頭條 四個 offer;同時也在幫公司招聘,篩選簡歷並面試。對技術面試這回事有一些體會,在此分享。git

 

坦白說,我對我我的在此次求職中的表現並不十分滿意,面試前沒有作足夠充分的準備——數次被面試官出的題目「虐」、應對面試的壓力時沒能作到沉着冷靜、在面試中未能完整地把本身的積累與優點表現出來……因此本篇文章並非一個「成功者」的經驗分享,而是一個普通人經歷過各類面試後的一個總結與反思。程序員

1、面試前的準備
1.1 簡歷
在替公司篩選簡歷時我對同事說,簡歷是向陌生的招聘方展現本身的第一途徑,假如簡歷都沒好好寫,那麼要麼態度不行要麼肚子裏沒貨。github

篩選簡歷時的常態是看到「履歷通常、項目經歷通常、沒亮點」的簡歷,100 份中大概有 80 份是這樣的。而招聘方要把這 80 我的拉過來逐個面試顯然不現實,所以假如由於簡歷沒好好寫被劃分進這 80 我的中,那麼最後可否得到面試機會就只能看運氣了。面試

我不是有經驗的 HR 沒法給出「很是漂亮」的簡歷標準,下面簡單說說我我的認知的簡歷及格線標準:算法

信息完整。姓名、電話、郵箱、在校經歷、公司經歷、項目介紹等等,其實有不少大神早就寫過 N 篇關於簡歷信息的文章了,我我的比較喜歡 Trinea 大神分享的簡歷模板《推薦 3 個簡歷模板及 2 大加分技巧》 。
展現本身的亮點。我明白不是全部人都有好的學校背景、好的公司背景、好的項目經驗背書 —— 假如你有,是個優點,但沒有的話,聰明的你應該會想辦法從其餘方面給本身加分。好比長期維護技術博客、博客言之有物,好比參與開源項目,好比作過一些我的項目等等。固然這些非一日之功,須要你平時的努力(不要想着在求職前隨便粉飾包裝一下,言之無物的博客或 github 反而會留下很差的印象)。個人理解是,其實招聘方也很苦惱,從 80% 的千篇一概的普通簡歷中想要篩選出能力好的人很是很是難,這時你能用這些亮點做爲敲門磚無疑就能脫引而出。(PS: 有好的博客或 github 千萬記得寫在簡歷上且能夠寫在顯眼的位置。在篩選簡歷過程當中曾碰到一我的簡歷上沒寫這些,幸虧他是朋友推薦特地給我發來了他的博客地址,不然單看他很是通常的簡歷他就失去了面試機會)
誠實靠譜。可能有人會問,假如我既沒有好的經歷也沒有亮點怎麼辦?那就踏踏實實把本身的優點寫出來,好比擅長 UI、對網絡層有深入理解、有自研 IM 的經歷等等。大部分程序員都是靠譜、理性的工科男,簡歷寫得誠懇踏實每每更能獲得青睞。不要浮誇甚至造假,踏踏實實把本身基本信息展現出來就好。對寫上簡歷的技術點要有必定了解,簡歷上寫了一堆技術點結果問了卻說不熟確定是很減分的。(PS:慎用「精通」)
另外,我我的在寫簡歷時有一個還未作到的點是及時更新簡歷。對於幾年前的項目早就記憶模糊了,幾年後再嘗試回憶項目細節寫進簡歷其實很難。因此最佳方案是項目結束後及時把收穫更新進簡歷裏。小程序

想學習更多Android知識,或者獲取相關資料請加入Android技術開發交流2羣:862625886。本羣可免費獲取Gradle、RxJava、小程序、Hybrid、移動架構、NDK、React Native、性能優化等技術教程!安全

1.2 基礎複習
對於基礎複習我此次最大的感觸就是,必定要早點作準備同時也要作全面完整的準備。性能優化

舉個例子, Java 中很是基礎的的四大引用。對 Android 開發來講平時可能用弱引用比較多,但真正做爲面試題來問時面試官但願你能立刻回答出四大引用分別是什麼以及各自的使用場景。假如你能立刻回答出四大引用的特色及使用場景固然是合格的回答,假如你不止回答出四大引用的特色還能聯繫到 ReferenceQueue,繼而延伸到在 leakcanary 的使用,那就是優秀的回答了 —— 但假如你被提問後一臉懵逼,說本身只記得弱引用,就會比較尬(固然就這個知識點而言,我做爲面試官的角色時還會嘗試「搶救一下」,由弱引用的使用延伸到內存泄露去,不會直接斷定應聘者)。網絡

由於在「面試」這個場景裏,面試官會默認你作了足夠的準備,對於一些中高端職位基礎題實際上是做爲送分題問的,固然但願你能快速反應、快速回答。而人不是機器,許久沒用或者沒複習的技術點想要在短期內回憶起來並概括成 N 個點說出來難度很是大。 因此基礎技術的面試其實就跟應試同樣,任你功力再高,也有必要好好複習一下。畢竟「武功再高,也怕菜刀」嘛(不恰當的比喻,哈哈)。數據結構

基礎複習能夠分爲兩大塊,一塊是 Android 和 Java 基礎,另外一塊是計算機基礎,也就是算法、計算機網絡、計算機原理等。對於前一塊,經驗豐富的你通常花半個月就能夠搞定;但對於後一塊,時間上就很差估計了(網上有很是完整的各類面經和題庫,聰明的你確定具有最基本的信息檢索能力,這裏我就不貼連接了)。

這裏我把我本身做爲反面教材:因爲前期對是否要跳槽猶豫不決,因此沒能早點進行充分的準備,致使後面碰壁後須要在短時間內急急忙忙去複習,其中的壓力可想而知。

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

1.3 項目複習
社招跟校招的一大差異是,社招中的基礎題部分只是前菜,招聘方會很是重視你的項目經歷,經過詢問項目經歷會擴展到對技術、學習能力、溝通能力等的考察。

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

整體架構和項目細節不用過多解釋,前者是從宏觀角度向對方介紹你的項目的架構,用最短的時間讓對方理解項目經過哪些模塊或組件間的協做去實現功能的;後者是對方可能會提出一些感興趣的點詢問你項目細節 —— 因此千萬記得認真掌握項目關鍵細節,不然答不出來會很尷尬。

項目亮點和難題則是面試必備,基本大部分面試都會問到這塊,無他,對方不瞭解你的項目的狀況下確定但願你能展現出能夠爲本身加分的點。

1.4 簡歷投遞
準備得差很少後就能夠開始進入簡歷投遞環節了,我以爲簡歷投遞的途徑的優先級是這樣的:熟人內推 > 優秀獵頭推薦 > 普通網友內推 > 普通獵頭推薦 > 官網投遞。

假如你的簡歷光芒閃閃,阿里星那種級別,那隨便投遞均可以很快有響應,不然投遞的途徑仍是很重要的。

熟人內推固然是第一選擇,經過熟人你不止能夠知道部門內部的業務發展、晉升、加班等狀況,在走流程時也能夠經過他直接接觸到你的將來 leader。而爲何優秀獵頭的內推會比普通網友內推要好呢?我我的的感覺是優秀獵頭會比普通網友更瞭解招聘狀況且能更積極得幫你催流程,而真正優秀的獵頭,在對公司總體信息的掌握上是高於普通員工的。

2、面試中常見的考察方向
面試中要沉着冷靜、面試前要確認面試時間並提早到……這些囉嗦的小 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.5 項目優化
我上一次正兒八經面試仍是找實習時,因此剛開始我對面試的理解仍是停留在展示本身「能作事、能力強」,而此次求職給個人收穫是,基本全部公司都會考察項目優化能力以區分普通開發和注重項目質量的開發。

項目優化能夠是架構重構,也能夠是內存、卡頓優化、電量優化等細節優化,還能夠是開發效率的優化等等。

這塊的博客不少,好比胡凱大神的《Android性能優化典範》等,光了解不夠,要實操,要有具體的場景和優化後的結果。

3、各大公司的面試
我有一個習慣是,每面完一家公司後都會把具體的問題記錄下來,把不會的題目當天解決 —— 你還別說,後續的面試還真讓我碰上了以前的題目。固然我不會事無鉅細,主要是記錄本身不大確定或不會的問題。

下面我簡單介紹一下經歷過的幾大公司的面試過程。

3.1 愛奇藝
愛奇藝是現場面的,效率很高,當天面完全部流程。算了下大概有四面技術面 + 一面 HR 面。

一面是 Java 和 Android 基礎,面試官多是 Java 開發出身,對 Java 方面的東西問得很細,好比堆和棧的區別、棧幀裏記錄了哪些信息等等。Android 方面的問題比較常規。

後面幾面比較注重項目,大概流程是先問了不少項目細節,中途穿插了一些算法、計算機網絡的題目。

3.2 滴滴
滴滴一面主要是技術基礎,問得很是細。好比會問到 git cherry-pick 和 git hook,還問到 inSampleSize 爲何是 2 的冪等等。

二面和三面是去的現場面,主要是項目相關,以及一些視頻相關的優化。

3.3 百度
百度總體求職體驗很好,面試官的問題以及溝通都很 nice,就是從住處去張江面試實在太遠了。。。

一面是 Android 基礎,二面會比較注重項目優化,三面是問了項目的架構設計並當場給了一道模塊設計題目,四面主要是項目相關。

我在上文的反思中有不少都是來自在百度這裏踩的坑,面試官會比較注重項目優化、注重架構和模塊設計能力,發現了個人知識體系上很多漏洞,很是感謝那幾個面試官。

3.4 螞蟻
螞蟻總體流程是一週一面的節奏,會有三到四面技術面 + 一面 HR 面。

螞蟻面試的特色是會偏業務一點,但接觸過的幾個面試官中你能感覺到對方思惟敏捷、很聰明。好比在讓你介紹項目時,會在詢問細節的同時忽然給你一個相關的場景讓你作一個模塊設計。好比在你絮絮不休說一堆時能及時發現你的回答不許確。

而 HR 面的過程比較專業,除了一些常規的問題外還會問你以前工做的一些細節等。

考察的內容主要是項目、基礎,有些面試官會問計算機網絡的問題,或者一些常規算法題。

3.5 騰訊
騰訊的面試過程是很舒心,也是一週一面,但全程會有 HR 短信通知,總體很人性化。

大概是三面技術面和一面 HR 面。一面和二面都是技術基礎,有很多計算機網絡和算法題(固然也是比較常規的算法題),後面的 GM 面試則是不拘泥於 Android 範疇,會問「你的優點是什麼」,「對來深圳工做有什麼難處」等等。

3.6 字節跳動
字節跳動是三面技術面 + 一面 HR 面,有趣的是三面都是視頻面試,雖然應聘的部門就在上海,但不須要趕過去現場面。

並且總體流程很是專業:面試前會有專人打電話約時間、面試後會及時通知你面試結果並約下一面的時間、面試中是在牛客網上視頻面試(網站上配置有白板能夠寫代碼)。

再說面試內容,字節跳動或者說咱們熟悉的「頭條」的特色的確是面試過程當中算法比重很高,但面試官毫不是無腦問算法題。好比一面問的算法題是線段樹 —— 這個數據結構個人確不熟悉,但面試官在提問過程當中不斷引導和考察其餘方面的東西,我能比較好得回答出來,最後雖然沒有命中最優解「線段樹」,但仍是讓我過了。

最後再強調一下,我沒有把全部面試題所有羅列出來是由於這幾個公司的面試題都算比較常規,只要你按照我上問說的那些踏踏實實去準備了,基本絕大多數均可以命中。

4、面試後的感覺
先來談談招聘行情。這幾天恰好有傳言稱華爲凍結 HC,也有說阿里也準備不放 HC 了 —— 都是傳言,真假有待考證。無論真假吧,在各類互聯網寒冬的論調絡繹不絕的當下的確會影響不少人對行情的判斷。而「Android 將死」的文章反覆出現更是讓人有些慌張。

但就我求職時的感覺看,客戶端招聘行情不是變壞,而是變好。在招聘熱度很高的七八月份時,打開 V2EX、打開行業交流羣、打開領英,有很大部分都是客戶端職位;字節跳動校招時甚至特地發了公開信勸說應屆生投遞客戶端崗位,並給了三個月簽字費的獎勵。整體看客戶端崗位是供少於求的,跟同行討論,「招人難」的狀況遠大於「求職難」。 因此我以爲後續不用太悲觀。

而後說說這些面試的感覺,從結果看,此次求職經歷彷佛不錯,但只有我本身知道過程有多煎熬……因此我寫了這篇文章,好好覆盤一下。

別看我上面幾節說得頭頭是道,其實這些都是創建在我血和淚的教訓上的反思和總結啊。(便宜讀者了,哈哈)

如今想來,此次面試經歷收穫良多。在準備面試時你會發現有多少知識點你是沒有十足把握的、在被面試官「教作人」時你會發現你我的的知識體系存在很多漏洞、在面試事後你也能夠得知外部的環境中你的價值幾何 —— 不是在「教唆」跳槽哈,跳槽必須是通過深思熟慮的,而面試,你能夠做爲一個自我檢驗的過程(固然面一個公司前請思考是否有去入職的可能性,不要輕易去面試,對方公司招聘也是有成本的)。

檢閱本身以後我會作一些學習計劃以補上本身的短板:

算法這塊每次急急忙忙去複習太難過了,後續準備先花必定時間把全部常規算法系統學習和複習一遍,同時計劃按期練習算法題保持「手感」。
技術基礎與技術原理。雖然經常使用的技術點就那些,但未用到卻重要的技術點是無窮盡的,特別是技術原理這塊比較系統的文章不多、很是少(後續準備寫一系列基礎和原理相關的博客,這裏算是立下 flag)。
架構設計和模塊設計,這塊很少說,是全部中高級開發必學的東西。
以及一些還未十足掌握的點,好比客戶端中比較少碰到的複雜環境下的線程安全問題。
目標就是一個,未雨綢繆,把本身沒有十足把握的技術點練到有充沛的信心爲止,後續會寫相關的博客更新在我的博客裏。「自信」這東西過重要了,在面試這種場景裏,稍微有點露怯會就會讓你變得緊張、不自信,連鎖的反應是後續的交談也會不暢(固然也多是我心理素質通常吧)。

想學習更多Android知識,或者獲取以上相關資料你們能夠跟我一塊兒探討,歡迎加羣探討,有flutter—性能優化—移動架構—資深UI工程師 —NDK相關專業人員和視頻教學資料
羣號:925019412

相關文章
相關標籤/搜索