写给有 Android 开发经验的大家

前言

不是要你给出每个问题的标准答案,而是要你给出这个问题的你的、本身的答案。
程序员

关于简历
面试

面试首先要提到的就是简历,简历这个东西真的是一个很深奥的事情,为何深奥,实际上是对像和我这样的人深奥:学历很差、工做经历很差。固然,这和目前技术研发人才需求的大环境也有关系,并且上述两点会愈来愈影响简历的经过性。说一个真实的事情你们就有概念了,这是一个前同事私下告诉个人,他比我先一年多离开公司,而后到了一个大厂(一个大电商),他如今也负责招聘面试,若是社招简历不是硕士,都会日后排排,虽然这不是公司规定,可是他们实际就是这样操做的。是否是很吓人?他本身都以为吓人。说了这么多,那怎么办呢?学历很差、工做经历很差就别期望找到好工做了?固然不是,其实面试仍是考的内功,简历只是一块敲门砖,若是你的内功深厚,而且可以很好的体如今简历上,那么简历真的只是一个简历而已。你们应该注意到了,上面提到了两点:算法

  1. 将能力很好的体如今简历上
  2. 内功深厚

如何将能力很好的体现到简历上其实不是一个理工科同窗擅长的技能,因此要多写多改多请教,多找找有经验的朋友帮你看看,即使是没有这样的朋友,相信你们也有能力和渠道去接触到这样的人。另外关于简历的格式网上有不少文章,前面专栏里文章也有提到过,这点就再也不深刻了,有一点很重要的我以为应该增强一下你们的警戒,就是用过,可是知道不深刻的技术点必定不要写在简历上,通常大公司面试有一面必定是简历面,也就是按照你简写上写的技术点问,若是发现你写了,可是又说不出来很深的东西,那就至关减分了,因此这一点必定要注意。总之,简历不是你面试经过最关键的东西,最关键的是第二点:内功设计模式

关于内功

一个怎样的Android工程师才能进入到大厂呢?下面几个方面每每是须要具有的缓存

基础

要想拿到大厂的offer,基础好是一个硬性条件,对于计算机相关专业毕业的同窗来讲,这些基础就是你大学所学的课程,若是不是计算机相关专业毕业的同窗,那么就须要在基础知识这个方面下足功夫了,具体来讲下面的东西必须掌握:性能优化

  1. 操做系统原理(里面有一些计算机组成原理的知识须要简单掌握)
  2. 网络原理

若是你没有掌握这些知识,或者以前学过,可是忘了怎么办?学啊!怎么学呢?去网上找一些大学的公开课,我是看的清华的,至于哪个学校的适合你,就只有你本身判断了。可能你们会有疑问,面试会问这些知识吗?直接问的不多,可是只有你了解了这些知识,才能更深刻的了解一些技术和知识。举两个例子吧,第一个,若是要作Android里的网络优化,你不知道网络里面的一些原理,你怎么知道怎么优化?若是你不知道UDP和TCP的详细区别,技术选择时,你怎么知道选择哪个做为你通信的协议?关于网络还有一个出现几率很高的问题就是TCP的三次握手和四次握手,其实它就是网络原理里面的知识。第二个,操做系统中,内存是发挥什么做用的,又是怎么工做的,知道这些,你再去了解Android的内存管理就信手拈来了。服务器

数据结构和算法

数据结构和算法实际上是分开的东西,咱们须要先掌握各类数据结构,再去加深算法,数据结构和算法其实也属于基础,可是它如今愈来愈重要,因此我就单独拿出来讲了。数据结构怎么深刻一样我也推荐你们去看清华或者浙大《数据结构》公开课,特别是清华的,值得反复研究。至于算法,首先要作的就是动手,LeetCode上直接干!第二阶段就是要总结各类算法的思想和套路,像递归、动态规划等这些算法都是有套路的,在LeetCode上也有按数据结构和算法分类的筛选,你们能够针对性练习和总结。固然,对于一个Android程序员,能作到天天在LeetCode上刷题就很是不错了,因此必定要坚持,等你坚持到必定的时间,你会发现你愈来愈游刃有余,我从15年末开始在LeetCode上刷题,目前已经刷了200多道了,小米的面试也很是注重算法,还要能写。并且对一些特别注重算法的公司,算法这块的考核很是严苛,对,就是严苛,网络

设计模式

设计模式中包括了设计原则,其实对于Android开发人员来讲,设计模式就那23种,知道并了解这些设计模式是第一个阶段,仅仅是到这个阶段是不够的,通常面试也不会问你某个设计模式的概念,而会让你具体的说说你对某一种设计模式的深刻了解和使用,它的优缺点,因此,第二阶段就是要运用它们,其次要和Android源码中运用到设计模式地方进行结合学习。例如建造者模式,Andoird中的Dialog建立就使用到了,还有像单例模式、适配器模式、观察者模式等等都是在Android中很是经常使用的设计模式,也是在面试中出现频率很高的。数据结构

Java

Java我就来直接一点了,以下:多线程

  1. Java集合(HashMap通常必考,通读源码颇有必要)
  2. 反射
  3. 多线程
  4. IO、NIO(可选)
  5. 泛型
  6. JVM相关,如内存的管理、内存的回收、类的的加载等等
  7. Java异常

你们可能以为这些本身多多少少都了解,可是当问到细节就不知道了,因此对于上面的知识仍是须要系统的认知,项目中没有机会深刻就本身一个一个突破,好比Java集合,首先对集合要有一个宏观的认知。

从常见类的源码开始动手,如HashMap,按部就班,逐个击破。从这点也能够看出,咱们对每一类知识必定要深刻的了解,而不是泛泛的知道,好比Android的一些热修复框架,其中就是JVM中类加载和反射等技术。又好比并发中,线程池和ThreadLocal这些都是必要掌握和熟练使用的知识,也是面试常常会被问到的。

Android

Android其实要说的很少,对于一个有工做经验的Android程序员来讲,基础的一些Android技术你们都是掌握了的,而若是要作一个加分的Android程序员,下面的Android技术就须要深刻了解了:

  1. Android View的绘制和流程
  2. Android触摸事件分发机制
  3. 性能优化(网络、内存、电量、UI)
  4. 常见Android源码,如Handler、AsyncTask等等
  5. 熟悉Binder原理
  6. 了解一些Framework常见知识,如AMS

一样的,这些都是要系统的掌握和运用。

JNI

JNI其实属于Android NDK中的一个技术点,可是它不像上面的知识须要系统的了解,JNI咱们只须要知道Java怎么调用C或C++的代码,C或C++怎么调用Java的代码,而且相互以前怎么传递各类参数(对象),由于通常Android开会不会涉及到写复杂的C或C++代码,咱们使用NDK也更可能是为了调用第三方的一些C或C++算法库,如FFmpeg。固然,若是你能写得一手好的C或C++代码,那么就更加分了。

框架和项目

在Android中会常用到一些第三方框架,这也是面试中会常常问到的,具体问题就是它们的原理或设计,像LeakCanary、OkHttp等,固然通常只会问你使用过的,在平时咱们使用第三方框架的时,就须要去了解他们,仅仅是为了用而用,是面试官不想看到的现象,由于只会用,不懂原理,就不能控制,而是被框架控制。如何去了解呢,首先要知道这个框架怎么用,而后在找入口,从入口一步一步去探索。本身作的项目也和第三方框架相似,你本身参与的项目的架构若是你都不清楚,那么面试官也就知道你对技术的饥渴度了。好比我以前的公司就使用Netty作终端和服务器的通讯,在个人简历中也体现了这点,我有信心将它体现到简历上,是由于我花时间去详细了解过Netty,从NIO到Netty,到Netty经常使用的类,再到一些慨念的了解,如零拷贝、IO多路复用、粘包、拆包等等。因此当你在项目中使用过了,而且被问到时你能很好的说出来,那必定是加分的。

其余

其余都是能为你的简历加分(好学历和好工做背景就不说了):

  1. 有开源项目
  2. 参与过开源项目
  3. 有我的博客(有内容、有深度、有价值)

这些也属于一我的的内功,可是它和上面我要提到的还不同,由于它不是必须,但又有可能很重要。

内功小结

你们看我一会就把Android研发人员须要具有的内功总结完了,可是若是你真的要把这些都真正的掌握、变成本身的东西真的不容易。每一个人都有本身的目标和梦想,在走向目标和梦想的道路上,确定有各类各样的困难。只有克服困难,才能继续前行,因此,坚持吧!

知识点详细清单

上面我总结的我怕你们仍是以为太泛泛,没有干货,因此再给你们补一个清单:

  • Activity的生命周期
  • Activity的任务栈
  • Activity的启动模式
  • Fragment的生命周期
  • Fragment的通信,Fragment之间,Fragment和Activity
  • 什么是Service,和Thread的区别
  • Broadcast的做用和注册方式
  • 什么是本地广播
  • 什么是有序广播
  • Android的异步处理方式有哪些
  • AsycnTask、HandlerThread、IntentService源码
  • Binder
  • View的绘制流程
  • 事件分发机制
  • 自定义View的几种场景和方式
  • ListView的缓存机制
  • Handler、Message、MessageQueue、Looper
  • 第三方开源框架设计和原理
  • ANR是什么,怎么避免和排查
  • OOM是什么,通常若是避免和解决
  • 内存泄露是什么,常见的内存泄露有哪些
  • 版本管理工具的使用,Git、SVN
  • 代码编译工具
  • 代码混淆
  • Java IO
  • 多线程
  • 类加载器
  • 反射
  • 23种设计模式
  • HTTP、TCP、UDP协议
  • 计算机网络
  • 操做系统原理
  • 算法和数据结构:排序、二叉树遍历、动态规划
  • 常见加密方式和原理

关于Android的前景

不断地也听见不少人在谈作Android是否还有前途、Android研发在走下坡路了、Android的工做太难找了,对于这些其实个人见解很简单,如今真的还没到说Android开发已经无路可走的地步,固然将来怎样我没法预判。如今各大公司其实都很缺Android研发(中高级),不断的在招人,就拿小米来讲,别说来面试的人了,就简历都拿不到太多,须要花不少时间去找简历。因此,对于有Android开发经验的同窗,更多应该想一想怎么往深探索,而不是一味想着换方向,无论换到哪一个方向,都会面对从初级到高级到资深再到专家的时间点。因此我认为正确的职业规划应该是金字塔形,核心竞争力必定要扎实!如下我以前总结的一张关于Android集合的图:


总结

上面算是一个简单面试前技术点的总结,东西不少,若是要从零开始掌握这些也是很是艰难的过程,惟有靠本身点点滴滴积累,别无他法。其实本身总结出这些东西并不难,难的是如何学、如何坚持、如何加固,每一个人的学习和积累方式都不一样,必定要找到本身的方式,什么是好的方式标准就是让本身能够牢记、快速记,牢记比快速记更重要,如何坚持是一种意志力上的考验,每每咱们须要为本身找一些长期和短时间的目标,激励本身不断的进步。包括我在内的大部分人都不是什么天才,惟一能让本身进步的方式就是脚踏实地的去干,相信越努力、越幸运!

相关文章
相关标签/搜索