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