背景

首先介绍一下自己的情况。目前所在的是一家小的创业公司,待了5年多,薪资一般吧。由于这几年公司也在转型。工作经历大概可以分为 3 个阶段。

第一阶段是从进公司开始做 android app 开发,无论是外包或者公司的主力产品都做过。

第二阶段是做 ROM 开发,由于公司规模不大,除了硬件和底层的东西外,基本上是一个人负责了整个 ROM 的修改,编译,发布(基于 MTK 的某一个 rom,然后做一些 android framework 层面上“奇奇怪怪”的定制)。

第三阶段,也就是当前。之前做的 ROM 所适配的手机销量未达预期,公司也不再准备投入更多,基本上是做做简单的维护。而我被分配的新任务是做机器学习的一些东西,比如 Tensorflow, OpenCV 做做图片处理,训练之类的。

相信诸位看了上边的经历,大概也猜到我现在所面临的问题。即,当前在一线做 android app 开发,而我的目标仍然是想找 android 开发的职位。

我对于自己的评价:

Android app 开发能力一般,但是足以胜任一般 app 开发的任务(因为确实有段时间未做公司正式项目的 app 开发,但是也不是说已经荒废了技能);

Android frameworks 方面比普通开发者了解更多;

解决问题,学习实践新技术的能力不错(无论是从第一次编译 AOSP 到后来整个 ROM 的开发,发布。还是从对机器学习完全陌生,到现在能够描述常见机器学习的算法,使用 Tensorflow 实现一些这方面的需求)。

说到这次的面试,面试官几乎是按照他所准备的 Android 面试题一一提问。如:

View 自定义
handler 机制
内存泄漏
rxjava的flatmap原理
......
(差不多都是些理论上的问题)

他问的这些我大部分都能答上,但是我自己所组织的语言,描述的结果却差强人意。大部分是因为我自己表达能力的问题,我觉得这些问题如果是作为笔试题目,我能够更从容的回答。

我更期待的是对于我自己项目经历的说明。因为这是我和其他应聘者不一样的地方。而面试官却完全没问我简历上的项目经历。虽然最后我还是自己硬讲了一下,但面试官也并未有兴趣,我讲的也很干瘪。最后面试就这样结束了。

我自己的想法:自己准备不充分,没能干净利落地应对这些“ Android 标准面试问题”。至少这些基础问题应该能够一两句话就讲清楚。完全没有体现出自己区别于其他应聘者的地方。我认为自己能够又更快又稳的做好开发工作,能够深入的研究框架,源码,解决一些疑难问题,怎么才能让面试官也这样认为。

为何在技术面试中程序员很容易被刷掉?

其实在面试中很多程序员并不是因为技术水平差而被刷,而是对这些“ Android 标准面试问题”不了解,知道怎么做,但是不知道底层原理。

去年,作为技术 Leader 和主程序员,我面试了超过 100 位的软件工程师职位候选人。

在下文章中,我将和你分享候程序员该如何准备技术面试,好让你最大可能通过这些面试。另外,我还会给到一些额外的技巧,它们将帮助你应对这些令人畏惧的技术面试。

首先,我想澄清一下,相比于做程序员,进行面试可以说是另一种技能。你可以是一名优秀的软件工程师,但可能是一名糟糕的面试者。逻辑上来讲,你越擅长软件开发,你就越有可能通过技术面试。但是,这并不能打包票保证你一定能通过绝大数的程序员岗位面试。

一、了解自己的优势

仔细分析自己的优势和劣势是什么,然后添加在简历中,优势可以从这几点入手,后面是面试官的理解:

  • 大型项目的经验 (能解决项目普遍出现的问题,技术水平靠谱)
  • 作为主要参与者得过比赛名次(聪明,勇于尝试)
  • 毕业于不错的学校(学习努力,认真)
  • 维护优秀的开源项目 (懂得团队协作,喜欢学习,愿意了解项目原理)
  • 发表过论文或者优秀的博客文章(研究能力强,分析能力强)
  • 数据结构和算法基础好,Leetcode 中等难度都能 bug free(基础不错,培养起来也简单)

了解到自己的优势和劣势,简历就可以强调自己的优势。例如,如果求职者要面试的是开发工程师,就应该突出项目经验以及对框架的熟悉程度,如果面试的是研究岗位,那么论文与文章的数量就比较重要。

二、技术知识

知乎上有个问题,叫做 如何高效学习,里面有一个回答我觉得很符合我自己的观点,就是 建立起自己的知识体系,建立知识体系的目的在于:

巩固记忆。
认识自己,找到自己的优势及不足。
把握复习的进度。
经验总结。
目前我自己的总结的会分为以下几个大点:

Java部分

  • 面向对象的基本思想
  • Object类相关:Object类的几个关键函数、String涉及到的常量池概念,序列化 & 反序列化。
  • 重要关键字:final、static。
  • 内部类:内部类的分类、应用场景、内部类编译成class后是怎么样的。
  • 抽象类 & 接口:区别、应用场景。
  • 编码:编码的目的、分类。
  • 异常:异常体系、自定义异常。
  • 注解:注解的基本概念、分类、编译时注解 & 运行时注解。
  • 容器:重要容器的内部实现、容器间的对比。
  • 内存模型。
  • 垃圾回收。
  • 类加载的过程。
  • 泛型:分类、通配符 & 上下边界、泛型擦除。
  • 反射:使用。

Android部分

  • Dalvik、Art虚拟机
  • Activity:生命周期、launchMode。
  • Fragment:生命周期、懒加载、两种Adapter之间的区别。
  • BroadcastReceiver:基本概念、广播分类、权限。
  • Service:生命周期、onStartCommand的返回值、startService和bindService的区别、相同进程 & 不同进程的交互、IntentService实现原理。
  • 重要的工具类 & 源码实现:AsyncTask、HandlerThread、Handler、IntentService、LruCache、LinkedHashMap、SparseArray。
  • RecyclerView:缓存原理、和ListView的对比、Adapter如何适配多种layout。
  • 存储:数据库升级 & 优化、ContentProvider,SharePreference。
  • SDK版本升级的兼容问题。
  • Android的权限管理机制。

图片

  • Bitmap相关:Bitmap的大小计算、质量、inJustDecodeBounds、inBitmap。
  • 几种图片格式的对比、压缩。
  • 大图加载:BitmapRegionDecoder

算法

  • 别无捷径,刷题,但是刷题的时候,要按照题的类型去总结。

开源框架

  • RxJava:操作符的应用场景、重点操作符的内部实现、和RxJava的对比。
  • Glide:流程、缓存相关的实现。
  • Retrofit:流程、动态代理 & 注解解析。
  • OkHttp:流程、队列实现、缓存实现。

性能

  • 性能优化技巧:启动速度优化、布局优化、内存优化、电量优化、APK大小优化、列表滑动优化。
  • 性能优化工具:TraceView、Systrace、调试GPU过度绘制 & GPU呈现模式分析、Hierarchy Viewer、MAT、Memory Monitor & Heap Viewer & Allocation Tracker、LeakCanary、Lint。
  • ANR
  • 性能实践:解决过的性能问题,从 遇到问题、分析问题、解决问题、结果 四个点进行阐述。

View

  • 绘制流程:measure、layout、draw三个关键流程。
  • 事件分发:事件分发的原理、处理过的滑动冲突问题。
  • 自定义View:Canvas & Path,实现过的比较复杂的自定义View。

架构

MVP:MVP的思想 & 优劣势、在项目中的应用、

源码

  • AMS
  • WMS
  • Binder
  • 应用启动流程
  • APK相关知识点
  • APK构成:resources.arsc组成、AndroidManifest.xml、aapt作用及原理
  • APK打包过程
  • APK安装过程
  • APK签名 & 校验原理
  • dexopt原理

网络

  • 基础知识:看一下对于 <<计算机网络>> ,重点是网络分层模型、TCP/UDP、HTTP/HTTPS。

设计模式

  • 按照23种网络模型、三个分类进行总结,每种设计模式包含以下三个方面,至少要准备常用的几个:
  • 基本概念:UML图、简单例子、应用场景、优势 & 劣势。
  • Android源码中的实现
  • 项目中的应用

多线程

  • 看并发编程的艺术,这本书的目录就是多线程最好的知识体系。
  • 遇到过的多线程问题、怎么解决的。
  • Gradle
  • 常用配置。
  • 多渠道打包。

插件化

  • 插件化的核心思想。
  • 几种插件化框架实现的原理。

组件化

  • 组件化的优势。
  • Arouter:使用方式、实现原理。

以上更多详细内容均放在了开源项目【github】 ,大家有需要可以自行获取。

三、非技术问题

Q: 为什么选择这家公司?
A: 面试之前对起码要浏览过公司的网站,了解公司有什么产品,这样既可以防止遇到皮包公司,或者小作坊欠薪拖薪。

Q: 你曾经面临最大的专业挑战是什么?你是怎么战胜它的?
A: 这个一定要准备好,不能说没什么挑战,没什么挑战代表你没有认真去思考,就算是最简单的增删改查或者前端的动效,背后的原理,网络协议的原理,你都应该去了解。对你在简历中的每一个项目,你都应该能说出里面最大的挑战,最有趣的部分是什么,这样面试官才能真正理解你在项目中做了什么,学习到什么。

Q: 是什么为什么你选择离开你现任公司?你从你上一家公司学到最重要的是什么?
A: 大多数求职者不喜欢这个问题,也不知道怎么回答。这个问题你能回答好的话就能拉出距离了。我觉得答案其实很简单,你们公司的项目有更好的发展前景/我想挑战自己在这一方面的能力等等。至于说旧公司薪酬太低,工时太长,没前途这些就免了。

Q: 你的长期工作目标是什么?
A: 这个看个人,转管理的话可能会加一轮问管理方面的问题,转资深工程师的话可以讲下自己打算钻研哪个方向。

四、最后

我一直以来都有整理练习大厂面试题的习惯,有随时跳出舒服圈的准备,也许求职者已经很满意现在的工作,薪酬,觉得习惯而且安逸。

不过如果公司突然倒闭,或者部门被裁减,还能找到这样或者更好的工作吗?

我建议各位,多刷刷面试题,知道最新的技术,每三个月可以去面试一两家公司,因为你已经有不错的工作了,所以可以带着轻松的心态去面试,同时也可以增加面试的经验。

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包——————可以我的【Github】阅读下载,最后觉得有帮助、有需要的朋友可以点个赞

我一个五年Android开发,居然被一个技术不如我的面试官嫌弃了......的更多相关文章

  1. 一个五年 Android 开发者百度、阿里、聚美、映客的面试心经

    花絮 也许会有人感叹某些人的运气比较好,但是他们不曾知道对方吃过多少苦,受过多少委屈.某些时候就是需要我们用心去发现突破点,然后顺势而上,抓住机遇,那么你将会走向另外一条大道,成就另外一个全新的自我. ...

  2. IntelliJ IDEA —— Android开发的另一个选择

    IntelliJ IDEA —— Android开发的另一个选择 很早就听过Eclipse的大名,但在我初学Java的时候,一位前辈推荐的IDE却是IntelliJ IDEA.因为之前用过JetBra ...

  3. 一个帖子学会Android开发四大组件

    来自:http://www.cnblogs.com/pepcod/archive/2013/02/11/2937403.html 这个文章主要是讲Android开发的四大组件,本文主要分为 一.Act ...

  4. 40k*16 薪,五年Android开发4轮面试拿下腾讯 Offer !(附真题)

    概述 感觉毕业后时间过得真快啊,从16年6月本科毕业入职了一家不大的公司,到现在快五年了,前段时间金三银四想着找一个新的工作,前前后后花了一个多月的时间复习以及面试,前几天拿到了腾讯的offer,想把 ...

  5. Android开发技巧——写一个StepView

    在我们的应用开发中,有些业务流程会涉及到多个步骤,或者是多个状态的转化,因此,会需要有相关的设计来展示该业务流程.比如<停车王>应用里的添加车牌的步骤. 通常,我们会把这类控件称为&quo ...

  6. 一个四五年的Java开发程序员,该准备哪些去面试?

    上周面试了一周,感触颇深,总结一下. 面试了公司大概有阿里,携程,爱奇艺,唯品会,途牛,bilibili,大众点评,阿里和爱奇艺是电话面试,其他现场面试. 首先,五年左右,应该算高级开发工程师,大部分 ...

  7. iOS开发,这样写简历才能让大厂面试官看重你!

    前言: 对于职场来说,简历就如同门面.若是没想好,出了差错,耽误些时日倒不打紧,便是这简历入不了HR的眼,费力伤神还不能觅得好去处,这数年来勤学苦练的大好光阴,岂不辜负? 简历,简而有力.是对一个人工 ...

  8. 美团面试官问我一个字符的String.length()是多少,我说是1,面试官说你回去好好学一下吧

    本文首发于微信公众号:程序员乔戈里 public class testT { public static void main(String [] args){ String A = "hi你 ...

  9. 这才是做了五年Android开发该有的样子!

    程序员工作五年后一般怎样了? 五年程序员生涯对身体上的摧残就不说了,来讲讲一般会有怎样的状态吧! 优秀的一般是这样:有着明确的职业目标与规划,热爱技术,五年的工作沉淀,技术能力得到了飞速提升,每天依然 ...

随机推荐

  1. layui--入门(helloWorld)

    具体可参考官方文档:https://www.layui.com/doc/ 由于引入layui 需要用到node.js 安装过程可参考: https://www.cnblogs.com/liuchenx ...

  2. LAMP——实现phpMyadmin、wordpress及Discuz应用部署

    一.环境准备 操作系统:Centos8.3.2011 软件:Apache2.4.37.Mysql8.0.21.PHP7.2.24 二.安装过程 1.安装phpmyadmin 1.1.安装软件包并启动服 ...

  3. k8s结合jumpserver做kubectl权限控制 用户在多个namespaces的访问权限 rbac权限控制

    圈子太小,做人留一面,日后好相见. 其实这个文章就是用户用jumpserver登录到k8s master节点 然后执行kubectl的时候只有自己namespaces的所有权限. 背景 1,k8s 有 ...

  4. RabbitMq脑裂问题

    现象 部署在阿里云上的2台RabbitMQ主从,访问management页面时出现如下所示的内容: 查看其中一个mq的日志,发现如下内容: 00:06:32.423 [warning] <0.5 ...

  5. JVM,我就不信学不会你了

    JVM 对 Java 有多重要,对程序员面试有多重要,这些不用多说. 如果你还没意识到学 JVM 的必要性,或者不知道怎么学 JVM,那么看完这篇文章,你就能知道答案了. 曾经的我很不屑于学 JVM, ...

  6. Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题

    LocalDate.LocalTime.LocalDateTime是Java 8开始提供的时间日期API,主要用来优化Java 8以前对于时间日期的处理操作.然而,我们在使用Spring Boot或使 ...

  7. 解决数据库连接池连接mysql时,每隔8小时mysql自动断开所有连接的问题

    解决数据库连接池连接mysql时,每隔8小时mysql自动断开所有连接的问题 最近有个问题非常讨厌,我们的工程中使用自己的连接池连接mysql数据库,可mysql数据库每隔8小时就会自动断开所有链接, ...

  8. KeepAlive详解(转)

    一.什么是KeepAlive? 首先,我们要明确我们谈的是TCP的 KeepAlive 还是HTTP的 Keep-Alive.TCP的KeepAlive和HTTP的Keep-Alive是完全不同的概念 ...

  9. HTTP工作过程(浏览器输入URL到返回HTML页面都经历了什么)

    超文本传送协议(HyperText Transport Protocol,HTTP)是互联网上应用最为广泛的一种网络协议,它工作在应用层,使用TCP的80号端口提供服务.并且HTTP是工作在客户/服务 ...

  10. Apache atlas liunx环境安装部署手册

    一.        背景 本文使用一台ubuntu虚拟机安装Apache-atlas,使用集成包unzip apache-atlas-2.1.0.zip进行快速安装部署,该集成包高度集成了hadoop ...