背景
2020年1月5号,朋友辭去了北京一家小創公司Android開發的工作,準備春節過後尋找新的工作的時候,突然遇到了新冠疫情的爆發,至今賦閑在家。昨天接到同行好友的電話,要和我聊聊天。告訴我再找不到工作就考慮轉行了!
話語間無不感歎安卓有點強弩之末的味道!聊天過程中,朋友也順帶分享了一波阿裡餓了麼、百度Android崗的面經。我也幫他内推了幾份工作崗位,卻因為技術欠缺和經驗不足等問題被友好的回絕了!
餓了麼Android崗一面
1:雙親委托機制?
2:插件化原理?
3:垃圾回收機制及其優缺點?
4:PathClassLoader和DexClassLoader差別?
5:說下Binder?
6:Android旋轉螢幕後Activity生命周期,Bundle是存儲在哪兒的?
7:事件分發機制?
8:Handler實作?
9:Java記憶體?
10:OkHttp設計模式?
11:算法。
- Http和Https的差別
- HashMap的具體實施原理,HashMap和Hashset的差別
- Java的垃圾回收機制
- JVM的原理及線上調優
- string,stringbulider,stringbuffer的差別
- Java的設計模式
- 在白紙上手寫二分法排序算法,這道題我在lintcode上面做過原題
- 有哪些可以保持程序同步的方法
- 如何避免死鎖
- 常見的資料結構有哪些
- leetcode 原題:查找單連結清單中倒數第K個節點的算法,面試官要求手寫
百度Android崗一面
1:算法:尋找出現超過一半的數字?
2:HashMap原理?
3:熱更新原理?
4:AstncTask+HttpClient 與 AsyncHttpClient有什麼差別?
5:Https握手過程?
6:RecycleView原理?
7:RecycleView的使用?
8:Hybrid通信原理是什麼,有做研究嗎?
9:ListView圖檔加載錯亂的原理和解決方案?
10:對稱加密與非對稱加密?
11:TCP、UDP差别?
12:TCP保證可靠的手段?
初級、中級 Android 工程師可能因離職而失業嗎?
針對朋友找工作難的問題,我特意咨詢了我在騰訊負責面試的朋友,為何Android開發普遍感覺找工作難。最後我們得出的結論基本一緻:供需極度的不平衡。
這段時間他都在幫部門招人,在拉鈎上也挂了JD,一個多月的時間收到的履歷估計有幾百份,他發起了面試的不超過5個,最後硬着頭皮遞上去1個還被刷了。
可問題就在這裡,據他回報大公司都在招Android開發,很多部門還非常着急,但就是招不到合适的人。别跟他說現在做Android的人很多,品質是關鍵,數量一點意義都沒有。每年池子裡的人就那麼多,一份好的履歷出來不止公司之間,部門之間甚至是部門内都在搶,但這批人之外,絕大部分人的履歷能占用的時間不會超過5秒。
以前我們溝通時他就提到過這個問題,在現在這個階段,公司之間的技術鴻溝已經非常明顯,開發者身在其中,也因為自身學習能力,環境,項目等等的差别,技術上的差距越拉越大,造成了工作幾年之後的兩級分化,并且這種差距的拉開不是靠自己的努力就能彌補的。
我這個Android開發八年的朋友,離職後缺乏大型項目經驗,至今未找到合适的工作!屬于一個典型溫水煮青蛙的案例!
Android學習路線指南
那面對這種情況,作為開發者,我們能做的是什麼?最基本的,脫離舒适區,不停磨練自己的技術。
工作前三年是職業生涯中成長最快的幾年,在這段時間裡你會充滿激情,做事專注,也容易養成良好的習慣。在大公司有些同學在前三年中就快速成為某一個領域的技術專家,有些同學也可能止步不前。接下來和大家一起探讨下如何在三年内快速成長為一名技術專家。
目錄
學習方法
1:掌握良好的學習心态
2:掌握系統化的學習方法
3:知識如何内化成能力
4:廣度和深度的選擇
1.掌握良好的學習心态
空杯心态
首先要有空杯的學習心态,而不是傲嬌自滿,故步自封,空杯子才可以裝下更多的東西。首先要學會取百家之長,帶着欣賞的眼光看團隊的同僚或學校的同學,欣賞每位同僚或同學的優點,然後吸取他們的優點,每個同僚都有其擅長的能力,比如有的同僚技術能力強,那麼可以觀察下他如何學習的(或者找他請教學習方法),有的同學擅長解決線上問題,那麼觀察他是如何解決線上問題的,解決思路是什麼?如果他解決不了時,他是如何尋求幫助。有的同學擅長使用IDE或MAC的快捷鍵,那麼可以向他學習提高工作效率。有的同學能快速了解業務知識,觀察他是如何做到的,自己如何達到他的程度。溝通能力,解決問題能力以及規劃能力都可以向同僚學習。
堅持學習
有的同學可能工作了五年,但是學習的時間可能一年都不到。學技術不能急于求成,隻要學習方法正确,量變一定會引起質變。
2.掌握系統化的學習方法
如果學習到的知識不成體系,那麼遇到問題時就會非常難解決。有些同學會出現這些情況,比如編碼時遇到問題百度搜尋,如果百度上找不到答案,這個問題就解決不了。再比如,在開發中要用到某個技術點,就學習下API,程式調通後就不再深入研究,淺嘗辄止,如果程式遇到其他問題也不知道如何解決。
以上情況我認為叫點狀學習。遇到一個問題,解決一個問題,需要一項技術,學習一項技術。那麼如何由點到面,由面到體,形成系統化學習呢。
首先要确定學習的知識領域,需要達成的學習目标,針對目标制定學習計劃,就像你要寫一本書一樣,先把目錄寫出來,然後根據目錄上的知識點逐漸去學習,最後把這些知識點關聯起來,形成一個系統化的知識體系。學習的時候,可以制定一個計劃,以周為機關,比如第一周學什麼,第二周學什麼。
比如我們Android開發,學習進階路線是:
3.知識如何内化成能力
成長必須經曆一個步驟,就是把知識内化成能力。知識是用腦記住的,能力是用手練習出來的。在工作的幾年裡,我們可能看過很多書,聽過很多技術講座和視訊,但是通過聽和看隻是讓你能記住這些知識,這些知識還不能轉換成你的能力。
聽和看隻是第一步,更重要的是實踐,通過刻意練習把聽到和看到的知識内化成你的能力。
刻意練習,就是有目的的練習,先規劃好,再去練習。
4.廣度和深度的選擇
技術人員的學習路徑有兩個次元,深度和廣度。很多程式員都有這個疑問,是先深後廣,還是先廣後深呢?
通過這麼多年的學習和思考,我的建議先深後廣,因為當技術學到一定深度後,就會有觸類旁通的能力,自己掌握的廣度也自然有了深度。但是在實際學習過程中,深度和廣度互相穿插着學習,比如學習并發程式設計時,首先學習JDK源碼,然後學進去之後,開始看JVM源碼,最後看CPU架構,在技術點逐漸深度研究的過程中,廣度也得到了完善。
是以無論哪種學習方式,學習态度才是最重要的,在廣度學習的時候有深入研究的态度就能達到一定的深度,在深度學習的時候,主動學習相關的技術點,廣度也得到拓寬。
最後
題外話,我在一線網際網路企業工作十餘年裡,指導過不少同行後輩。幫助很多人得到了學習和成長。
我意識到有很多經驗和知識值得分享給大家,也可以通過我們的能力和經驗解答大家在IT學習中的很多困惑,是以在工作繁忙的情況下還是堅持各種整理和分享。但苦于知識傳播途徑有限,很多程式員朋友無法獲得正确的資料得到學習提升,故此将并将重要的Android進階資料包括自定義view、性能優化、MVC與MVP與MVVM三大架構的差別、NDK技術、阿裡面試題精編彙總、常見源碼分析等學習資料免費分享出來。
【Android思維腦圖(技能樹)】
知識不體系?這裡還有整理出來的Android進階學習的思維腦圖,給大家參考一個方向。
需要的朋友,可以點選
https://shimo.im/docs/Q6V8xPVxHpkrtRtD前往免費領取!
希望我能夠用我的力量幫助更多迷茫、困惑的朋友們,幫助大家在IT道路上學習和發展~