我學習Android的一些套路
今天我將給大家分享一下我學習Android的一些方法和想法,分享中并不局限于Android哪一塊怎么學習。而是一個總體的,普適性的學習套路和方法。希望可以幫助大家解決一些問題。
注意本文為知乎Live底稿,知識點相對分散,后面部分包含了一些聽眾提出的問題,但是不影響總體的閱讀和理解。
Android需要打好哪些編程基礎 Java基礎(Kotlin)(參考技能樹 http://olabqc6d8.bkt.clouddn.com/Java_skill_tree.png ) OOP思想與設計模式 Android基礎(參考Android技能樹 http://7jpolu.com1.z0.glb.clouddn.com/Android_skill_tree.png ) 數(shù)據(jù)結(jié)構(gòu)與算法 其他,比如JVM相關(guān) 除了編程基礎,我們還需要補充哪些能力 喜歡鉆研的興趣 良好的英語理解能力 善于思考和總結(jié)的習慣 高效率的學習方法 能夠機智地利用Google搜索 善于利用工具 和現(xiàn)實事物關(guān)聯(lián)類比的能力 對待問題的態(tài)度1.喜歡鉆研的興趣,盡管高級編程語言的出現(xiàn)讓我們將精力更多的放到業(yè)務上,而不是編程細節(jié)。正所謂知其然知其所以然,鉆研細節(jié)可以更好地幫助我們實現(xiàn)業(yè)務,做到了然于胸。
2.良好的英文理解能力。由于一些原因,我們接觸到的一些技術(shù)的資料都是二手資料,而這些二手資料往往在知識傳遞的效果上有一些折扣,甚至是偏差。英語可以說是(安卓)編程提升的加速器。同時,英語好的話,可以輔助我們寫出更具有自解釋的代碼。
3.善于思考和總結(jié)的習慣。真理越辯越明,同樣技術(shù)越思考越清晰。對于一個技術(shù)通常我們需要抱有這樣的疑問
它是什么 一句話概括 解決了什么問題 存在的意義 怎樣解決了問題 內(nèi)部的實現(xiàn) 它的缺點是什么 多角度分析比如我們關(guān)于WebView的考慮點的總結(jié)
是否支持js 是否支持mixed content (https網(wǎng)頁加載http圖片) 與js通信的問題,比如給方法增加JavaScriptInterface注解 是否自身處理某些URL(協(xié)議不同,不讓flipboard://showSection等)還是交給外部程序 關(guān)于UA中是否加入特定的標識,比如Flipboard字樣 是否增加特定的header有了思考,我們需要以文字的形式記錄下來,這也應了那句老話,好記性不如爛筆頭。建議以博客的形式總結(jié)出來。
4.高效率的學習方法。
理清楚概念很重要 做好控制變量法 多動手實踐,與理論結(jié)合 抓住重點,剔除干擾因素其實,任何復雜的事情都是由簡單的事情組成,編程也是一樣。在編程過程中,我們會接觸到很多概念,這些概念很重要,對于概念的一知半解往往會使得我們越走越慢,學習起來原來越困難。因此對于編程中的概念要務必理解準確和深刻。
控制變量法:我們在初中做實驗的時候,經(jīng)常會用到控制變量法。在編程中紅也是。當我們在解決問題時,也要做到控制一處修改。比如我們項目中需要修一個webview相關(guān)的bug,我們要想一想能不能脫離現(xiàn)在龐大而負責的項目,單獨寫一個簡單的變量單一的sample來重現(xiàn),做到快速和小粒度驗證。
多動手實踐與理論結(jié)合:很多時候,我們學習新技術(shù)的時候,我們應該先學會使用它,有了初步的認知之后,便于我們更好的理解和深入研究。比如關(guān)于GUI的東西,我們最好時不時做出一些東西,理論和實踐要做到相輔相成。
抓住重點,剔除干擾因素:
任何復雜的事情都是簡單問題錯綜復雜交織在一起,進行拆分 去除無關(guān)因素或者干擾因素 補充了解問題必備的知識 具象分析:看它的實現(xiàn)原理和運行機制 (比如通過分析源碼,我們知道HandlerThread無非就是一個自帶并初始化好了Handler的線程) 抽象總結(jié):從適度抽象的角度進行歸納5.機智地使用Google。從事編程工作,使用Google是一種必須。雖然國內(nèi)訪問不了,但是對于聰明的程序員來說這不算問題。通常情況下,我都是講想要搜索的知識點轉(zhuǎn)成英文的形式,不包含中文。優(yōu)先查看stackoverflow 和 google groups的內(nèi)容。相比而言,中文的相關(guān)資源并不是很可靠,質(zhì)量也普遍差一些。
6.善用工具,多使用終端,多嘗試寫一些腳本解決重復的工作。Python,Ruby,Shell腳本都可以幫助你寫出很多利器。
比如全文查找關(guān)鍵字工具 grep -E $1 --exclude-dir={.git,lib,.gradle,.idea,build,captures} --exclude={*.png,*.jpg,*.jar} . -R --color=always -n 能找出Android工程下面的包含某個關(guān)鍵字的文件以及所在的行數(shù)。 快速獲取當前Activity的名稱 adb shell dumpsys window windows | grep -E ’mCurrentFocus|mFocusedApp’ --color=always 快速檢查json文件是否合法 https://github.com/androidyue/DroidScripts7.和現(xiàn)實事物關(guān)聯(lián)類比的能力
隨著編程時間的增長,我們會原來越發(fā)現(xiàn)程序里的很多概念和現(xiàn)實生活中的事物是類似的。
比如數(shù)據(jù)庫的索引和現(xiàn)實生活中我們使用的字典索引。好處都是便于快速查找。不好的地方,索引多了會增加占用,增加,刪除,修改同時連帶索引修改會慢一些等。 比如對象池和現(xiàn)實中餐廳的公共餐具是類似的。我們都需要回收的時候,清理臟數(shù)據(jù),避免影響到下一次使用。 比如KFC里面的餐具回收人員關(guān)于何時回收餐盤,和JVM的GC其實是類似的。一個對象不被其他對象持有,就可以回收。即一個桌子上沒有人,只有餐具通常是可以回收的。 如何做到關(guān)聯(lián)和類比 了解編程中的具體概念,抓住問題的關(guān)鍵點和關(guān)鍵行為 選擇現(xiàn)實中習以為常的事物和行為進行類比,不要選擇模糊不清的。 提取共同點,檢查是否match。8.對待問題的態(tài)度 對待問題的態(tài)度一定要積極。不能得過且過。比如對待不容易/不能復現(xiàn)的問題,及時手頭沒有可以復現(xiàn)的機器,也要通過模擬/使用云設備 等方式嘗試重現(xiàn)。
對于目前在做的只有自己已知的問題,不要隱瞞,盡量暴露出來,這樣便于自己和他人更好的發(fā)現(xiàn)解決。
作為Android程序員,如何把握好技術(shù)的寬度和深度對于Android來說,有太多的誘惑,比如React Native,小程序,熱更新,插件化。
我理解的應該是先從寬度上拓展,然后在盡心深度研究。
什么時候需要橫向拓展 初學者 工作業(yè)務量繁多,比如瀏覽器開發(fā)(普通App開發(fā)技術(shù),HTML+Javascript等技術(shù)) 自身興趣 什么時候需要縱向深入 中級和高級開發(fā) 追求更深入的細節(jié)和思想 工作內(nèi)容需要 橫向發(fā)展有哪些 ReactNative等技術(shù) 簡單的后臺開發(fā) Java/PHP/Python/Ruby IOS等應用開發(fā) 總而言之就是會的多 縱向發(fā)展有哪些 系統(tǒng)源碼 各種技術(shù)的實現(xiàn)機制 操作系統(tǒng)相關(guān)知識等 總而言之就是學得精,知其然深知其所以然。我個人比較傾向于多花點時間做深入研究,在這個過程中會慢慢形成一種透徹理解技術(shù)的能力,有了這種能力之后就能觸類旁通,學習其他技術(shù)也會更加輕松。
另外,工作需要時影響你朝著哪個維度發(fā)展的重要因素。所以選擇一個公司要謹慎。
通常大公司,優(yōu)秀的團隊會有利于你進行縱向深入 小公司,創(chuàng)業(yè)公司更多的會影響你進行橫向發(fā)展。 如何從日常的工作中獲取最大的收益日常的工作中,我們都是在做公司的項目。我們想要做到最大化收益需要做到
不要將自己的要求僅僅停留在功能實現(xiàn)(比如完成一個界面不代表你的收益做到最大,只是代表任務完成) 要理解你所使用的技術(shù)的原理和本質(zhì)。不要停留在API使用,否則無法增強你的競爭力。比如我們對于加載Bitmap都會用到LRUCache,我們則需要至少理解LRUCache的原理,如果可以的話,了解它的內(nèi)部實現(xiàn)機制。 項目中有好的地方,要去思考好在何處。思考這種技術(shù)的通用場景。 在項目中思考更好的解決方法。做好兩種方案的優(yōu)缺點對比。比如你聽了《Android Performance Pattern》中關(guān)于ArrayMap的講解,也考慮到HashMap的空間占用問題,不要急于去替換。要做到對比(既要了解HashMap也要了解ArrayMap)同時結(jié)合業(yè)務場景來選擇最適用的。 如果在項目中遇到了問題,建議先解決,然后空余時間研究這個技術(shù)的原理和細節(jié)。后續(xù)的研究務必要做。 善于做總結(jié),將自己的經(jīng)驗和教訓寫成博客分享給他人。日常的工作給我們提供了許許多多好的實踐和不好的問題,是一塊彌之珍貴的技術(shù)提升的源泉。
Android那么多庫,我該選擇哪些,怎么學,學到什么程度庫的存在是為了封裝細節(jié),簡化調(diào)用者實現(xiàn)或者輔助我們更容易發(fā)現(xiàn)問題。比如ButterKnife利用注解簡化了對于view的查找和類型轉(zhuǎn)換等功能。
關(guān)于如何選擇那些庫
確定這個庫是否是必需的 這個庫能否帶來開發(fā)效率的提升,降低代碼的維護成本 這個庫的學習成本如何 比如rxjava其實學習成本會相對高一些。 這個庫的質(zhì)量如何,不要僅僅看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 。。。關(guān)于庫,首先我們需要掌握其使用方法,同樣也需要理解其運行機制。
對于初學者,大學生的建議有哪些 越來越多的關(guān)于互聯(lián)網(wǎng)寒冬的消息傳出 聽見越來越多的人抱怨Android找工作越來越難,已經(jīng)趨近飽和。 Android開發(fā)的紅利期正在逐漸消逝,尤其是對于初級和中級開發(fā)人員 關(guān)于現(xiàn)在加入Android開發(fā)隊伍,我并不反對。 仍然可以趕上紅利期的有容器,機器學習和人工智能。 但是無論選擇哪一種技術(shù),即便是Android,請具備好的基礎和較強的編程能力和足夠的愛好。不要僅僅追求物質(zhì)。 一直想學,卻很難堅持下去 有意愿是很好的。 如果很難堅持下去,可能的原因有沒有學進去,或者自制力比較差 關(guān)于沒有學進去,可以參考上面提到的學習方法 如果是自制力的話,可以通過自我監(jiān)督和他人監(jiān)督的方式來改善。 不知道去哪里學安卓,可以邊學邊工作么 學習Android的途徑有很多,可以是自學(視頻網(wǎng)站,看書,博客)也可以選擇培訓(不推薦) 邊學邊工作通常是可以的,不過具體實施起來還要結(jié)合自身的情況,比如時間是否充裕,學習者的決心和自學能力。 春招做準備,數(shù)據(jù)結(jié)構(gòu)和算法不懂怎么辦無論是春招還是秋招,對基礎知識的掌握程度都是很重要的衡量標準,畢竟畢業(yè)生的實戰(zhàn)經(jīng)驗比較少一些。
數(shù)據(jù)結(jié)構(gòu)和算法應該是必不可少的一部分。建議還是要多多做一些準備工作。
呈現(xiàn)出最好的狀態(tài)來面試春招。
自己有一個什么樣的個人項目才有競爭力 如果這個項目是App 首先有足夠的用戶量,比如月活達到上萬的數(shù)量級 界面和交互處理良好,符合Android UI/UE規(guī)范 運行流暢和穩(wěn)定,不存在低級的錯誤(比如卡頓等問題) App能明顯解決用戶的痛點 如果這個項目是一個開源項目 有足夠的star(然而這個已經(jīng)被玩壞了) issue的處理情況 contributor的數(shù)量 設計的思想是否優(yōu)秀 代碼是否居然自解釋性 學習成本和維護成本盡量少 我該如何選擇網(wǎng)絡中魚龍混雜的學習資料 pass 使用Google和StackOverflow,Medium 如果是博客文章,在自己能力可以理解前提下,盡量選擇英文 最簡單判斷一個文章的優(yōu)劣可以先到文章的底部看評論(Good,Execellent,Awesome)以及Google+,Facebook,Twitter分享數(shù)量 盡量選擇內(nèi)容整潔(說明態(tài)度認真)的文章 學習效果差的問題 pass 長期看慕課和論壇,感覺效果很差 感覺通過視頻學習,進步很大,但是即使學習完了,感覺還是菜鳥 視頻也看了,書也讀了,但是寫起來還是很吃力,下一步如何熟練和進階產(chǎn)生這些結(jié)果的原因:
通常的視頻網(wǎng)站傳授給大家都往往是立竿見影的技能。 學習中缺乏思考,無法做到觸類旁通。只知道照葫蘆畫瓢 基礎薄弱,概念沒有搞清。導致做上層的東西舉步維艱。 沒有比較良好的輔助工具或者無法找到優(yōu)秀的輔助內(nèi)容。 如何提高安卓程序員的核心競爭力,項目理解能力還是技術(shù)能力,哪個更重要 什么是核心競爭力。表現(xiàn)在學習技術(shù)的能力,對待問題的態(tài)度,解決問題的技術(shù)方案。別的行業(yè)其實也是這樣的。 具體如何提高核心競爭力,我上面有提到,參考程序員需要具備其他那些能力。 這兩個能力是相輔相成的,很難做出孰重孰輕的決斷。 大齡Android程序員的煩惱經(jīng)常收到一些安卓程序員的郵件,其中有很多問題是,做了Android很多年了,為以后的職業(yè)選擇惆悵。比如互聯(lián)網(wǎng)寒冬,華為清退34歲以上員工等等。
的確,由于Android相關(guān)的工程師需求不如之前那么好,加之年齡越大,拼勁可能不如剛剛畢業(yè)的年輕人。這種煩惱是可以理解的。
走出煩惱的一些方法
不斷學習,夯實基礎,拓展技術(shù)面。為什么總是提到這個,因為其實存在很多程序員,邏輯思維不強,還不愛學習。不斷學習對于程序員來說至關(guān)重要。 提高自己的競爭力,不要成為僅僅面向API編程的程序員。要勤于思考,追求更高。求其上者得其中,求其中者得其下。你必須和5年前,甚至是10年前的你有改變,不能僅僅是一項技能重復了5年,10年。 建立個人品牌:寫博客,寫書,開源項目,寫獨立App等。注意這其中任何一個都是一個長期堅持才能完成的事情。關(guān)于寫博客,我在以前的知乎live講過一些技巧和思路,地址為 https://www.zhihu.com/lives/796775894273363968 其實現(xiàn)代人的煩惱,不論是否是程序員,很多都是關(guān)于物質(zhì)生活的恐懼。買車買房,家庭支出等等問題。以及對于自己的能力無法滿足物質(zhì)支出的恐懼和擔心。在自己無法改變的情況下,適當調(diào)整心態(tài)。 嘗試知識變現(xiàn),但是需要不斷積累,需要時間。不能一蹴而就。 關(guān)于舒適區(qū),學習區(qū)和恐懼區(qū)的理論 理論“舒適區(qū)”, 對于你來說是沒有學習難度的知識或者習以為常的事務,自己可以處于舒適心理狀態(tài)。
“學習區(qū)”,對自己來說有一定挑戰(zhàn),因而感到不適,但是不至于太難受。
“恐慌區(qū)”,超出自己能力范圍太多的事務或知識,心理感覺會嚴重不適,可能導致崩潰以致放棄學習。
對于一個人來說,最理想的狀態(tài)是處于“學習區(qū)”,學習具有適當挑戰(zhàn)性的東西, 一段時間后,“學習區(qū)”會慢慢變?yōu)椤笆孢m區(qū)”, “舒適區(qū)”越變越大, 而一部分的“恐慌區(qū)” 也會相應變成“學習區(qū)”。
來自:http://droidyue.com/blog/2017/10/22/to-way-to-learning-android/
相關(guān)文章:
1. CSS3實例分享之多重背景的實現(xiàn)(Multiple backgrounds)2. 使用Spry輕松將XML數(shù)據(jù)顯示到HTML頁的方法3. php網(wǎng)絡安全中命令執(zhí)行漏洞的產(chǎn)生及本質(zhì)探究4. XHTML 1.0:標記新的開端5. ASP基礎知識VBScript基本元素講解6. 利用CSS3新特性創(chuàng)建透明邊框三角7. XML入門的常見問題(四)8. asp(vbscript)中自定義函數(shù)的默認參數(shù)實現(xiàn)代碼9. 詳解CSS偽元素的妙用單標簽之美10. HTML5 Canvas繪制圖形從入門到精通
