作爲Android開發者,你想知道的都在這了!

   作者:Android探索

   博客:https://www.jianshu.com/p/3e846f357268

今天我將給大家分享一下我學習Android的一些方法和想法,分享中並不侷限於Android哪一塊怎麼學習。而是一個總體的,普適性的學習套路和方法。希望可以幫助大家解決一些問題。

注意本文爲知乎Live底稿,知識點相對分散,後面部分包含了一些聽衆提出的問題,但是不影響總體的閱讀和理解。

 Android需要打好哪些編程基礎 

  • Java基礎(Kotlin)

  • OOP思想與設計模式

  • Android基礎

  • 數據結構與算法

  • 其他,比如JVM相關

 除了編程基礎,我們還需要補充哪些能力 

  • 喜歡鑽研的興趣

  • 良好的英語理解能力

  • 善於思考和總結的習慣

  • 高效率的學習方法

  • 能夠機智地利用Google搜索

  • 善於利用工具

  • 和現實事物關聯類比的能力

  • 對待問題的態度

  1. 喜歡鑽研的興趣,儘管高級編程語言的出現讓我們將精力更多的放到業務上,而不是編程細節。正所謂知其然知其所以然,鑽研細節可以更好地幫助我們實現業務,做到了然於胸。

  2. 良好的英文理解能力。由於一些原因,我們接觸到的一些技術的資料都是二手資料,而這些二手資料往往在知識傳遞的效果上有一些折扣,甚至是偏差。英語可以說是(安卓)編程提升的加速器。同時,英語好的話,可以輔助我們寫出更具有自解釋的代碼。

  3. 善於思考和總結的習慣。真理越辯越明,同樣技術越思考越清晰。對於一個技術通常我們需要抱有這樣的疑問

  • 它是什麼 一句話概括

  • 解決了什麼問題 存在的意義

  • 怎樣解決了問題 內部的實現

  • 它的缺點是什麼 多角度分析

比如我們關於WebView的考慮點的總結

  • 是否支持js

  • 是否支持mixed content (https網頁加載http圖片)

  • 與js通信的問題,比如給方法增加JavaScriptInterface註解

  • 是否自身處理某些URL(協議不同,不讓flipboard://showSection等)還是交給外部程序

  • 關於UA中是否加入特定的標識,比如Flipboard字樣

  • 是否增加特定的header

有了思考,我們需要以文字的形式記錄下來,這也應了那句老話,好記性不如爛筆頭。建議以博客的形式總結出來。

4.高效率的學習方法。

  • 理清楚概念很重要

  • 做好控制變量法

  • 多動手實踐,與理論結合

  • 抓住重點,剔除干擾因素

其實,任何複雜的事情都是由簡單的事情組成,編程也是一樣。在編程過程中,我們會接觸到很多概念,這些概念很重要,對於概念的一知半解往往會使得我們越走越慢,學習起來原來越困難。因此對於編程中的概念要務必理解準確和深刻。

控制變量法:我們在初中做實驗的時候,經常會用到控制變量法。在編程中紅也是。當我們在解決問題時,也要做到控制一處修改。比如我們項目中需要修一個webview相關的bug,我們要想一想能不能脫離現在龐大而負責的項目,單獨寫一個簡單的變量單一的sample來重現,做到快速和小粒度驗證。

多動手實踐與理論結合:很多時候,我們學習新技術的時候,我們應該先學會使用它,有了初步的認知之後,便於我們更好的理解和深入研究。比如關於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文件是否合法

  • github.com/androidyue/…

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的途徑有很多,可以是自學(視頻網站,看書,博客)也可以選擇培訓(不推薦)

  • 邊學邊工作通常是可以的,不過具體實施起來還要結合自身的情況,比如時間是否充裕,學習者的決心和自學能力。

 我該如何選擇網絡中魚龍混雜的學習資料 

  • 使用Google和StackOverflow,Medium

  • 如果是博客文章,在自己能力可以理解前提下,儘量選擇英文

  • 最簡單判斷一個文章的優劣可以先到文章的底部看評論(Good,Execellent,Awesome)以及Google+,Facebook,Twitter分享數量

  • 儘量選擇內容整潔(說明態度認真)的文章

 學習效果差的問題

  • 長期看慕課和論壇,感覺效果很差

  • 感覺通過視頻學習,進步很大,但是即使學習完了,感覺還是菜鳥

  • 視頻也看了,書也讀了,但是寫起來還是很吃力,下一步如何熟練和進階

產生這些結果的原因:

  • 通常的視頻網站傳授給大家都往往是立竿見影的技能。

  • 學習中缺乏思考,無法做到觸類旁通。只知道照葫蘆畫瓢

  • 基礎薄弱,概念沒有搞清。導致做上層的東西舉步維艱。

  • 沒有比較良好的輔助工具或者無法找到優秀的輔助內容。

 如何提高安卓程序員的核心競爭力,

 項目理解能力還是技術能力,哪個更重要 

  • 什麼是核心競爭力。表現在學習技術的能力,對待問題的態度,解決問題的技術方案。別的行業其實也是這樣的。

  • 具體如何提高核心競爭力,我上面有提到,參考程序員需要具備其他那些能力。

  • 這兩個能力是相輔相成的,很難做出孰重孰輕的決斷。

 大齡Android程序員的煩惱 

經常收到一些安卓程序員的郵件,其中有很多問題是,做了Android很多年了,爲以後的職業選擇惆悵。比如互聯網寒冬,華爲清退34歲以上員工等等。

的確,由於Android相關的工程師需求不如之前那麼好,加之年齡越大,拼勁可能不如剛剛畢業的年輕人。這種煩惱是可以理解的。

走出煩惱的一些方法

  • 不斷學習,夯實基礎,拓展技術面。爲什麼總是提到這個,因爲其實存在很多程序員,邏輯思維不強,還不愛學習。不斷學習對於程序員來說至關重要。

  • 提高自己的競爭力,不要成爲僅僅面向API編程的程序員。要勤于思考,追求更高。求其上者得其中,求其中者得其下。你必須和5年前,甚至是10年前的你有改變,不能僅僅是一項技能重複了5年,10年。

  • 建立個人品牌:寫博客,寫書,開源項目,寫獨立App等。注意這其中任何一個都是一個長期堅持才能完成的事情。關於寫博客,我在以前的知乎live講過一些技巧和思路,地址爲 (https://www.zhihu.com/lives/796775894273363968)

  • 其實現代人的煩惱,不論是否是程序員,很多都是關於物質生活的恐懼。買車買房,家庭支出等等問題。以及對於自己的能力無法滿足物質支出的恐懼和擔心。在自己無法改變的情況下,適當調整心態。

  • 嘗試知識變現,但是需要不斷積累,需要時間。不能一蹴而就。

 關於舒適區,學習區和恐懼區的理論 

  • 「舒適區」, 對於你來說是沒有學習難度的知識或者習以爲常的事務,自己可以處於舒適心理狀態。

  • 「學習區」,對自己來說有一定挑戰,因而感到不適,但是不至於太難受。

  • 「恐慌區」,超出自己能力範圍太多的事務或知識,心理感覺會嚴重不適,可能導致崩潰以致放棄學習。

對於一個人來說,最理想的狀態是處於「學習區」,學習具有適當挑戰性的東西, 一段時間後,「學習區」會慢慢變爲「舒適區」, 「舒適區」越變越大, 而一部分的「恐慌區」 也會相應變成「學習區」。

近期文章:

等等,先別走!「碼個蛋」又有活動了!參與活動不但可以培養自己的好習慣,還能拿到「碼個蛋」IP系列專屬獎品,速度要快...

 戳我看詳情 

今日問題:

你覺得上面哪一條對你最有用?

留言格式:

打卡 x 天,答:xxx

告訴你一個小技巧:

只需3步,你將不會錯過任何一篇文章!