轉:?https://blog.csdn.net/singwhatiwanna/article/details/49560409
前言
看到一篇文章中提到“最近幾年國內的初級Android程序員已經(jīng)很多了锅劝,但是中高級的Android技術人才仍然稀缺“,這的確不假,從我在百度所進行的一些面試來看胖秒,找一個適合的高級Android工程師的確不容易钾怔,一般需要進行大量的面試才能挑選出一個比較滿意的鳍刷。為什么中高級Android程序員不多呢租漂?這是一個問題,我不好回答喊儡,但是我想寫一篇文章來描述下Android的學習路線拨与,期望可以幫助更多的Android程序員提升自己。由于我也是從一個菜鳥過來的艾猜,所以我會結合我的個人經(jīng)歷以及我對Android學習過程的認識來寫這篇文章截珍,這會讓這篇文章更加真實,而并非紙上談兵箩朴。
前面說到岗喉,我也是從一個Android菜鳥過來的。其實這句話放在任何人的身上都是適用的炸庞,即大家都是一步步過來的钱床,因此作為初學者也不必因為技術差而郁悶,同理埠居,高手也不要看不起一些所謂的菜鳥查牌,因為這不公平,技術只有在同等的工作年限上才具有一定的可比性滥壕,也許你眼中的菜鳥只是個工作半年的新手纸颜,而你已經(jīng)工作5年,可想而知绎橘,這根本不具有可比性胁孙,搞不好別人5年后可以達到比你更高的技術高度。
我有若干個技術QQ群称鳞,群里(481798332)的小伙伴對我的工作經(jīng)歷比較感興趣涮较,剛好在這里我就做下介紹。我是碩士研究生畢業(yè)冈止,我已經(jīng)工作3年零3個月了狂票,職位上從最開始的騰訊初級工程師變成了現(xiàn)在的百度Android資深工程師。最開始我并不是做Android的熙暴,先是做了半年的C++闺属,接著做了3個月的Web前端,然后公司內部轉崗做Android到至今周霉,純Android工作年限的話其實是2.5年掂器。但是我認為我的Android工作經(jīng)驗(注:工作年限不等同于工作經(jīng)驗)不止2.5年,我投入大量的業(yè)余時間在Android開發(fā)上诗眨,并且我習慣去思考問題唉匾、總結問題并將其融會貫通,因此我的Android技術在短時間內有了很大的提升匠楚。
在Android學習過程中巍膘,初學者踩過的坑我也都踩過,我也深深地知道大家在學習過程中最棘手的問題是什么芋簿。舉個例子峡懈,在3年前,我想在SlidingMenu中放入一個ListView与斤,發(fā)現(xiàn)二者總是不能很好地一起工作肪康,這肯定是由于滑動沖突的問題,我也知道撩穿,但是不知道怎么解決磷支。我就去學校圖書館翻遍了所有的Android書籍,無果食寡。大家肯定都知道原因雾狈,為什么我無法從書中查找到問題的答案,因為入門書不講滑動沖突抵皱,所謂的高級編程書也不講善榛。還有一個問題,我曾經(jīng)以為view.post(runnable)可以讓runnable的run方法在線程中執(zhí)行呻畸,所以我就在run方法里面去做耗時的操作移盆,現(xiàn)在想想我當時是多菜啊,因此我曾經(jīng)也是菜鳥伤为。
直到若干年后的某一天咒循,我終于琢磨透了滑動沖突的事,然后我就把解決問題的思想寫在了CSDN博客上绞愚,但是好像看得人并不多剑鞍,很多人并不能體會我的用心,后來我博客的訪問量越來越大爽醋,這才慢慢地得到了一些人的關注蚁署。后來有一天我有了寫書的契機,我想到了我最開始學習Android時所踩過的坑蚂四,想到滑動沖突對我的困擾光戈,為了更好地傳播我的技術經(jīng)驗,為了讓更多的人少踩一些坑遂赠,為了讓更多地人成為Android高級工程師久妆,我毅然決定將Android開發(fā)中最重要的、最疑難的跷睦、最容易困擾大家的筷弦、成為高級工程師所必備的知識點和盤托出,這就是《Android開發(fā)藝術探索》存在的原因以及意義。書的反響怎么樣呢烂琴?從目前讀者的評價來看爹殊,內容基本無差評,我收到了很多讀者的肯定以及感謝奸绷,這說明很多人能夠理解我的用心梗夸。
說了那么多,言歸正傳号醉,下面說下Android學習路線的話題反症,本文打算從4個階段來對Android的學習過程做一個全面的分析,分別為Android初級畔派、中級铅碍、高級以及資深工程師,具體請看下面的分析线椰。同理胞谈,本篇學習路線仍然只針對Android應用開發(fā),不針對Rom開發(fā)和逆向工程等士嚎。這里虛擬一位“小明”的角色呜魄,在這里小明就是Android初學者的代表。
小明之前完全沒接觸過Android開發(fā)莱衩,是個應屆生爵嗅,他的待遇是13k,然后小明以校招的身份進入了百度笨蚁,然后小明需要怎么學習才能成為初級工程師呢睹晒?這個時候,小明對編程基礎括细、數(shù)據(jù)結構伪很、C語言都有一定基礎,Java語法什么的也都掌握的比較好奋单,Android才有java語言锉试,無奈的是小明并不會搞Android。
小明首先需要購買一本Android入門的書籍览濒,為了更快地學習Android呆盖,小明業(yè)余時間也都用來一邊看書一邊照著書中的例子敲代碼,結果2周時間小明就把這本書學了一遍贷笛∮τ郑看完這本書后,小明對Android的歷史乏苦、結構株扛、代碼規(guī)范等都有了一個大概的了解,并且,小明已經(jīng)可以寫出一些簡單的Activity了洞就。這個時候在小明眼里盆繁,Android開發(fā)很簡單很好玩,通過在xml中擺放一些按鈕文本框什么的就可以做一些界面了奖磁。
小明開始跟著他的技術導師做需求改基,一些簡單的小需求小明自然是不在話下了繁疤。突然有一天來了一個需求咖为,該需求要求小明在Activity中為一個button加一個動畫效果,小明慌了:“完全沒接觸過稠腊,書上也沒有講躁染,怎么辦呢?”小明冷靜了下架忌,打開了百度搜索吞彤,輸入“Android 動畫”,打開前幾個鏈接叹放,小明恍然大悟饰恕,照著網(wǎng)上的例子把需求給實現(xiàn)了。后來導師告訴他:“學好Android井仰,官方文檔是必須看的埋嵌,既全面又權威”。然后小明如獲至寶俱恶,花了一年時間把上面的guide和training都看了一遍雹嗦,并且他還動手抄了幾個小例子。
有一天合是,小明又需要做一個動畫相關的需求了罪,這可難不倒小明,它熟練地打開了www.baidu.com聪全,輸入“Android 動畫”泊藕,突然他楞了一下:”總不能每次寫動畫都要百度一下吧!“难礼,于是他在CSDN開了一個博客娃圆,把動畫相關的知識點都寫上去,為的是后面再寫動畫相關的代碼就不用百度去搜了鹤竭,事實如何呢踊餐?后面再寫動畫相關的代碼阱驾,小明的確不用再去百度搜了躺盛,因為通過寫一篇動畫博客,他把動畫相關的細節(jié)都已經(jīng)記住了威蕉,這樣他就可以不用再去參考任何文檔了,后來小明還學會了把一些瑣碎的不方便放在博客上的東西寫到了印象筆記上面窜管,什么時候忘了10秒鐘以內都可以快速找回來散劫,而不是花10分鐘去再次搜索一遍。
這里總結一下幕帆,Android入門的時候获搏,需要有一本入門書,好好學習書中的內容失乾,同時花一年時間把Android官方文檔中的training和guide看一遍常熙,同時通過寫博客和記筆記的方式來做總結,建議讓自己的每篇博客都有價值些碱茁。通過一年時間的學習裸卫,相信每個人都可以達到中級工程師的水平。
技術要求:?
- 基本知識點?
比如四大組件如何使用纽竣、如何創(chuàng)建Service墓贿、如何進行布局、簡單的自定義View蜓氨、動畫等常見技術?
- 書籍推薦?
《第一行代碼 Android》聋袋、《瘋狂Android》
小明經(jīng)過一年的努力學習終于成為Android中級工程師了,月薪變成了17k穴吹。到了中級工程師幽勒,已經(jīng)可以在公司里干很多體力活了,但是一些很重要的任務小明還不能一個人承擔起來刀荒,這個時候小明需要學習的內容就很多了代嗤,如下所示:?
- AIDL:熟悉AIDL,理解其工作原理缠借,懂transact和onTransact的區(qū)別干毅;?
- Binder:從Java層大概理解Binder的工作原理,懂Parcel對象的使用泼返;?
- 多進程:熟練掌握多進程的運行機制硝逢,懂Messenger、Socket等绅喉;?
- 事件分發(fā):彈性滑動渠鸽、滑動沖突等;?
- 玩轉View:View的繪制原理柴罐、各種自定義View徽缚;?
- 動畫系列:熟悉View動畫和屬性動畫的不同點,懂屬性動畫的工作原理革屠;?
- 懂性能優(yōu)化凿试、熟悉mat等工具?
- 懂點常見的設計模式
學習方法
閱讀進階書籍排宰,閱讀Android源碼,閱讀官方文檔并嘗試自己寫相關的技術文章那婉,需要有一定技術深度和自我思考板甘。在這個階段的學習過程中,有2個點是比較困擾大家的详炬,一個是閱讀源碼盐类,另一個是自定義View以及滑動沖突。
如何閱讀源碼呢呛谜?這是個頭疼的問題在跳,但是源碼必須要讀。閱讀源碼的時候不要深入代碼細節(jié)不可自拔呻率,要關注代碼的流程并盡量挖掘出對應用層開發(fā)有用的結論硬毕。另外仔細閱讀源碼中對一個類或者方法的注釋呻引,在看不懂源碼時礼仗,源碼中的注釋可以幫你更好地了解源碼中的工作原理,這個過程雖然艱苦逻悠,但是別無他法元践。
如何玩轉自定義View呢?我的建議是不要通過學習自定義view而學習自定義view童谒。為什么這么說呢单旁?因為自定義view的種類太多了,各式各樣的絢麗的自定義效果饥伊,如何學的玩呢象浑!我們要透過現(xiàn)象看本質,更多地去關注自定義view所需的知識點琅豆,這里做如下總結:?
- 搞懂view的滑動原理?
- 搞懂如何實現(xiàn)彈性滑動?
- 搞懂view的滑動沖突?
- 搞懂view的measure愉豺、layout和draw?
- 然后再學習幾個已有的自定義view的例子?
- 最后就可以搞定自定義view了,所謂萬變不離其宗
大概再需要1-2年時間茫因,即可達到高級工程師的技術水平蚪拦。我個人認為通過《Android開發(fā)藝術探索》和《Android群英傳》可以縮短這個過程為0.5-1年。注意冻押,達到高級工程師的技術水平不代表就可以立刻成為高級工程師(受機遇驰贷、是否跳槽的影響),但是技術達到了洛巢,成為高級工程師只是很簡單的事括袒。
技術要求:?
- 稍微深入的知識點?
AIDL、Messenger稿茉、Binder锹锰、多進程类垦、動畫、滑動沖突城须、自定義View蚤认、消息隊列等?
- 書籍推薦?
《Android開發(fā)藝術探索》、《Android群英傳》
小明成為了夢寐以求的高級工程師糕伐,月薪達到了20k砰琢,還拿到了一丟丟股票。這個時候小明的Android水平已經(jīng)不錯了良瞧,但是小明的目標是資深工程師陪汽,小明聽說資深工程師月薪可以達到30k+。
為了成為Android資深工程師褥蚯,需要學習的東西就更多了挚冤,并且有些并不是那么具體了,如下所示:?
- 繼續(xù)加深理解”稍微深入的知識點“中所定義的內容?
- 了解系統(tǒng)核心機制:?
1. 了解SystemServer的啟動過程?
2. 了解主線程的消息循環(huán)模型?
3. 了解AMS和PMS的工作原理?
4. 能夠回答問題”一個應用存在多少個Window赞庶?“?
5. 了解四大組件的大概工作流程?
6. …?
- 基本知識點的細節(jié)?
1. Activity的啟動模式以及異常情況下不同Activity的表現(xiàn)?
2. Service的onBind和onReBind的關聯(lián)?
3. onServiceDisconnected(ComponentName className)和binderDied()的區(qū)別?
4. AsyncTask在不同版本上的表現(xiàn)細節(jié)?
5. 線程池的細節(jié)和參數(shù)配置?
6. …?
- 熟悉設計模式训挡,有架構意識
學習方法
這個時候已經(jīng)沒有太具體的學習方法了,無非就是看書歧强、看源碼和做項目澜薄,平時多種總結,盡量將知識融會貫通從而形成一種體系化的感覺摊册。同時這個階段對架構是有一定要求的肤京,架構是抽象的,但是設計模式是具體的茅特,所以一定要加強下設計模式的學習忘分。關于設計模式的學習,最近一本新書推薦給大家《Android 源碼設計模式解析與實戰(zhàn)》白修,既可以學習設計模式妒峦,又可能體會到Android源碼中的設計思想,我最近也在閱讀此書熬荆。
技術要求:?
- 稍微深入的知識點?
- 系統(tǒng)核心機制?
- 基本知識點的細節(jié)?
- 設計模式和架構?
- 書籍推薦?
《Android開發(fā)藝術探索》舟山、《Android 源碼設計模式解析與實戰(zhàn)》、《Android內核剖析》
這個階段的程序員也許并沒有太具體的學習路線了卤恳。