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:慎用“精通”)
另外,我個人在寫簡歷時有一個還未做到的點是及時更新簡歷 。對於幾年前的專案早就記憶模糊了,幾年後再嘗試回憶專案細節寫進簡歷其實很難。所以最佳方案是專案結束後及時把收穫更新進簡歷裡。
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 專案架構和模組設計
我一開始也沒有經驗,面愛奇藝時讓我介紹專案我就簡單介紹了下專案需求是怎樣,可以看出面試官並不滿意。後面專門向一個牛逼的前同事請教了這個,他的建議是注意介紹專案架構 ,後面面其他家時,果然感覺輕鬆了一些。