Android开发初期之后怎么提升?怎么才能叫精通?方向在哪?
先mark一下,好多人我發現始終停留在兩三年的水平上沒有突破。
另外還有一個誤區就是越底層越牛逼
第三個就是,我認識的大部分所謂的做過rom開發的對framework的熟悉程度遠不如我一個一直做應用的,大概是見木不見林,始終在那一個小角落里修修補補,不會橫向,也沒有縱向延伸。另外這里很重要的一點是基礎,比如你是否有*nix基礎,可以幫你快速理解很多東西
晚上有時間的話把這三塊展開說一下
---------------------分割線,這么多評論,壓力好大-----------------------
首先第一個問題:為什么很多人會一直停留在兩三年的水平上,而后一直在重復以往的經驗?
我認為最主要的一點就是主觀能動性,或者說興趣,如果你對Android開發沒有太大的興趣,那么還是盡早換方向吧。有了興趣,然后就是要有一個比較正確的鉆研路線,不要這也搞那也抓,最后什么都沒精通又好像什么知道。一個很好的例子就是我用過很多庫啊
我覺得一個比較好的路線是,把日常開發常用的各種系統庫,開源庫,代碼好好研究一遍,比如我用了butternife就要了解背后的apt,以及apt衍生出來的一系列庫比如Hugo。當然這大部分情況是初級進階的第一步。這個階段應該是盡量很好的用技術完成業務需求。
第二個階段,我覺得可以嘗試去了解Android Framework比較細節的一些東西,比如activity啟動流程,順便分析清除Activity stack的管理,比如了解Android的資源加載機制,順便了解aapt是如何打包Android資源的;又比如Java的類加載機制,這里配合資源的加載機制,很自然的就可以去了解Android的hotpatch機制,插件化的實現,開一些這方便的開源庫或者自己擼一個也就自然而然。這里我比較推薦
@Gityuan 同學的一系列博客,分析Android各種源碼很不錯。這個階段你可以用技術反哺業務,比如插件化和hotpatch就可以讓業務更加靈活。第三個階段,橫向擴展,到這個階段并不是說比第二個階段更加高級了,而是對第二個階段的一些補充,比如你是不是可以了解一下web開發,這樣做hybrid開發的時候就會更順手。是不是要了解一下這么火爆的ReactNative&Weex技術,甚至可以把他們的一些思想拿過來自己用,比如我司內部就有很多項目是用了JSCore和CssLayout來實現一些更輕量的動態化技術的。正如科學領域很多重大貢獻都是在交叉學科領域出現的。技術上到了這個階段甚至可以做到技術影響業務,技術驅動業務。
第二個問題:技術越底層越牛逼么?
其實大部分技術都是為了滿足業務需求,我認為這種場景下,是能越好的反哺驅動技術才越牛逼,和底層不底層沒關系。比如你app做的非常牛逼,交互和性能非常好,直接帶動業務飛速發展,我覺得你并比能做底層人差,術業有專攻,以你的態度和能力,即使去做底層開發,也是沒有問題的。
第三個就是為什么很多做rom的反而對Framework不是很熟悉
我覺得這個和第一個問題有些重復,興趣是很大的原因。另外一個問題就是,如果沒有*nix的編程基礎,底層的一些東西比如binder機制,比如runloop可能會有一些吃力。這里服務端的同學可能會有一些優勢,他們對rpc和一些系統調用相對熟悉一些,這也是為什么很多后端轉到Android的同學可以快速精通。
------啰啰嗦嗦寫這么多,請大家來拍磚-------
------最后,我再加一條廣告-----
蝦米音樂Android在招人,如果你想來和我們一起打造一個有情懷的產品,那么歡迎您來杭州加入我們的團隊。(好多同學在私信我要求,大概說一下是招P6+,P7的)
是的,我們正在努力,為了打造一個精品。
請私信或者微信聯系我 編輯于 2016-09-25 田元 Android學習群:156562475,已開源nono-android
我猜你這個階段是把大部分demo都能跑通了吧,常見的控件也會了吧。
但是,你現在還是會的太少了。
就是會用Linearlayout/relativelayout/button/textview/edittext/imageview(的很少一部分屬性)來畫一些簡單的界面了吧。
就是會用activity/fragment(的生命周期這么少的知識)來讓ui在手機里面顯示出來了吧。
就是會用asynctask(這么簡單的一個過時的類)來網絡請求了吧。
就是會繼承了個Application類來接幾個第三方服務(幾行代碼就接入)了吧。
就是會用個broadcast(估計只會最基本的顯式廣播,排隊廣播,粘性廣播啥的都不會用)了吧。
就是會ListView+BaseAdapter+ViewHolder(總共不到10個重載的方法)或者recycleview+adapter(估計不會自定義layoutmanager,估計沒才過itemanim的坑)來展示數據了吧。
這總共就多大一點知識啊,學的這些東西內容這么少,不迷茫才怪。
如果我說屈你了。
好。你說你比這強。
都會自定義控件(總共就measure draw layout這三個方法)了,還會volley(代碼寫的一堆callback hell),還會sqllite(這玩意沒多大用,也是死東西)勒,還會xml里面定義動畫(就平移 反轉 透明 旋轉 屬性這幾種)勒,甚至你還會eventbus(別說只會onEventMainThread哦),你還會rxjava(學過函數式語言的都感覺這沒啥)。
你說你還追新,md控件玩的溜的很,toolbar(兼容到4.4的沉浸式狀態欄會用不?)會用,drawerlayout會用(碰到過與surfaceview沖突的情況不?),還會用coordlayout+collapsinglayout+recycleview來做隱藏額頭(知道那個collapsinglayout中的mode是干啥的不,自定義behavor會不?:)
這些都會了不?
啥,你都會了?再留個作業。
APP里面的main在哪?
別的桌面應用框架像Qt,人家顯示控件都要new一個window,那咱app的這個渲染控件的window在哪new的,咋讓咱屏幕聽話跟著畫的?
咱手機這么多傳感器,那傳感器數據咋來到咱app的?
那manifest在咱手機里面咋滾輪的,發生了啥,系統咋處理的?
我在美團里面能打開支付婊的支付界面,這在咱手機里面發生了啥?
多花時間吧,花大把大把的。 編輯于 2016-03-19 MagiLu Android 開發?話題的優秀回答者 在上一家公司當過一段時間的Android面試官,發現很多“精通”Android的候選人簡歷上都會寫使用過XX開源庫并引以為傲,如果在面試的時候沒有問到這些有的還會對我提出質疑。拜托,這就叫精通了?這真的很有挑戰性么?
怎么樣算一名優秀的程序員?我認為最基本的要求是有高效的產出。回到Android上,一名優秀或者題主說的精通Android的程序員也應如此,高效的產出高質量代碼,迅速解決開發中存在的BUG,對于需求提出合理的解決方案,不間斷的學習和分享。而精通的開端,就是從一個使用者,變成創造者。輪子誰都會滾,而造輪子的,才值得尊敬。
那怎么成為精通Android的開發者?看,寫,思考,總結,交流,這條路沒有捷徑。我認為精通Android的開發者至少需要具有扎實的C++/Java基本功,微機,網絡通信,數據結構和算法基礎,熟悉Android的大部分組件,常用開源庫,豐富的Debug,適配經驗以及持續的學習能力。 編輯于 2015-02-28 耿銳 Senior Android Developer@Sydney
很多人都提供了非常不錯的答案,我也是受益匪淺,謝謝各位。
但是我覺得很多排名靠前的答案都給我感覺,思路太中國式了,像中國的考試一樣,追求難題,追求窮盡真理。比如
@陳昱全 里面提到的那個面試,比如 @田元 提高的app 的main在哪兒。我不是說這些沒用,或者不重要,但是我想這些知識點可能對于一個初學者進階的人來說,就算查到了答案,也理解不了。所以說一下我對這個問題的看法,只求拋磚引玉。第一個建議,對于一個junior developer,如果想往上走,在強化知識體系的之前,我往往建議先完善自己在debug tools上的經驗。
比如:
網絡debug tools: Charles, mitmproxy, Stetho
內存泄露:Memory Analyser, Leak Canary
Overdraw: 手機上的Drawing Settings, AVD Manager/Layout, Stetho
數據庫和cache: Stetho,SqliteManager
還有最原始的,利用logcat打log,分析log并且知道各種參數,比如-v time顯示時間,-s做filter等等
中國有句古話,工欲善其事,必先利其器。將各種debug工具掌握好,有利于更快地從Junior level提高上來。
第二個建議,提高自我表達能力。我在面試facebook的時候(別問細節了,沒過),有一個題目很有意思,來說一個你比較了解的工具或者api,whatever什么玩意都可以,看你能否有邏輯地、準確地將某lib的整個框架描述清楚,比如優缺點,比如運行流程和坑。在這里面,ABCD的某個環節中,你可以說你在B上內部邏輯不清楚,但是input 和output一定要說出來,如果能說出limitaion就更好了。
這項能力的好處是,“準確而有邏輯地表達”往往需要清晰的頭腦、豐富的知識儲備,這項訓練在programming中是非常有好處的,我發現凡是口頭表達邏輯很清晰的人,編程coding邏輯感也非常強。有好的邏輯思維的人,成長是極快的。
第三個建議,如果追求精通,不要一上來就追求對整個Android的精通,要先追求模塊的精通。有些人強于寫googlemap,有些人對Volley庫極為熟悉甚至被merge過很多pr,有些人可能對動畫非常了解,甚至有些人專門研究android相機保存圖片等。其實等你很熟悉一兩個模塊后,你會發現其他的東西很容易觸類旁通,就算不看代碼,猜也猜得到。
第四,提高英語能力。以前在國內只用baidu,后來出國了之后用英語才發現,簡直是多長了一個腦子的感覺,高質量的文章比比皆是。所以如果英語好,在IT skill上的進步可能會快好幾倍,真的不夸張。
最后,不要被面試官嚇到,他的問題肯定是經過準備的,沒準他比你早知道不了幾天這個問題的答案并且從來沒在真正項目上apply過。不知道就說不知道,不過我一般會建議在不知道的問題上猜一下,并非瞎猜,只是告訴他“這個問題我確實沒研究過,不過以我對android的了解看,應該是哪兒哪兒的問題或者應該是由于某種機制產生的”,目的就是顯示我對android很了解,很有信心。因為誰都不可能在工作中不查看新的東西,只用舊知識的公司應該是不存在的。
最后再次感謝 @陳昱全 和 @田元 ,二位說的很多問題我也不懂,趕緊去查一查,多謝! 發布于 2016-03-21 知乎用戶我們先來對問題分解一下:
Android 開發 :
分成成
1. "開發" 一般的開發技能
2. "移動應用開發" 移動應用開發相關概念思想
3. "Android 開發" 特指與 Android 開發直接相關知識技能
正如你可能所想的那樣,這樣的問題不像1 + 1等于2那樣,有一個簡單確切的答案.
真正答案因人而異. 下面我以自己幾年的Android 開發經驗,與你分享一二.
就按我上面所分解的幾個方面來說一說:
一: 開發技能
你可以看成是一般的編程技能
這方面你可以從?
編程語言的熟練掌握
面向過程編程思想
面向對象的思想
函數式編程思想
設計模式
算法與數據結構
網絡編程,TCP/IP 協議
重構?
版本管理(Git 等)
等方面的檢查和提高自己
更詳細的技能樹,請自己搜索
二: 移動應用開發
你可以看成是 App 開發
估計這可能是你更感興趣的
這方面你可以從: MVC 這成三個方面來對照檢查下
M: 數據層?
移動應用數據結構特點
數據存儲 :SQLite數據庫,文件存儲
數據格式: XML 格式,JSON格式 序列化與反序列化
數據查詢: 移動應用一般數據庫主要是 用SQLite
(說回來,單是 SQLite 數據庫,就可以花不少時間來深入學習下,
因為對一個應用來說,數據基本是核心)
V: 視圖層
移動應用界面特點
移動應用構建界面常用方法
移動應用交互特點
移動應用動畫
系統 UI 系統特點,優點,缺點及局限
C: 控制層
移動應用控制層特點
控制層的生命周期
多線程,UI 線程,后臺線程
再加一層:
E: 事件層
事件處理,觸控事件,手勢,事件響應鏈
三: Android 開發
工具篇 - 工欲善其事,必先利其器
Android Studio 掌握用得怎么樣了?
Adb 及相關工具會用嗎?
Gradle 構建系統呢?
文檔篇 - 看 Android 官方是怎么定義開發各種技能的.
相信常看 Android 開發者官方網站,你會收益良多,我下面寫的也不必看了.
系統篇?
Android 多線程編程,異步編程特點 - Loop,Handler,IntentService,Broadcast
,MessageQueue
Android UI 框架特點,優勢和不足
然后你再按 MVC 將 Android 各部分再分析分析,總結總結.
從操作系統層面去學習,不要僅限于應用層開發,開放的系統源代碼方便學習。
從框架設計逐步走到代碼實現,應用層過后,可以學習內核,驅動,虛擬機,開源庫,框架層再回到應用層,每個階段回味一下,就會體會到進階的感覺—酸爽。 發布于 2015-03-09 黃福林 熱愛手機/Android開發者/終身混跡科技數碼圈 參考 杰克沃頓大神 發布于 2016-03-30 知乎用戶這兩天面試也一直在跟來面試的兩個有三年工作經驗的程序員聊這個問題。
你的程序要實現某個要求的功能并不是太難,尤其是一般生活中用的App,游戲另說。
但是要把你的App做的別人一看就覺得好看好用,那是非常非常困難的。
這兩個人一個iOS一個安卓,給我看的是同一個應用(是的,來自同一家公司),在把手機遞給我的時候兩個人都說了同樣一句話:界面有點丑。
界面丑當然是產品經理和UI、UE的問題,但是,程序員的問題也是顯而易見的,你為什么要做一個自己都覺得很丑的應用?還把這個當成面試的敲門磚?而且我跟他們強調,當時UI做出來的設計稿一定比你這個成品要漂亮,不然不可能通過老板的審核,而且水平再差的UI隨便畫個界面出來也不至于難看成這樣。肯定是你們在做的時候丟失了細節,而后產品經理和老板都無可奈何,因為你們說做不到他們就沒辦法。好的應用的第一個必要條件,就是要讓用戶第一眼能夠接受它,你們手機里那些自己覺得很好用,天天用的應用,有哪個完全是因為功能不可替代而忍受它難看難用的界面的?(網銀App除外)
而要做到一個能做出漂亮的界面,細致的動畫,流暢的交互的應用,對程序員的考驗是非常非常大的,對安卓開發人員更甚。以前我花了兩個星期的時間想模仿出Cal這個應用頂部那個日歷的各種滑動效果,最終只能模仿出7成,還差的那3成在功能上是一模一樣的,但在細膩和流暢上就始終差那么一大截。 編輯于 2015-03-06 Lazy 菜鳥安卓猿。 我做安卓時間不是很長,項目中用到了很多別人的框架,但是都不知道其根本原理,我覺得應該要知其所以然。然后自己這一套框架。 發布于 2015-03-01 知乎用戶 自己寫一個SlidingMenu或者Universal-Image-Loader試試 發布于 2015-03-14 Tinker題主提出了三個問題:
1. Android開發初期之后怎么提升?- 把 Google 的 Samples 全部跑一邊
- 閱讀 Samples 的源碼以及 Samples 給的控件的源碼
- 了解所有的 Android 控件的繼承關系,盡量都背下來。是的,你沒看錯,背下來。繼承關系的了解有助于你解決后面開發中遇到的難題。
我看了下
@田元 的回答,他說的那些東西,Google Samples 全都提供了。他說的學習方式,我從文中看到推崇多學,但都限于用法的學習。
如果一直追求于用法的學習,一生都會被無休止的學習困擾,奔命于學習。
我個人還是建議多看看源碼。尤其是基礎的父類源碼。新出的東西看看繼承關系,翻一遍源碼即可。
(如對 @田元 的回答理解有誤,望指正。)
比如說新出的 Toolbar 繼承于 ViewGroup,如果多次閱讀過 ViewGroup 的源碼。對于新出的 Toolbar 只需看一遍源碼便知如何使用。如果熟悉了 ViewGroup,然后閱讀 Toolbar 的源碼(源碼兩千多行,基于前面的基礎,大部分代碼都無需仔細閱讀了),2 個小時不到就能完全掌握 Toolbar。
還有
@田元 所說的 CollapsingToolbarLayout、NestedScrollView 繼承于 FrameLayout。如果你對 FrameLayout 熟悉了,這些新出的 View 掌握速度將快的無法想象。再次建議,跑 Samples,多閱讀源碼,背下繼承關系。
2. 怎么才能叫精通?
私認為,你要是能回答小白提的任何 Android 問題,你都能對答如流就是精通。
:)
不要小瞧小白提問方式以及問題。
我組織了一個?『技術學習小組』,里面很多人問我 Android 問題,我有一大半沒辦法直接答出來。
然而我做了六年 Android 開發了。
3. 方向在哪?
題主問得什么方向?著實沒看懂題主的問意。
======= 補充點我解決 Android 難題的思路
關于解決 Android 難題的思路,我很贊成
@智靖遠 的答案。我的路子基本跟他說的一致,略有差異,接下來我補充下我的思路。寫 Android App 有一個 BUG 發生時,我的流程是這樣的:
能力還不夠答這個題目,還是嘗試答一下,我用我自己得例子來說明下。兩個例子。
1,數據庫索引優化
以前做一個項目數據量很大,然后想做優化,一頓加索引然后發現反而更慢了,于是乎去研究下發現聯合索引更快索引超過5個后明顯變慢,也更適合層級遞進查詢,但是原理不知,于是乎去了解索引的原理設計,從而讓自己有能力下次去避免這個問題或者做的更好。
2,一次面試
記得handler和looper得模式經典面試題,人人都能淺談下。那么你知道sendmessagedelay如何實現的,handler得生命周期如何,跨線程是如何通信的等等。當詳細問下去的時候很多人是不知道得。很多人會知道handler生命周期長做靜態內部類加索引用,但是你知道為什么嗎?我當時就是一問三不知,回去趕緊查看源碼了解管道,epoll模型等。
我本身對安卓開發一知半解,但是也算親眼見證了幾個大牛(不僅限于安卓)的成長,所以給一點我所知道的辦法。
1。面臨一個解決不了的問題的時候,最初階段放棄百度,放棄google搜索。盡量做到只依靠安卓官方文檔。
搜索引擎是一個黑匣子,問他“xx問題應該怎么解決”,它會忽略掉一切中間的思考,分析,解決流程,給出最后的答案。?
其結果就是,使用答案的人基本上不可能理解“為什么這么去做”,只知道“可以這么做”。 就像一個沒學過加減法,只會用計算器的收銀員,有計算器能工作,但是恐怕沒有心算的快。復雜的問題如果計算器不會算,他也不會。
等到通過基本的文檔自己找到了思路和方案,再去看看有沒有別人寫好的第三方的東西,或者成熟的方案,再和自己的東西印證。?
這要花很多的時間,會比別人慢,會把別人休息的時間用來加班。 但是大牛如果是睡覺打游戲就能養成的,這個問題也不會出現了對不。
2。安卓系統源代碼要常備。跟蹤代碼時候,盡可能跟到系統的層面,越深越好。至少sdk要進去。
不了解sdk的代碼,自己就很難寫出同級的代碼。好代碼看的多了,自然自己的水準也會提高。熟讀唐詩三百首嘛。
3。如果代碼沒有按預期的去動作,不要第一時間想著去解決這個現象,而是要追究為什么會發生這個現象。?
比如程序崩潰了,加個try catch自然解決了這個問題。但是這么做就太糟了。
自然要問問,為什么會出現這個exception?底層的返回null了,上層沒處理。哦,加個判斷就好了。這樣好一點,但是仍然很糟。 底層為什么會返回null?如果null是合法的返回,文檔里有沒有約定?如果沒有約定,文檔有問題,如果約定了,代碼有問題。更主要的是,其他地方是不是犯了同樣的錯誤?我是不是存在“不注意文檔約定”或者“寫文檔時候忘記約定”這樣的問題?
到這個地方,才真的對自己的成長有所幫助。大牛也是一步一步走上來的。
4。多把自己知道的東西教給別人。 比如寫一些知識和技巧跟大家分享,或者召集一個公司內的小培訓。
這樣做的好處有兩個。?
第一自己得到了鍛煉。把知識系統化總結,對自己是一個回顧,整理,沉淀的過程。這個過程中可能會找到自己尚欠缺的地方,也可能會被別人的提問啟發。?
第二是能逐步樹立自己的地位感,成為大牛也是一個正向激勵的過程,往往是牛人越來越牛,普通人越來越普通……
工作中很多任務是使用已經知道的東西來做。時間長了就會覺得都是重復勞動。
可是真的是這樣嗎?我所熟知的方法,就是最好的方法了嗎?是否有更優雅高效的方式?答案是一定有,沒有最好,只有更好。功能上覺得已經實現好了就提高效率,效率已經很高了就改善結構,結構優化清晰了就試試分析有沒有未來可能的需求變更,能不能應用設計模式,等一圈都走下來,回過頭一看,原來功能上還不夠完美啊。
? ? 本文轉自 一點點征服 ? 博客園博客,原文鏈接:http://www.cnblogs.com/ldq2016/p/6611725.html,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的Android开发初期之后怎么提升?怎么才能叫精通?方向在哪?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bs84c12引脚_HOLTEK推出BS
- 下一篇: CS8685 2x80W双声道大功率D类