深度思考:擁有多年開發經驗為何還會被多家大廠拒絕?Android開發還有什麼能學習的?

南方吳彥祖_藍斯發表於2021-05-17

前言

“Android 開發還有什麼可以學習的?” 近半年來,大家對於職業的未來發展、個人的成進階都有一些迷茫和焦慮。

為什麼會這樣呢?放眼現在網際網路行業,各大公司已經從爭奪使用者轉為爭奪使用者時長。而小程式、快應用的崛起,也讓許多 App 的增長達到瓶頸。

移動開發的前景似乎並不明朗,再加上競爭激烈以及技術變革放緩,我們感到迷茫、焦慮就不難理解了。但這是不是就意味著移動開發沒有前途了呢?

並不是,移動開發不侷限於 App 開發,所有新的技術浪潮其實都可以融入到移動開發的體系裡,比如 IOT、音影片、邊緣計算、VR/AR, 我們要做的,就是打好基礎,不斷學習新技術,建立完備的知識體系,提升個人能力和價值,以迎接新的挑戰。

接下來給大家舉例Android開發需要學習的一些技能及知識點:

Android開發需要學習的技能

安卓基礎知識

安卓基礎知識確實很多,如果日常積累不夠的話確實比較頭暈,比如我承認我只在 APP 升級的時候搞過一個前臺的 Service,但是面試的時候就會問你 Service 生命週期,如何繫結,如何跨程式通訊,如何關閉Service 等等,你肯定不能說"我沒用過我不會"。

所以我們就要複習,一來我們可以應付面試,二來我們也可以透過基礎知識的積累來提高我們的能力。

主要知識點:

1.Activity 任務棧和 4 種啟動模式關聯性問題 2.IPC 非常重要,想要達到中級和高階的水平就必須要讀懂,跨程式幾種方式必須瞭解 3.Binder 肯定是必問的,當然還有 AIDL 4.自定義 View 的 draw measure layout 過程,事件的分發,攔截,處理,處理滑動衝突的思路,view滑動的幾種方式 5.動畫的幾種實現方式 6.Window 在 Android 裡的作用。它和 Activity 和 View 的關係 7.四大元件的工作過程,這個確實有難度,按自己能力鑽研吧,也別陷的太深 但是,四大元件的使用方式必須會,Service 的啟動和繫結,廣播的使用方法,寫個簡單 ContentProvider 這些都是必須的 8.Looper,Handler,MessageQueue 的關係 9.主執行緒為什麼是主執行緒,如何開啟執行緒,執行緒池和安卓常用的四種執行緒池 他們的特點和使用場景 11.AsyncTask 原理,併發問題,缺點等 12.如何面對大的 bitmap,如何自己設計一個 ImageLoader 13.其實可以擴充套件為,如何設計一個 okhttp,如何設計一個 retrofit,eventBus 等等 14.其實就考察對開源框架的認識和使用的熟練程度 15.如何避免和處理 Crash 和 ANR 16.最佳化篇,過度繪製,OOM,記憶體洩漏,佈局最佳化,MAT, Lint

大廠相關面試題:

  • 有個問題很常見:你瞭解過哪些開源框架?
  • okhttp 或者 retrofit 必須瞭解一下底層原理,即使不能讀好原始碼,也要看看別人是怎麼分析的
  • 如今熱更新和外掛化特別火,一定要能說出來幾種,並簡單說明原理
  • MVC MVP MVVM 優缺點,一點要說出自己的切身體會
  • Fragment,生命週期和使用方法
  • Rxjava 儘量也看看
  • 註解機制,現在這麼多使用註解的框架
  • Acitvity的生命週期是什麼樣的?
  • Acitvity的生命週期,如何摧毀一個Activity? (美團)
  • Intent顯示跳轉與隱式跳轉,如何使用?(美團)
  • Activity A跳轉B,B跳轉C,A不能直接跳轉到C,A如何傳遞訊息給C?(美團)
  • Activity如何儲存狀態的?
  • 請描述Activity的啟動流程,從點選圖示開始。(B站)
  • 你會在什麼情況下使用Service?
  • startServer和bindServier的區別?(美團)
  • Service和Thread的區別?
  • IntentService與Service的區別?
  • ContentProvider如何自定義與使用場景是什麼?
  • BroadcastReciver的靜態註冊與動態註冊的區別?
  • 廣播的分類與工作原理

Java 基礎知識

我是參照的《Thinking in Java》這個書和網上的博文,別的我也沒買。網上 Java 的資料非常多,但是確實有很多寫的不好,甚至有一些錯誤的,大家閱讀要小心了。

主要知識點:

1.修飾符 2.類 介面 抽象類 匿名內部類 回撥機制 3.幾種基本型別,長度,邊界 4.從 Iterator 到 Collection,再到 Set List Map(必問) 5.從以下幾個角度理解學習:用法,具體實現類,執行緒安全性,底層資料儲存結構,某些場景下如何選用?比如 ArrayList 和 LinkedList 如何選用 執行緒相關(必問) 6.鎖機制 synchronize 用法 7.實現一個死鎖 8.同步,生產者消費者模型 9.Thread 中的幾個常用方法 比如問你 sleep 和 wait 區別 10.執行緒安全 11.JVM 瞭解一些,GC 瞭解一下,堆和棧的區別等 12.靜態代理,動態代理 反射 13.設計模式 單例模式(要會寫),工廠模式,抽象工廠,觀察者模式等

大廠相關面試題:

  • 什麼情況下會發生棧記憶體溢位?
  • 如果讓你寫一段棧溢位的程式碼你會什麼寫,一個棧大概有多大,為什麼?每個執行緒都有這樣大小的一個棧嗎? (美團)
  • JVM中一次完整的GC流程是怎樣的,物件如何晉升到老年代?
  • 介紹下GC回收機制與分代回收策略。
  • Java中有幾種引用關係,它們的區別是什麼?
  • GC收集演算法有哪些?它們的特點是什麼?
  • 如何判斷一個物件是否被回收,有哪些GC演算法,實際虛擬機器使用最多的是什麼GC演算法?(美團)
  • Jvm記憶體 結構說一下。(東方頭條)
  • JVM DVM ART的區別(360)
  • 描述GC機制。Class會不會回收?用不到的Class怎麼回收?(東方頭條)
  • StackOverFlow與OOM的區別?分別發生在什麼時候,JVM棧中儲存的是什麼,堆儲存的是什麼?(美團)
  • Java虛擬機器和Dalvik虛擬機器的區別?
  • 請描述new一個物件的流程。
  • Java物件會不會分配到棧中?
  • String, Stringbuffer, StringBuilder 的區別是什麼?(東方頭條)
  • String StringBuffer StringBuilder在進行字串操作時的效率;這裡主要考察String在記憶體中是如何建立的。(位元組跳動)
  • String為什麼是不可變的?(位元組跳動)
  • String為什麼設計成final的?
  • final 、finally、finalize 區別。
  • 抽象類和介面的區別。
  • 過載和重寫的區別 (京東)
  • 什麼是值傳遞和引用傳遞,Java 是值傳遞還是引用傳遞?

演算法和資料結構

主要知識點:

1.陣列,連結串列,佇列,棧,圖 2.不會直接問你,會讓你找到用處,比如Activity任務棧 3.演算法 4.基本幾種排序複雜度和思路 5.幾種查詢複雜度和思路 6.串的處理

大廠相關面試題:

  • 如何在一個1到100的整數陣列中找到丟失的數字? 騰訊
  • 如何在給定的整數陣列中找到重複的數字? 小米
  • 如何在未排序整數陣列中找到最大值和最小值? 位元組跳動
  • 在Java中如何從給定陣列中刪除多重複制? 百度
  • 常用的資料結構有哪些? B站
  • 一個陣列插入刪除查詢和連結串列的效率對比?如果一個陣列要反覆插入刪除怎麼最佳化降低時間複雜度? 騰訊
  • arrayList底層原理 滴滴 位元組跳動
  • 如何在一次遍歷中找到單個連結串列的中值? 中國平安
  • 如何證明給定的連結串列是否包含迴圈?如何找到迴圈的頭節點? 優酷
  • 兩個有交叉的單連結串列,求交叉點 華為如何得到單連結串列的長度? 360
  • 如何在不使用遞迴的情況下逆轉單連結串列? 小米/美團
  • 怎麼判斷連結串列有環? 滴滴
  • 如何使用棧實現佇列的功能?廣州荔枝FM
  • 兩個棧實現一個佇列 蘑菇街
  • 兩個佇列實現一個棧 騰訊
  • 對比一下佇列和棧,以及它們底部實現 騰訊

推薦 LeetCode 刷題和讀《劍指offer》。

效能最佳化

主要內容:

1.ANR 2.記憶體溢位 3.記憶體抖動 4.記憶體洩漏 5.UI卡頓 6.冷啟動最佳化等方面

大廠相關面試題:

  • 記憶體最佳化,記憶體抖動和記憶體洩漏。(東方頭條)
  • Bitmap壓縮,質量100%與90%的區別?(東方頭條)
  • TraceView的使用,查詢CPU佔用(東方頭條)
  • 記憶體洩漏查詢 (酷我音樂)
  • ANR查詢
  • ANR是什麼,怎麼解決?(美團)
  • CPU波動
  • 當前專案中是如何進行效能最佳化分析的
  • 冷啟動、熱啟動的概念(酷我音樂)
  • View層次過深怎麼最佳化,選擇哪個佈局比較好?(美團)
  • 怎樣檢測函式執行是否卡頓 (位元組跳動)
  • 什麼時候會發生記憶體洩漏?舉幾個例子(美團)

學習Android路上的一些彎路(避坑)

在學習之路上,每個人都會走一些彎路,犯一些錯誤,前世之事後事之師,真心希望Android初學者不要重蹈我的覆轍。

1、在外包待的時間太久,外包學習投入的時間過多,技術上沒什麼長進 2、沒有早一點接觸網際網路技術 3、沒有早一點擁抱開源,Github上有那麼多牛逼的程式碼,多讀,多寫,然後就拼天賦吧。 4、不要妄自菲薄,技術上不自信,認為自己寫不了牛逼的程式碼 5、不要閉門造車,多關注最新技術,提高眼界 6、儘量不要接收二手知識,比如能看英文就不要看翻譯版了 7、不要懼怕大塊頭的書,像 thinking in Java,演算法導論,一天掌握一點,一年也差不多掌握了8 不要過早地做管理,先寫個五年程式碼再說 8、Java基礎一定要紮實,雖然說並不需要首先精通Java才能上手安卓,但良好的Java功底確實會有很大的幫助。

有句話叫做 基礎不牢,地動山搖,大家可以制定一個安卓學習計劃:

第一步:書籍

我之前入手的第一本書就是android瘋狂講義,七八百頁,其實我感覺我們不用全部都學,比如說動畫、影片、感測器先可以不學,安卓瘋狂講義的有些設計不是很合理,把很多難的內容放到了前面。

沒有做到從易到難,我們學的過程中可以先把一章整體看一下,然後再安排學習的順序,把裡面的每一個例子都自己敲一遍。因為我上下班坐公交車時間很長因此我都是在公交車上看書,這樣一個月過去了,瘋狂講義的主要部分學了一遍。

第二步:影片

我看過收集的影片也很多,每天看7個,中間也有耽擱的這樣過去了一個月,所有的看了一遍,主要的,難懂的看了兩到三遍。

第三步:高 仿專案

做完前兩步,自己感覺水平應該可以了,於是就想去獨立開發一個app,但是還是不知道怎麼下手,於是從網上找了幾個開源專案,開始模仿去做,有仿新浪微博,仿美團,鬧鐘,這樣過去了一個月,終於有些底氣了。

第四步:android官網

要想去安卓官網還需要 翻 牆,這個大家都懂,首先官網上面的api guide看一下,最後都能仿著寫一遍程式碼,然後再把training上的幾個例子也仿著寫一遍。這樣學上面的例子用了一個月。

第五步:獨立開發app

開始設想獨立開發一款app。

Android學籍推薦

我 Android 開發快八年了,做為一名過來人的角度,給大家推薦幾本書籍。

Android 開發,目前主要是以 java/ kotlin 語言為主,學習 Android 之前,最好要先學習 java 語言。對 java 語法,基本資料結構有一定的瞭解。

Java

1.《Effectve Java》 2.《Java程式設計思想》 3.《深入理解Java虛擬機器》

Android

1.入門的話,主要推薦郭霖的《第一行程式碼》書籍,寫得通俗易懂。 2.進階推薦兩本書籍《Android核心剖析》,《Android開發藝術探索》

C++

學習完 Android 的話,想進階的話,還要學習一下 C++,沒錯,現在很多疑難問題都是 native 層的,只有學習 C++,才能成為一名真正的高手。

1.《深度探索C++物件模型》 2.《UNIX環境高階程式設計 第3版》

學什麼知道了,怎麼學呢?

做得越多不見得越厲害,而是對自己的 知識體系做總結

我認為學習的階段應該是這樣的:

學習新知識--->靈活應用--->自我總結--->創造新知識

很多人在剛接觸這個行業的時候或者是在遇到瓶頸期的時候,總會遇到一些問題,比如學了一段時間感覺沒有方向感,不知道該從那裡入手去學習,對此我針對Android程式設計師,我這邊給大家整理了一套 學習寶典

  • Android學習路線圖

首先,對於沒有學習方向,知識不體系的人,我把我工作幾年整理的學習路線分享給大家,做一個借鑑作用,還不知道怎麼學習的人可以直接照著我這個學習路線一個個的去學習,知識不體系的人可以參考下我整理路線的方式,總之希望能夠幫到你們!

  • 模組化學習資源

接下來是每個模組我整理出來的文件學習資料,幫助大家更細緻化的學習。

《Android彙總複習資料—Java》

《Android彙總複習資料—Android》

《Android彙總複習資料—Android擴充套件》

《Android彙總複習資料—Kotlin》

《Android彙總複習資料—Flutter》

《Android彙總複習資料—演算法》

除了上面的學習路線,還可以額外的配合以下方式學習,效果翻倍~

Android進階學習

①看影片進行系統學習

前幾年的Crud經歷,讓我明白自己真的算是菜雞中的戰鬥機,也正因為Crud,導致自己技術比較零散,也不夠深入不夠系統,所以重新進行學習是很有必要的。我差的是系統知識,差的結構框架和思路,所以透過影片來學習,效果更好,也更全面。關於影片學習,個人可以推薦去B站進行學習,B站上有很多學習影片,唯一的缺點就是免費的容易過時。

另外,我自己也珍藏了好幾套影片,有需要的我也可以分享給你。

②讀原始碼,看實戰筆記,學習大神思路

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

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

③面試前夕,刷題衝刺

面試的前一週時間內,就可以開始刷題衝刺了。請記住,刷題的時候,技術的優先,演算法的看些基本的,比如排序等即可,而智力題,除非是校招,否則一般不怎麼會問。

關於面試刷題,我個人也準備了一套系統的面試題,幫助你舉一反三:

④2020大廠面試高頻知識點

  • 圖片
  • 網路和安全機制
  • 資料庫
  • 外掛化、模組化、元件化、熱修復、增量更新、Gradle
  • 架構設計和設計模式
  • 效能最佳化
  • Android Framework
  • Android優秀三方庫原始碼

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

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

相關文章