大家應該看過很多分享面試成功的經驗,但根據倖存者偏差的理論,也許多看看別人面試失敗在哪裡,對自己才更有幫助。
最近跟一個朋友聊天,他準備了幾個月,剛剛參加完位元組跳動面試,第二面結束後,嗯,掛了…
所以啊,不管怎麼樣,不論是什麼樣的大小面試,要想不被面試官虐的不要不要的,只有刷爆面試題題做好全面的準備,當然除了這個還需要在平時把自己的基礎打紮實,這樣不論面試官怎麼樣一個知識點裡往死裡鑿,你也能應付如流~
位元組跳動Android實習面試涼涼經
一面問的 Java 和 Android 基礎
1、Jvm虛擬機器
2、messageQueue會不會阻塞ui執行緒
3、物件鎖和類鎖
4、之字形列印樹
5、還有其他的記不清了,主要是我對二面印象太深刻了。
二面問的 Flutter 和 Dart
1、dart是值傳遞還是引用傳遞
2、Widget和element和RenderObject之間的關係
3、widget的root節點
4、mixin extends implement之間的關係(除了extends其他的沒怎麼用過。。)
5、jvm記憶體模型(感覺這個是面試官可憐我,看我什麼都不會才問的=。=)
6、Future和microtask執行順序
7、dart中..的用法(基本沒用過。。)
8、await for(沒用過。。)
說實話,第一個、第三個、第六個我準備的話應該能答出來的,但是一個多月沒碰Flutter了,忘了都差不多。。。
此外GitHub和部落格維護好很重要,像我這種demo隨手寫,隨手刪的人直接GG。。
面試位元組跳動需要做哪些準備?
接下來將分:面試前、面試中、面試後 三個部分,解答一些常見的問題。
面試前
如何尋找一個面試機會?
- 內推:首先推薦大家走內推途徑,內推的簡歷通過率遠高於其他方式;內推的途徑有:聯絡工作的師兄師姐、在論壇上找對應的內推貼、參加校招宣講會 等
- 對應公司招聘官網直接投遞:需要大家明確自己想投哪些公司,直接搜尋公司的官方招聘官網(大公司普遍都有),找到自己想投的崗位投遞
- 相關招聘網站投遞:在各類招聘網站上HR也會發布對應招聘資訊,可以對應的投遞
需要為面試做哪些準備?
- 一份優秀的簡歷:要能說明 學校、學歷、實習經歷、在校期間技術專案經歷 等,具體的在姊妹篇《校招啦——來自位元組跳動面試官的技術簡歷指南》,敬請期待。
- 瞭解投遞的崗位要求:就是我們常說的JD(Job Description),公司的招聘官網或釋出的招聘資訊裡面會詳細描述,如果找不到或公司沒寫,可以聯絡HR發郵件說明。
- 複習面試崗位相關知識:校招同學需要複習 計算機基礎(網路、作業系統、計算機組成原理、數學等)、編碼能力(資料結構、演算法) 、技術方向基礎知識(如前端同學主要看html/css/js)
- 整理自己做過的專案:包括實習專案、個人專案、科研學術專案、參與社群開源專案等,在面試時需要做自我介紹,面試官也可能會根據你的簡歷詢問專案內容。
- 適當的做一些演算法題:前端、測試等一些崗位可能不是特別重視演算法,但做一些演算法題能訓練你的思維、程式碼能力;常用的刷題網站:LeetCoode、牛客網、各大高校OJ等
面試中
如何自我介紹?
技術面試自我介紹時請focus在技術方向上,有些同學會準備一段華麗的開場白,介紹自己大學期間的學生會、組織活動等經驗,這些內容對於技術面試沒有太多吸引力,不利於面試官找到對應你的合適問題,有時候反而會在面試官心目中減分(感覺不夠專注技術)。 建議是:
- 有技術實習經歷的同學,重點介紹實習中做過的專案,說明自己在專案中的角色、負責研發了那些部分、使用了什麼技術棧、學習到了什麼。
- 沒有實習經歷的同學,可以介紹自己在目標崗位的技術方向上學習了哪些內容、有做過什麼個人專案 或者一些Demo專案。
- 有ACM等計算機競賽獲獎經歷的要說明,加分項。
- 有參與開源專案或社群建設的,建議說明,加分項。
- 學術大牛同學也可以說明自己發表論文、參與會議情況,也是加分項。如果學術方向和工作內容沒有太多關係,建議不要滔滔不絕的詳細介紹,如果學術方向剛好和崗位match 或 面試官有興趣,面試官一般會主動繼續聊下去。
沒有實習經歷可以嗎?
答案是——可以的。 有技術實習經歷當然好事,但是對於校招/實習同學來說,不一定人人都有實習經驗,或者實習經驗可能與當前崗位不match。所以不用過分擔心,一般能過簡歷參與面試的同學,都是得到了初步的認可的。沒有相關實習經驗的同學,面試時可以突出自己在其他方面的優勢(如:個人專案、開源專案、競賽、學術,參考上個問題),面試官如果認可你的知識儲備、能力、潛力就會通過。
沒有 相關實習經歷 和 沒有相關知識能力 是兩回事,有實習經歷缺沒有積累知識能力的同學,可能最終評價會不如 通過自己學習探索具備相關知識的同學。所以請一定要做好面試前的準備,讓自己符合面試崗位的要求,比如投遞前端崗位的同學,至少要學習html/css/js相關基礎知識,對當前常用前端技術棧有一定的瞭解,並且有動手實踐的經歷。
需要對業務瞭解嗎?
校招/實習 來說,並不強求對業務的瞭解,一般來說在校同學也很難對業務有深入的理解,有相關經驗瞭解當然是加分項。
面試整體流程
通常來說,一次完整的面試包括:筆試、技術面試、崗位match、HR面試。
筆試:可能是線上筆試 或 當場筆試,校招筆試題目範圍較寬,會涉及計算機基礎知識、面試方向的知識技能、程式碼coding、資料結構 & 演算法 等。
技術面試:以位元組跳動為例,校招一般是2-3輪交叉技術面試,實習一般是1-2輪,考察 計算機基礎、編碼能力 、技術方向基礎知識以及技術深度、系統設計能力、抽象能力和工程化能力、軟素質 等。一面更偏向基礎知識、技術廣度,二三面偏向技術深度、進階能力。
崗位match:一般是通過技術面試後,由業務部門負責人面試,偏向軟素質、專業能力、個人發展與規劃等。
HR面試:通常是最後一輪面試,主要聊一下職業規劃、個人訴求、面試過程中的一些問題、入職相關資訊(如可入職時間、實習時間、工作地點等)
遇到不會的問題如何處理?
首先要明確——誰都會有不會的問題。即便是工作多年的社招同學也會有知識盲區,有部分不會的問題並不會影響你的整個面試評價。所以,千萬不要不懂裝懂,這樣反而會留下負面印象。 確實不會的問題請直接和麵試官說明,可以讓面試官給一些提示,或者徵詢面試官意見看能否現場查閱相關資料(一定要在面試官許可下查詢,否則容易被算作作弊)。如果在提示或查詢資料後,解決了原本不會的問題,也是加分項——說明學習能力、應變能力、抗壓能力不錯。
面試時可以問面試官什麼問題?
在一輪面試結束後,面試官可能會說:“你有什麼問題想問的嗎?” —— 注意,這個可能也是一道面試題,面試官想通過你的問題,瞭解到你的職業訴求、個人規劃、學習能力等,所以要慎重的選擇自己的問題。 技術面試環節不建議問一些與當前面試無關、涉及公司機密、個人隱私的問題,如:加班多少/工資待遇(這個在HR面試環節可問)、公司當前收益情況、業務線具體使用的核心技術、面試官聯絡方式等 可以問一些與自己相關的技術方向問題,如:如果通過面試需要學習哪些內容做準備、面試官對你本輪的評價和建議(如果面試官不方便說,也不要追問)、面試過程中某個困惑問題的解決方法(時間限制面試官可能只能給出思路)等。
面試後
長時間沒有得到回應如何處理?
面試後請注意查收自己的郵箱、保持電話暢通,如果長時間(3-5天)沒有得到回應,建議和HR聯絡。校招的同學通常比較畏懼與HR交流,擔心本身“薛定諤的貓”狀態的結果在自己聯絡HR後就變得負向了,這個心理一定要克服,及時的確認面試結果才有利於安排之後的面試/offer選擇。 如果真的得到了不好的結果,也可嘗試問一下HR面試評價中自己的問題,不一定能得到答覆,但如果HR能告訴你也利於你及時發現、解決自己的不足,為下一次面試打基礎。
面試沒有通過可以再次投遞嗎?
有的公司有面試不通過鎖簡歷機制(一段時間內投遞無效),這個也可以和HR問清楚。 我司(位元組跳動)是不鎖簡歷的,某一崗位面試不通過任然可以繼續投遞。但是建議大家每次投遞都認真準備,你的每一次投遞、面試都可能被記錄,如果多次面試、投遞沒有體現出成長,也還是會影響後續的簡歷篩選與面試。
面試後可以在分享面試題嗎?
可以自己記錄面試相關題目、經驗,為自己未來的面試做準備資料,但不建議立即分享(包括分享再網路上和分享給其他同學),有些公司筆試、面試時時會簽署協議的,如果發現分享最新面試、筆試題目,可能會直接取消錄用資格。
面試位元組跳動需要儲備哪些知識?
很多人準備面試的時候,大多數就會這樣的,開啟百度,輸入 “Android 面試題”,找幾個多的開始看。
這雖然看起來很自然,但是並不是一種 健康的方式,面試題的作用應當是查缺補漏,上學的時候也不是直接發習題冊然後對著答案學習吧?
知乎上有個問題,叫做 如何高效學習,裡面有一個回答我覺得很符合我自己的觀點,就是 建立起自己的知識體系,建立知識體系的目的在於:
- 鞏固記憶。
- 認識自己,找到自己的優勢及不足。
- 把握複習的進度。
- 經驗總結。
目前我自己的總結的會分為以下幾個大點:
Java 基礎知識
- 物件導向的基本思想
- Object類相關:Object類的幾個關鍵函式、String涉及到的常量池概念,序列化 & 反序列化。
- 重要關鍵字:final、static。
- 內部類:內部類的分類、應用場景、內部類編譯成class後是怎麼樣的。
- 抽象類 & 介面:區別、應用場景。
- 編碼:編碼的目的、分類。
- 異常:異常體系、自定義異常。
- 註解:註解的基本概念、分類、編譯時註解 & 執行時註解。
- 容器:重要容器的內部實現、容器間的對比。
- 記憶體模型。
- 垃圾回收。
- 類載入的過程。
- 泛型:分類、萬用字元 & 上下邊界、泛型擦除。
- 反射:使用。
Android 基礎知識
- Dalvik、Art虛擬機器
- Activity:生命週期、launchMode。
- Fragment:生命週期、懶載入、兩種Adapter之間的區別。
- BroadcastReceiver:基本概念、廣播分類、許可權。
- Service:生命週期、onStartCommand的返回值、startService和bindService的區別、相同程式 & 不同程式的互動、IntentService實現原理。
- 重要的工具類 & 原始碼實現:AsyncTask、HandlerThread、Handler、IntentService、LruCache、LinkedHashMap、SparseArray。
- RecyclerView:快取原理、和ListView的對比、Adapter如何適配多種layout。
- 儲存:資料庫升級 & 優化、ContentProvider,SharePreference。
- SDK版本升級的相容問題。
- Android的許可權管理機制。
圖片
- Bitmap相關:Bitmap的大小計算、質量、inJustDecodeBounds、inBitmap。
- 幾種圖片格式的對比、壓縮。
- 大圖載入:BitmapRegionDecoder
演算法
- 別無捷徑,刷題,但是刷題的時候,要按照題的型別去總結。
開源框架
- RxJava:操作符的應用場景、重點操作符的內部實現、和RxJava的對比。
- Glide:流程、快取相關的實現。
- Retrofit:流程、動態代理 & 註解解析。
- OkHttp:流程、佇列實現、快取實現。
效能
- 效能優化技巧:啟動速度優化、佈局優化、記憶體優化、電量優化、APK大小優化、列表滑動優化。
- 效能優化工具:TraceView、Systrace、除錯GPU過度繪製 & GPU呈現模式分析、Hierarchy Viewer、MAT、Memory Monitor & Heap Viewer & Allocation Tracker、LeakCanary、Lint。
- ANRANR原因ANR產生過程原始碼分析資訊收集過程trace檔案分析分析基本流程具體示例如何避免產生ANR
- 效能實踐:解決過的效能問題,從 遇到問題、分析問題、解決問題、結果 四個點進行闡述。
View
- 繪製流程:measure、layout、draw三個關鍵流程。
- 事件分發:事件分發的原理、處理過的滑動衝突問題。
- 自定義View:Canvas & Path,實現過的比較複雜的自定義View。
架構
- MVP:MVP的思想 & 優劣勢、在專案中的應用、
原始碼
- AMS
- WMS
- Binder
- 應用啟動流程
- APK相關知識點APK構成:resources.arsc組成、AndroidManifest.xml、aapt作用及原理APK打包過程APK安裝過程APK簽名 & 校驗原理dexopt原理
網路
- 基礎知識:看一下對於 <<計算機網路>> ,重點是網路分層模型、TCP/UDP、HTTP/HTTPS。
設計模式
按照23種網路模型、三個分類進行總結,每種設計模式包含以下三個方面,至少要準備常用的幾個:
- 基本概念:UML圖、簡單例子、應用場景、優勢 & 劣勢。
- Android原始碼中的實現
- 專案中的應用
多執行緒
- 看併發程式設計的藝術,這本書的目錄就是多執行緒最好的知識體系。
- 遇到過的多執行緒問題、怎麼解決的。
Gradle
- 常用配置。
- 多渠道打包。
外掛化
- 外掛化的核心思想。
- 幾種外掛化框架實現的原理。
元件化
- 元件化的優勢。
- Arouter:使用方式、實現原理。
Kotlin
- 有用到的可以看看。
多媒體
- 音訊、視訊播放。
大前端
- ReactNative、Flutter:沒學過的可以瞭解一下思想。
JNI
- 呼叫實現方式。
最後,面試前該準備哪些資源複習?
其實客戶端開發的知識點就那麼多,面試問來問去還是那麼點東西。所以面試沒有其他的訣竅,只看你對這些知識點準備的充分程度。so,出去面試時先看看自己複習到了哪個階段就好。
這裡再分享一下我面試期間的複習路線:(以下體系的複習資料是我從各路大佬收集整理好的)
《Android開發七大模組核心知識筆記》
《960全網最全Android開發筆記》
《379頁Android開發面試寶典》
歷時半年,我們整理了這份市面上最全面的安卓面試題解析大全
包含了騰訊、百度、小米、阿里、樂視、美團、58、獵豹、360、新浪、搜狐等一線網際網路公司面試被問到的題目。熟悉本文中列出的知識點會大大增加通過前兩輪技術面試的機率。
如何使用它?
1.可以通過目錄索引直接翻看需要的知識點,查漏補缺。
2.五角星數表示面試問到的頻率,代表重要推薦指數
《507頁Android開發相關原始碼解析》
只要是程式設計師,不管是Java還是Android,如果不去閱讀原始碼,只看API文件,那就只是停留於皮毛,這對我們知識體系的建立和完備以及實戰技術的提升都是不利的。
真正最能鍛鍊能力的便是直接去閱讀原始碼,不僅限於閱讀各大系統原始碼,還包括各種優秀的開源庫。
資料太多,全部展示會影響篇幅,暫時就先列舉這些部分截圖;
需要的朋友,可以點選我的GitHub免費領取!