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

南方吳彥祖_藍斯發表於2021-07-26

背景

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

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

程式設計師第一考慮的當然是技術,但現在真不知道學什麼了:幹了三四年的開發,手頭的工作馬馬虎虎都沒什麼問題了。就算有問題,也是業務邏輯上的問題,系統太複雜,吃不透;或者系統裡一些過時的/生僻的技術,真心覺得沒必要花時間花精力去研究,能對付就行了,是不是?反正下家單位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 原始碼等等。

以上這些內容均免費分享給大家,需要完整版的朋友, 。或者點選 【 】 檢視獲取方式。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69983917/viewspace-2783421/,如需轉載,請註明出處,否則將追究法律責任。

相關文章