這裏簡單說一下我的個人情況:
本人本碩985軟件工程,17年畢業後在TP-Link做過接近一年的安卓開發,後來才辭職考研回母校繼續提升自我。原本是打算找一份算法的實習,但今年算法崗的形勢不容樂觀,競爭激烈。所以在2月初決定把重心放在開發上,做自己喜歡的安卓,然後就開始投遞簡歷了。
2月初的時候很多大廠都還沒開始招聘暑假實習,我就在牛客網上找大廠的內推貼來看,當時字節跳動每天都有十幾個內推貼,甚是瘋狂!我就找了三四個字節的內推郵箱發去了自己的簡歷。大概2月7號發的簡歷,10號就收到了來自北京的HR約面試的電話,郵件中給的是牛客的視頻面試鏈接。然後14號連着一面二面,完了直接電話約三面,16號三面完,當晚8點收到了HR的Offer Call。(三次技術面)
大概到了3月3號決定投一下base深圳的騰訊,4號官網投遞了簡歷,然後約了9號一面,接着12號二面,當晚三面的面試官加了QQ,約了15號三面。接着17號HR面,最後19號晚上8點順利收到HR的Offer Call。(三次技術面 + HR面)
字節跳動 - 安卓開發崗
一面(45min)
- Activity的創建流程與原理(OnStart、OnCreate、OnResume等)
- Handler的原理(Handler、Looper、MessageQueue等)
- View的繪製過程(OnMeasure、OnLayout、OnDraw)
- Binder機制以及原理(binder驅動、共享內存等)
- 談談設計模式(23種設計模式,MVC和MVP的區別)
- 談談對操作系統中的進程的理解
- 操作系統中有哪些跨進程通信(IPC)的方法(信號量、管道、共享內存等)
- 講講Java中類的加載過程
還有一些問題遺忘了,最後是做一道編程題,二叉樹查找相關的,用遞歸完成了。
二面(60min)
- TCP三次握手原理及細節,談及爲什麼不能兩次握手的原因
- ShareReference的用法和原理
- Java垃圾回收的過程
- 內存泄漏問題(Java中static引起的內存泄漏問題等)
- JVM內存管理相關問題
- 智力題:兩個骰子(6面)如何表示2月全部日期
還有一些非常難的Java方面的問題遺忘了,編程題考查二叉樹Z字型遍歷,不能用STL庫。
三面(30min)
- Activity的創建原理,談及ActivityManagerService偏Framework層的理解
- 談談WindowManagerService的工作機制和原理
- 談談讀過哪些開源的安卓庫源碼
- 數學題:兩個人輪流投擲硬幣,規定正面贏,正反面各50%概率,計算先投的人獲勝的概率(用級數去解決)
- HTTP和HTTPS原理,區別,各自的優勢
- 談談對token的理解
這次面試沒有編程題,很簡短但是較爲嚴肅,前兩次氣氛都較爲輕鬆。
HR電話(10min)
簡單聊了一下以前的工作經歷和學習經歷,爲什麼辭職考研,對未來的職業規劃,然後就介紹公司的待遇和福利等等,發了口頭Offer,三天後郵件正式Offer。
騰訊 - 移動客戶端開發崗
一面(60min)
自我介紹後直接聊起了以前在TP做過的兩個項目。
第一個項目問到了設計模式中MVC和MVP的區別,ListView和RecyclerView的區別,如何用ListView實現RecyclerView等同的效果;第二個項目比較大,當時代碼量有三千行左右,從Framework層到應用層都有涉及,然後問到了跨進程通信,一個大的數據包跨進程通信中如何保證安全(拆包、安全校驗等)Java的類型擦除
HashMap的原理(哈希映射、衝突解決的方法等)
安卓的一系列基礎問題
這次面試非常注重過往項目的經驗,還有些問題遺忘了,編程題兩道:中序和後序推導出前序(二叉樹遞歸完成)、給出一個鏈表刪除倒數第五個節點
二面(60min)
- 談談對Handler、Looper的理解,他們倆的數量關係
- Java中內部類和靜態內部類的區別
- Java的泛型擦除問題(因爲一面沒答好,二面又重新拿出來問我了,還好我提前準備過)
這次面試非常注重基礎知識的考察,當然有很多問題遺忘了,編程題是:數組中每個值看作一棟樓的高度,站在數組中的一個位置求前後能看到的樓的數目(高樓擋在前面會看不到後面的樓)
三面(1h20min):
- 談談以前自己的學習方式,有沒有讀書做筆記的習慣或者寫技術博客的習慣等
- 談談以前在學校做過的項目(本科做過兩個科研項目,NLP、EEG,我都分別詳細講了)
- 談談之前在TP工作的項目,每個項目的時間分配和具體流程,包括技術細節,以及遇到的比較困難的問題,還有自己的成長
- 談談Activity的原理,生命週期(面試官希望我答出Native層的原理,雖然我讀過安卓源碼的書籍,但當時一緊張就答得不太全面)
- 廣播的收發過程,如何做一個有序廣播
- 談談對四大組件的理解
- 講一下HashMap的原理(爲什麼到了8個節點就變成紅黑樹)
- 以前做過哪些優化相關的工作
- 談談webview的原理和通信機制
- 概率題:x%的人喜歡籃球、y%的人喜歡排球、z%的人喜歡足球,問同時喜歡籃球和排球的人是多少
這次面試從家庭背景學習情況問到過往項目,再問到基礎知識,真的細緻入微哈哈~當然還是有些問題遺忘了,中間還問了能過來實習的時間。最後編程題是:兩個超大的字符串文件,求他們的最長迴文子串,要求不能調用庫(當時用動態規劃完成,但是時間複雜度爲N^2,其實用馬拉車算法可以降低複雜度,但當時我並沒有練過,所以就把代碼交上去了)
HR面(30min):
- 首先自我介紹一下,談談能過來實習的時間
- 辭職考研的原因
- 考研之後的半年做了啥(當時我在研究生入學前實習了一下)
- 講講之前在TP工作的成長
- 談談本科到現在的學習方式(在學習課本知識的過程有沒有自己打代碼實現demo之類)
- 研究生階段學習成績如何,排名什麼位置
- 上學期參與了實驗室的什麼項目,具體負責什麼
- 談談自己的優缺點
- 相比其他實習生,覺得自己比他們的優勢的地方
- 談談之前面試的三個面試官,逐位評價一下
- 上一份TP的工作是校招的嗎?當時還有沒有面試其他公司?當時面試公司這麼少是處於什麼考慮的?
- 現在實習還有沒有找別的公司,有沒有拿到其他公司的Offer(這裏我如實說了字節跳動的Offer)
- 對比騰訊和字節跳動,談談自己的想法,會如何做選擇,選擇的原因是什麼
- 最後,覺得騰訊爲什麼需要你?
總結和給各位同學的建議
無論是本科生還是研究生,實習生還是正式工作(社招除外),面試永遠考察的都是基礎!所以萬變不離其中,好好複習計算機學科相關的基礎知識,特別是常問的那一系列問題,每次面試完立刻覆盤,查缺補漏。不要害怕失敗,每次的失敗都會換來一段成長,這是非常寶貴的~然後編程題,平時花些時間上牛客或者leetcode刷一下題就好了。
面試的時候,保持自信心,回答問題不要着急保證思路清晰。然後對每個問題都誠實回答,不會的不能裝懂,可以謙虛請教面試官。最重要的是,堅定自己的目標,不要因爲一兩次的面試失利就影響到自己的情緒和狀態,不斷的總結失敗的原因,總有一天會收到心儀公司的Offer。最後祝各位Offer收到手軟!
面試複習路線
接下來分享的系統學習資源以詳解各大互聯網公司的 Android 常見面試題爲主線,從面試的角度帶你介紹必備知識點,以及該知識點在項目中的實際應用。
幫你在現在的基礎上,重新梳理和建立 Android 開發的知識體系。無論是你短期內想提升 Android 內功實力,突破自己工作中的能力瓶頸,還是準備參加 Android 面試,都會在這份資料中有所一些收穫。
從架構基礎開始,分了8個模塊來逐步從基礎進階到架構師的環節:
多餘的話就不講了,接下來將分享面試的一個複習路線,如果你也在準備面試但是不知道怎麼高效複習,可以參考一下我的複習路線,有任何問題也歡迎一起互相交流,加油吧!
架構師築基語言基礎
目前Android APP開發主流語言就是Java語言,Java語言最大的特性就是提高了軟件的交互可能性,可以說安卓手機幾乎所有應用程序都是利用Java語言來進行編寫的。
設計思想解讀開源框架
隨着互聯網企業的不斷髮展,產品項目中的模塊越來越多,用戶體驗要求也越來越高,想實現小步快跑、快速迭代的目的越來越難,插件化技術應用而生。如果沒有插件化技術,美團、淘寶這些集成了大量“app”的應用,可能會有幾個g那麼大。
所以,當今的Android移動開發,不會熱修復、插件化、組件化,80%以上的面試都過不了。
360°全方位性能調優
在不同層次的開發工程師手裏,因爲技術水平的參差不齊,即使很多手機在跑分軟件性能非常高,打開應用依然存在卡頓現象。
另外,隨着產品內容迭代,功能越來越複雜,UI頁面也越來越豐富,也成爲流暢運行的一種阻礙。綜上所述,對APP進行性能優化已成爲開發者該有的一種綜合素質,也是開發者能夠完成高質量應用程序作品的保證。
Android框架體系架構
Android框架體系架構(高級UI+FrameWork源碼) 這塊知識是現今使用者最多的,我們稱之Android2013~2016年的技術。
Android開發者也往往因爲網上Copy代碼習慣了而導致對這塊經常“使用”的代碼熟悉而又陌生:熟悉的是幾乎天天在和它們打交道, 天天在複製這些代碼 ;陌生的是雖然天天和這些代碼打交道,但是並沒有深入研究過這些代碼的原理,代碼深處的內涵。
NDK模塊開發(音視頻開發系列)
NDK(Native Development Kit縮寫)一種基於原生程序接口的軟件開發工具包,可以讓您在 Android 應用中利用 C 和 C++ 代碼的工具。通過此工具開發的程序直接在本地運行,而不是虛擬機。
在Android中,NDK是一系列工具的集合,主要用於擴展Android SDK。NDK提供了一系列的工具可以幫助開發者快速的開發C或C++的動態庫,並能自動將so和Java應用一起打包成apk。
Flutter學習進階
2020 年無疑是 Flutter 技術如火如荼發展的一年。現在這門技術也依然非常有價值。
每一個移動開發者都在爲 Flutter 帶來的“快速開發、富有表現力和靈活的 UI、原生性能”的特色和理念而癡狂,從超級 App 到獨立應用,從純 Flutter 到混合棧,開發者們在不同的場景下樂此不疲的探索和應用着 Flutter 技術,也在面臨着各種各樣不同的挑戰。
微信小程序開發
微信小程序作爲現在比較火的編程開發應用場景之一,深受市場的青睞,這讓不少開發者眼饞不已。但是對於初學者來說,就完全摸不着頭腦了,不知道微信小程序開發製作需要學習那些知識,有需要的朋友可以參考本篇。
Android相關源碼解讀
“編程語言是程序員的表達的方式,而架構是程序員對世界的認知”。所以,程序員要想快速認知並學習架構,讀源碼是必不可少的。閱讀源碼,是解決問題 + 理解事物,更重要的:看到源碼背後的想法;程序員說:讀萬行源碼,行萬種實踐。
主要內含微信 MMKV 源碼、AsyncTask 源碼、Volley 源碼、Retrofit源碼、OkHttp 源碼等等。
Android BAT高級開發面試題及答案解析
面試前夕,刷題衝刺
面試的前一週時間內,就可以開始刷題衝刺了。請記住,刷題的時候,技術的優先,算法的看些基本的,比如排序等即可,而智力題,除非是校招,否則一般不怎麼會問。
關於面試刷題,我個人也準備了一套系統的面試題,幫助你舉一反三: