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

hi大头鬼hi
Android开发专家
 
 

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

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


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


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


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


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

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

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

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

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

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

第三个就是为什么很多做rom的反而对Framework不是很熟悉
我觉得这个和第一个问题有些重复,兴趣是很大的原因。另外一个问题就是,如果没有*nix的编程基础,底层的一些东西比如binder机制,比如runloop可能会有一些吃力。这里服务端的同学可能会有一些优势,他们对rpc和一些系统调用相对熟悉一些,这也是为什么很多后端转到Android的同学可以快速精通。

------啰啰嗦嗦写这么多,请大家来拍砖-------


------最后,我再加一条广告-----
虾米音乐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。不要放弃任何一个提高的机会。
工作中很多任务是使用已经知道的东西来做。时间长了就会觉得都是重复劳动。
可是真的是这样吗?我所熟知的方法,就是最好的方法了吗?是否有更优雅高效的方式?答案是一定有,没有最好,只有更好。功能上觉得已经实现好了就提高效率,效率已经很高了就改善结构,结构优化清晰了就试试分析有没有未来可能的需求变更,能不能应用设计模式,等一圈都走下来,回过头一看,原来功能上还不够完美啊。

转载于:https://www.cnblogs.com/ldq2016/p/6611725.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值