前言
看到很多人提問非科班該如何學(xué)習(xí)編程
,其實(shí)科班也基本靠自學(xué)。有句話叫“師傅領(lǐng)進(jìn)門修行靠個(gè)人”,再厲害的老師能教你的東西都是很有限的,真正的修行還是要靠自己。博主本科是數(shù)學(xué)專業(yè),雖研究生是計(jì)算機(jī)專業(yè),但研究生往往是做研究工作(偏學(xué)術(shù)型研究),編程只是工具,可能很多時(shí)候Matlab就搞定了基本需求,再或許用一些科研型仿真軟件就可完成課題研究中涉及的編程模塊,學(xué)業(yè)上不太需要很多編程。
關(guān)于編程(比如Java)完全是靠擠時(shí)間自學(xué)的,而Android則更是參加工作后才開始自己倒騰。不少人認(rèn)為我學(xué)習(xí)能力強(qiáng)、博客產(chǎn)出高,是如何做到的? 一份興趣 + 一份堅(jiān)持
,很簡單,只是把大家用來娛樂、游戲等閑散時(shí)間,擠出來用于學(xué)習(xí)技術(shù)、寫博客而已。
關(guān)于如何學(xué)習(xí)Android系統(tǒng), 這就好比讀書, 是經(jīng)由一個(gè)由薄讀厚,再由厚讀薄的過程. 前者是指剛接觸一個(gè)新領(lǐng)域, 知之甚少,開始不斷努力鉆研探索, 慢慢地隨著時(shí)間地積累, 當(dāng)你會(huì)發(fā)現(xiàn)自己鉆研得越來越多, 自己掌握得知識體系非常龐大, 但當(dāng)遇到一個(gè)新問題需要從大腦檢索很久,甚至需要重新review一下曾經(jīng)看過的已知東西, 那么說明自己以完成了”由薄讀厚”;接下來, 需要進(jìn)行一個(gè)”由厚讀薄”的過程, 用程序員都能理解的一個(gè)詞就是知識歸納與建立索引的過程,通過思考將所有相關(guān)聯(lián)的知識 整理到一起, 形成自己大腦體系的完整知識目錄.進(jìn)而你會(huì)發(fā)現(xiàn)自己大腦里面留下得便是整個(gè)知識架構(gòu), 架構(gòu)里面的每一層只要拉開抽屜就能取出所有完整的知識點(diǎn). 到此,我覺得才是完成一個(gè)知識的學(xué)習(xí)的過程.
接下來從基礎(chǔ)篇和高級篇兩個(gè)層次來說說如何學(xué)習(xí)Android, 本文涉及的所有書籍都是Gityuan在學(xué)習(xí)過程中所讀過的部分較經(jīng)典的一些書籍才推薦給大家。
一. Java篇
Java是Android的語言基礎(chǔ),建議初學(xué)者一定要先學(xué)習(xí)Java基本知識,進(jìn)而再學(xué)習(xí)Android,循序漸進(jìn),只有扎實(shí)的基礎(chǔ)才能建造牢固的上層建筑。
當(dāng)然,這里說的要有一定Java基礎(chǔ),而并非讓大家上來先精通Java。作為Android開發(fā)者來說,完全沒有必要一開始都對Java理解得那么深,只有要看過一兩本Java基本書,掌握J(rèn)ava面向?qū)ο蟮乃枷氲暮诵囊x即萬物皆為對象
,掌握Java基本語法
,基本就可以開啟Android的學(xué)習(xí)之路。在后續(xù)對Android也有一定理解后,如遇不懂可再回過頭看看Java高級知識點(diǎn),慢慢地同步提升Java和Android水平。
Java書籍
- Thinking in Java: 中文版《Java編程思想 》,這是一本非常經(jīng)典的Java書籍,很多人都說這個(gè)書不適合初學(xué)者,我記得自己當(dāng)初看的第一本Java書便是這本書??赐甑谝槐閷ava有了整體的理解,但很多細(xì)節(jié)沒有完全理解,查了資源又看了第二遍,對Java有了更深地理解。再后來一段時(shí)間后,能力也有所提升,再拿起這本書又看了第三遍,發(fā)現(xiàn)對面向?qū)ο笥辛烁钜徊降睦斫?,這本書就是適合反復(fù)的閱讀。
- Effective Java:Java進(jìn)階書,這本書采用“條目”的方式來展開的,總提出了78條Java具體的建議,對Java平臺精妙之處的獨(dú)到見解,還提供優(yōu)秀的代碼范例。作為Java進(jìn)階之書,對Java水平的提升大有裨益。
- Java concurrency in Practice:中文版《Java并發(fā)編程實(shí)戰(zhàn)》,本書采用循序漸進(jìn)的講解方式,從并發(fā)編程的基本理論講起,再講述了結(jié)構(gòu)化并發(fā)應(yīng)用,性能與測試,最后將顯式鎖、原子變量、非阻塞算法這些高級主題。對于Java并發(fā)這一塊算得上是一本很棒的書。
- Java Performance:中文版《Java性能優(yōu)化權(quán)威指南》,Java之父James Gosling推薦的一本Java應(yīng)用性能優(yōu)化的經(jīng)典之作,包含算法結(jié)構(gòu)、內(nèi)存、I/O、磁盤使用方式,內(nèi)容通俗易懂,還介紹了大量的監(jiān)控和測量工具。關(guān)于優(yōu)化都是屬于較深的領(lǐng)域,對Java有一定基礎(chǔ)后,很有必要了解看看。
Java虛擬機(jī),這是作為進(jìn)階Java高手必需有所了解:
- The Java Language Specification,官方Java文檔(英文版)
- The Java? Virtual Machine Specification,官方Jvm文檔(英文版)
- 深入理解java虛擬機(jī):這是國內(nèi)關(guān)于Java虛擬機(jī)講得非常全面的一本書,從Java GC到Java虛擬機(jī)內(nèi)部實(shí)現(xiàn)以及優(yōu)化策略,作為Java高手非常值得一看的書籍。
有朋友私信我覺著這個(gè)java書難度有點(diǎn)高,可能是本人在看Java書籍之前,還看過些許C和C++的入門書的緣故,所以看的第一本書《Java編程思想》。如果你真的是零基礎(chǔ),第一次接觸編程,想以Java作為自己的入門語言,那么你可以先看看《Java語言程序設(shè)計(jì)》(基礎(chǔ)篇) 或者《Java從入門到精通》,作為初學(xué)者要先掌握J(rèn)ava基本語法,平時(shí)遇到不熟悉的方法,多查看API文檔即可,慢慢地就熟悉了。
二、Android基礎(chǔ)篇
高效看書的姿態(tài):學(xué)習(xí)過程會(huì)需要看書,網(wǎng)上一搜,往往會(huì)有一大推的書推薦給大家去閱讀,面對這么多書,該如何選擇,如何閱讀的呢,對于同一個(gè)層級的書籍選擇一本精讀,其余的粗讀、略讀即可,大同小異,對于精讀書籍需要反復(fù)的閱讀。
2.1 入門級別
有了一定的Java基礎(chǔ)(不需要精通Java),就可以開始入門Android。建議初學(xué)Android者,一定要先搭建自己的開發(fā)環(huán)境,先準(zhǔn)備jdk和Android Studio環(huán)境,現(xiàn)在就不要再用Eclipse了,對于Android開發(fā)者來說過時(shí)。在看書的過程一邊看知識點(diǎn)一邊寫著示例程序,一來加深印象,二來提高動(dòng)手能力。
- 《瘋狂Android講義》:作者李剛,這是我看過的第一個(gè)Android書籍,目前有第三版了,我當(dāng)時(shí)看的是第二版基于Android 4.2,書中有大量的實(shí)例,記得當(dāng)時(shí)每看完一個(gè)實(shí)例就跟著敲了一遍,大概花了一周時(shí)間把這本書看完并把大部分的實(shí)例代碼都親手敲了一遍。這里需要說明這本書對于理解Android系統(tǒng)幫忙并不太大,只是當(dāng)初次接觸Android時(shí)恰巧看到這本書,并非其他書不好,對于應(yīng)用入門級的書其實(shí)大同小異。
- 《第一行代碼》:作者郭霖,網(wǎng)上有不少人都推薦這本書作為Android入門書,但我當(dāng)時(shí)沒有看過。這是圖靈系列圖書,前段時(shí)間圖靈的編輯看到我的博客gityuan.com,聯(lián)系到我問是否有興趣出書,便提到郭霖的《第一行代碼》是他們出版社推出的,然后就給我免費(fèi)郵寄了一本(多謝贈(zèng)書之誼)。我大概掃了一掃這本書,內(nèi)容的確比較基礎(chǔ),作者文筆不錯(cuò),書中還穿插了不少打怪漲經(jīng)驗(yàn)升級的片段,比較風(fēng)趣,初學(xué)者可以看看。
Android基本書籍,只需一兩本即可,沒有必要看太多基礎(chǔ)書籍,不同能力就該有不同層級的追求,這里就不再介紹其他基礎(chǔ)書籍。 另外,Android開發(fā)過程中總是需要各種開發(fā)環(huán)境、工具的下載,再這里推薦一個(gè)不錯(cuò)的網(wǎng)站 AndroidDevTools.cn,收集整理了 Android開發(fā)、設(shè)計(jì)等相關(guān)的各種工具大集合,非常全面,而且速度也不錯(cuò)哦,最重要的不用翻墻就可下載到最新的工具。
有朋友好奇私信我是否即將要出書了,目前沒有相關(guān)計(jì)劃,自覺能力尚不及很多前輩,還需加深內(nèi)功修為,將更多的知識寫成文章來分享大家。
2.2 一手資料
何為Android一手資料?那就是Google官方給出的資料,這里往往是英文版的,營養(yǎng)價(jià)值極高。其實(shí)只要英文還可以(不行就是在線翻譯工具)+翻墻工具,強(qiáng)烈建議你直接看Android官網(wǎng)的資料,千萬別被英語所嚇倒,因?yàn)楹芏鄬I(yè)名稱,大家一看就明白比如Activity/Service/Thread等這些代碼名稱本身就是英語,剩下的都是較基礎(chǔ)語法,不懂可以隨時(shí)翻譯,我一般都是用Chrome瀏覽器+Google翻譯插件,哪里不會(huì)點(diǎn)哪里,媽媽再也不用擔(dān)心我的英語了。
言歸正傳,如果你能看完并理解以下內(nèi)容,那么你完全可以沒有必要再看前面介紹的書籍,并且對于Android已有相當(dāng)熟悉。
-
developer.android.com:Android開發(fā)官網(wǎng),下面列舉常用的資料:
- Android training:Android培訓(xùn)文檔;相應(yīng)地,國內(nèi)有一個(gè)中文翻譯文檔Android培訓(xùn)課程中文版;
- Android API指南:Android組件、Manifest配置文件,動(dòng)畫/圖像等相關(guān)介紹;
- Android Tools:性能、測試、Android Studio等各種工具說明文檔;
- source.android.com:介紹Android開源碼相關(guān)的內(nèi)容;
-
Android Performance Patterns:2015年Google陸續(xù)在Youtube上發(fā)布的Android性能優(yōu)化的視頻,目前已更新第4季。
- 國內(nèi)Google組織在優(yōu)酷上發(fā)布了相應(yīng)的中文視頻 (中文)Android 性能模式 第四季;
- 對官方視頻進(jìn)行翻譯并整理:Android性能優(yōu)化典范中文版文檔;
- android-developers.googleblog.com:Android官方博客,有一些比較不錯(cuò)的feature,博客會(huì)第一時(shí)間呈現(xiàn)。
2.3 開源資源
到這里,那么你已經(jīng)具備開發(fā)App的本領(lǐng)。平時(shí)需要自己動(dòng)手多寫寫App,另外就是看看別人優(yōu)秀的App是如何寫的,下面列舉一些開源庫、工具以及App:
- android-arsenal.com:作者vbauer整理收集Github中各種開源庫與工具,并提供搜索功能,是國外整理得最全面的庫;
- Android 開源項(xiàng)目匯總:作者Trinea整理的各種開源庫,是國內(nèi)整理得最全面的庫;
- codeKK 開源項(xiàng)目源碼分析:從源碼的角度,分析Android較流行的優(yōu)秀開源框架;
- codota.com:這是一個(gè)代碼搜索引擎,收集的是各種API的優(yōu)秀示例Java代碼。
此處本文提及的網(wǎng)址與博客,當(dāng)然還有很多優(yōu)秀的博客和網(wǎng)站值得推薦,這里就不一一介紹。
三、Android高級篇
作為程序員,不去閱讀源碼,僅僅看API文檔,只是浮于表象,這是遠(yuǎn)遠(yuǎn)不夠的。真正最能鍛煉能力的便是直接去閱讀源碼,不僅限于閱讀Andoid系統(tǒng)源碼,也包括閱讀各種優(yōu)秀的開源庫。
如果想成為Android系統(tǒng)工程師,那么閱讀Android系統(tǒng)源碼便是必修課。
如果想成為高級App開發(fā)工程師,那么閱讀Android系統(tǒng)源碼算是選修課,閱讀一些優(yōu)秀的開源框架庫算是必修課。
如果你是剛剛?cè)腴T,建議先打好基礎(chǔ),千萬不要一上看源碼,一來看得費(fèi)勁,二來你可能在代碼間來回跳轉(zhuǎn),可能會(huì)迷失在某一個(gè)環(huán)節(jié),更甚是理解錯(cuò)誤,記住一定要循序漸進(jìn)。
3.1 閱讀源碼的重要性
借用Linux之父Linus Torvalds的一句名言:Read the fucking source code。不管是閱讀Andoid系統(tǒng)源碼還是優(yōu)秀的開源框架,對能力那都會(huì)有一個(gè)很大提升;首先,能學(xué)習(xí)到優(yōu)秀的代碼風(fēng)格和設(shè)計(jì)思想;其次,能真正做到“知其然,還知其所以然”;最后,能指導(dǎo)自己更加靈活的使用API,能更加快速地找到系統(tǒng)bug的根源。
3.2 閱讀源碼的準(zhǔn)備
- Java基礎(chǔ):上層framework以及App層都是采用Java語法;
- C/C++基礎(chǔ):Android的jni/native層代碼采用C++,Linux 采用C;
- Linux內(nèi)核:Android內(nèi)核基于Linux的,了解Linux相關(guān)知識對深入掌握Android還是很有必要。
- Git工具:Android源碼采用git和repo進(jìn)行管理;
- Make:Android源碼采用Make系統(tǒng)編譯,源碼系統(tǒng)中會(huì)看到很多Android.mk之類的文件;
- Source Insight:這絕對是看源碼的神器;可以在Java、C++、C代碼之間無縫銜接;
- Android Studio:這是Google官方支持的App開發(fā)環(huán)境,另外,能方便地閱讀framework Java層面的系統(tǒng)源碼。
- Atom: 是Github推出的開源文本編輯器,支持linux、window等多平臺,可能不是最好用的,但我已習(xí)慣Atom.
- Google Drawings:這是畫圖工具,Gityuan博客中的文章都是采用Google Drawing完成,比如Binder開篇文中的圖。
- StarUML:這是類圖,Gityuan博客文章的類圖和流程圖都是采用StarUML完成,比如理解Android進(jìn)程創(chuàng)建流程文中時(shí)序圖。
3.3 閱讀源碼的姿態(tài)
閱讀源碼絕不是從源碼工程按順序一個(gè)個(gè)的文件,從首行看到尾行。正確而高效地閱讀源碼的姿態(tài)應(yīng)該是以某一個(gè)主線為起點(diǎn),從上層往底層,不斷地追溯,在各個(gè)模塊、文件、方法之間來回跳轉(zhuǎn),反復(fù)地閱讀,理清整個(gè)流程的邏輯。同時(shí)帶著思考去看源碼,嘗試去揣測作者的用意,去理解代碼的精妙之處,去思考代碼可能存在的缺陷,去總結(jié)優(yōu)秀的代碼設(shè)計(jì)思想。下面說說我在閱讀Android源碼過程常涉及的庫。
閱讀Android源碼:
如下以Android系統(tǒng)啟動(dòng)為主線,展開一系列的文章Android開篇中的流程圖,在公司內(nèi)部分享時(shí)我曾多次以下圖為流程,來闡述Android架構(gòu),如下圖:
點(diǎn)擊查看大圖
Android系統(tǒng)源碼
android.googlesource.com:Google官方源碼,國內(nèi)無法直接訪問,需要翻墻,對于一個(gè)程序員來說具備翻墻的能力是有必要的。Android源碼中包含的庫非常之多,下面列舉我在看Android源碼過程中涉及較多,也是比較??吹囊恍欤?/p>
- android/platform/packages/apps:Android自帶的app,比如Email,Camera, Music等,對于應(yīng)用開發(fā)工程師主要關(guān)注的目錄;
- android/platform/frameworks/base: Java framework,這是framework工程師看得最多的目錄;
- android/platform/frameworks/native:Native framework;
- android/platform/art:Art虛擬機(jī);
- android/kernel/common:Android內(nèi)核,這是驅(qū)動(dòng)工程師最關(guān)注的模塊;
- android/platform/system/core :核心系統(tǒng);
- android/platform/libcore:平臺的lib庫;
另外,對于無法翻墻的朋友來說,還可以通過上Github通過 Android主頁 下載Android源碼,這些都是定時(shí)從Google官方源碼的鏡像同步而來的。還可以從androidxref來直接查看Android系統(tǒng)源碼。
3.4 優(yōu)秀資源
牛頓曾說過:“如果我看得更遠(yuǎn)一點(diǎn)的話,是因?yàn)槲艺驹诰奕说募绨蛏稀?/strong>,這句話很具有實(shí)用價(jià)值,看完前面的介紹,你千萬不要一上來就一頭扎進(jìn)源碼的世界,小心你會(huì)進(jìn)入二次元世界,處于混沌狀態(tài),最后崩潰乃至放棄求知之路,一定要合理利用現(xiàn)有的優(yōu)秀資源。
Android 系統(tǒng)源碼分析:鄧凡平和羅升陽都是我的好朋友,對于Android方面的理解有著很多共通之處,下面推薦給大家。
-
Innost的專欄
- 鄧凡平前輩所寫博客,條例有序,覆蓋了Android系統(tǒng)大部分內(nèi)容;
- 《深入理解Android》 (卷I,卷II,卷III)
-
老羅的Android之旅
- 羅升陽前輩所寫博客,從各個(gè)層面介紹Android系統(tǒng);
- 《Android系統(tǒng)源代碼情景分析 》
-
Gityuan源碼分析
- 前面兩位的博客基于Android 2.x或4.x,目前Android已發(fā)展到Android 6.0。不管Android如何變化,核心思維變化并不大,兩位前輩的博客還是值得學(xué)習(xí)和參考的地方。但是Android經(jīng)過幾個(gè)大版本迭代,無論是從代碼結(jié)構(gòu)還是整體邏輯仍有很多變化。故博主(Gityuan)撰寫了Android 6.0源碼系列的博文。
3.5 進(jìn)階書籍
- Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)
- 深入理解Linux內(nèi)核
- 深入Linux內(nèi)核架構(gòu)
- Linux設(shè)備驅(qū)動(dòng)程序
- 重構(gòu) 改善既有代碼的設(shè)計(jì)
- 編程珠璣 (卷1, 卷2)
- 設(shè)計(jì)模式
- 設(shè)計(jì)模式之禪
- 人月神話
- …
前4本書都是關(guān)于Linux,如果你不是需要從事Linux相關(guān)開發(fā),只想提升對Android整體的理解,那么只需看一到兩本,對Linux的進(jìn)程、內(nèi)存、IO以及驅(qū)動(dòng)有所了解,對CPU調(diào)度、進(jìn)程間通信有所熟悉就基本可以。另外,優(yōu)秀的書還有很多,這里只介紹/列舉我看過的書,目前還在看一些優(yōu)秀的書,后續(xù)再更新。
需要再次強(qiáng)調(diào)一下,此處高級篇更主要的是針對系統(tǒng)工程師,對于android開發(fā)高級工程師的修煉之路,只需要掌握其中一部分即可,更核心的重點(diǎn)還是在app層面的知識。
四、其他
4.1 開發(fā)書籍推薦
如果還想看更多關(guān)于開發(fā)書籍的推薦, 可以看看diycode
發(fā)起的,由一群社區(qū)較活躍的Android人士(包括Gityuan在內(nèi))一起共同撰寫的Android開發(fā)書籍推薦
4.2 解決問題的方式
遇到問題,一定要先嘗試自己解決,實(shí)在解決不了再請教他人。這是對自己的一個(gè)鍛煉,也是對他人的一個(gè)尊重,可以有多種途徑自行嘗試解決:
-
百度
一下,很多時(shí)候還是能有所幫助的,不要過分強(qiáng)調(diào)google,完全拋棄百度,畢竟中文資料對大多數(shù)人來說理解起來更快; -
Google
搜索,建議先用中文關(guān)鍵詞google
一下;再英文關(guān)鍵詞google一下; - stackoverflow.com、知乎等技術(shù)問答網(wǎng)站內(nèi)直接搜索;
- 查看官方文檔;
- 如果有源碼,嘗試直接看源碼,看能否解決;
另外,有空可以多逛逛github
,多看看Google官方文檔,多關(guān)注社區(qū),定會(huì)收獲不少;
4.3 番外篇
最后,再說說關(guān)于學(xué)習(xí)編程的番外篇:
- 好奇心比雄心走得更遠(yuǎn):很多人對未來空有滿腔的雄心壯志,往往不如對技術(shù)要有一份好奇心,一份探索欲,再加上一份執(zhí)著的人。
- 要有open的心態(tài):曾經(jīng)的我也只是把自己的所思所得都放入自己的云筆記,很少整理,這其實(shí)不利于技術(shù)發(fā)展,有空應(yīng)該多整理自己零散的知識點(diǎn),覺得不錯(cuò)的點(diǎn)可以拿出來寫成博客,那是對能力的又一層提升。另外,在低頭做技術(shù)的同時(shí),還應(yīng)該有空抬頭看世界,不能閉門造車。
- 天道酬勤:學(xué)歷只能代表過去,能力代表現(xiàn)在,潛力代表未來! 你不把自己逼一把,你壓根不知道自己有多優(yōu)秀,只要努力去學(xué)習(xí),去挖掘潛力,進(jìn)而提升自我技術(shù)修為,未來不再是夢!共勉之!
- 當(dāng)然,最最重要的是能靜得下心,持之以恒地鉆研技術(shù)。
您的點(diǎn)贊收藏就是對我最大的鼓勵(lì)! 歡迎關(guān)注我,分享Android干貨,交流Android技術(shù)。 對文章有何見解,或者有何技術(shù)問題,歡迎在評論區(qū)一起留言討論!
作者:Gityuan
原文鏈接:http://gityuan.com/2016/04/24/how-to-study-android/#%E4%BA%8Candroid%E5%9F%BA%E7%A1%80%E7%AF%87