先mark一下,好多人我发现始终停留在两三年的水平上没有突破。java
另外还有一个误区就是越底层越牛逼react
第三个就是,我认识的大部分所谓的作过rom开发的对framework的熟悉程度远不如我一个一直作应用的,大概是见木不见林,始终在那一个小角落里修修补补,不会横向,也没有纵向延伸。另外这里很重要的一点是基础,好比你是否有*nix基础,能够帮你快速理解不少东西android
晚上有时间的话把这三块展开说一下git
---------------------分割线,这么多评论,压力好大-----------------------程序员
首先第一个问题:为何不少人会一直停留在两三年的水平上,然后一直在重复以往的经验?
我认为最主要的一点就是主观能动性,或者说兴趣,若是你对Android开发没有太大的兴趣,那么仍是尽早换方向吧。有了兴趣,而后就是要有一个比较正确的钻研路线,不要这也搞那也抓,最后什么都没精通又好像什么知道。一个很好的例子就是我用过不少库啊 github
第二个阶段,我以为能够尝试去了解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
------啰啰嗦嗦写这么多,请你们来拍砖-------
我猜你这个阶段是把大部分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在咱手机里面咋滚轮的,发生了啥,系统咋处理的?
我在美团里面能打开支付婊的支付界面,这在咱手机里面发生了啥?
不少人都提供了很是不错的答案,我也是受益不浅,谢谢各位。
可是我以为不少排名靠前的答案都给我感受,思路太中国式了,像中国的考试同样,追求难题,追求穷尽真理。好比
里面提到的那个面试,好比 提升的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成在功能上是如出一辙的,但在细腻和流畅上就始终差那么一大截。题主提出了三个问题:
1. Android开发初期以后怎么提高?我看了下
的回答,他说的那些东西,Google Samples 全都提供了。好比说新出的 Toolbar 继承于 ViewGroup,若是屡次阅读过 ViewGroup 的源码。对于新出的 Toolbar 只需看一遍源码便知如何使用。若是熟悉了 ViewGroup,而后阅读 Toolbar 的源码(源码两千多行,基于前面的基础,大部分代码都无需仔细阅读了),2 个小时不到就能彻底掌握 Toolbar。
还有
所说的 CollapsingToolbarLayout、NestedScrollView 继承于 FrameLayout。若是你对 FrameLayout 熟悉了,这些新出的 View 掌握速度将快的没法想象。再次建议,跑 Samples,多阅读源码,背下继承关系。
2. 怎么才能叫精通?
私认为,你要是能回答小白提的任何 Android 问题,你都能对答如流就是精通。
:)
不要小瞧小白提问方式以及问题。
我组织了一个 『技术学习小组』,里面不少人问我 Android 问题,我有一大半没办法直接答出来。
然而我作了六年 Android 开发了。
3. 方向在哪?
题主问得什么方向?着实没看懂题主的问意。
======= 补充点我解决 Android 难题的思路
关于解决 Android 难题的思路,我很同意
的答案。能力还不够答这个题目,仍是尝试答一下,我用我本身得例子来讲明下。两个例子。
1,数据库索引优化
之前作一个项目数据量很大,而后想作优化,一顿加索引而后发现反而更慢了,因而乎去研究下发现联合索引更快索引超过5个后明显变慢,也更适合层级递进查询,可是原理不知,因而乎去了解索引的原理设计,从而让本身有能力下次去避免这个问题或者作的更好。
2,一次面试
记得handler和looper得模式经典面试题,人人都能浅谈下。那么你知道sendmessagedelay如何实现的,handler得生命周期如何,跨线程是如何通讯的等等。当详细问下去的时候不少人是不知道得。不少人会知道handler生命周期长作静态内部类加索引用,可是你知道为何吗?我当时就是一问三不知,回去赶忙查看源码了解管道,epoll模型等。
我自己对安卓开发只知其一;不知其二,可是也算亲眼见证了几个大牛(不只限于安卓)的成长,因此给一点我所知道的办法。
1。面临一个解决不了的问题的时候,最初阶段放弃百度,放弃google搜索。尽可能作到只依靠安卓官方文档。
搜索引擎是一个黑匣子,问他“xx问题应该怎么解决”,它会忽略掉一切中间的思考,分析,解决流程,给出最后的答案。
其结果就是,使用答案的人基本上不可能理解“为何这么去作”,只知道“能够这么作”。 就像一个没学过加减法,只会用计算器的收银员,有计算器能工做,可是恐怕没有心算的快。复杂的问题若是计算器不会算,他也不会。
等到经过基本的文档本身找到了思路和方案,再去看看有没有别人写好的第三方的东西,或者成熟的方案,再和本身的东西印证。
这要花不少的时间,会比别人慢,会把别人休息的时间用来加班。 可是大牛若是是睡觉打游戏就能养成的,这个问题也不会出现了对不。
2。安卓系统源代码要常备。跟踪代码时候,尽量跟到系统的层面,越深越好。至少sdk要进去。
不了解sdk的代码,本身就很难写出同级的代码。好代码看的多了,天然本身的水准也会提升。熟读唐诗三百首嘛。
3。若是代码没有按预期的去动做,不要第一时间想着去解决这个现象,而是要追究为何会发生这个现象。
好比程序崩溃了,加个try catch天然解决了这个问题。可是这么作就太糟了。
天然要问问,为何会出现这个exception?底层的返回null了,上层没处理。哦,加个判断就行了。这样好一点,可是仍然很糟。 底层为何会返回null?若是null是合法的返回,文档里有没有约定?若是没有约定,文档有问题,若是约定了,代码有问题。更主要的是,其余地方是否是犯了一样的错误?我是否是存在“不注意文档约定”或者“写文档时候忘记约定”这样的问题?
到这个地方,才真的对本身的成长有所帮助。大牛也是一步一步走上来的。
4。多把本身知道的东西教给别人。 好比写一些知识和技巧跟你们分享,或者召集一个公司内的小培训。
这样作的好处有两个。
第一本身获得了锻炼。把知识系统化总结,对本身是一个回顾,整理,沉淀的过程。这个过程当中可能会找到本身尚欠缺的地方,也可能会被别人的提问启发。
第二是能逐步树立本身的地位感,成为大牛也是一个正向激励的过程,每每是牛人愈来愈牛,普通人愈来愈普通……