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