十年磨一劍:站在面試官角度聊聊現下Android大環境面試,“野生”程序員現階段面試問題 & 學習誤區

最近看書學習工作,有一些心得體會,點點滴滴,閒言碎語。

一份Android中級研發面經

接下來都是面試過程中普遍問到的基礎知識(面試收集主要來自於bilibili,嵩恆,螞蟻金服等互聯網公司)。

1. 啓動

  • 啓動模式
  • App啓動流程
  • Binder
  • ServiceManager
  • 序列化

2. 進程

  • IPC 進程通訊方式
  • 進程保活

3. Hook

Hook 的選擇點:靜態變量和單例,因爲一旦創建對象,它們不容易變化,非常容易定位。

Hook 過程:

  • 尋找 Hook 點,原則是靜態變量或者單例對象,儘量 Hook public 的對象和方法。
  • 選擇合適的代理方式,如果是接口可以用動態代理。
  • 偷樑換柱——用代理對象替換原始對象。
  • 多數插件化 也使用的 Hook技術

4. 內存泄漏

  • 構造單例的時候儘量別用Activity的引用;
  • 靜態引用時注意應用對象的置空或者少用靜態引用;
  • 使用靜態內部類+軟引用代替非靜態內部類;
  • 及時取消廣播或者觀察者註冊;耗時任務、屬性動畫在Activity銷燬時記得cancel;
  • 文件流、Cursor等資源及時關閉;
  • Activity銷燬時WebView的移除和銷燬。

5. View

  • Window WindowManager WMS
  • View 工作流程
  • View.post

6. 動畫

幀動畫 :AnimationDrawable 實現,在資源文件中存放多張圖片,佔用內存多,容易OOM。

補間動畫 :作用對象只限於 View 視覺改變,並沒有改變View 的 xy 座標,支持 平移、縮放、旋轉、透明度,但是移動後,響應時間的位置還在 原處,補間動畫在執行的時候,直接導致了 View 執行 onDraw() 方法。補間動畫的核心本質就是在一定的持續時間內,不斷改變 Matrix 變換,並且不斷刷新的過程。

屬性動畫 :ObjectAnimator、ValuetAnimator、AnimatorSet 可以是任何View,動畫選擇也比較多,其中包含 差速器,可以控制動畫速度,節奏。類型估值器 可以根據當前屬性改變的百分比計算改變後的屬性值 。因爲ViewGroup 在 getTransformedMotionEvent方法中通過子 View 的 hasIdentityMatrix() 來判斷子 View 是否經過位移之類的屬性動畫。調用子 View 的 getInverseMatrix() 做「反平移」操作,然後判斷處理後的觸摸點是否在子 View 的邊界範圍內。

提升動畫 可以打開 硬件加速,使GPU 承擔一部分CPU的工作。

7. Android 進程通訊方式

  • bundle
  • ContentProvider
  • 文件
  • Broadcast
  • AIDL
  • Messager
  • Socket

8. Android 線程通信

  • Handler線程間通信
  • Handler 同步屏障機制
  • Looper.loop 爲什麼不會卡死
  • Messaage複用

9. Android 和WebView 通信

  • js調用android
  • android 調用js

10. app優化 (項目中處理的一些難點)

  • 啓動優化
  • 佈局UI優化
  • 打包優化

11. 第三方庫 源碼總結

  • LeakCanary 原理
  • OkHttp
  • 同步請求流程
  • 異步請求流程
  • 責任鏈模式 和 攔截器
  • OkHttp 流程
  • ButterKnife
  • butterknife 實現流程

面試技巧

最近面試了很多人,但是基本上都沒招到什麼滿意的人,是Android開發都涼了嗎,其實並不是,從簡歷的數量上來看,金三銀四的簡歷還是很多的,首先我們從簡歷上來說,面試官都希望看見什麼樣的簡歷呢?

大部分的簡歷,都是羅列自己的公司經歷、項目經歷,介紹了項目大概的情況,好一點的,羅列下項目的技術方案。

要知道,對於面試官來說,簡歷是很重要的一環,這是對你的第一印象評價,很大程度上決定了你的面試成敗。我在面試的時候,簡歷發給我之後,通常會看一眼面試者的項目經歷,從而決定了我的面試問題。所以,項目經歷上只需要寫下面幾個方面:

  • 項目一句話簡介,說明項目的大體情況和規模
  • 核心技術方案,介紹用到的核心技術、核心技術方案
  • 你在項目中承擔的角色以及貢獻等

實際上有了這些東西,我基本上可以瞭解你的這個項目大概是個什麼規模,需要用到哪些技術點,以及你應該有的能力範圍,下面我就會根據你的這些項目經歷來對你提問,由淺入深,可能先問你大概的技術方案,是否有更佳方案或者現在的方案是否有什麼問題等,再深入問問技術的細節,看你的技術深度和廣度。

除了項目經歷,你的簡歷上只應該出現你的亮點,切記各種廢話,什麼精通Java,精通設計模式、數據結構,這些根本不能體現你的特點,這些東西應該結合業務或者架構,例如利用設計模式改進了技術方案的流程,通過數據結構優化了程序的執行效率。

另外補充一點,好的開源項目、博客等等,這些都是比較好的加分項目,但是...如果你的開源項目連readme都沒,你的博客全是流水賬,那就不要貼了,反而容易減分。

面試實際上是一個雙向的過程,所以,一場好的面試,絕不是面試官單方面的發問,面試者應該引導面試官,把面試當作是一場技術討論,一來一回,雙方都能瞭解對方的技術實力,我相信,這樣雙方都會對這次面試滿意,通過面試也就是自然而然的了。

大公司和小公司該選哪個?

說完公司的面試,再說一下經常有讀者私信我的一個問題,那就是A公司、B公司,我到底該選哪個公司,首先我要確認下你是不是來炫耀的。

對於這個問題,其實也是有一個個人看法的,這個看法是我的主觀臆斷,可能很多人也不會這樣想,這裏寫出來,大家輕噴。

首先,如果你是剛畢業的學生,我會建議你去小公司、創業公司,但是,是技術型偏向的公司,絕不是外包或者某個公司的IT部,爲啥呢,原因很簡單,剛畢業這幾年,是你飛速成長的幾年,也是你選擇方向的幾年,在這些技術型小公司、小團隊裏,你可以非常快速的上手各種技術,沒有任何外部壓力,團隊小,大家通訊基本靠吼,不需要走流程、發郵件、約評審,這是大公司的通病——決策鏈太長,同時,你對自己的技術定位,在一段時間後,也會更加清晰。

在這之後,除非有一夜暴富的機會,就不應該在繼續在小公司待下去了,這時候,一定要去大公司進行歷練。大公司去幹什麼呢?其實很多大公司的技術並不很先進,代碼很可能也很爛,但是你去大公司,就好像游擊隊變成了正規軍,你要學的是規範和流程,小公司的這幾年,讓你的技術突飛猛進,但是卻不成章法,大公司就是讓你來沉澱技術的(這句話要屏蔽老闆),大公司經營多年,技術方案早已成型,很多開發者進去也是擰螺絲,但是,你需要的是瞭解各個系統、各個平臺的流程、優劣,做到心中有術,而不是心中有碼,如果你是一個可造之材,那麼經過這樣兩輪歷練,我相信你應該是一個很不錯的開發者了。

學習

首先,學習這件事情,就是一個認知的過程,既然是一個認知的過程,那就不能以管窺豹,而需要站在一個全局的思想上來看,例如在學習Flutter的時候,沒有必要精通所有的Widget,掌握常見的Widget之後,就應該去思考Flutter的繪製流程、刷新流程,瞭解這些,才能讓你在全局角度上掌握Flutter的渲染過程,這比你掌握幾個Widget更加有用。

更加通用的,我們平時應該儘可能的拓寬自己的知識廣度,這樣才能讓你的眼界更加寬廣。就拿Flutter來說,總有一些敏感詞噴Flutter,Flutter能不能火我不知道,能不能推廣我也不知道,但是我依然學了Flutter,這是爲啥?因爲通過Flutter我學習到了一種新的跨平臺思想,一種區別於現有的命令式編程的編程範式,一種全新的改進渲染流程的方法,掌握這些,我覺得比單純的討論阿里是不是不再用Flutter了更加有用。

學習,永遠是一個認知碾壓的過程,不斷接觸新思想、新技術,才能讓自己有更加敏銳的認知洞察力,就好像學了Flutter,你會發現Compose好像也是一樣啊,SwiftUI好像也是啊,從更高的眼界上去看這些東西,其實本質上,都是一種思想,現在的社會早已不存在信息孤島,學會將信息鏈接起來,纔是高效的認知方法。

井底之蛙永遠跳不出去井,也永遠別用阿里是不是還用Flutter這樣的事來限制你的認知,就好像三體人用質子封鎖了地球的科技進步,可悲。

努力成爲一個優秀的程序員

在大公司一定要吾日三省吾身,千萬不能貪圖安逸,一個技術用十年,你也只有一年工作經驗。

寫代碼

永遠不要上手就寫代碼。

這句話我們從小就聽——不要上手就寫作文,先想好提綱。編程也是如此,除非胸有成竹,否則絕不一碼十行。

當我們拿到一個需求進行開發的時候,一定要先在大腦中推敲推敲,這個需求的每個方面是否都是完備的,是否有異常流程,這個需求的每個技術點,是否能夠勝任這個需求,這個需求的流程,我是否完全都清楚了,這些東西都想不好,那就不是在編程,而是在「拉屎」,而且你拉的這些shit,很可能會把後面的開發者「淹沒」,造成一場信任危機。

所以,寫一個好代碼的時間一定比爛代碼花的時間更少。

不過,面對日益壓榨嚴重的資本家們,可能經常不太會給夠一個好代碼的開發時間,這個時候,就需要對代碼進行取捨了,或是找輪子,或是改輪子,總之,要把精力花在刀刃上,一個最佳的原則——make it work, make it right, make it fast,我認爲,這是一個代碼最佳的生命週期。

系統面試複習路線參考

成年人想要改變生活、逆轉狀態時,會不約而同做一件事,那就是再次學習。

接下來分享的系統學習資源以詳解各大互聯網公司的 Android 常見面試題爲主線,從面試的角度帶你介紹必備知識點,以及該知識點在項目中的實際應用

幫你在現在的基礎上,重新梳理和建立 Android 開發的知識體系。無論是你短期內想提升 Android 內功實力,突破自己工作中的能力瓶頸,還是準備參加 Android 面試,都會在這份資料中有所一些收穫。

從架構基礎開始,分了8個模塊來逐步從基礎進階到架構師的環節:

多餘的話就不講了,接下來將分享面試的一個複習路線,如果你也在準備面試但是不知道怎麼高效複習,可以參考一下我的複習路線,有任何問題也歡迎一起互相交流,加油吧!

首先是超級詳細得不能再詳細的Android開發學習思維導圖,因爲圖片實在是太大了,所以我就只把二級目錄的內容放出來,更加詳細的你們可以點擊這裏

接下來就需要梳理知識,提升儲備了!(Android移動架構師七大專題學習資源)

  • 架構師築基必備技能:深入Java泛型+註解深入淺出+併發編程+數據傳輸與序列化+Java虛擬機原理+反射與類加載+動態代理+高效IO

  • Android高級UI與FrameWork源碼:高級UI晉升+Framework內核解析+Android組件內核+數據持久化

  • 360°全方面性能調優:設計思想與代碼質量優化+程序性能優化+開發效率優化

  • 解讀開源框架設計思想:熱修復設計+插件化框架解讀+組件化框架設計+圖片加載框架+網絡訪問框架設計+RXJava響應式編程框架設計+IOC架構設計+Android架構組件Jetpack

  • NDK模塊開發:NDK基礎知識體系+底層圖片處理+音視頻開發

  • 微信小程序:小程序介紹+UI開發+API操作+微信對接

  • Hybrid 開發與Flutter:Html5項目實戰+Flutter進階

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

然後再是通過源碼來系統性地學習

只要是程序員,不管是Java還是Android,如果不去閱讀源碼,只看API文檔,那就只是停留於皮毛,這對我們知識體系的建立和完備以及實戰技術的提升都是不利的。

真正最能鍛鍊能力的便是直接去閱讀源碼,不僅限於閱讀各大系統源碼,還包括各種優秀的開源庫。

刷大廠面試題備戰,增加大廠通過率

歷時半年,整理了這份市面上最全面的安卓面試題解析大全。

1.可以通過目錄索引直接翻看需要的知識點,查漏補缺。
2.五角星數表示面試問到的頻率,代表重要推薦指數

以上這些內容均免費分享給大家,需要完整版的朋友,點這裏可以看到全部內容。或者點擊 【這裏】 查看獲取方式。

最後還有耗時一年多整理的一系列Android學習資源:Android源碼解析、Android第三方庫源碼筆記、Android進階架構師七大專題學習、歷年BAT面試題解析包、Android大佬學習筆記等等,這些內容均免費分享給大家。**

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