首頁>科技>

到今年7月,我已經工作了整整3年!匆匆三年如白駒過隙,我還依然記得2017年的夏天。

在那個夏天,我脫下了屬於大學時代的學位服,告別我的整個學生時代,我找到我的第一份正式的工作,也經歷了我從校園融入社會的坎坎坷坷!那個朝氣蓬勃的時代、也是一個屬於青春的年代。現在回味、無比悠長。

原諒我矯情了一會兒,現在進入正題。想知道阿里面了9次,騰訊面了5次的我,為什麼會入職位元組跳動嗎?看官,請你們接著往下看。

25次大廠面試的原因

我相信每一位軟體開發的畢業生都夢想著進入像BAT這樣一線大廠,你們都想著進入當然我也不例外,誰叫我們都是“同道中人”呢!

先說說我吧,雖然我不喜歡別人誇但是你們誇我還是有一點小驕傲的。雙非一本畢業,雖然談不上多麼厲害但是也還行,別說讀研我是真的不喜歡讀書,讀研天天要背英語單詞難道你們不覺得煩嗎?我比較喜歡有邏輯性的事物,因為這樣在之後的大廠面試中演算法題基本都答對了。

我吧,接觸程式設計接觸的比較早,在高一的時候因為我哥給我帶了一本自學C語言的書,我便開始沉迷在程式設計的海洋裡,一蹶不振。到現在那本書我還沒有扔掉,現在有時間的時候都會看一看,不過現在看來裡面的知識點太少了,適合剛起步的新手學習。對了這本書叫《C primer plus》,安利一下。

因為高中三年都熱愛著程式設計,所以我高考完以後報考的志願確定了是計算機這一方向,別人說大學生活都是豐富多彩的,我也信了高中老師的鬼話,說什麼高中三年不要玩,好好學習等到上了大學隨便你玩,老師都不帶管你的。以至於到現在都還沒有女朋友,真氣死我了...

大學四年中,我自學過Java、Andorid、C++,到後來火熱的GO語言、AI,也有一定的了解,卻因為大學老師的一段話走上了APP的開發之路,因為當年抖音的爆火,無數短視訊APP橫空出世,他說:將來做Android的程式設計師肯定特別吃香,就因聽了老頭這話一入坑便是三年。

雖然現在也挺好,在位元組能到稅後34K,但是我還是覺得,程式設計師需要的不是行情行業,需要的是實力和技術,只要你有硬實力,無論市場行情怎樣,走到哪都會公司企業接納你。內推不就是一個很好例子嗎?

9面阿里,5面騰訊的心路歷程

阿里和騰訊和位元組一直是我追求目標,其實畢業前,我並沒有找到心儀的工作,只是找到了一家小型網際網路公司做Android開發(當然,是在面試完騰訊和阿里之後我才明白了我自身實力的不足)。

但是咱不能放棄,一次不行還有第二次,兩次不行還有無數次。起碼我得進他們的研發部看看他們的大牛到底有多厲害才能進得去那樣的大廠?

於是,我開始我的三年面試大廠之路;

三年,我卡死在無數面試題之下,挫敗了我也成就了我

我這個人最好的好處就是會在失敗中總結,面試遇到不會的題目我會在心中記下,面試結束以後再網上找答案,在記錄在我自己的學習筆記中。

比如像Android的音視訊,UI執行緒、view分發反向制約的方法、Future和microtask執行順序,Java的物件鎖和類鎖、生產者消費者(非阻塞式)我都會記下來。這也為我之後成功入職位元組跳動做好了鋪墊。

阿里9次面經

一面(2017校招)

資料庫的四大特徵,資料庫的隔離級別?HTTP 與 HTTPS 有什麼區別?資料庫設計中常講的三正規化是指什麼?說一下反轉連結串列?靜態代理和動態代理的區別,什麼場景使用?執行緒池都有哪幾種工作佇列?兩個程序同時要求寫或者讀,能不能實現?如何防止程序的同步? 什麼是 ANR 如何避免它?APP效能穩定性是怎麼做的?你做了記憶體優化最大的感受是什麼?Kotlin 特性,和 Java 相比有什麼不同的地方?react native 有多少了解?講一下原理。

二面(2017秋招)

怎樣獲取當前執行緒是否是主執行緒怎樣檢測函式執行是否卡頓常用的對稱加密演算法,有什麼同view分發反向制約的方法這次的面試沒及時覆盤,所以後半個小時的面試題忘得差不多了。這次的面試官比較嚴肅,搞得我有點緊張,所以最後 還是掛了,然後就是新一輪的面試。

三面(2018春招)

dart是值傳遞還是引用傳遞Widget和element和RenderObject之間的關係widget的root節點mixin extends implement之間的關係jvm記憶體模型Future和microtask執行順序await fordart中..的用法

四面(2018年4月春招)

Future和microtask執行順序dart中..是什麼await for使用singleinstance的啟動模式如果不指定棧名,是怎麼分配的wait和sleep的區別jvm執行緒私有的有哪些動態代理的方法怎麼初始化的

五面(2018年10月秋招)

簡單介紹專案了解哪些資料結構了解哪些排序演算法堆排序LinkedList與ArrayList;HashMap擴容 ConcurrentHashMapTCP與UDP,區別及運用場景http是用的TCP還是UDPhttp與https的區別JVM記憶體模型(Static方法在哪個區)Activity生命週期,Activity啟動模式,Handler原始碼旋轉陣列

六面(2019年3月春招)

final、finally、finalize的區別抽象類的成員變數與成員方法的繼承union與union all的區別MySQL的索引的實現B+樹查詢的時間複雜度,資料結構在瀏覽器輸入網址敲回車後經歷了什麼三次握手https的加密流程對稱加密與非對稱加密原理(RSA、AES)手撕DCL單例還了解什麼設計模式

七面(2019年四月春招)

動態代理的方法怎麼初始化的cglib動態代理三個執行緒wait,喚醒情況是什麼樣的最終是誰持有的activity,handler記憶體洩露(記憶體洩漏這點真的是無比幸運,剛好找到的視訊裡面講過)handler的sendmessage和postdelay的區別arraylist和hashmap的區別,為什麼取數快差不多重複的和模糊的

八面(2019年9月秋招)

stringbuilder 和stringbuffer區別lock和syncrognized原理區別,適合什麼場景。實現生產者,消費者handler原理,是如何實現延時的。一個activity啟動另外一個activity的生命週期。反轉連結串列歸併排序快速排序

九面(2020年5月春招)

抽象類和介面解釋一下。講講類的載入機制。jvm的記憶體回收機制,那你了解哪些記憶體回收演算法。主要用的那個演算法。抽象類和介面的區別。Activity有哪些啟動模式Fragment的生命週期和Activity有哪些不同,執行順序解釋一下。(這個回答的有點迷,只能說大體是那麼一回事)執行緒和服務的區別,解釋一下。事件分發機制講解一下,view中有個onFilterTouchEventForSecurity還是啥,小哥哥說是view中獨有的一個方法,你了解嗎?(英語水平不過關,沒聽清是啥方法,表示不清楚。)充值模組如何進行的封裝handler的機制講解一下。模板方法講解一下(腦袋抽了,記不起來)如何保證應用的安全性,做了哪些處理。加固的原理了解嘛。騰訊5面面經

一面

mmap + native 日誌優化?

講了傳統日誌列印的兩個效能問題,一個是反覆操作檔案描述符表,一個是反覆進入核心態,然後講了 mmap 的原理機制。

廣播和 EventBus 的區別?

說 EventBus 的實現原理是基於反射,裡面管理了兩張表,且程式碼之間關聯性不大不易於維護,EventBus 不支援跨程序通訊,被面試官反問你確定不支援跨程序?我說我的看的原始碼是不支援,面試官說那好吧。

常用設計模式你了解哪些?

我開始巴拉巴拉說了一大堆,其中說到了裝飾設計模式,被面試官打斷了,請你具體說說裝飾設計模式。

跨程序通訊有哪些?

管道,訊號,訊號量,檔案,本地套接字,共享記憶體,binder 驅動

簡單講講 binder 驅動吧?

從 Java 層來看就像訪問本地介面一樣,客戶端基於 BinderProxy 服務端基於 IBinder 物件,從 native 層來看來看客戶端基於 BpBinder 到 ICPThreadState 到 binder 驅動,服務端由 binder 驅動喚醒 IPCThreadSate 到 BbBinder 。然後又講了虛擬記憶體、實體記憶體和記憶體對映,跨程序通訊的原理是要基於核心的, 當我講到 binder_open 、binder_mmap 和 binder_ioctl 是被面試官打斷了,估計是怕我講太久了。

跨程序傳遞大記憶體資料如何做?

我說 binder 肯定是不行的,因為對映的最大記憶體只有 1M-8K,可以採用 binder + 匿名共享記憶體的形式,向跨程序傳遞大的 bitmap 需要開啟系統底層的 ashmem 機制。

說說 ConcurrentHashMap 的實現原理說下,初始化大小是多少?

是執行緒安全的,實現原理採用的是分段鎖,初始化大小是 16 ,必須是 2 的冪次。

啟動優化怎麼優化?

我說了關鍵優化 Application ,被面試官打斷了,說大家都能想到的東西你不要說了,我想聽的是你能不能站在系統的角度去做一些優化,我提到了優化包體積大小能優化啟動速度,優化 dex 分包能優化啟動速度,可以參考最新的華為方舟編譯器等等。

你寫的 rxpay 和 rxlogin 具體怎麼實現的?

一般我們整合第三方登入和第三方支付 SDK 都需要監聽 onActivityResult 方法,我是參考了 RxPermission 的實現方案添加了透明 Activity 。

kotlin + fullter 方面的

二面

單例設計模式都寫寫,靜態內部類是怎麼保證執行緒安全的?synchronized 底層實現原理,ReentrantLock 公平鎖與非公平鎖。主執行緒等待所有執行緒執行完畢,再執行某個特定任務怎麼實現?原理和原始碼看過沒?自定義 view 的一般流程,要注意些什麼如何優化,點選時間和長按時間分別是怎麼實現的?四種啟動模式,在原始碼分析中的原理是怎樣的?講講 bindService 的過程,你當初是怎麼優化後臺服務程序的?開發中你都用到了哪些設計模式?說說當時具體的場景。為什麼你要用方法工廠,另外兩種呢?RxJava 在使用過程中碰到了某些不友好的錯誤一般怎麼解決?發現了記憶體洩露一般怎麼解決分析,有沒有碰到過系統服務記憶體洩露的問題?你們用的 okhttp ?那你有沒有做過一些網路優化呢?比如弱網環境。給你個數 1 吧,比如 1000011 裡面有幾個 1 ?快排了解不?最壞的情況是怎樣?如果有大量重複資料怎麼優化?

三面

講講 handler 的底層實現原理?這麼簡單?問到碗裡來了,後面漸漸說到延遲訊息是 nativePollOnce 來處理的,在 6.0 以上用的是 epoll 方式來監聽檔案描述符。接著問道了為什麼要用這種方案?它跟 poll 和 select 比起來有哪些優勢?它是怎麼監聽的你看過它的內部實現原理沒?反正感覺很難受了。說說你做的日誌記錄優化?你在每個檔案的最後寫入了當前內容的大小,你有沒有想過如果檔案被破壞的情況?這種異常情況怎麼處理?後面還問到了加密和壓縮。你看過 binder 驅動的原始碼,說說他的記憶體對映過程,說說客戶端等待服務端處理返回的流程,如果要跨程序傳遞大記憶體資料你具體會怎麼做?簡單寫一寫吧。在公司做過哪些優化?記憶體優化,啟動優化,網路優化,包體積優化,具體說說包體積優化。我提到了包體積優化不僅僅是優化了包的大小,包體積太大從安裝的那一刻開始,我們的應用就可能比較慢了,因為 pms 會去拷貝解壓解析我們的 apk 安裝檔案,會去優化我們的 dex 等等,包體積太大還會影響我們的啟動速度。然後就巴拉巴拉說具體怎麼做,問到了為啥混淆資源能減少包體積大小?你當時優化的時候效果是怎樣的減少了多少?開發過程中遇到的一些最難解決的問題?提到了動態修復替換載入 so ,那你知道怎麼修復 class 嗎?怎麼修復資源呢?後面又聊到了外掛化,提到了 360 用的是借屍還魂,那如果我們在外掛的 Androidmanifest.xml 中註冊了其它屬性該怎麼解決,資源方面怎麼處理?

四面

先談談自己的專案

遠端資料庫傳輸圖片到app端,我們當時將圖片轉換成base64存在資料庫中,然後傳到app端,app解析base64獲得bitmap,直接顯示然後面試官瘋狂diss 為什麼要將圖片轉成base64再傳(二面也diss這個,問是否可以直接傳圖片地址)

講一下http連線的框架retrofit原理什麼是動態代理自定義view繼承viewGroup的情況activity的生命週期對handler機制的了解

五面

java異常分類什麼是編譯時異常object的方法有哪些虛擬機器為什麼能讓class檔案讓機器識別除了json之外,客戶端和伺服器通訊還有哪些格式

說了xml,hashmap,但是好像不是很滿意,後來網上查到還有protobuf

原始碼中looper的while迴圈是怎麼確定排程的,比如MQ為空時怎麼辦?事件分發位元組跳動面試題

一面

Jvm虛擬機器messageQueue會不會阻塞ui執行緒物件鎖和類鎖之字形列印樹還有其他的記不清了,主要是我對二面印象太深刻了

二面

dart是值傳遞還是引用傳遞、Widget和element和RenderObject之間的關係widget的root節點mixin extends implement之間的關係jvm記憶體模型Future和microtask執行順序dart中…的用法await for

三面

linux網路模型b+樹阻塞佇列redis和MongoDB的區別。幾個概念對比,還有底層實現。演算法題: mergeksortedlist,時間複雜度如何?HashMap 如果一直 put 元素會怎麼樣?hashcode 全都相同如何?equals方法都相同 如何?

所以的面試題和答案都被我整理成PDF,這也為我入職位元組跳動提供的保證,近期需要面試的,需要面試題參考的小夥伴如下領取方式。

最新評論
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 蘋果單日下架近3萬款遊戲,騰訊網易坐收漁利