8年Android老碼農現身分享:一個月面試6家大廠屢敗屢戰,那些面試學習上走過的彎路

背景

前段時間突然接到同行好友的電話,要和我聊聊天。

他說他們部門調整,雖然最後他留了下來,但還是非常焦慮。人無遠慮必有近憂,他這次被刺激到了,想提高一下自己,以免下次再有類似的心驚肉跳。但怎麼提高呢?

程序員第一考慮的當然是技術,但現在真不知道學什麼了:幹了三四年的開發,手頭的工作馬馬虎虎都沒什麼問題了。就算有問題,也是業務邏輯上的問題,系統太複雜,喫不透;或者系統裏一些過時的/生僻的技術,真心覺得沒必要花時間花精力去研究,能對付就行了,是不是?反正下家單位99.99%的機率是不會用到這些東西的的。

那麼就是一些新技術了。新技術雜得很,不知道學什麼,框架類庫啥的其實沒什麼技術含量,一兩個星期就可以上手,上手了之後呢?往深裏學?其實和老舊技術一樣的問題,誰知道下一份工作用不用得上呢!而且沒趣,大概是因爲沒有挑戰性吧,反正就那個樣,還能咋的?

學習瓶頸

一直聊到這裏,我都非常理解。我這個8年的老碼農,體會比他還深。其實稍微幹上一些年頭,就是這個樣子,看起來像是“學習熱情下降”“懶得學習”,但本質上呢,兩個原因:

1、本身的技能增強,能夠應付日常工作,沒有剛入行時那麼大的壓力了。

2、學習的邊際效益遞減,所以開始考慮投資/收益比了。

剛入行的時候,技術一丁點的進步,都能帶來非常大的成就感,至少能少挨點罵,是不是?積累到一定時候,就可以跳個槽漲點工資啥的。但三五年過後,

我已經會了:

  • 熟悉Android OS系統體系結構、framework層;
  • 良好的Java技術功底,精通多線程、socket通信、文件操作等java底層技術;
  • 精通Android的基本組件使用,熟練使用Android各種佈局與控件,熟練運用各種動畫特效;
  • 熟悉View的繪製原理,精通自定義動畫以及自定View的開發
  • 有豐富的Android性能優化經驗,善於解決系統崩潰,內存溢出和兼容性問題;
  • 熟悉JNI技術和代碼混淆
  • 有單元測試、自動化測驗及相關框架經驗;
  • 有良好的代碼習慣,要求結構清晰,命名規範,邏輯性強,代碼冗餘率低,代碼註釋清晰;

下面分享一下我自己的例子。

開發8年一個月面試6家大廠的面試題整理和建議

我不是什麼大牛,我只是一個有八年工作經驗的Android老兵,既沒有非常亮眼的學歷,也沒有牛逼大廠的履歷。

去年冬天,在孩子得病從急診轉住院的時候,我得到了年前將被優化的消息,作爲家裏唯一經濟來源的我整個人蒙了,一時間茫然和無助差點毀了我。

最後我還是和家人如實說了,受到了他們的極大的鼓勵,也找到了重新開始的勇氣。

可惜這場疫情來的如此兇猛,職位少、要求高、電話面試、視頻面試、在線coding、屢戰屢敗、屢敗屢戰,構成了我這一個月的常規生活。

我一開始也焦慮、茫然,甚至對自己的能力和工作經驗深深懷疑。

後來經過幾個好朋友的鼓勵打氣,也看了很多面試文章,認真總結自己面試中不足的地方,查漏補缺,終於在這周確定了offer。

接下來我就對我面過公司的面試題做一下總結,權當拋磚引玉,希望對大家有幫忙。

面試問題彙總

某知名在線教育公司

  • 介紹一下自己項目中MVP如何實現;
  • 自定義View流程;
  • 說說項目中遇到的性能優化、內存泄漏和內存溢出;
  • native和h5交互怎麼做;
  • 事件分發流程;
  • http、https的區別,post、get區別;
  • 算法:兩個單鏈表相交,求相交結點;
  • 算法:獲取單鏈表倒數第k個元素;

著名安全類公司

  • Activity的啓動模式和應用場景;
  • Handler機制以及與Message等之間的關係;
  • 與Service通信的幾種方式,進程間通信和進程內通信的區別;
  • 手寫代碼實現線程死鎖; 手寫兩種單利模式,並講出優缺點;
  • 如何實現RecyclerView的側滑刪除;
  • http、tcp/ip基本認識,post和get區別;
  • 內部類爲什麼會造成內存泄漏;
  • 怎樣給RecyclerView加header和footer,爲什麼可以這樣;
  • RecyclerView如何實現複雜佈局;
  • 算法:一個整型數組中,只有兩個數出現一次,其餘均出現兩次,找出這兩個數,給出時間複雜度;

著名求職類公司

  • View的回執流程,onMeasure方法的三種模式;
  • 畫出Window的層次結構;
  • Handler、Looper原理;
  • 說一下自己設計的圖片框架;
  • Glide源碼;
  • 對RxJava的理解;
  • 事件分發機制,TouchEvent的down、up和move;
  • 項目中如何實現熱修復,或使用了哪個熱修復庫;
  • 手寫實現數據庫SQLiteOpenHelper;
  • ActivityThread的main方法中做了些什麼;
  • 內存泄漏的原因,常見場景和如何處理;
  • 佈局優化,如何防止過度繪製;

一個名字聽起來巨有錢的公司

  • RxJava的優劣勢;
  • home/user/a/../b/./c所代表的的路徑,手寫代碼輸出絕對路徑;
  • 對系統相機的瞭解;
  • View的回執流程;
  • Glide源碼,介紹自己的圖片框架;
  • 手寫實現快速排序;
  • 介紹代理模式;
  • MVC、MVP各自特點和優缺點;

某大廠下的外賣團隊

  • 介紹Activity任務棧;
  • RxJava原理,RxJava同時執行5個任務,是並行還是串行;
  • Activity的啓動過程;
  • View的繪製過程,onMeasure方法中兩個參數的含義;
  • 自己封裝過什麼框架,介紹一下原理;
  • ListView和RecyclerView的優化和區別;
  • 如何爲RecyclerView的Adapter設置監聽,說出最好方案;
  • 介紹一個自己做過的最滿意的東西;
  • 泛型中 ? 表示什麼含義,若加入不滿足條件的類型會怎樣;
  • 單例模式中的雙檢鎖,如果把類鎖換成內部聲明的另一個類,效果會怎麼樣;

知名在線借款公司

  • Activity的生命週期,啓動模式;
  • 如何實現多個Activity同時展示;
  • 手寫單例模式並解釋爲什麼這樣寫;
  • 如何防止過度繪製;
  • 介紹下你閱讀過的源碼;
  • 磁盤緩存怎麼實現;
  • JVM垃圾回收機制;

Android開發到底需要學習哪些?

對於現在的Android及移動互聯網來說,我們需要掌握的技術,我做了一個清單:

  • 泛型原理
  • 反射原理
  • Java虛擬機原理
  • 線程池原理
  • 註解原理
  • 註解原理序列化
  • Activity知識體系(Activity的生命週期、Activity的任務棧、Activity的啓動模式、View源碼、Fragment內核相關、service原理等)
  • 代碼框架結構優化(數據結構、排序算法、設計模式)
  • APP性能優化(用戶體驗優化、適配、代碼調優)
  • 熱修復
  • 熱升級
  • Hook技術
  • IOC架構設計
  • NDK(c編程、C++、JNI、LINUX)
  • 如何提高開發效率?
  • MVC、MVP、MVVM
  • 微信小程序
  • Hybrid
  • Flutter

解析知識點,爲什麼要學

1.數據結構和算法

數據結構和算法其實是分開的東西,我們需要先掌握各種數據結構,再去加深算法,數據結構和算法其實也屬於基礎,但是它現在越來越重要,所以我就單獨拿出來說了。

數據結構怎麼深入同樣我也推薦大家去看清華或者浙大《數據結構》公開課,特別是清華的,值得反覆研究。

至於算法,首先要做的就是動手,LeetCode上直接幹!

第二階段就是要總結各種算法的思想和套路,像遞歸、動態規劃等這些算法都是有套路的,在LeetCode上也有按數據結構和算法分類的篩選,大家可以針對性練習和總結。

當然,對於一個Android程序員,能做到每天在LeetCode上刷題就非常不錯了,所以一定要堅持,等你堅持到一定的時間,你會發現你越來越遊刃有餘,我從18年底開始在LeetCode上刷題,目前已經刷了200多道了,小米的面試也非常注重算法,還要能寫。

而且對一些特別注重算法的公司,算法這塊的考覈非常嚴苛,對,就是嚴苛,而不是嚴格。

2.設計模式

設計模式中包括了設計原則,其實對於Android開發人員來說,設計模式就那23種,知道並瞭解這些設計模式是第一個階段,僅僅是到這個階段是不夠的,一般面試也不會問你某個設計模式的概念,而會讓你具體的說說你對某一種設計模式的深入瞭解和使用,它的優缺點,所以,第二階段就是要運用它們,其次要和Android源碼中運用到設計模式地方進行結合學習。

例如建造者模式,Andoird中的Dialog創建就使用到了,還有像單例模式、適配器模式、觀察者模式等等都是在Android中非常常用的設計模式,也是在面試中出現頻率很高的。

3.語言學習開發語言

Android應用是由Java語音進行開發的,SDK也是由Java語言編寫的,所以我們要學習Java語言。另外,雖然說Kotlin語言也得到Android官方的熱推,但是Kotlin也是編譯成了Java語言在運行的。對於Android開發來說。

只要SDK沒有用Kotlin重寫,那麼Java語言都是需要學習的。而且Android apk的後臺服務器程序大概率是Java語言構建,所以學習Java是一個必然。

那麼Java中那些東西是我們Android中比較相關的稍微比較難的Java基礎幾乎是一個門檻,像泛型丶多線程丶反射丶JVM丶JavaIO丶註解丶序列化等等。

4.APP開發框架知識

這塊知識是現今使用者最多的,我們稱之爲Android2013-2016nian 的技術。但是,即使是這樣的技術,很多開發者也往往因爲網上很多copy代碼的習慣而導致對這塊的使用的代碼熟悉而陌,熟悉的是天天和它們打交道天天在複製,陌生的是天天打交道卻沒有深入研究過他們,要學習源碼,模仿源碼,然後在hook源碼,這樣才能說懂這塊的知識。

5.App性能優化

一個app的西能好不好我們需要從兩個層面分析:

1、從寫代碼的時候就注意,讓自己的代碼是高性能高可用的代碼,這個過程是書寫高性能代碼
2、對已經成型的代碼通過工具檢測代碼問題,通過檢查到問題來指導我們進行代碼的刪改這個過程被稱爲調優

那如何寫出高性能的代碼呢?

需要我們具備深厚的代碼功底,這就是代碼的基礎,如:數據結構達到可以根據應用場景寫出符合當前場景的特殊結構,比如google針對Android平臺特徵研發了SparseArray代替HashMap.另外,對常用的算法也有自己獨到的見解

6.NDK模塊開發

音視頻、高清大圖片、人工智能、抖音直播等這些年與用戶緊密相關,與我們生活最相關的技術一直都在尋找最終的技術落地平臺,以前是Windows系統,而現在是移動系統了。而移動系統中Android比例又是最大的。所以NDK可以說是必備要學習的,除此之外,音視頻的編解碼技術流媒體協議,ffmepeg,c,c++,JNI,linux都是音視頻開發必備技能。而且OpenCV \OpenGI這些又是圖像處理必備。

7.如何提高開發效率?

工欲善其事必先利其器,如何提高開發效率,很多開發者在開發中由於gradle不會用導致加載代碼非常耗時,這些都是你的工作成本的浪費。還有就是git的使用也可以幫助我們管理好我們的代碼,這個非常關鍵,因爲這個工具可以讓我們修改的代碼不會因爲錯誤操作而導致丟失。另外,對移動開發者我們至少需要知道如何抓取網絡包。其中,最常用的stetho就是一個非常好用的可以抓取網絡包的工具。

8.混合開發

混合開發的flutter現在已經逐漸成了主流的混合開發框架,另外由於阿里系的強大存在,導致阿里系的公司都在用Weex混合架構,這些都是一個Android工程師開拓視野,走向未來必不可少的基本技能的。

寫給看到最後同學的話

這些算是我作爲過來人對於應屆畢業生和剛工作不久的同學的一些小小建議吧。

(1)一定要緊跟技術前進的腳步,尤其是大數據相關的技術,在技術更迭的時候一定要學習熟悉新技術,看源碼,哪怕自己在工作中用不到也一定要學。因爲這是你下一份工作的敲門磚。

(2)不要給自己設置舒適區,這個就是說,一個公司待久了不要懶惰,不能荒廢自己,始終要保持清醒的頭腦和進取心,不斷學習,不斷完善自己的技術,架構設計能力,項目管理能力,交付能力等。

一定要及時從項目中總結經驗和不足,最好落實到日記本中,最後通過不斷思考,形成自己的做事方法論。

(3)對自己的職業生涯要有一個規劃,以後要做哪一塊一定要有自己的想法,確定了就要從這個方向完善自己,多學多練。

沒有人會專一做某一塊,但是自己一定要想好哪一塊是自己以後要走的方向,那麼這一個方向確定了就要深入的學習這一塊的知識,多看源碼,多做練習,如果接觸到具體項目,要在項目中沉澱自己,最後形成自己的知識體系。

(4)做事情要有擔當,不要根據OKR給自己設置界限,有能力有空閒多做一定要多做,這也是別人認可你的最佳途徑之一。互聯網圈子很小,大家認可你,以後去大廠,換個好工作,也許就更容易。

Android開發如何提升自身技能?

Android學習是一條漫長的道路,我們要學習的東西不僅僅只有表面的 技術,還要深入底層,弄明白下面的 原理,只有這樣,我們才能夠提高自己的競爭力,在當今這個競爭激烈的世界裏立足。

現在競爭這麼激烈,只有通過不斷學習,提高自己,才能保持競爭力。

對於程序員來說,要學習的知識內容、技術有太多太多,要想不被環境淘汰就只有不斷提升自己,從來都是我們去適應環境,而不是環境來適應我們!

對於一些不知道學習什麼,沒有一個系統路線的程序員,這裏給大家提供一個大概的思路:

  • 架構師築基必備技能:深入Java泛型+註解深入淺出+併發編程+數據傳輸與序列化+Java虛擬機原理+反射與類加載+動態代理+高效IO
  • Android高級UI與FrameWork源碼:高級UI晉升+Framework內核解析+Android組件內核+數據持久化
  • 360°全方面性能調優:設計思想與代碼質量優化+程序性能優化+開發效率優化
  • 解讀開源框架設計思想:熱修復設計+插件化框架解讀+組件化框架設計+圖片加載框架+網絡訪問框架設計+RXJava響應式編程框架設計+IOC架構設計+Android架構組件Jetpack
  • NDK模塊開發:NDK基礎知識體系+底層圖片處理+音視頻開發
  • 微信小程序:小程序介紹+UI開發+API操作+微信對接
  • Hybrid 開發與Flutter:Html5項目實戰+Flutter進階

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

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

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

1.2020大廠面試高頻知識點

  • 圖片
  • 網絡和安全機制
  • 數據庫
  • 插件化、模塊化、組件化、熱修復、增量更新、Gradle
  • 架構設計和設計模式
  • 性能優化
  • Android Framework
  • Android優秀三方庫源碼

2.Jetpack架構組件從入門到精通

  • Android Jetpack - Navigation
  • Android Jetpack - Data Binding
  • Android Jetpack - ViewModel & LiveData
  • Android Jetpack - Room
  • Android Jetpack - Paging
  • Android Jetpack - WorkManger
  • Android Jetpack架構組件之Lifecycle
  • Android Jetpack Compose 最全上手指南

3.Framework精編內核解析

主要內容包含:

  • 深入解析Binder
  • 深入解析Handler
  • Dalvik VM 進程系統
  • 深入解析 WMS
  • PackagerManagerService

4.Kotlin強化實戰(附Demo)

  • 第一章 Kotlin入門教程
  • 第二章 Kotlin 實戰避坑指南
  • 第三章 項目實戰《Kotlin Jetpack 實戰》
    • 從一個膜拜大神的 Demo 開始
    • Kotlin 寫 Gradle 腳本是一種什麼體驗?
    • Kotlin 編程的三重境界
    • Kotlin 高階函數
    • Kotlin 泛型
    • Kotlin 擴展
    • Kotlin 委託
    • 協程“不爲人知”的調試技巧
    • 圖解協程:suspend

5.Android設計思想解讀開源框架

  • 熱修復
  • 插件化
  • 組件化框架設計
  • 圖片加載框架
  • 網絡請求框架
  • RXJava 響應式編程框架設計
  • IOC 架構設計
  • Android架構組件Jetpack

6.NDK模塊開發

  • NDK 模塊開發
  • JNI 模塊
  • Native 開發工具
  • Linux 編程
  • 底層圖片處理
  • 音視頻開發
  • 機器學習

7.Android源碼解析

“編程語言是程序員的表達的方式,而架構是程序員對世界的認知”。所以,程序員要想快速認知並學習架構,讀源碼是必不可少的。閱讀源碼,是解決問題 + 理解事物,更重要的:看到源碼背後的想法;程序員說:讀萬行源碼,行萬種實踐。

主要內含微信 MMKV 源碼、AsyncTask 源碼、Volley 源碼、Retrofit源碼、OkHttp 源碼等等。

以上這些內容均免費分享給大家,需要完整版的朋友,點這裏可以看到全部內容。或者點擊 【這裏】 查看獲取方式。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章