Android 程序猿如何繼續深入的研究技術層的知識?請教各位前輩指條明路

背景:個人自學Android開發,目前從事Android開發工作,獨立完成過一個App 十萬行代碼左右

現在在想要更加深入的學習些東西,但是不知道從何處著手,目前的能力是,了解大部分官方文檔中Android 開發中的技術,能夠根據客戶需求搭配出合理的技術組合(但是部分技術並不熟,開發時可查閱資料獨自完成 PS:不是純拷貝前人代碼),了解Android開發的流程,但是因為小公司,目前尚無完整的測試流程。平常喜歡在GitHub上看看源碼,看看技術文檔,但是總覺得自己是東一槍西一炮,高不成低不就的那種,真心希望各位知乎前輩根據我的描述,跟我分享下或者教授我一些進階的方式方法,路線,中英文資料皆可!拜託了


10W行代碼,9W行xml嗎?

好吧說正事兒。你這種狀態叫做浮躁,我曾經也和題主一樣,感覺學的很散,好像什麼都會一點,但是又不夠深入,整天都是心慌慌。其實這算是到達瓶頸期了,潛下心來閉關修鍊,一旦突破肯定能到達一個新的高度。前輩稱不上,我分享一下我是怎麼做的吧。

我當時就是覺得自己做什麼業務都沒有問題,能夠選用合理的技術,也能寫出相對優雅的代碼;能把玩python, rails, node, haskell 等一堆東西,但是總覺得缺點什麼,之所以這樣,是因為我浮游於表面,總有一種盲人摸象的感覺,知道怎麼做,但是不知道原理;俗話說,萬變不離其宗;所以,我決定深入底層,打通任督二脈。具體來說,我給自己定了四個目標:

1. 深入Android系統

2. 深入Java

3. 了解編譯原理等CS基本知識

4. 深入Linux內核

深入Android系統

這一塊有很多人分享過經驗,其實無非那麼幾點,我就簡單重申一下吧。

1. IPC機制,Binder和匿名共享內存等

2. 四大組件啟動,工作原理

3. View系統,繪製原理,事件分發

4. 動畫框架,原理

5. 多線程機制,消息機制 AsyncTask,Thread/Handler

6. 系統啟動過程,system_server啟動過程

7. Window系統,Window創建過程

8. 資源管理系統,資源載入機制等

《Android開發藝術探索》這本書確實不錯,適合中級程序員;《群英傳》我也看過,覺得沒有上一本好;個人感覺《Android內核剖析》挺不錯的,雖然有點過時了也買不到書了。

當你搞清楚了這些,基本上你寫的什麼代碼在Android上層是怎麼運作的都瞭然於胸;FrameWork層的任何問題也攔不住你的腳步了;不過這個階段,僅僅是了解了Android系統Framework層的原理,對於怎麼寫代碼,對於語言本身,對於Android系統底層的原理依然很迷惑,沒事,已經看到了光了,一步一步來。

深入Java

Java語言相對來說比C++簡單很多,但是對於經常寫業務代碼的人,對於如何寫出優雅的java代碼以及如何辨別垃圾代碼,還有Java的內存模型/GC,並發機制,虛擬機執行流程肯定不甚了解,因此,這個階段,我打算大致搞清楚Java語言本身,順便從這個角度切入編程語言本身;主要如下:

1. 學習如何寫更好的Java代碼,《Effective Java》值得一讀。

2. 什麼樣的Java代碼是有問題的?《Java解惑》;怎麼改寫代碼?《重構》

3. 學習一些沒有接觸過的Java高級庫,NIO/AIO, concurrent/forkjoin等,有機會使用到工作過程中。

4. 了解Java虛擬機 《深入理解Java虛擬機》《實戰Java虛擬機》;從這裡,可以知道很多JVM的運行原理,內存模型,class文件格式,Java並發原理,虛擬機執行引擎等相當多的東西;雖然說Android的虛擬機Dalvik和ART(ART也許稱不上虛擬機)使用的不是標準的HotSpot但是,我相信原理都差不多。

但是,Java平台的技術棧遠非這麼一點,學無止境;走到這一步,我覺得對於Java語言已經算得上掌握了,於是主要目標轉向編程語言本身。

了解編譯原理等CS基本知識

推薦一下R大的書單吧:http://zhuanlan.zhihu.com/hllvm/20130808

當然由於定位不一樣,我肯定不會像他一樣專門搞搞基語言虛擬機(主要是我沒那個水平!- - ),僅供參考;我自己目前看的幾本書如下:《編程語言實現模式》《深入理解計算機系統》《SICP》《編譯器設計》;然後由於在學Haskell,所以在追github上一個項目,sdiehl/write-you-a-haskell ;具體怎麼做還是邊走邊瞧。

後面的我也不敢說太多,目前打算是希望深入了解Linux內核,以前看過《深度探索Linux操作系統:系統構建和原理解析》;打算看《深入Linux內核》《Unix環境高級編程》;只要越過了浮躁期,其實目標還是很明確的;知道自己該學習什麼,也知道大致該怎麼做;感覺自己走在正確的路上,越來越接近那個目標,每天都充滿希望。

最後,作為搞技術的,一句話與題主共勉:

不為繁華易匠心


Android開發藝術,Android源碼設計模式 這兩本書值得一看


把app下載地址曬出來,這樣才方便大家了解你給你建議。


簡而言之,一句話想深入的研究技術層就得閱讀源碼。 如何自學Android?


看系統架構設計,實現原理,多看開源代碼,體會其中精髓。


哈哈,這牛逼當年我也吹過@_@。

當著畢設老師的面,在被問「畢設代碼可有上萬行?」時,意氣風發的答,有十萬行。

看github是好事,我當初也是長年累月的泡。

挪用過的輪子也不少了,可是真的知其所以然的沒幾個。

會用固然好,但是能看明白原理,按需改造,甚至提煉精髓為己所用才是真本事。

然而這條路,肯定還很漫長。我現在還是,戰戰兢兢地學,小心翼翼地吹,能謹慎發表的意見,才不怕更高深的人揭短。

當然,有大牛願意挑刺更是該榮幸之至了。

我覺得當務之急,不妨系統化的學習學習基礎,全面回顧整理知識點,查漏補缺。像《開發藝術探索》,《源碼解析》等都還不錯。

建議抽幾個小時,畫一份自己的Android知識腦圖,不拘泥形式,從面到點的一一精細化列出來。挺有用,一方面能歸納總結,另一方面還可以看到欠缺點。

當然,最能受益的莫過於做總結了。寫博客是個很好的建議,堅持下去成長更快。

——

我不會說我好久沒在外網寫了。


建議找家大公司,好好做幾個模塊,自然就能懂得android了。


建議先閱讀framework層的源碼,包括view,viewgroup和各View組件,理解自己所寫的代碼,慢慢深入。


把Android apidemos從頭到尾擼兩遍。

把Android framework源代碼從頭到尾看一遍。

把著名的Android開源庫每個領域的用一遍。


題主可以學習一下管理項目複雜度的知識:

dagger2 依賴注入,

rxjava響應式編程,

單元測試

集成測試

ui測試

mvp模式

CI(持續集成)

gradle構建系統

還可以檢查代碼的質量:

Don"t repeat yourself

kiss

上班了閑了補


我覺得剛接觸Android還是《第一行代碼》比較合適,進階的話結合《Android開發藝術探索》和官網API文檔,如果遇到瓶頸,靜下心來讀《Think in Java》和《design patterns》,當然提升能力還要靠不斷的coding,coding中不要忘了總結,不要忘了去stackoverflow上提問交流,不要忘了去git上維護自己的項目或看一下git上你關心項目的源碼。技術無止境,保持不斷學習的習慣。以上。


取決於你「深入研究技術層的知識」的目的,和你現在的「位置」

如果是為了「好奇」,「樂趣」,「興趣」,等等個人原因,那麼 @田Weishu寫的已經很棒了。

如果是為了你的「職業生涯」,我這兒會提一些不同的建議。

一個人學不進去東西往往是因為促進不夠。而能促進學習的無非就是成就感。不同「位置」的人成就感的來源也不太一樣。學生的成就感可能單純些,上進一些的同學們能從「弄懂一些東西」,「學會一些東西」上獲得很大的成就感。但是等你上了班,進入職場,儘管搞it得總歸會留著一些對於「未知領域」的好奇心,職場有另一套「成就系統」。「升職」啊,「加薪」啊,他們的基礎就是你的「影響力」。就是說你的能力或者行為能給公司產生多大的「影響」。

所以有時候不妨放下學生的心態,總想去看「不懂」的,或者「深入」的。嘗試去看看,甚至做做,對『公司』有幫助的。你也說了,你們公司「目前尚無完整的測試流程」,這裡面文章就大得很。我司就有一大幫人在搞這個。你能不能幫你司搞一套?開發出來的app有沒有效率問題,有沒有內存問題,有沒有兼容性問題?你能不能幫你司解決一下?從你還有客戶來看似乎是搞外包的公司,有沒有什麼東西可以沉澱成你們公司的產品?等等等等。。。等你解決了以上的一個或幾個問題,你會發現你的技術水平莫名其妙的就上來了,同時上來的還有你的級別和薪水 :)


一個大一點的主類就是5000行。。。

正式的:handle運行機制,surfaceview, AIDL,廣播的深入使用, FTP , Socket,介面回調甚至是基礎的 file , string你是否已經是能夠輕車熟路的使用。

更別說那些與 js交互,與. so文件的調用的jni方向了。還有 SDK的開發。。。

少年,你還有很遠的路要走。。。當然對你來說已經是輕車熟路或者小兒科了。。那我這種比較膚淺的就是見笑了。。


推薦看下 老羅的安卓之旅 說的很詳細


我一同事一個main window class 8000行, 我想他寫10個窗口出來也快10萬行了。


2017年底,我覺的這個問題已經可以擴大到,在響應式編程和MVVM之後,Android的開發技術還有哪些值得深入去做。應用層的新技術已經差不多成為標配了,再深入就等於自己做框架了。

我的建議是:

  1. 深入內核,了解Android的底層架構與技術體系。
  2. 設計適用於Android 的CI和自動化測試,如何能夠更有效地提升運維的效率。
  3. 混合開發仍然是Android一個比較深入的問題,包括原生混合和webapp混合,這實質上的問題是如何進一步提升混合開發的性能,有很多很有意思的問題值得深入去做。
  4. 如何更有效地管理Android的開發流程。


需要先看一下這個「十萬行代碼的」質量才能準確的進行下一步的回答。。。。


多總結啊

比方說我剛開始做Android開發時,做圖片選擇器,放了個複選框在圖片上指示勾選狀態,當圖片選擇數量達到設定的上限時,限制不讓複選框改變勾選狀態。

我之前的做法是直接把勾選框disabled了,不夠靈活,而且之前勾選的圖片也不能改變狀態了,結果最後寫得很複雜,還有全局變數什麼的;後來學習了事件分發機制,知道如何攔截點擊事件後,直接幾行代碼就解決了,又快又整潔。

舉了一個微小的例子,很慚愧。。。


可以關注一下各大廠的動向,響應式編程的趨勢在上升。

http://mp.weixin.qq.com/s?__biz=MzAxNjI3MDkzOQ==mid=2654472521idx=1sn=827c698bc0c771b3c19191f1a85214b6scene=1srcid=0421mMyne7Ir2BsFHepbQHjDfrom=groupmessageisappinstalled=0#wechat_redirect


深入學一下系統源碼


推薦閱讀:

自學Android開發掌握基礎之後如何快速進階,需要哪些能力才能拿到大公司的offer?
能否實現一種中間件將 iOS、Android、Windows Phone 7 上任意平台開發的軟體在其他平台也能運行?
鬥魚,熊貓APP 這類APP用到了哪些視頻,音頻方面的框架和技術?
簡訊驗證碼API哪家比較好?

TAG:Android開發 | Android |