截止到2017年5月12日,持续了半个多月的找工作大业终于结束啦,在这个半个月经历了大大小小十几场面试,面试的企业有智能硬件、即时通讯的、销售管理软件相关的、线上教育相关的、资讯相关的。因为我自己也不确定接下来自己想去什么方向,只是单纯的想找到一个自己没有接触过的领域,所有简历投了很多跟自己本身没有相关的行业。
首先交代一下我的背景,我所在的公司是一家上市公司,公司规模很大,我所出的团队是智能硬件团队,我可是这个团队的元老级别的人(白痴),我主要负责 Android 端 低功耗蓝牙的开发,背景交代完毕。
我们就按时间顺序依次说说我面试过的10加企业。
出国手机小号App
这是一个刚刚成立的创业公司,团队正在快速的扩张,作为我开始投简历的第一个家公司,我是没有抱着多大希望的,后面再说这种观点真的是一种错误。在面试过程中,主要问了一下低功耗蓝牙(BLE)相关的东西。自己虽然经常在使用,但是具体的参数和实现形式不是很了解,自己回答的很不好,完全达不到用人单位的要求。
下面大体总结一下关于低功耗蓝牙的相关问题:
- BLE 的配对方式有哪些?
- BLE 每秒钟传输速率是多少?数据传输的形式有哪些?(Byte[]),低功耗蓝牙的传输通道有哪三种?有一个2kb的数据该如何传输?
- 低功耗蓝牙的优缺点?低功耗蓝牙与经典蓝牙的区别?
- 低功耗蓝牙如何做设备搜索?如何区分自己公司的产品?(UUID),如何防止手机能够连接上设备?(将通用的UUID做成自己公司特有的)
- 低功耗蓝牙的固件升级功能如何实现?(OTA/DFU),实现的流程?
- 针对不同厂家的ROM,蓝牙模块有哪些差异?你是如何解决这些差异问题的?
国外的喜马拉雅
这个一家CEO来自 Google 的创业团队,倡导的理念是要么快要么死。唯一让我感到很吃惊的是他们只有 Android 客户端,完全不在国内应用市场上线,只做 google play。这是我真佩服他们的地方,当天去面试时,面试基本之前没看过我的简历,拿着电脑从头开始看,边看边问,问的也没什么章法,我答的也没什么逻辑。其中有几个问题,还是影响到我了,
- 你在项目中有没有什么可以说出来的 Case?或者让你感到自豪的点?— 这么开放的问题,我回答的很失败,完全没有get 到他的点。
- 你用过我们公司的App吗?或者说你对我们公司了解吗?— 我之前完完全全没有去了解过这家公司,他们所从事的事情我也是在拉勾上简单看了一下,没有进入到公司的主业去看看。所以奉劝各位,在面试一家公司之前,一定要去看看公司的主页,了解一下人家公司是干嘛的。
国内在线教育App
这是一家处于北京胡同里的创业公司,首先这个公司的Hr是真不错,在面试之前会和你讲很多公司的业绩和主营业务,说公司的开发团队是很有极客范的一群人,详细的询问你离职的原因和期望工资,她会根据你说的内容深入的了解你这个人。所以有些话还是不要说的太满。经过九曲十八绕我终于来到了这个据说“有情怀的公司”。面试官主要问了我下面几个问题:
- 大学里是如何学习 Android 的?
- Activity 的生命周期?Activity 之间互相跳转时的生命周期?Activity 和Dialog 之间跳转时的生命周期?Activity 加载 Fragment 时的生命周期?
- List 里的参数为啥是 Integer 类型不能是int ? — 引用类型和基本类型
- 弱引用?
- 数组和链表的区别?— 在内存的分布。
- gradle 是否了解?
- 如何看到 React Native ?
- AsyncTask 是顺序执行的还是并发执行的?— 这个问题后来通过看源码弄明白了。
- 面向对象的思想?详细说下多态
总体感觉,问的问题还是偏向于基础的,基础不牢地动山摇啊。
销售管理App
这是业内很有名的公司,我在刚开始做App 的时候就听说过,进去面试的时候,先让我做了大约4页的面试题,我是请假去的,所以草草的写完啦,之后被领到一个中午热饭的地方进行面试,不得不说那个味啊,真是… 面试的过程中面试官看我做的页面相关的东西很少,没怎么上心的问我,简单的应付一下就让我走了,不得不说真的很不负责任,浪费大家时间。下面说说笔试题的一些内容吧。
- 抽象类和接口的区别
- 内部类 — 静态内部类和成员内部类
- 死锁的条件?
- ArrayList 中元素的删除操作?— 用 Iterator 的 remove() 方法,不能直接调用 arrayList 的 remove()方法。
- 自己设计一个图片缓存框架?
- LruCache ? 为什么要用 LinkedHashMap?
- ListView 的优化?图片错位?滑动卡顿?检测内存的指标的工具?
- GreenDao 的原理是什么?注解是什么?
- ListView 的 item 中包含 CheckBox,如何获得手指点击区域的 position?也就说用什么方法可以获得点击的是第几个 item.
相机伴侣
这是第一个给我 offer 的公司,老板说了一句很打动我的话:有眼缘。曾给我打过两次电话,我都以个人原因拒绝啦,差点就去了。公司不大,面试的地方在楼道里,是不是很搞笑,但就是这样的环境,我们竟然聊了一个多小时。面试的问题如下:
- BLE在不同ROM的适配问题。
- Handler 机制?如何避免内存泄漏?— removeCallbacksAndMessage(),只要 MessageQueue 中没有 Message 待处理,那么就不会引起内存泄漏。
- 如何正确的停滞一个 Thread ?— while 中的标志中位。
- Android 中的多线程? AsyncTask IntentService HandlerThread ThreadPool
- 线程和进程的区别? — 这个一个多么经典的问题啊,我回答的语无伦次。
- 介绍下 MVC MVP MVVM ?
- Volley 源码的解析?
- Tcp Udp 的区别?
- 常用的设计模式?— 单例模式(饿汉式、懒汉式、DoubleCheck、静态内部类、枚举),观察者模式(写出代码),工厂模式。
总结一下,公司的领导很不错,平易近人。
大裤衩
这是我人生中第二次进入大裤衩,那份激动真的是难以言表,我明明知道它不会要我,但我还是想去试试,给自己一点希望。经过层层开条安检,终于来到了34层,首先让我们做了一份面试题,当我见到这份面试题的时候,我哭的心都有了,这里面的题每一道我都见过或者说我曾经都敲过。给了40分钟,最后没有做完就被揪去面试。结果可想而知啦。
- 最大不重复子串— KMP (原题啊— 我还曾经在电脑上敲过,此时哭晕在厕所)
- Activity 的生命周期?— 重点在 onRestart() 起始的位置。
- Service 的启动方式?
- Android 中的多线程?
- 写出常用的排序算法?二分查找算法?
- Https 的原理是什么?网络请求是一个什么过程?
- 蓝牙的电量优化?
- MVP 中 Presenter 的作用?是否可以共用?
- 读过 图片缓存框架的源码?
- OkHttp 缓存的原理?— 这个问题得查查
这是我四月底的最后一家面试,在这半个月里真的感觉到自己知识储备的不足,打算找工作的事情先放放,安心学习一个月再继续找,有点疲惫啦。
情怀
这是我在接到这家公司面试邀请时首先想到的词,面试我的是一个身材魁梧的 leader,一看就经常健身,从他的面相和面试过程来看,我知道我有戏。 整个面试过程就是两个男人的单挑。😄
面试题如下:
- 说下你最熟悉的技能吧?— 自定义View 三个方法的作用是什么?
- View 和 SurfaceView 的区别?详细说一下 SurfaceView ? 硬件加速?
- Android Animations 的 Property Animation ? 插值器?阻尼?
- Invalid 和 Postvalid 的区别?
- ANR?
- BroadcastReceiver ?— 有序广播 ?原题是:两个广播接收器同时对一个 action 进行监听,如何保证第一个比第二个先监听到?有两种方式:设置优先级,有序广播。
- 图片缓存的处理方式?
inBitmap
属性? - java 的值传递和引用传递?实参和行参?
- 你属性什么设计模式?— 我们为什么要用设计模式?— 这个问题我回答的很是无语啊。
- 面向对象的开闭原则? — 我还能说什么,我这是没记住啊。
- 写一下冒泡排序?— 这个我用冒泡排序的优化方式,结果这位大哥竟然没看明白,我俩就这个算法讨论了大约10分钟,弄的我都开始怀疑人生了,我明明早上刚刚看过的啊。
总结一下,那个哥们还是很不错的,很亲切的一个人,上午面试完,晚上就给结果啦,还是很有效率的。下次有机会再合作吧。
百鸟之王
这家公司的面试邀请得感谢我的媳妇,是她帮我投递的,之前我也投递过,但是没过,媳妇的第二次投递竟然给我一个面试的机会,很兴奋。早早的来到公司前台,在吧台填好表格就开始做面试题,足足的四页啊,如下:
- MediaPlayer 的生命周期?
- 设计一个音乐播放器?写下设计思路,进程间通信?
- Service 的启动方式?有啥区别? IntentService?
- 自定义 View ? SurfaceView ?SurfaceHolder?
- Activity、Fragment、FragmentActivity 的生命周期?
- Android 的多线程?
- 内存泄漏的原因?检测内存的工具?— MAT
写完笔试题,进入面试环节,跟一个小组长面试了大约1个小时,主要问题如下:
- BLE 从搜索、连接到数据解析的过程?BluetoothGatt? — 点到即止。
- get/post 方法的区别?
- 多线程下载?断点续传的实现?
- MQTT 协议?如果不用 MQTT,该如何实现 IM 通讯?— Socket
- React 的生命周期?
- WebView 的优化?
很有很多问题,但我想不起来,暂时记得就只有这么多了,面试了两轮之后,让我回去等消息。晚上打电话约明天下周二面试,很期待啊。但不得不说,这一天我的状态真的差到爆啊,语无伦次,前一句说了什么我自己都不知道。就是在这样的过程中结束了我的第三轮技术面试。面试内容如下:
- 选一个你比较擅长的?咱们来聊一聊?— 但是我心中是想了很多的,但是看见面试题第一篇有 Service,我说那就说说 Service吧。他把东西方法开始跟我侃 Service.
- 前台Service、Service、IntentService 的区别?—
- Android 中五大进程?
- 为什么要有 前台 Service ? 如何保证 Service 不被杀死? 进程保活的方式有哪些?
- Service 和Activity 是否处于同一个线程中?在 Service 中是否可以显示内容?toast snackBar dialaog?如果 我没有 Activity ,那么我是否可以在 Service 中显示内容?—WindowManager.
- Binder 机制?AIDL 的底层实现是什么样的?为什么 AIDL 的效率比其他方式高?如果两个通信的进程,其中一个被杀死啦,那么另一个线程会怎样?
- 自定义 View ? SurfaceView 的区别?三个过程的目的是什么?
- ListView 的底层实现?— RecycleBin 机制。getView () 中的 ConvertView ?ViewHolder 的作用?多类型的 item 该如何处理?
- 为什么离职?—-在回答这个问题的时候一定要灵活。切不可说些有的没的,一定不要让面试官感觉到你的抱怨的成分。
- 讲讲你的软件项目管理的相关东西吧?—— 这个其实是他在给我讲。
我俩聊了两个小时,这个过程我和他都有交流,我真切的感觉这家伙却是懂得东西很多,已经深入到 FrameWork 层,懂得东西比我透彻。最后让我等一会,过一会进来一个Hr,主要问了为什么离职?期望工资最低是多少?介不介意加班?(她以这么问,我就感觉很坑啊)有什么想问的她?我们的谈话就结束了。最后简单的在VP 那聊了一会我就出来。此时出来已经是四点多了,我从一点半说到四点,我真的佩服我自己啦。希望有一个好的结果。
到此为止,我所有的面试过程就结束啦。最后感谢公司同事的帮助和支持。
下面是我在刷面试题遇到的总结比较全的相关问题,我觉得如果都弄懂了,那么高级没问题啦。
Android基础
- View的绘制流程;自定义View如何考虑机型适配;自定义View的事件分发机制;View和ViewGroup分别有哪些事件分发相关的回调方法;自定义View如何提供获取View属性的接口;
- Art和Dalvik对比;虚拟机原理,如何自己设计一个虚拟机(内存管理,类加载,双亲委派);JVM内存模型及类加载机制;内存对象的循环引用及避免
- 内存回收机制与GC算法(各种算法的优缺点以及应用场景);GC原理时机以及GC对象;内存泄露场景及解决方法;OOM的避免及解决方法
- 四大组件及生命周期;ContentProvider的权限管理(读写分离,权限控制-精确到表级,URL控制);Activity的四种启动模式对比;Activity状态保存于恢复
- Fragment生命周期;Fragment状态保存
- startActivityForResult是哪个类的方法,在什么情况下使用,如果在Adapter中使用应该如何解耦
- AsyncTask原理及不足;IntentService原理
- AstncTask+HttpClient与AsyncHttpClient有什么区别
- 如何保证一个后台服务不被杀死;比较省电的方式是什么
- 如何通过广播拦截和abort一条短信;广播是否可以请求网络;广播引起anr的时间限制
- 进程间通信,AIDL
- Handler机制及底层实现
- Binder机制及底层实现
- ApplicationContext和ActivityContext的区别
- 一张Bitmap所占内存以及内存占用的计算
- 对于应用更新这块是如何做的?(灰度,强制更新,分区域更新)
- 混合开发,RN,weex,H5,小程序(做Android的了解一些前端js等还是很有好处的)
- 说一款你认为当前比较火的应用并设计(直播APP)
Java基础
- 集合类以及集合框架;HashMap与HashTable实现原理,线程安全性,hash冲突及处理算法;ConcurrentHashMap
- 进程和线程的区别;多线程与线程池
- 数据一致性如何保证;Synchronized关键字,类锁,方法锁,重入锁
- 同步的方法;多进程开发以及多进程应用场景
- 服务器只提供数据接收接口,在多线程或多进程条件下,如何保证数据的有序到达
- ThreadLocal原理,实现及如何保证Local属性
- String StringBuilder StringBuffer对比
- 接口与回调;回调的原理;写一个回调demo;
- 泛型原理,举例说明;解析与分派
- 抽象类与接口的区别;应用场景;抽象类是否可以没有方法和属性
- 静态属性和静态方法是否可以被继承?是否可以被重写?原因
- 修改对象A的equals方法的签名,那么使用HashMap存放这个对象实例的时候,会调用哪个equals方法
数据结构与算法
- 堆和栈在内存中的区别是什么(数据结构方面以及实际实现方面)
- 最快的排序算法是哪个?给阿里2万多名员工按年龄排序应该选择哪个算法?堆和树的区别;写出快排代码;链表逆序代码
- 求1000以内的水仙花数以及40亿以内的水仙花数
- 子串包含问题(KMP 算法)写代码实现
- 万亿级别的两个URL文件A和B,如何求出A和B的差集C,(Bit映射->hash分组->多文件读写效率->磁盘寻址以及应用层面对寻址的优化)
- 蚁群算法与蒙特卡洛算法
- 写出你所知道的排序算法及时空复杂度,稳定性
- 百度POI中如何试下查找最近的商家功能(坐标镜像+R树)
其他
- 死锁的四个必要条件
- 常见编码方式;utf-8编码中的中文占几个字节;int型几个字节
- 实现一个Json解析器(可以通过正则提高速度)
- MVC MVP MVVM; 常见的设计模式;写出观察者模式的代码
- TCP的3次握手和四次挥手;TCP与UDP的区别
- HTTP协议;HTTP1.0与2.0的区别;HTTP报文结构
- HTTP与HTTPS的区别以及如何实现安全性
非技术问题汇总
- 研究比较深入的领域有哪些
- 对业内信息的关注渠道有哪些
- 最近都读哪些书
- 自己最擅长的技术点,最感兴趣的技术领域和技术点
- 项目中用了哪些开源库,如何避免因为引入开源库而导致的安全性和稳定性问题
- 实习过程中做了什么,有什么产出
- 5枚硬币,2正3反如何划分为两堆然后通过翻转让两堆中正面向上的硬币和反面向上的硬币个数相同
- 时针走一圈,时针分针重合几次
- N * N的方格纸,里面有多少个正方形
- 现在下载速度很慢,试从网络协议的角度分析原因,并优化(网络的5层都可以涉及)
HR问题汇总
- 讲一件你印象最深的一件事情
- 介绍一个你影响最深的项目
- 介绍你最热爱最擅长的专业领域
- 公司实习最大的收获是什么
- 自己的优点和缺点是什么?举例说明
- 你的学习方法是什么样的?实习过程中如何学习?实习项目中遇到的最大困难是什么以及如何解决的
- 说一件最能证明你能力的事情
- 项目中遇到最大的困难是什么?如何解决的
- 你的职业规划以及个人目标;未来发展路线及求职定位
- 评价下自己,评价下自己的技术水平,个人代码量如何
- 通过哪些渠道了解的招聘信息,其他同学都投了哪些公司
- 业余都有哪些爱好
- 当前的offer状况;如果BATH都给了offer该如何选
- 你对一份工作更看重哪些方面?平台,技术,氛围,城市,money
- 理想薪资范围;杭州岗和北京岗选哪个
- 理想中的工作环境是什么
- 实习过程中周围同事/同学有哪些值得学习的地方
- 家人对你的工作期望及自己的工作期望
- 若上司在公开会议上误会你了,该如何解决
- 是否可以实习,可以实习多久
- 你看中公司的什么?或者公司的那些方面最吸引你?