今天我將給你們分享一下我學習Android的一些方法和想法,分享中並不侷限於Android哪一塊怎麼學習。而是一個整體的,普適性的學習套路和方法。但願能夠幫助你們解決一些問題。javascript
注意本文爲知乎Live底稿,知識點相對分散,後面部分包含了一些聽衆提出的問題,可是不影響整體的閱讀和理解。java
Android須要打好哪些編程基礎
除了編程基礎,咱們還須要補充哪些能力
- 喜歡鑽研的興趣
- 良好的英語理解能力
- 善於思考和總結的習慣
- 高效率的學習方法
- 可以機智地利用Google搜索
- 善於利用工具
- 和現實事物關聯類比的能力
- 對待問題的態度
1.喜歡鑽研的興趣,儘管高級編程語言的出現讓咱們將精力更多的放到業務上,而不是編程細節。正所謂知其然知其因此然,鑽研細節能夠更好地幫助咱們實現業務,作到了然於胸。android
2.良好的英文理解能力。因爲一些緣由,咱們接觸到的一些技術的資料都是二手資料,而這些二手資料每每在知識傳遞的效果上有一些折扣,甚至是誤差。英語能夠說是(安卓)編程提高的加速器。同時,英語好的話,能夠輔助咱們寫出更具備自解釋的代碼。git
3.善於思考和總結的習慣。真理越辯越明,一樣技術越思考越清晰。對於一個技術一般咱們須要抱有這樣的疑問程序員
- 它是什麼 一句話歸納
- 解決了什麼問題 存在的意義
- 怎樣解決了問題 內部的實現
- 它的缺點是什麼 多角度分析
好比咱們關於WebView的考慮點的總結github
- 是否支持js
- 是否支持mixed content (https網頁加載http圖片)
- 與js通訊的問題,好比給方法增長JavaScriptInterface註解
- 是否自身處理某些URL(協議不一樣,不讓flipboard://showSection等)仍是交給外部程序
- 關於UA中是否加入特定的標識,好比Flipboard字樣
- 是否增長特定的header
有了思考,咱們須要以文字的形式記錄下來,這也應了那句老話,好記性不如爛筆頭。建議以博客的形式總結出來。web
4.高效率的學習方法。面試
- 理清楚概念很重要
- 作好控制變量法
- 多動手實踐,與理論結合
- 抓住重點,剔除干擾因素
其實,任何複雜的事情都是由簡單的事情組成,編程也是同樣。在編程過程當中,咱們會接觸到不少概念,這些概念很重要,對於概念的只知其一;不知其二每每會使得咱們越走越慢,學習起來原來越困難。所以對於編程中的概念要務必理解準確和深入。算法
控制變量法:咱們在初中作實驗的時候,常常會用到控制變量法。在編程中紅也是。當咱們在解決問題時,也要作到控制一處修改。好比咱們項目中須要修一個webview相關的bug,咱們要想想能不能脫離如今龐大而負責的項目,單獨寫一個簡單的變量單一的sample來重現,作到快速和小粒度驗證。shell
多動手實踐與理論結合:不少時候,咱們學習新技術的時候,咱們應該先學會使用它,有了初步的認知以後,便於咱們更好的理解和深刻研究。好比關於GUI的東西,咱們最好時不時作出一些東西,理論和實踐要作到相輔相成。
抓住重點,剔除干擾因素:
- 任何複雜的事情都是簡單問題錯綜複雜交織在一塊兒,進行拆分
- 去除無關因素或者干擾因素
- 補充瞭解問題必備的知識
- 具象分析:看它的實現原理和運行機制 (好比經過分析源碼,咱們知道HandlerThread無非就是一個自帶並初始化好了Handler的線程)
- 抽象總結:從適度抽象的角度進行概括
5.機智地使用Google。從事編程工做,使用Google是一種必須。雖然國內訪問不了,可是對於聰明的程序員來講這不算問題。一般狀況下,我都是講想要搜索的知識點轉成英文的形式,不包含中文。優先查看stackoverflow 和 google groups的內容。相比而言,中文的相關資源並非很可靠,質量也廣泛差一些。
6.善用工具,多使用終端,多嘗試寫一些腳本解決重複的工做。Python,Ruby,Shell腳本均可以幫助你寫出不少利器。
- 好比全文查找關鍵字工具
grep -E $1 --exclude-dir={.git,lib,.gradle,.idea,build,captures} --exclude={*.png,*.jpg,*.jar} . -R --color=always -n
能找出Android工程下面的包含某個關鍵字的文件以及所在的行數。
- 快速獲取當前Activity的名稱
adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp' --color=always
- 快速檢查json文件是否合法
- https://github.com/androidyue/DroidScripts
7.和現實事物關聯類比的能力
隨着編程時間的增加,咱們會原來愈加現程序裏的不少概念和現實生活中的事物是相似的。
- 好比數據庫的索引和現實生活中咱們使用的字典索引。好處都是便於快速查找。很差的地方,索引多了會增長佔用,增長,刪除,修改同時連帶索引修改會慢一些等。
- 好比對象池和現實中餐廳的公共餐具是相似的。咱們都須要回收的時候,清理髒數據,避免影響到下一次使用。
- 好比KFC裏面的餐具回收人員關於什麼時候回收餐盤,和JVM的GC實際上是相似的。一個對象不被其餘對象持有,就能夠回收。即一個桌子上沒有人,只有餐具一般是能夠回收的。
如何作到關聯和類比
- 瞭解編程中的具體概念,抓住問題的關鍵點和關鍵行爲
- 選擇現實中習覺得常的事物和行爲進行類比,不要選擇模糊不清的。
- 提取共同點,檢查是否match。
8.對待問題的態度 對待問題的態度必定要積極。不能得過且過。好比對待不容易/不能復現的問題,及時手頭沒有能夠復現的機器,也要經過模擬/使用雲設備 等方式嘗試重現。
對於目前在作的只有本身已知的問題,不要隱瞞,儘可能暴露出來,這樣便於本身和他人更好的發現解決。
做爲Android程序員,如何把握好技術的寬度和深度
對於Android來講,有太多的誘惑,好比React Native,小程序,熱更新,插件化。
我理解的應該是先從寬度上拓展,而後在盡心深度研究。
何時須要橫向拓展
- 初學者
- 工做業務量繁多,好比瀏覽器開發(普通App開發技術,HTML+Javascript等技術)
- 自身興趣
何時須要縱向深刻
- 中級和高級開發
- 追求更深刻的細節和思想
- 工做內容須要
橫向發展有哪些
- ReactNative等技術
- 簡單的後臺開發 Java/PHP/Python/Ruby
- IOS等應用開發
- 總而言之就是會的多
縱向發展有哪些
- 系統源碼
- 各類技術的實現機制
- 操做系統相關知識等
- 總而言之就是學得精,知其然深知其因此然。
我我的比較傾向於多花點時間作深刻研究,在這個過程當中會慢慢造成一種透徹理解技術的能力,有了這種能力以後就能舉一反三,學習其餘技術也會更加輕鬆。
另外,工做須要時影響你朝着哪一個維度發展的重要因素。因此選擇一個公司要謹慎。
- 一般大公司,優秀的團隊會有利於你進行縱向深刻
- 小公司,創業公司更多的會影響你進行橫向發展。
如何從平常的工做中獲取最大的收益
平常的工做中,咱們都是在作公司的項目。咱們想要作到最大化收益須要作到
- 不要將本身的要求僅僅停留在功能實現(好比完成一個界面不表明你的收益作到最大,只是表明任務完成)
- 要理解你所使用的技術的原理和本質。不要停留在API使用,不然沒法加強你的競爭力。好比咱們對於加載Bitmap都會用到LRUCache,咱們則須要至少理解LRUCache的原理,若是能夠的話,瞭解它的內部實現機制。
- 項目中有好的地方,要去思考好在何處。思考這種技術的通用場景。
- 在項目中思考更好的解決方法。作好兩種方案的優缺點對比。好比你聽了《Android Performance Pattern》中關於ArrayMap的講解,也考慮到HashMap的空間佔用問題,不要急於去替換。要作到對比(既要了解HashMap也要了解ArrayMap)同時結合業務場景來選擇最適用的。
- 若是在項目中遇到了問題,建議先解決,而後空餘時間研究這個技術的原理和細節。後續的研究務必要作。
- 善於作總結,將本身的經驗和教訓寫成博客分享給他人。
平常的工做給咱們提供了許許多多好的實踐和很差的問題,是一塊彌之珍貴的技術提高的源泉。
Android那麼多庫,我該選擇哪些,怎麼學,學到什麼程度
庫的存在是爲了封裝細節,簡化調用者實現或者輔助咱們更容易發現問題。好比ButterKnife利用註解簡化了對於view的查找和類型轉換等功能。
關於如何選擇那些庫
- 肯定這個庫是不是必需的
- 這個庫可否帶來開發效率的提高,下降代碼的維護成本
- 這個庫的學習成本如何 好比rxjava其實學習成本會相對高一些。
- 這個庫的質量如何,不要僅僅看star,更要看issue的處理狀況
Flipboard經常使用的庫(部分)
- LeakCanary A memory leak detection library for Android and Java.
- Stetho Stetho is a debug bridge for Android applications, enabling the powerful Chrome Developer Tools and much more.
- ButterKnife Bind Android views and callbacks to fields and methods.
- Baber A custom view styling library
- GoldenGate An Android annotation processor for generating type safe javascript bindings
- MaterialEditText EditText in Material Design
- 。。。
關於庫,首先咱們須要掌握其使用方法,一樣也須要理解其運行機制。
對於初學者,大學生的建議有哪些
- 愈來愈多的關於互聯網寒冬的消息傳出
- 聽見愈來愈多的人抱怨Android找工做愈來愈難,已經趨近飽和。
- Android開發的紅利期正在逐漸消逝,尤爲是對於初級和中級開發人員
- 關於如今加入Android開發隊伍,我並不反對。
- 仍然能夠遇上紅利期的有容器,機器學習和人工智能。
- 可是不管選擇哪種技術,即使是Android,請具有好的基礎和較強的編程能力和足夠的愛好。不要僅僅追求物質。
一直想學,卻很難堅持下去
- 有意願是很好的。
- 若是很難堅持下去,可能的緣由有沒有學進去,或者自制力比較差
- 關於沒有學進去,能夠參考上面提到的學習方法
- 若是是自制力的話,能夠經過自我監督和他人監督的方式來改善。
不知道去哪裏學安卓,能夠邊學邊工做麼
- 學習Android的途徑有不少,能夠是自學(視頻網站,看書,博客)也能夠選擇培訓(不推薦)
- 邊學邊工做一般是能夠的,不過具體實施起來還要結合自身的狀況,好比時間是否充裕,學習者的決心和自學能力。
春招作準備,數據結構和算法不懂怎麼辦
不管是春招仍是秋招,對基礎知識的掌握程度都是很重要的衡量標準,畢竟畢業生的實戰經驗比較少一些。
數據結構和算法應該是必不可少的一部分。建議仍是要多多作一些準備工做。
呈現出最好的狀態來面試春招。
本身有一個什麼樣的我的項目纔有競爭力
若是這個項目是App
- 首先有足夠的用戶量,好比月活達到上萬的數量級
- 界面和交互處理良好,符合Android UI/UE規範
- 運行流暢和穩定,不存在低級的錯誤(好比卡頓等問題)
- App能明顯解決用戶的痛點
若是這個項目是一個開源項目
- 有足夠的star(然而這個已經被玩壞了)
- issue的處理狀況
- contributor的數量
- 設計的思想是否優秀
- 代碼是否竟然自解釋性
- 學習成本和維護成本儘可能少
我該如何選擇網絡中魚龍混雜的學習資料 pass
- 使用Google和StackOverflow,Medium
- 若是是博客文章,在本身能力能夠理解前提下,儘可能選擇英文
- 最簡單判斷一個文章的優劣能夠先到文章的底部看評論(Good,Execellent,Awesome)以及Google+,Facebook,Twitter分享數量
- 儘可能選擇內容整潔(說明態度認真)的文章
學習效果差的問題 pass
- 長期看慕課和論壇,感受效果不好
- 感受經過視頻學習,進步很大,可是即便學習完了,感受仍是菜鳥
- 視頻也看了,書也讀了,可是寫起來仍是很吃力,下一步如何熟練和進階
產生這些結果的緣由:
- 一般的視頻網站傳授給你們都每每是立竿見影的技能。
- 學習中缺少思考,沒法作到舉一反三。只知道照葫蘆畫瓢
- 基礎薄弱,概念沒有搞清。致使作上層的東西舉步維艱。
- 沒有比較良好的輔助工具或者沒法找到優秀的輔助內容。
如何提升安卓程序員的核心競爭力,項目理解能力仍是技術能力,哪一個更重要
- 什麼是核心競爭力。表如今學習技術的能力,對待問題的態度,解決問題的技術方案。別的行業其實也是這樣的。
- 具體如何提升核心競爭力,我上面有提到,參考程序員須要具有其餘那些能力。
- 這兩個能力是相輔相成的,很難作出孰重孰輕的決斷。
大齡Android程序員的煩惱
常常收到一些安卓程序員的郵件,其中有不少問題是,作了Android不少年了,爲之後的職業選擇惆悵。好比互聯網寒冬,華爲清退34歲以上員工等等。
的確,因爲Android相關的工程師需求不如以前那麼好,加之年齡越大,拼勁可能不如剛剛畢業的年輕人。這種煩惱是能夠理解的。
走出煩惱的一些方法
- 不斷學習,夯實基礎,拓展技術面。爲何老是提到這個,由於其實存在不少程序員,邏輯思惟不強,還不愛學習。不斷學習對於程序員來講相當重要。
- 提升本身的競爭力,不要成爲僅僅面向API編程的程序員。要勤于思考,追求更高。求其上者得其中,求其中者得其下。你必須和5年前,甚至是10年前的你有改變,不能僅僅是一項技能重複了5年,10年。
- 創建我的品牌:寫博客,寫書,開源項目,寫獨立App等。注意這其中任何一個都是一個長期堅持才能完成的事情。關於寫博客,我在之前的知乎live講過一些技巧和思路,地址爲 https://www.zhihu.com/lives/796775894273363968
- 其實現代人的煩惱,不管是否是程序員,不少都是關於物質生活的恐懼。買車買房,家庭支出等等問題。以及對於本身的能力沒法知足物質支出的恐懼和擔憂。在本身沒法改變的狀況下,適當調整心態。
- 嘗試知識變現,可是須要不斷積累,須要時間。不能一蹴而就。
- 關於溫馨區,學習區和恐懼區的理論
理論
-
「溫馨區」, 對於你來講是沒有學習難度的知識或者習覺得常的事務,本身能夠處於溫馨心理狀態。
-
「學習區」,對本身來講有必定挑戰,於是感到不適,可是不至於太難受。
-
「恐慌區」,超出本身能力範圍太多的事務或知識,心理感受會嚴重不適,可能致使崩潰以至放棄學習。
對於一我的來講,最理想的狀態是處於「學習區」,學習具備適當挑戰性的東西, 一段時間後,「學習區」會慢慢變爲「溫馨區」, 「溫馨區」越變越大, 而一部分的「恐慌區」 也會相應變成「學習區」。