Android程序員如何增加對技術的理解深度?

Android程序員,大四實習中。在工作中基本就是寫一些業務代碼。在師兄的建議下開始深入學習某些技術點。

最先是從網路庫開始的,在使用了retrofit+rxjava的模式後,開始研究retrofit的用法,最後clone了retrofit的源碼,閱讀了大約三遍。寫了一篇博客總結。

同時也在畢設中模仿volley的設計寫一個網路請求庫,感覺經過這兩個個過程,對於代碼閱讀等能力有所提升,但是還是存在一些疑惑。

1. 雖然有了源碼的閱讀,但是仍然不知道閱讀完之後自己有什麼產出(感覺沒有提現在平時的代碼中用到retrofit的核心思想,但是見過別人用,想模仿卻發現沒有業務需求可以如此去做),在利用其核心思想解決問題前,很難說自己已經掌握了這個技術點

2. 因為平時忙業務代碼,retrofit和源碼前前後後看了一個月,(之前正常使用有了挺長時間,不過都是一些模板一樣的代碼)感覺自己是不是太笨?

3. 想進一步深入學習Androud,java本身的東西,還想抽時間深入理解多線程編程和操作系統的知識。但是感覺自己想得太多,不知道從何開始,如何安排時間和順序,導致都看過一點,不深入,浮在表面。不知道如何去克服這個問題?

希望各位前輩給個建議和指導


說到網路庫,我可能可以給你一點點建議,所以我也只說一下有關網路方面的,希望可以拋磚引玉的啟發到你。

我寫的第一個庫也是一個Http網路庫,名字在這裡不說。在Github上Star雖然只有2.6k左右,但是有幾個Star數超過我庫的知名庫反而參考了不少我的設計,甚至參考了一點點源碼過去,所以我想說一下這個過程中我學了什麼和做了什麼。

首先作為一個比較完善的Http庫,對Http協議的支持要儘可能全面,比如Cookie的自動維護、自動重定向(含多層嵌套)、緩存、Https的、多文件上傳下載、多線程的控制等,還有很多用法上的細節等。

然後舉一個我學習其它庫的例子,我在開發完成第一版後,知道了Volley這個庫,說實話之前的開發中,Http網路層我一直是自己閉門造車,深知自己寫的還不夠好。於是我把Volley的源碼看了一遍,發現了Volley的隊列特別好用,當時我還不太熟悉隊列,於是自學加上多次實驗終於熟練掌握了隊列,因為我庫的核心是同步請求模塊,支持外面用任何方式封裝非同步,所以後來把我庫的非同步請求入口也改成隊列了;後來也有其它喜歡的人把我庫用RxJava等方式改寫了。

到了後期我的庫用的人多了,我就把自己從中學到的東西分享給其它人,我就在YY上直播寫代碼了,剛開始直播寫任務隊列、後來直播Http結合業務邏輯直接請求JavaBean和List等複雜對象,最後一次直播大概連續直播了7個小時,內容是從0開始寫一個完整的Http框架。幫助別人成長的同時也得到了大家的認可,也交到了很多朋友,這是我寫代碼以來最開心的事。當然我也直播了一些其它方面的技術,和話題無關就不提了。

其次說一下技巧和方法,我在看別人源碼的時候一般抓住三個點(以下「它」指代碼或者庫):

  1. 它的作用是什麼,如果和我想的一樣我會直接跳過;
  2. 它為什麼這樣設計;
  3. 它的優缺點各是什麼?如果我理解不了,我會用自己實現一遍,如果我看懂優缺點我會思考如何改寫到最優;
  4. 授人以漁,當你非常熟練的掌握了一個技術的時候,你可以把它講給別人聽,這樣既能幫助到別人,也可以讓你理解的更加深刻。方式可以寫博文、可以做成視頻、可以傳到Github上。當然前提是千萬不要把錯誤的知識點傳遞給別人了,內容至少是乾貨,給別人的demo起碼要很容易運行起來。

最後說下我認為進階必須要掌握的幾個技能模塊:

  1. 網路
  2. 線程
  3. 自定義View
  4. 設計模式、數據結構
  5. JNI、圖片、音視頻的處理

如果你看到這裡了,那你可能對我的答案有點兒興趣,歡迎去我的Gayhub看看:yanzhenjie (嚴振傑)。


簡單的說,就是從『熟練使用』到思考『為什麼要這樣實現』,要掌握一門技術,了解一個開源庫,那麼首先,你需要知道怎麼去使用它,熟練使用後,再去思考,它為什麼要這樣實現,以及這樣實現的好處是什麼,如果我來做,會怎麼實現,思考好這幾個問題,你肯定會對這門技術、開源庫有更新的理解,如果沒有思考清楚,那麼就可以去看他的源碼,或者看其他人對他的分析,相信通過這種方式,一定能讓你有目的、有效率的快速加深一門技術的理解深度。


學完 API 之後要儘可能研究一下這些 API 的實現和裡面的設計哲學。Android 這麼好的一個開源項目非常適合讀源碼來提升自己,比如最簡單的 startActivity 是怎麼工作的,Instruments 是如何與 AMS 通訊的,而 AMS 的應用端代理 AMN 又是通過何種方式與 AMS 的 Binder 通訊,研究了幾個服務之後你就會發現 Android 應用與系統服務交互的方式就是一種模式。舉這個例子只是拋磚引玉一下,Android 的設計很精巧,隨便找一個切入點深入研究也能收穫很多。


看開源代碼,重點放在理解他們的設計上,看的時候,多問問:

  • 如果是我做,我會怎麼設計
  • 它這樣設計,可能出於什麼考慮
  • 現有的設計,有什麼不足?該怎麼改進

這樣你就會有比較好的收穫,另外也可以根據代碼繪製出它們的 UML 圖表,比如類圖、時序圖等,這樣收穫會更大。

架構與設計比代碼更重要更核心的能力,還可以遷移到技術之外,要著力在這方面培養自己。


我覺得首先應該增加技術的廣度,其次是技術的深度。

你可以先學習一下計算機組成原理 彙編,可能對你日常的工作沒多大幫助,但是有助於你理解一些以前不太能理解的東西。

比如你在學習多線程的時候接觸到了線程池,你肯定會有疑問,線程池是幹嘛的,為什麼要用線程池,你百度谷歌查資料,然後別人告訴你,線程池避免了cpu過多創建銷毀線程的開銷,你又會好奇為什麼cpu創建銷毀線程會有那麼大開銷,這個時候你去學習彙編,學完彙編之後你明白了,哦,原來創建一個線程這麼麻煩,又開闢內存又是幹什麼的巴拉巴拉,解決為什麼要有線程池的問題中你學習了彙編,在學習彙編時你又接觸了寄存器 ALU等等硬體,你又好奇寄存器 ALU他們是怎樣工作的,你又去學習邏輯門電路這些東西。

整個下來,你就學習了彙編,計算機組成原理,理解了為什麼要有線程池 (??▽?)?

我目前大專二年級,共勉 (′?ω?`)


多擼代碼,積累實際編碼行數,畢業生的話,3萬5萬不嫌多。

能看懂是一回事,有完整的思路能自己實現是另一回事,兩者中間有個不小的台階要邁。


Android應用開發的進階的問題其實只有兩個半:

1. 理解消息分發機制

2. 理解布局機制

上面這兩個問題直接相關的是兩個基類:ViewGroup和View

最後半個,之所以說是半個,是因為它不是Android特有的,而是所有軟體工程通用的:

設計模式與架構能力。

像什麼組件化、mvp、等等。

Android操作系統的進階其實更簡單,因為它和操作系統原理是互通的,相信一個稍有理想的程序員都至少了解一種操作系統。值得注意的是,Android是基於linux的, 作為一名Android工程師,關注點應該偏重於ui相關的部分,這一點上來說,嘗試自定義rom是一個行之有效的方法。


一直往底層鑽


其實如果對某個技術點很感興趣,閱讀源碼,閱讀分析教程都能增加深度,但還不夠,看源碼很容易知其然,但不知其所以然。真正能敢說精通的就是自己重新用自己的思路重新實現一遍某個技術點,而且重新實現過程中可以學到很多很多看源碼自己可能看不到的東西。


基礎技術可能還不到位吧,沒法理解技術要點,不過我天天用輪子,沒有造輪子,也沒有興趣看人家怎麼造輪子,retrofit我覺得用用就好了,如果真的玩還是耍幾個設計模式進去學習更大些,retrofit的設計如果工作上沒用需要改變的地方看看就好了。

ps:從深化技術的角度我指路子,android基礎知識-重構代碼-套用設計模式,簡單的給你個題目,使用觀察者模式使得gps信息變更後通知觀察對象,有興趣隨便玩玩應該就知道如何深入理解技術了


先要會用,然後站在設計者的角度去理解


推薦閱讀:

假設安卓下個版本不再開源?
Android Studio 怎麼樣?
Hola Launcher 和 APUS Launcher 比起來,哪個產品更好?
谷歌為什麼一直不改進Android「下載」這個應用?
阿里的雲OS是基於安卓的定製,類似MIUI,Flyme嗎?

TAG:程序員 | Android開發 | Java | Android | 移動開發 |