一.前言
最近事情比較多,工作比較忙,同時在自學泰語和前端,精力比較分散。差點這份面經就跳票了,感謝同行的鼓勵讓我重新提筆。
數數這也正好是我入行的第三個年頭了,僥倖當年在外包公司得到實習的機會,從此開始了IT生涯。回頭看看這三年一步一步走來,真是吃了不少苦頭。不知道你們有沒有跟我同樣的經歷,剛畢業的時候什麼都不懂,渴望一個機會,去面試當面被面試官批評太差勁。剛入行的時候,沒有牛人帶,總盼望著誰拉扯自己一把,什麼都得自己摸索,一步一步自己踩坑。才工作一兩年的時候,就感覺遭遇了瓶頸,未來一片迷茫,不知所措。這些我都經歷過,我甚至還經歷過比這更糟糕的情況。幸運的是,我堅持了下來。
二.個人背景
先介紹下個人履歷,作為面試的參考,拋開背景談面試都是耍流氓。
雙非(非985,非211)一本電信專業畢業,半跨行從事IT行業,工作三年,跳槽前沒有網際網路履歷,第一份工作在外包公司任職,第二份在公募基金公司任職。
如果你是專科畢業,我建議你至少要考個本科學歷
現在很多公司簡歷稽核的時候都會卡學歷,我之前任職的基金公司甚至一度卡到985,211。雖然IT是靠能力吃飯的行當,但是隨著從業人員的增多,市場的門檻也會隨之調整。我有時候甚至覺得本科都有點不夠看,建議專科畢業的同學至少要考個本科學歷,不然很容易失去面試機會。即使面試通過了,在最終的HR面也很容易被刷。
三.面試準備
3.1養成日常學習的習慣,而不是依賴考前突擊
我的面試準備週期很長,差不多從17年12月底開始有想出去看看的打算,一直到18年6月才最終拿到滿意的offer,這個期間我一直在查漏補缺。但我的學習週期更長,從17年5月進入一個日常學習的狀態,花了一年時間跟著網課完成了系統性的學習,中間還看過很多書。
我不建議大家只在面試前夕進行突擊學習,背面試題,這種技巧可能會讓你獲得一個offer,但沒辦法提升你的個人能力。我建議養成一個日常學習的習慣,每天抽空學幾個小時,在面試前把總結的知識點重溫一遍即可。這種習慣日復一日所帶來的複利會讓你的技術在某一刻由量變產生質變。
3.2人不是神仙,不可能面面俱到
業內經常會調侃,面試造航母,工作擰螺絲。你不可能問什麼都能答的上來,所以你要調整好心態坦然接受失敗。不得不說準備面試真的是個很痛苦的事情,耗費精力不說,你可能突然會發現你原來這也不會,那也不懂,自以為拿手的本事被人兩三下就問懵逼了,信心嚴重受挫。但你要相信自己,跌倒了不要緊,再爬起來就好。
關於面試具體要準備什麼,聊這方面的文章很多,我簡單梳理一下,後面也會有我部分公司面試題的總結。
多執行緒、JVM
這兩塊的知識點是讓你能順利通過大廠一面的保證,我所經歷過的阿里、頭條面試一面基本圍繞這些知識點展開。
開源框架
我覺得多多少少需要看一些框架原始碼,瞭解其中的原理,掌握其中的核心,並且能用自己的語言,陳述出來。還有時下比較流行的東西面試官問的機率很高,比如元件化、hybrid。多讀讀原始碼也能培養自己讀程式碼的能力,這樣的本事能讓你很快的瞭解一個新的專案或者一個新的框架。
效能優化
這一塊也是很多公司喜歡問的,特別是當部門架構組團隊招人的時候喜歡問。我不太擅長這方面,就不多談了。
資料結構及演算法
在我係統學習的過程中我是把資料結構和演算法跟著課程學了一遍的,但是我面試期間是完全放棄複習演算法的。這麼說並不是說演算法不重要,頭條的面試上來就會考一道演算法題,喜歡考演算法的廠也越來越多。只是大家要根據自己的實際情況分配複習的比重。畢竟數學考試最後一道大題你做不來,你可以把前面的小題爭取全部做對。
四.簡歷
簡歷是敲門磚,也可能是面試的引線
大家一定要重視簡歷。對於學校不優秀,工作背景不突出的同學,簡歷是你的敲門磚。簡歷寫的不好,你可能直接會錯過一次展示自己的機會。
在面試中很多面試官會根據簡歷來提問,所以你擅長的東西,一定要寫在突出的地方讓面試官看到,主動引導面試官問你你擅長的問題。在回答問題的時候,千萬不要隻言片語草草結束。每次被提問,都是一次展示自己的機會。儘可能的說全,說詳細。接著面試官可能圍繞你說的內容進行深挖去考察你,所以你的知識點不能浮於表面,不然兩三個回合可能就被問的啞口無言。如果你實在有些知識點不懂,儘量的在回答中規避這些細節,免得面試官一時興起問你一下。
那麼簡歷到底該怎麼寫,有些同學可能會覺得,我平時工作都在堆業務,專案上沒有什麼可以寫的怎麼辦。首先再回頭看一看專案裡是不是真的沒有什麼閃光點,日活、品控、效能這些都能作為你的談資。如果實在沒有那就去研究兩三個主流開源框架,讀讀Android SDK原始碼,寫點開源專案放到github上。你也可以搞明白自己專案的業務架構,鑽研一下元件化、熱修復、外掛化、hybrid等熱門技術,深究一下效能優化比如卡頓監測、APK瘦身、DEX加密、過渡繪製等。每一個點它都可能成為你成功的鑰匙。
五.面試題
生活是場修行,認真對待每場面試
這裡寫了部分大廠面試題作為大家複習的參考,平安系的面試主要問的專案,包括個別小廠面試沒什麼參考性,這裡就不寫了。
頭條的面試質量很高,覆盤的時候有種醍醐灌頂的感覺。
攜程的面試很不走心,大老遠跑一趟最後面試官都不給我提問的機會面完直接走出去了,我也沒差到這種地步吧。
阿里的面試比較隨機,兩次下午上班的時候來電面試,一次是晚上來電面試。
5.1東方財富
筆試
- 簡述類載入機制
- 寫三種單例的實現方式
- Activity生命週期
一面
- Handler機制
- 事件分發機制
- 樂觀鎖與悲觀鎖
二面
- Android 7.0 8.0 p 相容性問題
- 巢狀滑動
- 營銷工具比如列表第三位展示廣告,如何設計介面
5.2螞蟻金服
一面
- 記憶體洩漏
- 具體場景
- 大圖載入
- 大圖載入的快取
- Bitmap優化
- Handler機制
- 子執行緒能不能建立Handler
- 執行緒間通訊其他方式
- 執行緒的建立與退出
- 樂觀鎖與悲觀鎖
- volatile原理
- 讀寫鎖的應用
- RecyclerView與ListView的區別
- RecyclerView為什麼這麼設計
- 應用
- 自定義控制元件
- 事件分發機制
- 動畫
- okhttp支不支援優先順序
- ssl握手誰實現的
- websocket應用
- 簡述日誌系統
二面
- 介紹專案架構等,圍繞專案進行提問
- 序列化的作用
- 子執行緒輪詢阻塞佇列如何安全回收執行緒
5.3Musical.ly(頭條)
一面
演算法:陣列中的資料前半部分遞增,後半部分遞減,排序並去重
Java虛擬機器
- 虛擬機器記憶體結構
- 哪些是執行緒私有,哪些執行緒公有
- 靜態常量的儲存位置
- 無窮遞迴方法引發的問題
- GC機制
- GC roots是什麼
- Handler造成記憶體洩漏的整個引用鏈
- 什麼情況會產生ANR
- 廣播
- onReceive方法呼叫執行緒
- 靜態廣播接收流程
- 動態廣播接收流程
- 動態廣播能不能重複註冊
- SurfaceView原理及使用注意事項
- ButterKnife工作原理
- 仿微信朋友圈圖片展示設計思路
------以下問題都是面試官根據簡歷問的------
- 熱修復
- 熱修復原理
- 假如某個類A有個bug,熱修復的整個流程
- 該修復方案是否能避免oat導致的一些問題
- LeakCanary原理
- Groovy外掛
- APK瘦身如何實現的
- 自定義任務在某個任務之前或之後執行怎麼寫
- Gradle打包的整個過程
- 看過哪些Android原始碼
- 攔截Activity跳轉有哪些Hook點
- Groovy和Java的比較
二面
- 類載入過程
- 觸發類初始化的時機
- 被動引用
- Activity啟動模式及幾個模式的應用場景
- onSavedInstanceState相關
- 滅屏會不會觸發onSavedInstance
- onRestoreInstanceState和onSavedInstanceState是否成對出現
- Service生命週期的理解
- bindService整個程式碼怎麼寫
- 與service通訊是否會阻塞當前執行緒
- 如果是耗時方法,為什麼會阻塞
- 如果不是耗時方法,為什麼不會阻塞
- 如果遠端是耗時操作,怎麼不等待結果讓主執行緒先執行
- startService和bindSerivce對service生命週期的影響
- aidl傳遞Bitmap需要注意的事項
5.4攜程
一面
- EventBus原理
- Java中有哪幾種註解
- 具體註解名稱
- 如何自定義註解
- EventBus是什麼註解
- 能不能用編譯時註解實現EventBus
- 註解處理器怎麼工作
- 註解處理器有哪些API
- Glide原理
- Lrucache原理
- LinkedHashpMap原理
- HashMap原理
- 解決Hash衝突的方法
- equals和hashcode作用
- hashcode如何實現
- Object類下有什麼方法
- 使用過哪些熱修復
- 熱啟動熱修復原理
- 冷啟動熱修復原理
- Android中的類載入器
- 類載入器之間的區別
- Dex融合用的哪種類載入器
- 父類是什麼及三者之間的關係
- 雙親委派模型
- APK瘦身
- Android中的動畫及區別
- Handler原理
- Android中序列化方式
- 兩者區別
- 為什麼Parcelable效能更好
- 序列化UID作用
- ThreadLocal原理
- Java中有哪些鎖
- 悲觀鎖與樂觀鎖的區別
- 自旋鎖的作用
- 鎖一般是怎麼實現的
- 讓你自己實現,怎麼實現一個鎖
- 記憶體優化有哪幾種方式
- 佈局優化有哪幾種方式
- 線性佈局在onLayout裡面做了哪些工作
- 谷歌為什麼給Activity設計這麼多生命週期
5.5招行信用卡中心
(招行是架構組招人,問的問題主要是架構方面和安全方面,比較開放,簡單總結一下)
- 工程結構縱向橫向如何拆分(專案架構)
- 如果解決程式碼依賴
- 兩個隔離模組的資料互動
- 開發過程中遇到的問題
- 記憶體洩漏
- 專案中首頁的實現
- VLayout實現原理
- 為什麼不用RecyclerView實現多Item
- 熱修復差分檔案的驗證(安全性)
- 公鑰私鑰體系
- 應用場景
- HTTPS連線過程
- 應用構建過程
- 應用簽名校驗過程
- V1簽名和V2簽名區別
- Dex加固原理
- APK瘦身
六.展望
幹這行三年了,自己恐慌過,也看到過別人恐慌。擔心行業日落西山,擔心Android被大前端統一。這樣的擔心也不算沒有道理。但其實真正讓我恐慌的是我沒在進步,而行業在不斷進步,擔心跟不上行業的腳步。作為程式設計師,還是要保持一顆學習的心態,不斷前進。但也希望大家在繁忙的工作、學習之餘抽身出來多培養些興趣愛好,多陪陪家人朋友。多打磨一下自己的軟技能,提高談吐、情商、表達能力。這些也是一個優秀的程式設計師所需要具備的條件。
我不算是一個優秀的程式設計師,也只是努力的在這條路上前行,希望能做一些自己喜歡的事情。
如果有機會,會在部落格上跟大家分享一些安卓以外的內容。
願每個人都有夢想,也願每個人都能堅持自己的夢想