一個6年高級Android程序員的年終面試總結,含淚親訴一波三折的工作之旅,讓你不再迷茫!

人生是一個漫長的過程,我們懷有太多的期望,就難免會遭遇失望與挫折。

今天這篇文章是我自己2020的小總結,2020感恩遇見。

一年的遭遇

2020開頭就是一個不平凡的一年,疫情來襲,許多互聯網公司面臨倒閉的風險,而很多程序員則在面臨着失業裁員的風險。

而我就是裁員大隊中的一員,組織架構調整,進行了人員優化,業務線被解散,被裁員。

然後爲了更快的工作, 草草的面試了幾家公司最後入職了一家小公司,每天做着沒有技術含量重複的工作,剛開始只是想填補被裁員的資金漏洞,但是工作久了還是無法適應,工作都是一些邊緣化的內容,自己考慮到沒有什麼實質性地成長,然後在幾個月後裸辭了。

後來開始重視面試,仔細挑選公司投遞簡歷,在面試前也前前後後複習準備了四五個月,後來面試了十幾家大小廠,拿到了幾個offer,入職了一家大廠,目前工作已經有小几個月,工作氛圍很好,幹勁滿滿,2021繼續加油!

不放棄,不氣餒!

接下來分享一下面試的一些題目,只記錄了一部分,因爲有些忘了。

字節跳動4輪面試

一面

  • 插件化,啓動activity的hook方式,taskAffity
  • okhttp支持HTTP2?http2的功能有哪些?tcp方面擁塞控制?tsl的握手和具體的非對稱加密算法。非對稱名稱
  • handler的post(Runnable)如何實現的。callback,runnable,msg的執行優先級。
  • 阻塞是怎麼實現的?爲什麼不會阻塞主線程?
  • 求二叉樹中兩個節點之間的最大距離。
  • 206含義,未修改資源是哪個,302含義,301含義
  • 多進程通信問題。binder優勢。aidl生成的java類細節。多進程遇到哪些問題?
  • 動態代理傳入的參數都有哪些?非接口的類能實現動態代理嗎?ASM的原理
  • Application和Activity在Context的繼承樹上有何區別?二者使用上有何不同?
  • 任意一顆二叉樹,求最大節點距離

二面

  • 設計一個日誌系統。
  • 內存泄露的分類。怎麼查看內存泄露的問題
  • touch事件源碼問題。
  • 組件化的問題。module和app之間的區別。moduler通信是如何實現的。
  • native奔潰的日誌採集,怎麼處理?
  • 註解實現一個提示功能:如果int的值大於了3需要提示。

三面

  • 介紹下flutter的啓動流程
  • 介紹下flutter與weex的區別
  • 組件化介紹一下
  • webview中與js通信的手段有哪些?
  • 介紹下flutter_boost的原理

四面

  • 適配器和裝飾模式各自特點和使用場景
  • 視頻編解碼是怎麼做的
  • 三色球排序

騰訊面試

  • 音視頻採集編碼播放流程
  • Mediacodec編碼內部原理與工作流程(什麼狀態機之類的),使用Mediacodec時遇到過什麼問題,怎麼解決的
  • ffmpeg怎樣編碼和解碼的,怎麼做視頻編輯,添加特效
  • 怎麼取一幀視頻畫面編輯成圖片並將二維碼合成到圖片中,然後進行壓縮處理,壓縮要保證圖片的清晰度不變
  • 平時做過哪些性能優化,怎麼做的,已經發布的app怎麼監測性能
  • Jetpack會不會,livedata、databinding的使用及原理
  • Kotlin、flutter也提了一下
  • Android中進程通信方式除了aidl,還有什麼用的比較多(不包括Linux的)
  • App的啓動流程,從點擊圖標開始
  • 一個算法問題
  • app的啓動優化方案有哪些(主要是非常規的那些方法)

滴滴面試

  • 創建線程有哪幾種方法
  • 線程池的運行機制
  • 如果有一個任務需要線程池裏所有任務執行完以後執行,應該怎麼做
  • synchronize和lock有什麼區別
  • 如何避免線程鎖死
  • 手寫單例,如果在不使用鎖的情況下創建單例並保證單例安全性
  • handler原理,子線程可以創建Handler嗎?
  • 內存泄漏與內存溢出的區別
  • 有沒有做過安全性能檢測的項目
  • 原生與H5如何交互,傳參數?
  • 用過哪些算法?
  • 如何在服務中啓動一個耗時操作
  • Activity的啓動模式

小米麪試

  • 介紹一下binder和原理
  • measure layout draw流程,滑動衝突
  • 常用的多線程工具類。blockingqueue ,concurrenthashmap,信號量,countdownlatch,cyclicbarrier,exchanger等,stringbuffer
  • stringbuilder 和stringbuffer區別
  • lock和syncrognized原理區別,適合什麼場景。
  • 實現生產者,消費者
  • handler原理,是如何實現延時的。
  • 一個activity啓動另外一個activity的生命週期。

算法題:

  • 反轉鏈表
  • 歸併排序
  • 快速排序
  • feiboqiena數列
  • 二分查找
  • 兩個隊列實現棧
  • 兩個棧實現隊列
  • 判斷鏈表是否成環,找到成環的交點。

順豐面試

  • 使用過hook技術嗎?談談理解。
  • 談談對android虛擬機的理解。
  • 有做過推送相關嗎?原理有去了解過嗎?
  • 談談startActivity的流程。
  • 談談對自定義View的理解。
  • 談談binder的理解。
  • 你知道數據庫有哪些,android sqlite存儲數據的上限大小是多少?
  • 談談TCP與UDP的理解。
  • Java的引用。
  • GC算法
  • 談談對android應用的理解。

手百3輪面試

一面

  • 爲什麼工作一年就想換工作?
  • onTouchEvent/onTouchListenr.onTcouchEvent/onClickListenr
  • hashmap的原理?
  • java的hashcode和equals的區別
  • java的gc瞭解多少?
  • kt的伴生對象是餓漢模式還是懶漢模式?
  • handler.postDelayed的原理
  • ANR怎麼產生?怎麼捕捉?
  • 智力題:桌子上有101塊餅***拿先手,他拿後手,你需要怎麼贏
  • tcp 三次握手/四次揮手, 爲什麼要三次握手,四次揮手?
  • 內存泄漏是什麼?怎麼找?
  • 算法題:斐波拉契數列,遞歸的方式怎麼優化?

二面

  • 手淘這種大型app是怎麼迭代起來的?
  • 你對小程序的原理了解麼?
  • v8binding怎麼做?
  • 你項目的價值是什麼?
  • 圖片緩存怎麼做?你要設計一個圖片緩存框架怎麼搞?
  • lrucache怎麼實現?爲什麼是o(1)的時間複雜度?
  • voliate 關鍵字解釋下?
  • voliate 關鍵字不能實現什麼?
  • https解釋下
  • 常見的對稱加密算法和非對稱加密算法有哪些?
  • 讓你設計一個打點系統怎麼做?
  • 如果進程被殺死或者切換後臺,數據如何保存丟失?
  • 你怎麼設計埋點系統一個線程模型?
  • 快速排序?快速排序是穩定的麼?
  • 如何實現一個快速排序的穩定性?
  • minstack怎麼設計?
  • kotlin和java混用有哪些問題?
  • 設計一個數據結構,微博裏面有人發了文章怎麼實現?關注怎麼實現?
  • 微博裏面有人發了文章,關注的人如何獲取最新的10條?如何獲取關注的人的文章的最新1000條?設計一個高效的算法

三面

  • 你爲什麼選擇換工作?
  • 你組裏面的人都怎麼樣?
  • 你怎麼解決項目中的難點?
  • 你有工作中遇到過哪些比較麻煩的地方?
  • 你平時怎麼學習的啊?
  • 你除去學習之外都看什麼書?

網易2輪面試

一面

  • HashMap擴容原理,爲什麼要2的指數冪容量,如果輸入17會是多少容量?

跟HashCode有關係,如果輸入17,會向後達到2的指數冪,32。

  • CurrentHashMap 讀寫鎖是如何實現的?

如果沒有hash衝突的情況下,使用CAS進行插入,如果有hash衝突,使用synchronized加鎖進行插入。當鏈表長度大於8且數據長度>=64時,會使用紅黑樹替代鏈表。

ReentrantReadWriteLock類中有readLock()和writeLock()方法可以分別獲取WriteLock和ReadLock對象,調用他們的lock方法,就可以實現讀寫鎖。實現原理就是AQS的acquire和acquireShared方法。

  • List加鎖要如何加?

二面

  • app優化 內存優化 cpu使用率優化
  • 如何設計一個類似於微信朋友圈的首頁的功能,UI 數據等方面
  • 如何設計一個無限數據的氣泡顯示聊天內容
  • 5個G數據,如何在500M內存的情況下實現排序
  • 大文件在傳輸過程中要考慮哪些問題,如何保證大文件的一致性
  • JSbridge 是如何實現js和native聯通的
  • 如何做到單個信號源,多個頁面響應

一些高頻重點問題

  • APP性能優化 內存優化 cpu佔用率 流暢性等,考慮一下如何評價一款app的性能,如何監控線上app的性能問題

  • 多線程同步Sync和Lock實現原理

  • HashMap ConcurrentHashMap實現原理 鏈表轉紅黑樹的條件,擴容原理,ConcurrentHashMap線程安全原理、如何做到性能好

面試總結

講一下大廠面試一些必備的技能

1. 一般情況下第一輪都是基礎面試,需要紮實的基礎

  • 最常用的Android 基礎知識
  • Java 基礎知識
  • 瞭解一些 常用東西的原理,例如:handler, thread 等
  • 項目中的技術點

2. 第二輪的時候需要了解更深層次的東西

  • Android 事件分發機制原理
  • Android 繪圖機制原理
  • WindowManager 的相關知識
  • 進程間傳輸方式
  • Java 內存管理機制

3. 能進入第三輪基本沒什麼問題,但是要注意以下問題

  • 該輪一般是 老大或者部門負責人,問的問題一般都看 深度與廣度

  • 當問及薪水的時候,要說一個合適的,小公司隨意,大公司一定要慎重,當心裏沒底的時候,可以告訴對方,讓對方給一個合理的薪資。一般都是在原工資基礎之上增長,聽獵頭說一般漲幅都在15%-30%,超 NB 的可以要30%及以上,如果感覺自己還不錯的,挺厲害的,建議最高20%,一般人就定在15% 左右最靠譜。公司內部一般有一套機制,根據公司情況而定。

  • 我們的面試原則就是拿到合理薪資,得到 offer

  • 個人發展情況,這個問題很難回答,如果和公司方向不符合,極有可能和公司無緣。建議多試探性的問問公司缺少什麼,你能否給予公司對應的東西。當然對於有自我追求的人,那可以放心大膽的提。我的方向就是架構師,哈哈哈,挺極端的,別學我哦。我感覺選擇都是雙向的,因此我知道自己需要的是什麼。

  • 你最擅長什麼UI 還是其他什麼?這個問題更不好回答。你要說你擅長 UI,是不是意味着你其他能力就不行?雖然我不知道面試官的用意,但是我能感覺到,這個問題不是那麼好回答,我會回答說自己都行,來什麼業務接什麼需求。可能回答不太好,總之和公司的職位吻合就行,這樣總不至於出錯吧。

最後

其實客戶端開發的知識點就那麼多,面試問來問去還是那麼點東西。所以面試沒有其他的訣竅,只看你對這些知識點準備的充分程度。so,出去面試時先看看自己複習到了哪個階段就好。

關於知識梳理,這裏再分享一下我面試這段時間的複習路線:(以下體系的複習資料是我從各路大佬收集整理好的)

知識梳理完之後,就需要進行查漏補缺,所以針對這些知識點,我手頭上也準備了不少的電子書和筆記,這些筆記將各個知識點進行了完美的總結。

3.項目覆盤

實際上,面試的一二輪所問到的技術問題,很多都是圍繞着你的項目展開,因此在面試前最後要做好的一件事情就是項目覆盤。關於項目覆盤,我個人的思路如下,可供參考:

  • 你在這個項目中承擔了什麼樣的角色?
  • 這個項目的背景是什麼,如果是技術項目,爲什麼要做?
  • 有哪些技術難點,是怎麼解決的,是否還有更好的方案?
  • 你認爲項目中是否有可以改進的點?
  • 這個項目解決了什麼問題,最好用數據說話,這個數據又是怎麼得出來的?

提前把思路捋一捋,上面這些問題好好思考或準備一下,做到心中有譜以後,自然能夠面試官聊得融洽,保持一個好的心態,通過的機率就會更大一些。

資料太多,全部展示會影響篇幅,暫時就先列舉這些部分截圖,以上資源均免費分享,以上內容均放在了開源項目:github 中已收錄,大家可以自行獲取(或者關注主頁掃描加微信獲取)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章