本文主要包含以下幾部分內容:
- 寫在前面
- 準備工作
- 面試進行時
- 總結
- 寫在最後
1.寫在前面
本人2014年10月底以菜雞的水平進入薯片公司手機團隊做Android 應用開發。2016年底,公司出現危機,開始“優化”,本組一個小兄弟被“優化”,於是我也着手開始做準備,將來若輪到我被“優化”,出去面試時也好打個有準備的仗。這裏我可以交代一下,我從開始面試到拿到滿意的offer,大概是9個月時間,2017年9月16號纔拿到滿意的offer,時間跨度非常的長,大概參與了25家公司的面試,因爲基本上是騎驢找馬,並不急,我只想拿到滿意的offer。
2.準備工作
主要是明確自己想要加入的公司,並開始做技術準備。目標公司是BAT,我需要到更大的平臺和更優秀的人做更好的項目,正常來說加入BAT以後可以讓自己的實力和眼界得到提升,並且有一線大廠的光環對以後都是蠻重要的。有人說去哪裏都一樣,去了大廠也是個螺絲釘,我想說我寧願做航空母艦上的螺絲釘也不願意做拖拉機上的螺絲釘。其實在求職的過程中一次又一次的失敗曾經讓我放棄BAT了,轉而投向其他我認爲有前景的公司,不過最初我真的是非常想去BAT!做夢都想去。關於技術準備,主要是包含下面幾項:
- 項目經歷
- Java基礎
- 設計模式
- 算法
- 網絡相關知識
- Android基礎
- Android源碼
- Android性能優化
- 開源庫源碼
整個技術準備過程與面試過程是交替進行的,一邊面試一邊查缺補漏,如此往復。我當時是每天早上7點起牀坐班車去公司,8點半吃完早餐就在工位上學習,一直學到9點半左右。然後10點開始辦公,18時吃完晚餐,19時到20時,如果工作忙的話就辦公,不忙的話就接着學習,後期公司任務變少了,有時候全天都在學習。在這個過程中我真的是學的越多越覺得自己真是菜啊,一是覺得不知道的東西太多了,即廣度太窄,二是知道的東西掌握的又不深,即深度不夠。
3.面試進行時
準備了一段時間後我覺得自己準備的差不多了,就在拉勾上&boss上註冊賬號,公開了簡歷,前期我沒有主動投遞,有哪家讓我去面試,我纔去。後期就主動開始投簡歷了,這裏不得不吐槽一下拉鉤的star法則,以及萬年不匹配。我面試的公司較多,摘取幾個有代表性的公司拿出來分享下。
藍廠
一面就掛了,主要是以下幾個問題:
- 事件分發流程
- View的渲染機制
- 動畫的原理,底層如何給上層信號
- 編譯打包的過程
- Android有多個資源文件夾,應用在不同分辨率下是如何查找對應文件夾下的資源的,描述整個過程
- ANR的原理(回答主線程5秒阻塞是不行的,要讀源碼)
面試官是做framework的,所以問的東西偏framework,最後他說“雖然你是做應用的,但是不能浮於表面,要深入研究”,我覺得他說的很有道理。
度娘
晚上八點半,在雨中打着傘接到電話,進行電話面試,一面就掛了。
- Bitmap 使用時候注意什麼?
- Oom 是否可以try catch ?
- 內存泄露如何產生?
- 適配器模式,裝飾者模式,外觀模式的異同?
- ANR 如何產生?
- String buffer 與string builder 的區別?
- 如何保證線程安全?
- java四中引用
- Jni 用過麼?
- 多進程場景遇見過麼?
- 關於handler,在任何地方new handler 都是什麼線程下
- sqlite升級,增加字段的語句
- bitmap recycler 相關
- 強引用置爲null,會不會被回收?
- glide 使用什麼緩存?
- Glide 內存緩存如何控制大小?
- 如何保證多線程讀寫文件的安全?
面試官聲音略顯慵懶疲憊……我懷疑他是不是面了太多人已經麻木了
某海外直播公司
一面:
- 線程和進程的區別?
- 爲什麼要有線程,而不是僅僅用進程?
- 算法判斷單鏈表成環與否?
- 如何實現線程同步?
- hashmap數據結構?
- arraylist 與 linkedlist 異同?
- object類的equal 和hashcode 方法重寫,爲什麼?
- hashmap如何put數據(從hashmap源碼角度講解)?
- 簡述IPC?
- fragment之間傳遞數據的方式?
- 簡述tcp四次揮手?
- threadlocal原理
- 內存泄漏的可能原因?
- 用IDE如何分析內存泄漏?
- OOM的可能原因?
- 線程死鎖的4個條件?
- 差值器&估值器
二面:
- 簡述消息機制相關
- 進程間通信方式?
- Binder相關?
- 觸摸事件的分發?
- 簡述Activity啓動全部過程?
- okhttp源碼?
- RxJava簡介及其源碼解讀?
- 性能優化如何分析systrace?
- 廣播的分類?
- 點擊事件被攔截,但是相傳到下面的view,如何操作?
- Glide源碼?
- ActicityThread相關?
- volatile的原理
- synchronize的原理
- lock原理
三面:
三道算法題,要求在一個小時之內做完。
- 翻轉一個單項鍊表 1->2->3->4->5->null =====> 5->4->3->2->1->null
- string to integer
- 合併多個單有序鏈表(假設都是遞增的)
四面:
總監面,問了一些java 同步相關的。
HR面:
談薪水,最後沒談攏。
由鵝廠與其他公司合資創立的公司
一場筆試加一場面試後掛了,面試官T4級別……。
筆試:
- Activity生命週期簡述
- .常見內存泄漏情景及避免內存泄漏的措施
- Actvity啓動模式簡述
- 簡繪觀察者設計模式UML圖
- 算法,求公共子序列(或者是子串,記不清了)
- Java四種引用
- 自定義view重寫哪幾個方法?
- http 的session&cookie的區別
- 簡述工作線程更新UI的方法
面試:
- 應用最多佔多少內存
- 滑動卡頓如何解決(不同原因及對應處理方式)
- 自定義view實戰
- 多線程,多進程 相關
- Java四種引用的使用
某ding
一面就掛。
- XX項目你負責什麼
- Sqlite 怎麼增加一個字段
- XX項目中是怎麼創建數據庫的
- Sqlite 怎麼刪除一個字段
- 有什麼你覺得自己做得好的地方
- 爲什麼用Retrofit(一個開源庫)
- Retrofit與之前的網絡庫有什麼優勢
- XX項目中你們自己定義的線程池來管理任務,不使用框架,那麼,後來新的項目怎麼設計的
- 你認爲Rxjava的線程池與你們自己實現任務管理框架有什麼區別?
- 內存泄漏的常見場景
- 怎麼發現&分析內存泄漏
某條
面了三輪技術加一輪HR,HR事業線不錯,笑得職業化,其他的沒記住。
其他
- 處理有序數組爲什麼比無序數組更快 參考StackOverflow
- 熱修復與插件化相關
- Integer類是不是線程安全的,爲什麼
- 不使用同步鎖如何實現線程安全
- 面試頭條的時候在線編程:從上到下從左到右輸出二叉樹
- 針對concurrent包下面的一些類的問題
Android面試再也不是“能答出來Activity生命週期就OK”的時代了,你們看前面的面試題,有些問題牽扯到底層原理。另外光是concurrent包下面的東西就能把你問懵逼了。
4.總結
我自己面試了一些公司,拿了一些offer,但是還是想去BAT,所以那些offer最終都拒了,好在最終拿了B的offer,算起來前前後後面了8次BAT,屢敗屢戰,內心還是很強大的。結合我的面試經歷與同事們的面試歷程,總結幾點:
- 有些規模小的公司很注重你是不是全能的,恨不得你什麼都會,又給不起錢,福利待遇很不好,各種避稅措施。
- 馬爸爸的公司很注重項目經驗是否匹配,往死了問項目,項目簡單的話是很吃虧的,鵝廠希望你是聰明的機靈的,度娘希望你基礎好,熱愛技術;
- 有些獵頭朋友是非常專業的,不僅給你安排面試流程,還給你提供很多有價值的信息,另外獵頭一般推薦的都是高級職位;
- 面試真的很看眼緣,很多時候你和面試官一見面,如果你覺得面試官和你氣場不合,那很可能就沒戲了(這話說起來似乎是給自己的失敗找藉口,信則有不信則無,各自體會吧),碰見一個面試官,一見面就問我”XX大學是一本麼”,答曰”是”,”是985麼”,答曰”是”,”是211麼”,答曰”是”,真心不想聊下去了,不過我也確實沒有通過面試……。
- 我認爲一面必須表現的很好,因爲二面的面試官會參考一面的評價,一旦一面評價一般,第一印象就不好了;
- 如果你出身很好,學校認可度高,那你會有優勢,請聯想“好學生犯錯與壞學生犯錯時老師的表現“。
- 基礎很重要,大廠還是很青睞名校計算機專業出身的工程師的(我不是),根正苗紅啊,他們基礎一般都很好。所以半路出家的朋友們,注意補補基礎,基礎好,才能走得遠。
- 要深入研究,不能浮於表面,多看看源碼,被嘲笑爲 API Player 是很難受的。
- 要廣泛接觸,不要只看着自己的一畝三分地,多看看流行的庫,技術等。
- 最好是有blog和gayhub,並寫一些有價值的內容,可以加分,別像我一樣blog又空又low。
5.寫在最後
在薯片的三年,我從一個讓leader皺眉的菜雞成長爲一個可以hold住工作的菜雞,用了一年半,後面的時間我覺得一直是原地踏步,開始求職前我覺得自己很叼(畢竟薯片也算頗有名氣),但事實上並不是。我們更應該注重自身能力的提升,否則離開平臺我們什麼都不是。今年移動端不景氣,求職不容易,但鴻洋大神說了:“你只要牛逼,不存在就業危機”。所以還是要做一個U盤型人才……。
最後,段首不知道怎麼縮進,湊合看吧……阿彌陀佛