
背景
前段時間突然接到同行好友的電話,要和我聊聊天,
他說他們部門調整,雖然最后他留了下來,但還是非常焦慮,人無遠慮必有近憂,他這次被刺激到了,想提高一下自己,以免下次再有類似的心驚肉跳,但怎么提高呢?
程式員第一考慮的當然是技術,但現在真不知道學什么了:干了三四年的開發,手頭的作業馬馬虎虎都沒什么問題了,就算有問題,也是業務邏輯上的問題,系統太復雜,吃不透;或者系統里一些過時的/生僻的技術,真心覺得沒必要花時間花精力去研究,能對付就行了,是不是?反正下家單位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 原始碼等等,

以上這些內容均免費分享給大家,需要完整版的朋友,點這里可以看到全部內容,或者點擊 【這里】 查看獲取方式,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/290417.html
標籤:java
