今年因公司业绩不景气,最终倒闭了,而我也被迫失业,就只能老老实实在家呆着找工作。这一呆就才不多2个月,在这段时间内面试了差不多10家公司,有一半都给了Offer,但是没有想去的公司。
原因:
1、就是薪资给的少了点;
2、薪资给的还可以,但是没有什么空间可以提升自己。
经过一段时间朋友介绍,让我把简历投到华为去尝试一下,于是怀着侥幸的心理试了试。
进入大厂想必都是每个开发者们最初的想法,而我也是一样。想想总是那么美好的
等待了两个多星期接收到了面试通知约,我三天后去面试,下面就是我的面试过程了。
一面(1hour):
0、自我介绍
1、项目介绍,技术点相关。
2、C++和Java区别,GC
C++不熟,只能说内存管理相关的问题,所以就问到了GC。然后说分代收集算法。老年代担保、元数据区从JVM移到了本地内存这些。
3、线程相关,Runnable和Thread的区别。
Thread类是实现了Runnable接口,平时使用起来可以使用start方法调用。线程池基本传Runnable对象,平时也是线程池用的多,所以具体相关不太熟。
4、线程池
5、synchronized,volatile
6、继承相关,多重继承和接口
7、网络编程
8、UPD,TCP区别
9、最大的优点
10、最大的缺点
11、算法,二叉树中序遍历
真是早起毁一天,竟然没撕出来,我真想给自己两耳光。不过面试官给我总结的很好,说要利用栈的特性,先进后出,所以要保证左子树先进根结点再进,这么思考之后就顺利了很多。
**总结:**早上状态很差,简单问题也会卡壳,希望大家还是能够选择自己状态好的时间点面试……。
二面(40mins):
0、介绍一下项目
1、Android四大组件,详细讲一下。
2、Launcher启动APP的全过程。
icon存入口Activity信息
AMS通知Launcher去pause。
Launcher通知AMS已经pause
AMS检查进程是否已经启动,如果不启动则启动进程。并且调用ActivityThread的main方法。
启动之后通知AMS已经启动
然后AMS将入口Activity信息传递给APP。
APP启动对应入口Activity,并且创建对应上下文并且调用Activity的onCreate方法。
3、进程间通信,AIDL,Binder。扯了一会说进程间通信平时怎么做的,就说了一下AIDL相关的Demo实现什么的。说到了自己程序里面有拉起微信的这个功能(也就是广播)。
4、设计模式了解吗,平时用过哪些设计模式。
5、算法题:输入一个数n,代表有n个点,一个二维数组,二维数组代表相连的点,要求输出连通起来的点。
如果n=6,数组假设是{{1,2},{2,3},{4,5}},则输出{{1,2,3},{4,5},{6}}
吐槽一下,本来约的早上9.30和10.30两轮面试,一次约两轮我也是醉了。然后就二面拖了快一个小时才面上。早起代码状态真的差,这两题都写了分别用了快20分钟,真的捉急。
一个午觉起来,收到了面试通过的短信,效率还是非常高的。还以为挂了呢,看来只是面试官想吃饭了……
三面(<30分钟):
0、自我介绍
1、上家公司做的项目
说了RePlugin框架原理,说了ffmpeg动态链接库开发方面的失败经历,说了Android的适配,和最近影响到的AndroidQ相关新特性的适配。
2、什么情况下会压力特别大,怎么处理的。
3、职业规划
…
综合起来就是了解个人情况,技术问题都是自己说的。还是非常愉快轻松的。
**总结:**华为面试安排非常紧张,但是反馈效率特别高,一二面结束马上会短信通知是否通过。然后隔天直接三面,流程走的非常快。
问了hr,说只要通过了面试,一周左右就会下来offer。
面试前我做的准备
1、理论知识的梳理
因为面试时考验你原理性的知识,虽然我工作了两年,但是毕竟是工作,很多理论知识都忘的一干二净,于是去面试前,我利用收集来的Android行业大牛面试笔记给自己做了一次完整的知识梳理。
(个人建议:去面试之前,给自己做一次完整的知识梳理是很有必要的,不仅加深了对理论知识的认知,还可以从中知晓自己对哪一模块的不了解,加深学习)
**Java基础方面:**JVM、String、内部类、多态、抽象和接口、集合框架(Hashmap、Arraylist)、单例、线程、Synchronized、Look锁、动态代理、引用
**Android基础方面:**四大组件、View、进程、Bitmap、屏幕适配、消息机制、线程异步、WebView。
**Android扩展方面:**ART、Apk优化、Hook、Proguard、架构(MVC/MVP/MVVM)、Jetpack、NDK开发。
**Android源码方面:**Leakcanary、Eventbus
**设计模式方面:**面向对象六大原则、工厂模式、单例模式、建造者模式、观察者模式、适配器模式、策略模式、代理模式
算法方面: 排序、二叉树、链表、栈和队列、二分、hash表、堆、数组/双指针、字符串处理、动态规划
**网络知识:**Http(缓存、Https、Http2.0)、TCP(三次握手四次挥手、socket)、类加载器
2、刷题
对于面试,刷题是非常重要的,刷题不仅能加深你对技术原理的认识,而且假如刷到当天的面试题血赚(不过,这种可能性非常小),但刷题还是很有必要的,起码加深了自己对原理、底层的理解。
3、完善简历
大家都知道去面试的过程中,简历对于面试有着至关重要的作用,一份观赏清晰的简历能帮助求职者在面试官心中有着非常不错的印象,仅仅从这一点来看,简历的完善就是非常有必要的。
简历该怎么写?
1、尽可能突出自己的优势
制作简历一定要学会突出重点,写出自己的优势,如你在上一家公司做出的贡献,就要写在显眼的位置进行突出,用颜色加深再好不过。如果你的优势是学历,那么学历就要放在第一页,因为HR在筛选简历时,一份简历往往只看那么几秒钟,你需要做到的就是让HR一眼看中你的简历。
2、描述自己做到了什么,而不是做了什么
很多程序员会在自己的项目或是技术栈里这样描述:在某项目,我负责xxxx,如重构,如优化。但实际上,面试官想要看到的是你在项目中,重构和优化带来了什么样的好处和效果,如果说性能提升了,那么提升的数据和情况是如何的,要一一描述出来,所以重点应该是“将项目做到了什么样子,做成了什么事”。
完成这两点,一份漂亮的简历即可出炉。
五、后话
总得来说,这次面试能拿到offer,也跟我之前的努力分不开的。其实做程序员圈子很重要,因为有了圈子可以让你少走弯路,拓宽人脉,拓展思路,学习他人失败和成功的经验,获取最新经验与信息,才能抱团取暖!所以说,圈子的高度很大部分决定人生的高度!
大家努力奋斗吧!与之共勉。
本文摘自 :https://blog.51cto.com/u