Android 開發面經,歷時兩月斬獲BAT+頭條四個公司 Offer
拿了 BAT+頭條 四個 offer;同時也在幫公司招聘,篩選簡歷並面試。對技術面試這回事有一些體會,在此分享。
坦白說,我對我個人在這次求職中的表現並不十分滿意,面試前沒有做足夠充分的準備——數次被面試官出的題目“虐”、應對面試的壓力時沒能做到沉著冷靜、在面試中未能完整地把自己的積累與優勢表現出來……所以本篇文章並不是一個“成功者”的經驗分享,而是一個普通人經歷過各種面試後的一個總結與反思。
一、面試前的準備
1.1 簡歷
在替公司篩選簡歷時我對同事說,簡歷是向陌生的招聘方展示自己的第一途徑,假如簡歷都沒好好寫,那麼要麼態度不行要麼肚子裡沒貨。
篩選簡歷時的常態是看到 “履歷一般、專案經歷一般、沒亮點” 的簡歷,100 份中大概有 80 份是這樣的。而招聘方要把這 80 個人拉過來逐個面試顯然不現實,因此假如因為簡歷沒好好寫被劃分進這 80 個人中,那麼最後能否獲得面試機會就只能看運氣了。
我不是有經驗的 HR 無法給出“非常漂亮”的簡歷標準,下面簡單說說我個人認知的簡歷 及格線標準 :
- 資訊完整。姓名、電話、郵箱、在校經歷、公司經歷、專案介紹等等,其實有很多大神早就寫過 N 篇關於簡歷資訊的文章了,我個人比較喜歡 Trinea 大神分享的簡歷模板 ofollow,noindex">《推薦 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。而為什麼優秀獵頭的內推會比普通網友內推要好呢?我個人的感受是優秀獵頭會比普通網友更瞭解招聘情況且能更積極得幫你催流程,而真正優秀的獵頭,在對公司整體資訊的掌握上是高於普通員工的。
二、面試中常見的考察方向
面試中要沉著冷靜、面試前要確認面試時間並提前到……這些囉嗦的小 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.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 面,有趣的是三面都是視訊面試,雖然應聘的部門就在上海,但不需要趕過去現場面。
而且整體流程非常專業:面試前會有專人打電話約時間、面試後會及時通知你面試結果並約下一面的時間、面試中是在牛客網上視訊面試(網站上配置有白板可以寫程式碼)。
再說面試內容, 位元組跳動或者說我們熟悉的“頭條”的特點的確是面試過程中演算法比重很高,但面試官絕不是無腦問演算法題 。比如一面問的演算法題是線段樹 —— 這個資料結構我的確不熟悉,但面試官在提問過程中不斷引導和考察其他方面的東西,我能比較好得回答出來,最後雖然沒有命中最優解“線段樹”,但還是讓我過了。
最後再強調一下,我沒有把所有面試題全部羅列出來是因為這幾個公司的面試題都算比較常規,只要你按照我上問說的那些踏踏實實去準備了,基本絕大多數都可以命中。
四、面試後的感受
先來談談招聘行情。這幾天剛好有傳言稱華為凍結 HC,也有說阿里也準備不放 HC 了 —— 都是傳言,真假有待考證。不管真假吧,在各種網際網路寒冬的論調絡繹不絕的當下的確會影響很多人對行情的判斷。而“Android 將死”的文章反覆出現更是讓人有些慌張。
但就我求職時的感受看, 客戶端招聘行情不是變壞,而是變好 。在招聘熱度很高的七八月份時,開啟 V2EX、開啟行業交流群、開啟領英,有很大部分都是客戶端職位;位元組跳動校招時甚至特意發了公開信勸說應屆生投遞客戶端崗位,並給了三個月簽字費的獎勵。 總體看客戶端崗位是供少於求的,跟同行討論,“招人難”的情況遠大於“求職難”。 所以我覺得後續不用太悲觀。
然後說說這些面試的感受,從結果看,這次求職經歷似乎不錯,但只有我自己知道過程有多煎熬……所以我寫了這篇文章,好好覆盤一下。
別看我上面幾節說得頭頭是道, 其實這些都是建立在我血和淚的教訓上的反思和總結啊。(便宜讀者了,哈哈)
現在想來,這次面試經歷收穫良多。 在準備面試時你會發現有多少知識點你是沒有十足把握的、在被面試官“教做人”時你會發現你個人的知識體系存在不少漏洞、在面試過後你也可以得知外部的環境中你的價值幾何 —— 不是在“教唆”跳槽哈,跳槽必須是經過深思熟慮的,而面試,你可以作為一個自我檢驗的過程(當然面一個公司前請思考是否有去入職的可能性,不要輕易去面試,對方公司招聘也是有成本的)。
檢閱自己之後我會做一些學習計劃以補上自己的短板:
- 演算法這塊每次急急忙忙去複習太難過了,後續準備先花一定時間把所有常規算法系統學習和複習一遍,同時計劃定期練習演算法題保持“手感”。
- 技術基礎與技術原理。雖然常用的技術點就那些,但未用到卻重要的技術點是無窮盡的,特別是技術原理這塊比較系統的文章很少、非常少(後續準備寫一系列基礎和原理相關的部落格,這裡算是立下 flag)。
- 架構設計和模組設計,這塊不多說,是所有中高階開發必學的東西。
- 以及一些還未十足掌握的點,比如客戶端中比較少碰到的複雜環境下的執行緒安全問題。
目標就是一個, 未雨綢繆,把自己沒有十足把握的技術點練到有充沛的信心為止,後續會寫相關的部落格更新在個人部落格裡。 “自信”這東西太重要了,在面試這種場景裡,稍微有點露怯會就會讓你變得緊張、不自信,連鎖的反應是後續的交談也會不順暢(當然也可能是我心理素質一般吧)。

資料總結.png
想學習更多Android知識,或者獲取以上相關資料請加入Android技術開發交流2群:862625886。本群可免費獲取Gradle、RxJava、小程式、Hybrid、移動架構、NDK、React Native、效能優化等技術教程!