摘要: 看到不少人提問非科班該如何學習編程,其實科班也基本靠自學。有句話叫「師傅領進門修行靠我的」,再厲害的老師能教你的東西都是頗有限的,真正的修行仍是要靠本身。我本科是學數學的,雖然研究生是計算機專業,但研究生每每是作研究工做,並不會接觸編程這麼基本的東西,關於編程相關我都是靠自學。java
看到不少人提問非科班該如何學習編程,其實科班也基本靠自學。有句話叫「師傅領進門修行靠我的」,再厲害的老師能教你的東西都是頗有限的,真正的修行仍是要靠本身。我本科是學數學的,雖然研究生是計算機專業,但研究生每每是作研究工做,並不會接觸編程這麼基本的東西,關於編程相關我都是靠自學。對於Android這一塊,是參加工做還開始接觸,開始本身學習的。linux
學習級別,不少人都每每劃分紅入門、初級、中間..骨灰級等。這裏就簡單地劃分爲兩級:基礎篇和進階篇。另外,本文涉及到的全部書籍都是Gityuan 在學習過程當中所讀過的比較經典的一些書籍,才推薦給你們。android
1、基礎篇git
看書的姿態:學習過程每每你們都須要看書,網上一搜,每每會有一大推的書推薦給你們去閱讀,面對這麼多書,該如何選擇,如何閱讀的呢,對於同一個層級的書籍選擇一本精讀,其他的粗讀、略讀便可,大同小異,對於精讀的書籍須要反覆的閱讀。程序員
1.1 Java篇github
Java是Android的基礎,建議初學者必定要先學習Java基本知識,進而再學習Android,按部就班,切莫心急,只有紮實的基礎才能建造牢固的上層建築。算法
Java書籍編程
Thinking in Java: 中文版《Java編程思想 》,這是一本很是經典的Java書籍,不少人都說這個書不適合初學者,我記得本身當初看的第一本Java書即是這本書。看完第一遍對Java有了總體的理解,但不少細節沒有徹底理解,查了資源又看了第二遍,對Java有了更深地理解。再後來一段時間後,能力也有所提高,再拿起這本書又看了第三遍,發現對面向對象有了更深一步的理解,這本書就是適合反覆的閱讀。設計模式
Effective Java:Java進階書,這本書採用「條目」的方式來展開的,總提出了78條Java具體的建議,對Java平臺精妙之處的獨到看法,還提供優秀的代碼範例。做爲Java進階之書,對Java水平的提高大有裨益。瀏覽器
Java concurrency in Practice:中文版《Java併發編程實戰》,本書採用按部就班的講解方式,從併發編程的基本理論講起,再講述告終構化併發應用,性能與測試,最後將顯式鎖、原子變量、非阻塞算法這些高級主題。對於Java併發這一塊算得上是一本很棒的書。
Java Performance:中文版《Java性能優化權威指南》,Java之父James Gosling推薦的一本Java應用性能優化的經典之做,包含算法結構、內存、I/O、磁盤使用方式,內容通俗易懂,還介紹了大量的監控和測量工具。關於優化都是屬於較深的領域,對Java有必定基礎後,頗有必要了解看看。
Java虛擬機,這是做爲進階Java高手必需有所瞭解:
The Java Language Specification,官方Java文檔(英文版)
The Java® Virtual Machine Specification,官方Jvm文檔(英文版)
《深刻理解java虛擬機》:這是國內關於Java虛擬機講得很是全面的一本書,從Java GC到Java虛擬機內部實現以及優化策略,做爲Java高手很是值得一看的書籍。
本文的重點是講如何學習Android,因此姑且把Java基礎與進階的書都放到Android學習的基礎篇裏。做爲Android開發者來講,徹底沒有必要一開始都對Java理解得那麼深,只有要看一兩本Java基本書,掌握Java面向對象的思想的核心要義即萬物皆爲對象,掌握Java基本語法,基本就能夠開啓Android的學習之路。在後續對Android也有必定理解後,再慢慢不斷提高Java和Android水平。
有朋友私信我覺着這個java書難度有點高,多是本人在看Java書籍以前,還看過些許C和C++的入門書的緣故,因此看的第一本書《Java編程思想》。若是你真的是零基礎,第一次接觸編程,想以Java做爲本身的入門語言,那麼你能夠先看看《Java語言程序設計》(基礎篇) 或者《Java從入門到精通》,做爲初學者險掌握Java基本語法,平時遇到不熟悉的方法,多查看API文檔便可,慢慢地就熟悉了。
1.2 Android基礎篇
有了必定的Java基礎(不須要精通Java),就能夠開始入門Android。建議初學Android者,必定要先搭建本身的開發環境,先準備jdk和Android Studio環境。再看書的過程,一邊看知識點一邊寫示例程序,一來加深印象,二來提升動手能力。
《瘋狂Android講義》:做者李剛,這是我看過的第一個Android書籍,目前有第三版了,我當時看的是第二版基於Android 4.2,書中有大量的實例,記得當時每看完一個實例就跟着敲了一遍,大概花了一週時間把這本書看完並把大部分的實例代碼都親手敲了一遍。
《第一行代碼》:做者郭霖,網上有很多人都推薦這本書做爲Android入門書,但我當時沒有看過。這是圖靈系列圖書,前段時間圖靈的編輯看到個人博客gityuan.com,因而聯繫到我問是否有興趣出書,便提到郭霖的《第一行代碼》也是他們出版社推出的,而後就給我郵寄了一本。我大概掃了一掃這本書,內容的確比較基礎,做者文筆不錯,書中還穿插了很多打怪漲經驗升級的片斷,比較風趣,初學者能夠看看。
Android的基本書籍,只需一兩本便可,沒有必要看太多基礎書籍,不一樣能力就該有不一樣的追求,這裏就再也不介紹其餘基礎書籍。 另外,Android開發過程當中老是須要各類開發環境、工具的下載,再這裏推薦一個不錯的網站AndroidDevTools.cn,收集整理了 Android開發、設計等相關的各類工具大集合,很是全面,並且速度也不錯哦,最重要的不用就可下載到最新的工具。
1.3 Android一手資料
何爲Android一手資料?那就是Google官方給出的資料,這裏每每是英文版的,養分價值極高。其實你只要英文還湊合+工具,強烈建議你直接看Android官網的資料,千萬別被英語所嚇倒,由於不少專業名稱,你們一看就明白好比Activity/Service等這些代碼名稱自己就是英語,剩下地都就很是基礎語法,不懂能夠隨時翻譯,我通常都是用Chrome瀏覽器+Google翻譯插件,哪裏不會點哪裏,媽媽不再用擔憂個人英語了。
言歸正傳,若是你能看完並理解下列的內容,那麼你徹底能夠沒有必要再看前面介紹的書籍,而且對於Android已有至關熟悉了。
developer.android.com:Android開發官網,下面列舉經常使用的資料:
另外由胡凱發起了Android培訓課程中文版;對官方文檔進行翻譯;
Android training:Android培訓文檔;
Android API指南:Android組件、Manifest配置文件,動畫/圖像等相關介紹;
Android Tools:性能、測試、Android Studio等各類工具說明文檔;
source.android.com:介紹Android開源碼相關的內容;
Android Performance Patterns:2015年Google陸續在Youtube上發佈的Android性能優化的視頻,目前已更新第4季。
國內Google組織,優酷上發佈了相應的 (中文)Android 性能模式 第四季;
另外由胡凱發起了Android性能優化典範中文版文檔;對官方視頻進行翻譯並整理;
android-developers.blogspot.com:Android官方博客,有一些比較不錯的feature,博客會第一時間呈現。
1.4 Android資源整理
到這裏,那麼你已經具有開發App的本領。平時須要本身動手多寫寫App,另外就是看看別人優秀的App是如何寫的,下面列舉一些開源庫、工具以及App:
android-arsenal.com:做者vbauer整理收集Github中各類開源庫與工具,並提供搜索功能,是國外整理得最全面的庫;
Android 開源項目彙總:做者Trinea整理的各類開源庫,是國內整理得最全面的庫;
codeKK 開源項目源碼分析:從源碼的角度,分析Android較流行的優秀開源框架;
codota.com:這是一個代碼搜索引擎,收集的是各類API的優秀示例Java代碼。
固然還有不少優秀的博客和網站值得推薦… //TODO
2、進階篇
做爲程序員,不去閱讀源碼,僅僅看API文檔,只是浮於表象,這是遠遠不夠的。.真正最能鍛鍊能力的即是直接去閱讀源碼,不只限於閱讀Andoid系統源碼,也包括閱讀各類優秀的開源庫。
2.1 閱讀源碼的重要性
借用Linux之父Linus Torvalds的一句名言:Read the fucking source code。無論是閱讀Andoid系統源碼仍是優秀的開源框架,對能力那都會有一個巨大的提高;首先,能學習到優秀的代碼風格和設計思想;能真正作到「知其然,還需知其因此然」;能指導本身更加靈活的使用API,能更加快速地找到系統bug的根源。
2.2 閱讀源碼的準備
Java基礎:上層framework以及App層都是採用Java語法;
C/C++基礎:Android的jni/native層代碼採用C++,Linux 採用C;
Linux:Android內核基於Linux的,瞭解Linux相關知識對深刻掌握Android仍是頗有必要。
Git:Android源碼採用git和repo進行管理;
Make:Android源碼採用Make系統編譯,源碼系統中會看到不少Android.mk之類的文件;
Source Insight:這絕對是看源碼的神器;能夠在Java、C++、C代碼之間無縫銜接;
Eclipse:熟悉經常使用快捷鍵,工欲善其事必先利其器;雖然Source Insight很方便,但因爲對Eclipse的熟悉感,對於framework Java層面的代碼,我仍是更習慣用Eclipse來看,對於Native代碼以及linux代碼則採用Source Insight來看;
Android Studio:這是Google官方支持的App開發環境,關於Android Studiod使用教程;
Google Drawings:這是畫圖工具,Gityuan博客中的文章都是採用Google Drawing完成,好比Binder開篇文中的圖。
StarUML:這是類圖,Gityuan博客文章的類圖和流程圖都是採用StarUML完成,好比理解Android進程建立流程文中時序圖。
2.3 閱讀源碼的姿態
閱讀源碼毫不是從源碼工程按順序一個個的文件,從首行看到尾行。正確而高效地閱讀源碼的姿態應該是以某一個主線爲起點,從上層往底層,不斷地追溯,在各個模塊、文件、方法之間來回跳轉,反覆地閱讀,理清整個流程的邏輯。同時帶着思考去看源碼,嘗試去揣測做者的用意,去理解代碼的精妙之處,去思考代碼可能存在的缺陷,去總結優秀的代碼設計思想。下面說說我在閱讀Android源碼過程常涉及的庫。
閱讀Android源碼:
下面是我以Android開機過程爲主線,展開一系列的文章 Android開篇中的一副流程圖,在公司內部分享時我曾屢次如下圖爲流程整個Android架構,以下圖:
Android系統源碼
android.googlesource.com:Google官方源碼,國內沒法直接訪問,對於一個程序員來講能力是很是有必要的。Android源碼中包含的庫很是之多,下面列舉我在看Android源碼過程當中涉及較多,也是比較常看的一些庫:
android/platform/packages/apps:Android自帶的app,好比Email,Camera, Music等,對於應用開發工程師主要關注的目錄;
android/platform/frameworks/base: Java framework,這是framework工程師看得最多的目錄;
android/platform/frameworks/native:Native framework;
android/platform/art:Art虛擬機;
android/kernel/common:Android內核,這是驅動工程師最關注的模塊;
android/platform/system/core :核心系統;
android/platform/libcore:平臺的lib庫; 另外,對於朋友來講,還能夠經過上Github經過Android主頁 下載Android源碼,這些都是定時從Google官方源碼的鏡像同步而來的。
2.4 優秀資源
牛頓曾說過:「若是我看得更遠一點的話,是由於我站在巨人的肩膀上」,這句話很具備實用價值,看完前面的介紹,你千萬不要一上來就一頭扎進源碼的世界,當心你會進入二次元世界,處於混沌狀態,最後崩潰乃至放棄求知之路,必定要合理利用現有的優秀資源。
Android 系統源碼分析
Innost的專欄
鄧凡平前輩所寫博客,條例有序,覆蓋了Android系統大部份內容;
《深刻理解Android》 (卷I,卷II,卷III)
老羅的Android之旅
羅昇陽前輩所寫博客,從各個層面介紹Android系統;
《Android系統源代碼情景分析 》
Gityuan源碼分析
對於鄧凡平和羅昇陽兩位前輩的博客基於Android 2.x或4.x,目前Android已發展到Android 6.0。無論Android如何變化,其核心思惟變化並無很大,因此兩位前輩的博客仍是頗有值得學習和參考的地方。話又說回來,Android通過了幾個大版本的迭代,不管是從代碼結構仍是總體邏輯仍有很多變化。故博主計劃寫一關於Android 6.0源碼系列的博文。
Gityuan做爲Android界新秀,能力尚不及不少前輩,但有一顆樂於分享的心,有一份癡於Android的品質,有一種堅持的態度,已經並一直還在努力奮鬥的道路上…
2.5 進階書籍
《深刻理解Linux內核》
《深刻Linux內核架構》
《Linux內核設計與實現》
《Linux設備驅動程序》
《重構·改善既有代碼的設計》
《編程珠璣(卷1,卷2)》
《設計模式》
《設計模式之禪》
《人月神話》
前4本書都是關於Linux,若是你不是須要從事Linux相關開發,只想提高對Android總體的理解,那麼只需看一到兩本,對Linux的進程、內存、IO以及驅動有所瞭解,對CPU調度、進程間通訊有所熟悉就基本能夠。另外,優秀的書還有不少,這裏只介紹/列舉我看過的書,目前還在看一些優秀的書,後續再更新。
3、其餘
最後,再說說關於學習編程的番外篇:
好奇心比雄心走得更遠:不少人對將來空有滿腔的雄心壯志,每每不如對技術要有一份好奇心,一份探索欲,再加上一份執着的人。
要有open的心態:曾經的我也只是把本身的所思所得都放入本身的雲筆記,不多整理,這其實不利於技術發展,有空應該多整理本身零散的知識點,以爲不錯的點能夠拿出來寫成博客,那是對能力的又一層提高。另外,在低頭作技術的同時,還應該有空擡頭看世界,不能閉門造車。
天道酬勤:學歷只能表明過去,能力表明如今,潛力表明將來! 你不把本身逼一把,你壓根不知道本身有多優秀,只要努力去學習,去挖掘潛力,進而提高自我技術修爲,將來再也不是夢!共勉之!
解決問題的方式:遇到問題,必定要先嚐試本身解決,解決不了再請教他人。這是對本身的一個鍛鍊,也是對他人的一個尊重,能夠有多種途徑自行搜索:
百度一下,不少時候仍是能有所幫助的,不要過度強調google,徹底拋棄百度,畢竟中文看起來比較快;
先中文關鍵詞google一下;再英文關鍵詞google一下;
stackoverflow.com、知乎等技術問答網站內直接搜索;
查看官方文檔;
若是有源碼,嘗試直接看源碼,看可否解決;
有空能夠多逛逛github,多看看Google官方文檔,多關注社區,定會收穫很多;
固然,最最重要的是能靜得下心,鍥而不捨地專研技術。
====================================分割線================================
文章轉載自 開源中國社區[http://www.oschina.net]