Android开发初期以后怎么提高?怎么才能叫精通?方向在哪?

hi大头鬼hi
Android开发专家
 
 

先mark一下,好多人我发现始终停留在两三年的水平上没有突破。java

另外还有一个误区就是越底层越牛逼react


第三个就是,我认识的大部分所谓的作过rom开发的对framework的熟悉程度远不如我一个一直作应用的,大概是见木不见林,始终在那一个小角落里修修补补,不会横向,也没有纵向延伸。另外这里很重要的一点是基础,好比你是否有*nix基础,能够帮你快速理解不少东西android


晚上有时间的话把这三块展开说一下git


---------------------分割线,这么多评论,压力好大-----------------------程序员


首先第一个问题:为何不少人会一直停留在两三年的水平上,然后一直在重复以往的经验?
我认为最主要的一点就是主观能动性,或者说兴趣,若是你对Android开发没有太大的兴趣,那么仍是尽早换方向吧。有了兴趣,而后就是要有一个比较正确的钻研路线,不要这也搞那也抓,最后什么都没精通又好像什么知道。一个很好的例子就是我用过不少库啊 github

艺哥也提到过,不少面试者以用过不少库为荣,你真的去了解过这些库么?
我以为一个比较好的路线是,把平常开发经常使用的各类系统库,开源库,代码好好研究一遍,好比我用了butternife就要了解背后的apt,以及apt衍生出来的一系列库好比Hugo。固然这大部分状况是初级进阶的第一步。这个阶段应该是尽可能很好的用技术完成业务需求。

第二个阶段,我以为能够尝试去了解Android Framework比较细节的一些东西,好比activity启动流程,顺便分析清除Activity stack的管理,好比了解Android的资源加载机制,顺便了解aapt是如何打包Android资源的;又好比Java的类加载机制,这里配合资源的加载机制,很天然的就能够去了解Android的hotpatch机制,插件化的实现,开一些这方便的开源库或者本身撸一个也就天然而然。这里我比较推荐 web

同窗的一系列博客,分析Android各类源码很不错。这个阶段你能够用技术反哺业务,好比插件化和hotpatch就可让业务更加灵活。

第三个阶段,横向扩展,到这个阶段并非说比第二个阶段更加高级了,而是对第二个阶段的一些补充,好比你是否是能够了解一下web开发,这样作hybrid开发的时候就会更顺手。是否是要了解一下这么火爆的ReactNative&Weex技术,甚至能够把他们的一些思想拿过来本身用,好比我司内部就有不少项目是用了JSCore和CssLayout来实现一些更轻量的动态化技术的。正如科学领域不少重大贡献都是在交叉学科领域出现的。技术上到了这个阶段甚至能够作到技术影响业务,技术驱动业务。面试

第二个问题:技术越底层越牛逼么?
其实大部分技术都是为了知足业务需求,我认为这种场景下,是能越好的反哺驱动技术才越牛逼,和底层不底层不要紧。好比你app作的很是牛逼,交互和性能很是好,直接带动业务飞速发展,我以为你并比能作底层人差,术业有专攻,以你的态度和能力,即便去作底层开发,也是没有问题的。算法

第三个就是为何不少作rom的反而对Framework不是很熟悉
我以为这个和第一个问题有些重复,兴趣是很大的缘由。另一个问题就是,若是没有*nix的编程基础,底层的一些东西好比binder机制,好比runloop可能会有一些吃力。这里服务端的同窗可能会有一些优点,他们对rpc和一些系统调用相对熟悉一些,这也是为何不少后端转到Android的同窗能够快速精通。sql

------啰啰嗦嗦写这么多,请你们来拍砖-------


------最后,我再加一条广告-----
虾米音乐Android在招人,若是你想来和咱们一块儿打造一个有情怀的产品,那么欢迎您来杭州加入咱们的团队。(好多同窗在私信我要求,大概说一下是招P6+,P7的)
是的,咱们正在努力,为了打造一个精品。
请私信或者微信联系我
 
 

我猜你这个阶段是把大部分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在咱手机里面咋滚轮的,发生了啥,系统咋处理的?
我在美团里面能打开支付婊的支付界面,这在咱手机里面发生了啥?

我提出来的这些都感受虚?回去大量学习而后写代码吧。个人这些也不是专门找书看的,而是长期开发来排除各类bug,期间读各类大牛文章,甚至翻了dev/framework层源码理解来的。
多花时间吧,花大把大把的。
 
 
在上一家公司当过一段时间的Android面试官,发现不少“精通”Android的候选人简历上都会写使用过XX开源库并引觉得傲,若是在面试的时候没有问到这些有的还会对我提出质疑。拜托,这就叫精通了?这真的颇有挑战性么?
怎么样算一名优秀的程序员?我认为最基本的要求是有高效的产出。回到Android上,一名优秀或者题主说的精通Android的程序员也应如此,高效的产出高质量代码,迅速解决开发中存在的BUG,对于需求提出合理的解决方案,不间断的学习和分享。而精通的开端,就是从一个使用者,变成创造者。轮子谁都会滚,而造轮子的,才值得尊敬。
那怎么成为精通Android的开发者?看,写,思考,总结,交流,这条路没有捷径。我认为精通Android的开发者至少须要具备扎实的C++/Java基本功,微机,网络通讯,数据结构和算法基础,熟悉Android的大部分组件,经常使用开源库,丰富的Debug,适配经验以及持续的学习能力。
 
 

不少人都提供了很是不错的答案,我也是受益不浅,谢谢各位。

可是我以为不少排名靠前的答案都给我感受,思路太中国式了,像中国的考试同样,追求难题,追求穷尽真理。好比

里面提到的那个面试,好比 提升的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很了解,颇有信心。由于谁都不可能在工做中不查看新的东西,只用旧知识的公司应该是不存在的。

最后再次感谢 ,二位说的不少问题我也不懂,赶忙去查一查,多谢!
 
 

咱们先来对问题分解一下:
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 各部分再分析分析,总结总结.

未完待续
 

从操做系统层面去学习,不要仅限于应用层开发,开放的系统源代码方便学习。

从框架设计逐步走到代码实现,应用层事后,能够学习内核,驱动,虚拟机,开源库,框架层再回到应用层,每一个阶段回味一下,就会体会到进阶的感受—酸爽。
 
参考 杰克沃顿大神
 
 

这两天面试也一直在跟来面试的两个有三年工做经验的程序员聊这个问题。

你的程序要实现某个要求的功能并非太难,尤为是通常生活中用的App,游戏另说。

可是要把你的App作的别人一看就以为好看好用,那是很是很是困难的。

这两我的一个iOS一个安卓,给我看的是同一个应用(是的,来自同一家公司),在把手机递给个人时候两我的都说了一样一句话:界面有点丑。

界面丑固然是产品经理和UI、UE的问题,可是,程序员的问题也是显而易见的,你为何要作一个本身都以为很丑的应用?还把这个当成面试的敲门砖?并且我跟他们强调,当时UI作出来的设计稿必定比你这个成品要漂亮,否则不可能经过老板的审核,并且水平再差的UI随便画个界面出来也不至于难当作这样。确定是大家在作的时候丢失了细节,然后产品经理和老板都迫不得已,由于大家说作不到他们就没办法。好的应用的第一个必要条件,就是要让用户第一眼可以接受它,大家手机里那些本身以为很好用,每天用的应用,有哪一个彻底是由于功能不可替代而忍受它难看难用的界面的?(网银App除外)

而要作到一个能作出漂亮的界面,细致的动画,流畅的交互的应用,对程序员的考验是很是很是大的,对安卓开发人员更甚。之前我花了两个星期的时间想模仿出Cal这个应用顶部那个日历的各类滑动效果,最终只能模仿出7成,还差的那3成在功能上是如出一辙的,但在细腻和流畅上就始终差那么一大截。
 
 
我作安卓时间不是很长,项目中用到了不少别人的框架,可是都不知道其根本原理,我以为应该要知其因此然。而后本身这一套框架。
 
 
本身写一个SlidingMenu或者Universal-Image-Loader试试
 
 

题主提出了三个问题:

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. 使用 Debug 或者 Logger 调试分析代码流程,这一步是为了了解执行流程,在了解的过程当中,问题通常都能解决掉。
  2. 经过第一步,咱们能够对代码有一个清晰的流程认知,能解决掉自身的逻辑 BUG。
  3. 第 2 步若是没有逻辑 BUG,剩下就是使用控件自己产生的 BUG 。这时候就直接去阅读源码,理清源码的逻辑流程,这一步能解决掉 90% 的 BUG。
  4. 还有 10% 就尝试能不能经过继承改变源码的逻辑流程,而后解决掉 10% 中的 99% 的 BUG。
  5. 第 4 步遗留的 1%,就经过 google,善用 site:http//xxxx keyword。http 的 url 通常是 stackoverflow、github,keyword 尽可能使用英文。
 
 

能力还不够答这个题目,仍是尝试答一下,我用我本身得例子来讲明下。两个例子。
1,数据库索引优化
之前作一个项目数据量很大,而后想作优化,一顿加索引而后发现反而更慢了,因而乎去研究下发现联合索引更快索引超过5个后明显变慢,也更适合层级递进查询,可是原理不知,因而乎去了解索引的原理设计,从而让本身有能力下次去避免这个问题或者作的更好。

2,一次面试
记得handler和looper得模式经典面试题,人人都能浅谈下。那么你知道sendmessagedelay如何实现的,handler得生命周期如何,跨线程是如何通讯的等等。当详细问下去的时候不少人是不知道得。不少人会知道handler生命周期长作静态内部类加索引用,可是你知道为何吗?我当时就是一问三不知,回去赶忙查看源码了解管道,epoll模型等。

这两个例子不是代表我精通了安卓了,我也只是知道点开发皮毛。可是总看到不少高手得精通其实就是当他遇到问题解决问题的时候会比咱们多去想一想为何,当你知道为何了才是精通而不是单纯得技能。这一点我是作的不够好的,但愿15年本身能作的更好一点。
 
 

我自己对安卓开发只知其一;不知其二,可是也算亲眼见证了几个大牛(不只限于安卓)的成长,因此给一点我所知道的办法。

1。面临一个解决不了的问题的时候,最初阶段放弃百度,放弃google搜索。尽可能作到只依靠安卓官方文档。

搜索引擎是一个黑匣子,问他“xx问题应该怎么解决”,它会忽略掉一切中间的思考,分析,解决流程,给出最后的答案。
其结果就是,使用答案的人基本上不可能理解“为何这么去作”,只知道“能够这么作”。 就像一个没学过加减法,只会用计算器的收银员,有计算器能工做,可是恐怕没有心算的快。复杂的问题若是计算器不会算,他也不会。
等到经过基本的文档本身找到了思路和方案,再去看看有没有别人写好的第三方的东西,或者成熟的方案,再和本身的东西印证。
这要花不少的时间,会比别人慢,会把别人休息的时间用来加班。 可是大牛若是是睡觉打游戏就能养成的,这个问题也不会出现了对不。

2。安卓系统源代码要常备。跟踪代码时候,尽量跟到系统的层面,越深越好。至少sdk要进去。
不了解sdk的代码,本身就很难写出同级的代码。好代码看的多了,天然本身的水准也会提升。熟读唐诗三百首嘛。

3。若是代码没有按预期的去动做,不要第一时间想着去解决这个现象,而是要追究为何会发生这个现象。
好比程序崩溃了,加个try catch天然解决了这个问题。可是这么作就太糟了。
天然要问问,为何会出现这个exception?底层的返回null了,上层没处理。哦,加个判断就行了。这样好一点,可是仍然很糟。 底层为何会返回null?若是null是合法的返回,文档里有没有约定?若是没有约定,文档有问题,若是约定了,代码有问题。更主要的是,其余地方是否是犯了一样的错误?我是否是存在“不注意文档约定”或者“写文档时候忘记约定”这样的问题?
到这个地方,才真的对本身的成长有所帮助。大牛也是一步一步走上来的。

4。多把本身知道的东西教给别人。 好比写一些知识和技巧跟你们分享,或者召集一个公司内的小培训。
这样作的好处有两个。
第一本身获得了锻炼。把知识系统化总结,对本身是一个回顾,整理,沉淀的过程。这个过程当中可能会找到本身尚欠缺的地方,也可能会被别人的提问启发。
第二是能逐步树立本身的地位感,成为大牛也是一个正向激励的过程,每每是牛人愈来愈牛,普通人愈来愈普通……

5。不要放弃任何一个提升的机会。 工做中不少任务是使用已经知道的东西来作。时间长了就会以为都是重复劳动。但是真的是这样吗?我所熟知的方法,就是最好的方法了吗?是否有更优雅高效的方式?答案是必定有,没有最好,只有更好。功能上以为已经实现好了就提升效率,效率已经很高了就改善结构,结构优化清晰了就试试分析有没有将来可能的需求变动,能不能应用设计模式,等一圈都走下来,回过头一看,原来功能上还不够完美啊。
相关文章
相关标签/搜索