
26歲,在外包公司干了三年的Android開發,于2021年5月辦理完成所有離場手續,辦完那一天,我像是終于解脫了,終于放下,也終于釋懷,
這三年的時間,算是給我人生上了一課,文字可能會比較多,但大部分的情況都和全國99%的軟體行業外包情況完全匹配,希望能給你們一些參考,
第一次進入外包公司
開始面試的時候,找了兩個月,一開始外包公司直拒,投遞了 Factory Club,中控,醫惠科技等等,可是都沒有回音,11 月份已經沒有多少作業機會了,迫切的需要一份作業,于是海投,我進入第一家外包公司,
由于我這是第一次進外包公司,所以連薪水都沒有多要,最后自己通過公司進入了工行杭研中心,開始外包的坑之路~~(簽合同的時候,還簽了保密協議!!)
入職體驗很不好
加入之后的第一個專案是銀行外包金融App專案,因為要匯報每日的開發進度,所以我們是駐場開發,
入職后,根本沒人帶,前期就是先進行一系列考試,什么安全培訓、職業技能測驗培訓,培訓完會有對應的考試,
當然了這些都是占用我們下班時間進行的,體驗極差的一點就是,工行專案組長每天都會拉我們外包工開晨會,時間基本都快半小時了,就一圈人站在一塊向組長匯報昨天的作業進度,今天的作業開展,
第二次外包經歷
經歷了一次外包,后來我辭職后就沒找外包了,通過了廣電運通的面試,
面試時候就感覺不靠譜,因為面試地點是位于近江附近的望江國際里面的溫州銀行,面試前網上搜了廣電運通的資訊,說是國企,所以我就硬著頭皮接下 offer 了,沒想到面試 Android 結果做的 C++,而且也是駐場開發,
入職一月半就又離職了,這時候我的簡歷就很糟糕了,8 個月的外包經歷又加上近期作業只有一個半月,然后我又進了外包,這次是華為外包,
入職
技術面試只有一輪,是華為員工進行的電話面試,大概半個多小時,都是 Android 基礎又常見的面試題,但是熱修復、記憶體泄漏、記憶體優化、插件化、組件化、okhttp竟然一個問題都沒問,
隔天,某軟國際 hr 通知我面試通過,還要接受 hrbp 的電話面試,順利結束后,給我發了鏈接是牛客 Android 在線筆試(感覺這個順序給弄反了),然后就是到濱江這邊的和瑞科技園簽合同,hr 和我說,我要先去華為辦公一個月再回和瑞科技園辦公,我簽的是 FP 模式,不是駐場開發,
前一個禮拜都在進行資訊安全、網路安全等培訓,培訓通過后說是才給辦華為工卡,
作為過來人的體會,外包被歧視真的是一個社會問題,
大家說是一個地方作業,但是那種隱形的階級感是在的,就是有很多正式員工很有優越感去使喚外派員工,
實際上就是這樣,外包人員不可能接觸到核心一點的東西,內部的很多檔案,點進去可能都沒有權限,加班只能調休沒有加班費,
有時候仔細想想,外包和大廠在智商上的差距有那么大嗎?
辭去第二份外包作業之后,花了大量的時間復習準備面試,杭州的一二線公司基本上都去面試過了,包括阿里,位元組,快手,滴滴,有贊,涂鴉,哈啰(騰訊沒有客戶端的hc),其中也拿了幾個不錯的offer,這里就簡單分享下部分面試題和準備作業吧:

備戰大廠
戰況:
- 滴滴:二面掛
- 快手:一面掛
- 阿里:三輪技術面 + 一輪HR 面
- 有贊:三輪技術面 + 一輪HR 面
- 哈啰出行:三輪技術面 + 一輪HR 面
- 涂鴉智能:三輪技術面 + 一輪HR 面
- 位元組跳動:三輪技術面 + 一輪HR 面
關于面試前的準備作業,首先就是先把簡歷給優化了,畢竟簡歷算的上是大廠面試的墻門轉了,
寫一份不被扔垃圾桶的簡歷
-
簡約清晰:技術人的簡歷可以簡約一點,簡約不等于簡單,你的專案經歷和技術深度可以很深,但是體現在簡歷上一定高度概括,簡歷上不適合長篇大論的寫記敘文,議論文,
-
突出重點:一份簡歷如果全文都是做了系統,參與了功能,面試官要自己找重點,所以最好簡歷直接開門見山,我在專案中扮演什么角色,搞了什么大事情,拿到什么結果,最好是帶資料作為支撐的,有個詞叫可量化,如果就是訪問量小但流程復雜度高,你可以總結怎么做模塊化開發、流程靈活性配置、效率提升等等,寫到JVM 記憶體調優你可以寫新生代/老年代記憶體回收時間提升了 **ms等等,這都是參考,可以輔助一些圖或表在簡歷中,直觀來說一圖二表三文字,當然前提是你圖表確實有亮點,
-
細節:細節決定成敗,有幾個細節要關注:1.不要有錯別字;2.前后邏輯一致,資料不要自相矛盾;3.簡歷不要壓縮、不要群發、郵件帶正文介紹自己;4.排版干凈清爽
由于本人之前的職級有點低,所以這次的目標崗位是P6+ ~ P7崗(雖然最侄訓是只拿到了P6+的崗位),如果有高P的大佬,那么下面的面試題看看就好,意義不大,
滴滴
一面:
- 簡單介紹下專案中遇到的難題,怎么解決的?
- 大圖加載的優化方案
- java注解元注解有哪些,有什么區別
- 簡要講解下APT技術
- ButterKnife為什么在子module要用R2檔案,子module為什么不能使用switch-case來對view的id進行區別處理
- Activity.getWindow什么時候為空
- Handler 發送延遲訊息,是否一定會在指定時間以后執行,異步訊息怎么判斷,訊息串列是按什么順序排列
- Looper在沒有訊息時,怎么處理,如何進行執行緒阻塞
二面:
- 簡要介紹下專案中的亮點
- 主執行緒修改UI為什么會導致崩潰,怎么解決的
- 為什么Android要設計單執行緒操作UI
- 簡單介紹下Activity啟動流程
- Handler機制原理, Looper的阻塞機制
- 記憶體優化做過哪些,用過哪些工具
快手面試
一面:
- 如何計算bitmap大小,如何檢測bitmap是否超過了1M,并列印
- 如何給在ImageView里面展示一個帶邊框的bitmap
- Handler機制
- ANR有哪些,怎么監控
- LRUCache原理
- 什么情況下會出現ConcurrentModifyException,為什么會出現,怎么解決
- 執行緒池使用過沒,有哪些引數,什么作用
- HashMap原理
- SparseArray的原理
- SparseArray和HashMap的查找和插入時間復雜度是多少
- Android打包流程, 位元組碼插樁在哪個流程中實作
- 熱更新有了解過么,tinker的原理是什么,有什么缺點, 有沒有其他框架沒有這個缺點的,怎么實作的
- Http 1.0,Http1.1 ,Http 2.0的區別 keep-alive和多路復用有啥區別
- 了解過HttpDNS么,什么作用
- 手寫一個生產者和消費者模型
阿里面試
一面:
- 卡頓檢測怎么做的,為什么要這么做,會有兼容問題么
- 如果降低crash率的,有做哪些處理
- 覺得哪些東西做的比較好,說一下
- jsBridge是怎么實作的,如果客戶端向前端發送訊息怎么發送,
- 在圖片框架選型的時候怎么考慮的,Fresco,Piccaso,Glide之間的優缺點
- 自定義一個從底部滑出的抽屜,該怎么做,需要有哪些考慮的點
- 一個簡單的RecyclerView,說一下手勢Down,Move,Up的分發,如果TextView上面設定了點擊事件,那么分發邏輯是怎么樣的
- 專案是怎么進行架構設計的
- 專案是否采用模塊化處理,怎么做的,怎么進行互動
- git-merge和git-rebase的區別
二面:
- 現在專案的整體設計是怎么樣的
- 降低crash率做了哪些處理
- 怎么檢測線上卡頓問題
- kotlin相比于java有哪些優勢
- 什么時機可以認為頁面加載完成
- 記憶體優化有做過哪些
- 講下merge和include
- 講下運營商DNS劫持,又是如何防止DNS劫持
- 怎么使用Fragment的, 是采用一個Activity多個Fragment的形式么
- 有沒有使用過一些跨端技術
三面:
- 專案合并做了哪些事情
- 怎么檢測線上卡頓
- 怎么檢測線上記憶體泄漏
- 做了哪些性能優化
- 最近研究了哪些新技術,談談看法
- 何如學習提高自己的技術
- 說說看自己的優劣勢
- 對于現在做的產品有什么看法和見解,怎么看待競品
有贊面試
一面:
- 組件化的架構怎么設計的
- 組件之間怎么通信,除了EventBus還有其他哪些了解過
- EventBus是怎么作業的
- Router框架怎么設計的
- LiveData為什么具有生命周期感知能力,如何實作的
- APT怎么實作,如何生成代碼檔案
- MVP與MVVM的區別
- MVP為什么會存在記憶體泄漏的可能,怎么解決
- 執行緒池的創建有哪些引數,有什么作用
- 有用過kotlin么?object關鍵主要應用在哪里? let和run的區別
- GC有哪些演算法,現代虛擬機基本采用什么演算法,為什么這么做
- Activity的啟動流程
- 在APP行程還沒創建的時候,會做哪些額外操作,app行程是誰創建的
- View是如何顯示出來的
- 如何把像素點顯示到螢屏上
- Glide三級快取策略有了解過么
- Glide為什么會感知生命周期
- 做過哪些性能優化
- 最近寫的這篇博客寫的什么,遇到了什么問題,怎么解決
二面:
- 講講專案的組成
- retrofit2原理
- 用過rxjava2哪些運算子,zip什么作用,
- 熱修復的原理
- APT技術怎么實作,如何理解AOP,有過哪些應用場景
- MVC,MVP,MVVM的區別
- 講一下LiveData+ViewModel怎么實作生命周期, 螢屏旋轉時,會保存資料么
- 有沒有碰到過LiveData接收多次訊息的問題,LiveData的postValue和setValue有什么區別,平時怎么使用
- glide怎么實作生命周期的監聽
- 組件化的方案,如何提高編譯效率
- 組件通信用的什么
- 有沒有寫過印象深刻的框架
- 平時周末會遇到線上事故么,怎么處理
- 平時開發程序怎么溝通協調,在里面作為什么角色存在,
三面:
- 講一下你覺得成長最大的一個專案,為什么
- 組件化考慮的因素有哪些,為什么這么考慮,為什么使用AAR包就會提高編譯效率
- 說一個你覺得做的比較好的點,
- 有沒有跨端經驗
- 有沒有推動過專案的一些方案的制作和實施,講一下怎么做的
哈啰出行
一面:
- 講述一下自己做的最有亮點的專案
- view的繪制流程
- View的事件分發流程
- ViewPager內部嵌套同向RecyclerView,RecyclerView滑動與ViewPager滑動沖突解決方案
- 詳細說下Handler機制
- Handler會存在哪些問題,怎么解決
- 設計模式用過哪些,簡要講述下最熟悉的幾個設計模式,怎么設計,為什么這么設計
- APT怎么實作的,元注解什么作用, IOC怎么實作
二面:
- 講述一下自己專案亮點
- 講一下路由框架的架構設計,路由還可以實作哪些功能
- 容災方案怎么實作,怎么做降級處理,怎么做AbTest
- App Link有了解過沒
- Handler的機制,如果取不到訊息接下來怎么做,
- APP啟動做過哪些優化,如果啟動優化的負責人,你會怎么做
- Activity的冷啟動流程
- Application由誰創建,Activity由誰創建,ContentProvider的onCreate發生在什么時候
- 熱更新的原理,插件化的原理
三面:
- 講述專案經歷
- 講一下自己覺得做得最好的地方
- 有做過哪些性能優化
- 讓你負責埋點功能,你怎么設計實作
- leakcanary實作原理
- flutter有了解過么
- 講當前部門的主要業務
位元組跳動
一面:
- git cherry-pick 操作commit id一樣么
- git merge和rebase的作用
- Fragment 如何傳參的,有沒有使用建構式傳參
- SurfaceView和View繪制上面的差別,可以設定層級么, mediaOverlay什么作用
- 插件化和組件化的差別, 插件化的加載程序
- 長圖加載解決方案 DecodeRegion的底層原理
- 演算法:A方法回傳0和1的概率是p和1-p, 設計一個演算法讓0和1回傳的概率各是1/2
- opengl 頂點著色器, 片段著色器
- classLoader通過什么判斷class是否已經加載到記憶體中
- 記憶體優化怎么做的
- 滑動沖突怎么解決 nestchild和nestparent如何實作手勢分發
二面:
- OpenGLES 怎么使用
- 執行緒啟動方式
- HandlerThread了解過么
- Synchronized原理,notify wait底層是怎么做的, 了解過鎖的膨脹么
- CAS操作如何保證兩個執行緒資料安全
- Dialog和Activity屬于同一個window么,為什么
- 用過哪些設計模式
- 講講設計原則,專案里使用情況
- 講講現在專案里的網路庫, OKHttp有哪些優勢(相比較于以前的HttpClient和HttpUrlConnection)
- EventBus 內部使用什么樣的資料結構保存,EventBus的優缺點
- Bitmap記憶體怎么計算 假設一個100*100的圖片放入xxhdpi的檔案夾,在720的手機上面顯示,Config是ARGB8888, 記憶體大小多少
- 講講為什么使用MVVM,MVP為什么會出現記憶體泄漏, MVVM為什么不會出現記憶體泄漏
- VSync信號 什么作用 同步多次執行addView,removeView等UI操作為什么不會多次進行View的繪制
- 演算法:如果將一串路徑反轉 例如 /a/b/././c/..d/e -> /e/d/c/b/a
三面:
- 自動登出如何處理的
- 登錄之后頁面,資料重繪怎么處理
- TCP和UDP的區別, 講下視頻通話中哪些用到了UDP,哪些用到了TCP
- Java的Thread是JVM創建的還是系統的
- Thread可以設定大小么
- JVM的記憶體回收演算法
- View的onMeasure測量邏輯
- 解決過的難題
- 講下mvvm的設計,與mvp相比優勢是什么,如果用mvp如何防止記憶體泄露
- 100個人編號為1100,山洞有100盞燈,編號為1100, 人依次過山洞,當人經過【燈編號可以整除人編號】的路燈時,按下開關,假設剛開始燈都是滅的,那么100個人出去以后,有多少盞燈是亮著的,
- 給定兩個職員,找出最近的公共上級 (樹的最近公共祖先節點
總結
我一般都是建議不要去外包,不是我對外包有多大仇恨,也不是有意甩鍋外包公司,人家也是企業,也是靠實力看市場來賺錢,曾經也在外包干過三年的我,三年一點成長沒有(沒精力,天天加班,也沒空間提升,因為大家都是干著流水線式碼農的作業),不是忙專案就是忙出差,真的廢了的一踏糊涂,
眼下正值很多畢業生找作業的季節,對于初入社會的職場人來講,第一份作業特別重要,它一定程度上決定了后面幾年的路是怎么樣的,是完美入場,還是完美入坑,區別還是很大的,
面試大廠無論如何,你回答的層面最好足夠深,從原始碼層級說起來,有時候面試官的對問題的看法和你的看法有分歧,此時就需要你是否可以從原始碼的層面上對這些問題有自己的解釋,
面試的時候只需要沉著冷靜的思考,從原始碼的角度對面試官拋出來問題進行分析,就能比較輕松的解決,
技能儲備沖擊大廠
Android學習是一條漫長的道路,我們要學習的東西不僅僅只有表面的 技術,還要深入底層,弄明白下面的 原理,只有這樣,我們才能夠提高自己的競爭力,在當今這個競爭激烈的世界里立足,
如果你覺得自己學習效率低,缺乏正確的指導,可以參考下下面分享我多年作業以來收集整理的學習路線,給大家做個參考:

接下來是每個模塊我整理出來的檔案學習資料,幫助大家更細致化的學習,
《Android匯總復習資料—Java》

《Android匯總復習資料—Android》

《Android匯總復習資料—Android擴展》

《Android匯總復習資料—Kotlin》

《Android匯總復習資料—Flutter》

《Android匯總復習資料—演算法》

除了上面的學習路線,還可以額外的配合以下方式學習,效果翻倍~
①看視頻進行系統學習
前幾年的Crud經歷,讓我明白自己真的算是菜雞中的戰斗機,也正因為Crud,導致自己技術比較零散,也不夠深入不夠系統,所以重新進行學習是很有必要的,我差的是系統知識,差的結構框架和思路,所以通過視頻來學習,效果更好,也更全面,關于視頻學習,個人可以推薦去B站進行學習,B站上有很多學習視頻,唯一的缺點就是免費的容易過時,
另外,我自己也珍藏了好幾套視頻,有需要的我也可以分享給你,
②讀原始碼,看實戰筆記,學習大神思路
“編程語言是程式員的表達的方式,而架構是程式員對世界的認知”,所以,程式員要想快速認知并學習架構,讀原始碼是必不可少的,閱讀原始碼,是解決問題 + 理解事物,更重要的:看到原始碼背后的想法;程式員說:讀萬行原始碼,行萬種實踐,
主要內含微信 MMKV 原始碼、AsyncTask 原始碼、Volley 原始碼、Retrofit原始碼、OkHttp 原始碼等等,

③面試前夕,刷題沖刺
面試的前一周時間內,就可以開始刷題沖刺了,請記住,刷題的時候,技術的優先,演算法的看些基本的,比如排序等即可,而智力題,除非是校招,否則一般不怎么會問,
關于面試刷題,我個人也準備了一套系統的面試題,幫助你舉一反三:

④2020大廠面試高頻知識點
- 圖片
- 網路和安全機制
- 資料庫
- 插件化、模塊化、組件化、熱修復、增量更新、Gradle
- 架構設計和設計模式
- 性能優化
- Android Framework
- Android優秀三方庫原始碼


轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/292220.html
標籤:其他
