我的阿里春招之路:历时14天,五轮面试后终于拿到Android岗offer

  • java内存模型、导致线程不安全的原因。

  • volatile关键字,缓存一致性、指令重排序概念。

  • synchronize关键字,java对象头、Markword概念、synchronize底层monitorenter和moniterexit指令。

  • lock语句和synchronize对比。

  • 原子操作,CAS概念、相关参数。

  • 乐观锁、悲观锁概念及使用场景。

  • 线程池概念、实现原理等。

  • JVM锁的优化,偏向锁、轻量级锁概念及原理。

多线程方面回答得比较好,面试官反馈比较满意。

数据库

数据库方面我水平较菜,没有深入了解。面试官问了一个问题,

  • SQL语句中对表或者字段取别名有什么好处?

并不知道怎么回答,面试官也没有再问数据库相关。之后面试官问了解操作系统,回答:没学过。面试官:好的 ,那不问了。心中感动得无法用言语形容。

通信协议

接下来是对通信协议的了解,大概问了下列问题:

  • TCP三次握手、四次挥手。

  • http请求报文结构、响应报文,状态码。

  • http2.0相比于http1.0的新特性,推送、多路复用、消息头压缩等。

通信协议问得不是太深,了解得比较好即可。面试官反馈比较好。最后就是问android了,面试官说感觉你android应该挺厉害的,当时真的是受宠若惊。

Android

Android是重头戏。由于之前已经了解挺多,Android方面基础的没有多问,比较深入。大概有如下问题:

  • Handler机制组成,Handler机制每一部分的源码包括looper中的loop方法、threadlocal概念、dispatchmessage方法源码,runnable封装message等。

  • listview缓存机制、recycleview缓存机制。

  • bitmap高效加载,三级缓存等。

  • binder机制原理。

  • view的工作原理及measure、layout、draw流程。哪一个流程可以放在子线程中去执行?

  • draw方法中需要注意的问题?

  • view的事件分发机制。

  • Android性能优化:布局优化、绘制优化、内存泄露优化、bitmap、内存泄露等。

  • 内存泄露的概念?Android中发生的场景?怎么解我的阿里春招之路:历时14天,五轮面试后终于拿到Android岗offer
    决?讲了Handler、动画等。

面试Android方面的时候已经真正地淡定下来了,有条不紊地和面试官说了自己所有的理解。反馈也挺好。

算法

最后是一题在线编程,题目比较常规,是一题最大连续子序列,需要注意全是负数的处理,在此不赘述可自行百度。

写算法的时候发生了一个小插曲,由于面试官直接面的都是以java写的,而笔者比较熟悉C++写算法,面试官也不太熟悉c++编译(g++),面面相觑一会儿才成功编译输出结果。真心非常感谢二面面试官的细致和耐心,最好的一次面试体验。面试官说他的这一面他过了,还会有一到两轮技术面试,礼貌地感谢面试官之后结束了,至此二面结束。二面108min。关闭连接后长呼一口气和女友分享了喜报,经此一役,我知道我的阿里之路已走完半程。

为什么说二面很重要呢?因为二面是所以技术面试中最为细致、考察最为最为深入的一轮面试,后面的面试官会很大程度上参考这一面试的结果,并且据说这一面很影响评级。

阿里三面

二面过后的第二天下午收到三面电话,约了三点的面试,由于之前的面试都是晚上可以在教室完成(在此感谢女友,没有你的陪伴就没有一个好的环境完成面试),三点的时间点是上课时间也基本找不到空教室,所以在教师休息的小房间完成了三面面试。

三面面试官感觉是部门主管级别,上来自我介绍后开始问问题。

问了一下简历上在学校做的一个Android的项目,说一个难点,讲了推送,巴拉巴拉讲了一通极光推送,感觉面试官不是很感冒,问了极光推送的实现原理,笔者一紧张竟然忘了讲长连接……又问了华为实习的项目,难点,怎么优化……我扯了一通字母树,感觉面试官还是不太感冒。这个时候已经有点慌张,然后……面试官开始问优缺点、之前签的公司、为什么想去杭州、你是怎么看待算法?还问了最优成就感的一件事情,你觉得为什么会获得一等奖?是不是因为对手太弱了(懵了……)?回答完直接问还有什么问题想问他…此时有点崩溃,感觉也答得不太好,问了还有哪些方面需要改善。然后结束了面试……三面29min。

面完三面挺难受的,感觉反馈不是很好,没发挥好。难过了一会儿吃了个饭回图书馆继续看书。

阿里四面

当晚上我还在图书馆感怀阿里离我远去的时候,一个杭州的电话来了……和四面面试官约好了时间,做一个技术和综合素质方面的面试。急匆匆和女友去找到了一个空教室,9点电话如约而至。四面面试官感觉斯文儒雅,上来介绍这是一轮交叉面,最后一轮技术面试。照例自我介绍后,问了如下问题:

通信协议

TCP保证可靠传输的实现:停止等待协议、滑动窗口协议、流量控制、拥塞控制等。

项目

  • 说一个你记忆比较深刻的功能:我讲了一个查看当前WiFi网络连接终端信息的功能的实现。

  • 说一下你遇到的问题:讲了一个十几万级别的字符串的匹配通过字母树优化的问题。面试官听了后和我详细分析了一下,得到了一个更好的实现方法……当时一阵汗颜,班门弄斧了。

  • 问了一下项目中使用到的三级缓存策略。

获奖

聊了聊获奖经历,中间是怎么学习的。面试官看了看前面的面试过程,说问了多线程了,那他就不问了……

数据库

数据库方面问了以下的问题:

  • 索引的种类。

  • B树、B+树、红黑树。

  • B+树和B树相比有什么优点,应用场景?

  • 红黑树的一些特点?怎样保持平衡?

问着数据库,问着问着扯到数据结构那边去了……说完之后面试官是感觉你这些都有所准备啊,我说对,毕竟是面阿里,面试官笑了说我本来还准备问你一下八大排序的现在感觉你应该都会,我很自信(jian zha)地说对,我都会。至此,面试官说技术方面他没什么问题想问的了,他这是一轮交叉面,集团内部要求的,他是后台开发方面的,不懂Android,问我还有什么想问的。我抛出了万金油问题,您觉得我还有哪些方面需要优化的。面试官哈哈一笑,说你们这些学生现在问的都是套路问题,他基本上回答的都是这个问题,然后说了一通感觉深度和广度都有,继续保持就好了。

四面48min。至此,彻底放心。互道周末愉快后结束了面试。和女友分享喜报后,阿里之路的进度条已经走到80%了。至于为什么有交叉面,众说纷纭,不太清楚。

五面(HR)


度过周末后照例去图书馆学习,在周一下午接到hr的电话。周末准备了一些常见的HR面试问题,结果一个都没问到,问到的问题大概如下:

  • 关于之前一次笔试的编程题,为什么没有做出来?后来有思考过吗?

  • 你签约的公司给的薪水是怎么样的?如果阿里给你offer,你是怎么考量这两个offer的?

  • 为什么没有在之前实习的公司留下来?之前公司的主管是怎么评价你的?

  • 你的优缺点?

最后日常问问题,万金油问题培养体系和晋升机制。面完告知一到两周会有结果,要从池子里综合考量捞出一批人给offer(心中一慌,毕竟走到最后的对手都不容小觑)。随后HR面试官加了微信,有问题可以在微信上交流。

后续

面完HR安心地在备胎池里面躺着。等待的日子总是很难熬,一天一天地过去,各种打听消息,听说有的前几批的拿到了意向(offer),心里拔凉拔凉。在过去四天后,周五的下午问了HR面试官后得知offer已在审批,据说比较稳,就是走个流程。联想到之前面完腾讯hr在offer审批等了很久还是心难安,在熬过周末,周一和周二,offer已经审批了三天,焦虑程度与日俱增。周二晚上十点半的时候,在宿舍无聊刷新闻的时候,突然收到一条短信和一封邮件,打开后发现是录用意向书。

真的挺开心,长呼一口气,总算这条路走到了尽头。

以上是我的阿里春招之路的分享。

我的阿里春招之路:历时14天,五轮面试后终于拿到Android岗offer

总结

洋洋洒洒写到这边已经说了很多,也有一些经验和大家分享。从18年春招找实习到19年春招,找工作的日子真的很累,不过再累也要坚持。有幸参加过一些公司的面试,问的问题也都大同小异,主要是以下的一些方面:

  • Java基础

  • 集合类

  • 多线程

  • JVM虚拟机

  • 通信协议

  • 数据库

  • 操作系统

  • 算法

  • 你的技术方向

  • 项目。

关于每个方面的复习文末会给出分享。

一些感慨

说一些个人感受吧,找工作其实很容易,一些公司单凭学历就可以让你进去上班,现在太缺程序员了,简单到你面试根本不聊技术谈谈人生、聊聊奖项就可以给你发offer,但是找一个好工作不易,数十上百个人抢一两个岗位很常见。

主要你怎么定义你对于“好”的理解,工资高?公司技术氛围好?行业地位高?工作安稳福利好?不加班?仁者见仁智者见智,没必要强行拿自己的价值观去评判别人的工作,最适合的才是最好的。所以在找工作的时候想清楚自己到底想要一个怎样的工作也是挺重要的,定义一个目标,努力去做,才是最重要的。

技巧小谈

关于面试的一些技巧,个人觉得最根本的还是拓展你的知识架构的宽度和广度,形成你的一套说辞架构。以多线程为例,问到你多线程?可以先从为什么要使用多线程?使用多线程有什么好处?使用多线程一定会比单线程好吗?多线程会导致什么问题?导致问题的java内存模型是怎样的?怎么解决这个问题?解决方法如volatile、synchronize关键字等它的底层实现是怎样的?你是怎么使用多线程的?使用线程池有什么好处……

如果你真正理解了并将它完善成一个体系,面试官让你说多线程,接下来10min,你可以一直讲完。面试的参照不是你和面试官相比如何,而是你和你的竞争者相比如何,如果上面这一套完善地讲完,面试官对你的评价可想而知。

我是如何复习的?

1、确定好方向,梳理成长路线图

不用多说,相信大家都有一个共识:无论什么行业,最牛逼的人肯定是站在金字塔端的人。所以,想做一个牛逼的程序员,那么就要让自己站的更高,成为技术大牛并不是一朝一夕的事情,需要时间的沉淀和技术的积累。

关于这一点,在我当时确立好Android方向时,就已经开始梳理自己的成长路线了,包括技术要怎么系统地去学习,都列得非常详细。

我的阿里春招之路:历时14天,五轮面试后终于拿到Android岗offer

知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。

2、通过源码来系统性地学习

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

我的阿里春招之路:历时14天,五轮面试后终于拿到Android岗offer

知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。

2、通过源码来系统性地学习

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

上一篇:剑指offer 前n个数二进制中1的个数


下一篇:剑指 Offer 50. 第一个只出现一次的字符(python3编写)