开发菜鸟7面腾讯,终于拿到offer...
前言
我在上一家公司工作了3年多,由于受公司平台技术选型的限制,自己的技术能力一直也没有得到实质性地成长,心想自己才25岁还比较年轻,不想把技术能力局限在这里,就想找一个更大的平台去开拓自己的视野,加上我一直对腾讯非常的向往,于是就有了7面腾讯。
去年一共面试了五次腾讯,不过都挂了,今年面了第六次第七次后,终于上岸了。头三次面试腾讯,笔试做过后全部石沉大海。所幸也总结出了失败的经验,第四次成功挺进二面挂(太不容易了),沉淀了半年后,第五次跟第六次稍微理想一点,不过也还是挂了。终于在我的坚持不懈下第七次上岸了。下面我就含泪跟大家分享一下我的心酸面经过程。(不要问我为什么还记得这么清楚,习惯面完复盘,勿杠!!!)
面试经历
第四次
一面
1.http三次握手
2.java内存机制
3.java的垃圾回收机制(没答好)
4.string的底层逻辑
5.后端接收前端信息怎么处理?(一直没明白啥意思,没回答到点上)
6.java线程的理解
7.java线程安全出现的原因
8.java的静态存储原理
9.数组和链表的存储方式
10.算法题,快排(我本来会写,结果写完一直报错数组溢出,最后直接结束了)
11.栈的存储方式
12.栈和堆的运用场景
二面
1.自我介绍
2.10万个数如何找中位数
3.介绍一下各种搜索树以及查找时间复杂度(AVL树,B/B+树,红黑树,二叉搜索树,在没有退化为链表的情况下,都是O(logn)
4.TCP/UDP发一个大包有什么区别?
5.平衡二叉树旋转的方法
6.找一棵二叉树中两个节点的公共祖先
第五次
一面
1.mmap + native 日志优化?
2.广播和 EventBus 的区别?
3.常用设计模式你了解哪些?
4.跨进程通信有哪些?
5.简单讲讲 binder 驱动吧?
6.跨进程传递大内存数据如何做?
7.说说 ConcurrentHashMap 的实现原理说下,初始化大小是多少?
8.启动优化怎么优化?
9.你写的 rxpay 和 rxlogin 具体怎么实现的?
10.kotlin + fullter 方面的
二面
1.单例设计模式都写写,静态内部类是怎么保证线程安全的?
2.synchronized 底层实现原理,ReentrantLock 公平锁与非公平锁。
3.主线程等待所有线程执行完毕,再执行某个特定任务怎么实现?原理和源码看过没?
4.自定义 view 的一般流程,要注意些什么如何优化,点击事件和长按时间分别是怎么实现的?
5.四种启动模式,在源码分析中的原理是怎样的?
6.讲讲 bindService 的过程,你当初是怎么优化后台服务进程的?
7.开发中你都用到了哪些设计模式?说说当时具体的场景。为什么你要用方法工厂,另外两种呢?
三面
1.讲讲 handler 的底层实现原理?
2.说说你做的日志记录优化?
3.你看过 binder 驱动的源码,说说他的内存映射过程,说说客户端等待服务端处理返回的流程,如果要跨进程传递大内存数据你具体会怎么做?简单写一写吧。
4.在公司做过哪些优化?
5.过程中遇到的一些最难解决的问题?
6.提到了动态修复替换加载 so ,那你知道怎么修复 class 吗?怎么修复资源呢?
7.还有什么要问的?
(当时内心嫉妒忐忑,每天抱着手机,记不得是什么时候发现的状态灰了...)
第六次
一面
1.自我介绍
2.自我介绍时说过自己看过EventBus源码,然后让我谈谈事件总线的理解。
3.EventBus会有什么问题吗?
4.EventBus、接口回调、观察者模式的使用场景说一下。
5.项目什么地方用到数据的持久化,说一下。
6.Activity的生命周期,弹出dialog和一个activity的dialog生命周期有什么区别?
7.Activity的启动模式,应用场景,然后举了很多微信的场景,让我去选择用那种启动模式,说下理由。
8.Activity进程的优先级。
9.如何防止微信不被系统杀死?
10.service两种启动模式,区别
11.两种启动模式,如果我在退出Activity的时候没有退出service会怎么样。
12.设计一个图片浏览框架,(线程池,lru缓存,brabra的说了一堆)。
13.有一个很大很大的图片加载到内存上,不能降低清晰度和压缩图片你怎么解决?(提示我局部显示?我没懂)
14.如何适配不同厂商的手机,然后设计模式,brara又说了一大堆,最后还说到jetkins自动部署上面去了
15.AsyncTask源码分析,每个方法在哪个线程执行的?
(面试官说我不错,叫我明天准备二面,电话一挂,我就愉快地去吃饭了。)
二面(二面总监/面委,由于开会,等了半个小时)
1.上来大数相乘,我做的眼泪都快流出来了。
2.put和post的区别,应用场景。
3.看了我的flutter项目,我改了一个框架,问我这个框架。
4.让你设计一个跨平台的框架,你怎么设计(这里我谈了flutter的架构)。
5.https的流程。
6.fragment的懒加载。
7.一个商场里有一个电影院,你会把厕所建设在哪里,说一下你的理由?
三面HR面(又等了20分钟)
1.自我介绍
2.为什么选择腾讯?
3.对我们了解吗?
4.愿不愿意来
5.家里的情况
6.什么时候可以入职。
第七次(这次过了!!!记的也是最清楚的)
一面【66min】
1.自我介绍
2.我看你这简历上的技能咋都写的是Java的东西呢?安卓的项目做过,SSM的也做过,那你后台开发和Android倾向于哪一个?
3.说说项目,我看你上面有个项目做App的,有准备Android方面的吗?
4.有些SQL比较慢,你咋办?为什么有的SQL这么慢,说说你觉得导致SQL很慢的原因。
5.内存泄漏?OOM?什么情况会OOM?
6.用过多线程没?说说咋用的。线程池知道不?说说线程池的原理?
7对ArrayList一个读操作,一个写操作,你用多线程咋实现。死锁你知道不?你怎么解决?
8.volatile知道吗?volatile的原子性?
9.Java中的锁知道哪些?
10.线程之间通信的方式?
11.JVM调优,说说你能从哪些方面着手?
12.JVM和GC简单聊聊,结合JVM内存说说GC。
13.HashMap和HastTable,HashMap安全?不安全用什么?hash()?HashTable是怎么实现安全的?
14.我对你的Java基础有了一个了解了,下面我们问问网络相关的知识,计算机网络应该学过吧,那说说TCP三次握手?第三次握手能不能去掉?UDP和TCP的区别?
15.你知道长连接吗,说说?为啥用长连接?
16.HTTP1.0和HTTP2.0的区别?说说NIO?
17.HTTPS知道吗?说说SSL?
18.好了,网络聊到这里吧,我们说说算法之类的吧。跳台阶知道吧,怎么做啊。
19.一个链表,让你找最中间的节点,你怎么找?
20.两个大文件,一个比较大,一个比较小,让你求交集,你怎么做?
21.那么,我们再问两个智力题吧,没有固定答案,不要限制自己的思路,想到啥说啥,一个粗细不一样的绳子,完整的烧完1个小时,你怎么让他烧15分钟(不一定烧完)。
22.一副全新的扑克牌,按顺序的,AAAA,2222,3333,这种,你怎么洗牌能洗散开?
23.C++和C了解吗?
24.面试官问我啥时候有空,约下一面?
26.闲聊,你有啥要问我的啊?问了好几个问题,问完了以后,面试官问我还有啥想问的,不想问问学习资源什么的吗??我就又问了好几个,然后跟我说了说面试的情况。就愉快的say GoodBye了。
问的问题(忘记顺序了):
1)我问:还有下一面吗?面试官给我说了说后面啥情况,如果下一面过了,那么三面不会再写算法题了估计。
2)面试官问我:目前有没有Offer?Java后台和Android你选一个,你做哪个?
3)我问:新人培养计划是啥?以及你们主要负责哪一块的业务?
4)面试官临时想到问我的:有人说Android端走下坡路,你怎么看啊?
5)给我说了说笔试是啥情况。
PS:因为我 算法太烂了,我就问笔试对于能否进下一轮面试的作用大吗?他说,会占一部分,但是也不会全看 算法。但是毕竟编程,代码水平不可以特别差吧,还是要有一定代码功底的。总体感觉:
面试的问题不是很难,如果不会,面试官会引导你,他觉得我说的挺有意思的时候,还笑笑,这就让我更不紧张了。还有就是语速慢点,我可能太紧张了,叭叭的多还叭叭的快。
问问题的话,感觉还是尽量的去了解他们这个部门干啥,自己去了干啥比较重要,毕竟如果面的好,能拿offer,比较offer的话,好比较的。顺便也能看看自己对这个部门感兴趣吗。面试是个双向选择的过程,一定要了解对方做啥,自己是不是有兴趣等等方面。
以及回答问题的时候,尽量发散思维,结合实际的例子去说,这样会让面试官觉得你很棒,知道的很多,也有自己的积累和思考,如果回答一个问题照着网上看到的资料背下来,可能会让对方感觉是机械记忆,可能我回答问题的时候,尽可能把很多学习到的知识都串联起来讲出来了,所以面试官对我评价不错。一面没结束就直接约下一面,也是挺意外的。
【开发菜鸟7面腾讯,终于拿到offer...】二面【30+min】
我走进了面试的房间,等着面试官进来。过了一会面试官也进来了,问我设备调试好了吗。我说,好了,然后他让我点击哪儿哪儿的,开始共享屏幕,然后我靠,我点了之后,发现我chrome版本太低了,不行!我说,我浏览器版本有点低,抱歉,之前理解错您(调试)的意思了,我以为需要用摄像头和话筒,我没注意浏览器版本也有要求。然后我说,等我换个火狐浏览器。
3s换了浏览器我就开始准备写了,面试官说,用你最熟悉的语言写哈~一上来那个界面,main(),测试用例啥的得我自己写....
题目大概和leetcode 59题类似。大概如下,从右上角开始顺时针。剑指offer上也有类似的,反正就是刷题,刷题,刷题啊!!!
输入: 3 输出: [ [ 7, 8, 1 ], [ 6, 9, 2 ], [ 5, 4, 3 ] ]
几个while循环解决的,也没和我讨论看看有没有啥思路,写好了,我就喊他,我问他,需要我说说下咋做的吗,他说不用,run下,给我看看就行。然鹅我一开始写的时候就把main给删掉了...然后我就捣鼓了一下,run,边界溢出了,贼尴尬。我就调试,调试了一会,他说,给你放松下要求,去IDE里调试吧。我没搭理他,继续找问题,怎么可能这么容易屈服于IDE呢。
嘿嘿,终于,发现好几个变量写错了地方。改了改,run,成功AC,他说,你这个输出格式和我想的有点差距啊,我说好的呢,我再改改。AC。那边终于给我竖起了大拇指,然后面试官就说这个题还有变种的。。。。。
这里不得不说,我在复习算法的时候,主要看了b站yxc大佬的视频,对我帮助很大,还有怎么快速排错,他自己创办的AcWing也挺好用的。还有就是一面过了之后,马上跟我的内推人沟通了下,他也给了点建议,让我多刷leetcode medium,然后我就大概过了LeetCode 100题里面的常见的题目大概50多道,还有剑指offer里的60道左右(有些太难的,我觉得不会出就没看,之前也有刷过剑指offer,所以复习编程题还好)。笔试之前,把剑指offer上的题思路都顺了一遍,保证自己见到就有思路,能先和面试官交流下自己的思路。
笔试完了,跟内推人说了一声。过了一会,他跟我说,面试官对我评价不错,具体怎么样不能透露,反正就是很好,让我好好准备总监面吧。看到进复试了真的开心。
(忘记讲了第七次我是内推进的)
三面(60min)
大概是晚上快七点的时候,深圳那边给我打电话,确认身份,说觉得我前几面表现还不错,想约下一面,然后定了周三,跟我说下一面是技术面昂。不得不说,效率好快。
- 面试官上来又是一通确认身份。
- 说说JVM的内存吧,他们都是干啥的?对象怎么创建?
- 每个区域都会发生怎样的异常啊,谁会发生OOM?
- 说说你对GC的认识吧。
- 知道引用计数法吗?引用计数法有啥优点吗?缺点呢?
- 可达性分析?
- 垃圾回收的几种算法?比较一下。
- 你觉得垃圾回收有什么缺点?
- 说说垃圾收集器?有没有想过你说的这些垃圾收集器为啥会有这些缺点呢?
(关机垃圾回收和JVM问的很详细很详细,有的问题记不太清了...) - 我看你还会这个MySQL,那我们来问问MySQL中的锁。你知道有哪些锁吗?
- 行锁有啥用啊,相对于表锁?
- 知道MySQL主要的两种引擎吗,MySIAM和InnoDB的区别,使用场景?谁有表锁?
- 看你了解InnoDB,那你具体说说InnoDB吧。
- 面试官:我还问你点啥呢?我:那我说说我的哪个项目?开始叭叭我的项目。没叭叭完,让我停下了。问我这些优化思路是你自己想出来的吗,我说我们组两个人,思路是我想的。
- CPU爆满了,你觉得操作系统会干点啥事情?
(蒙蔽...答的不对,面试官给我纠正了下...然后就下个题目了) - 那我们再说说链表和数组?比较一下它们有啥区别吧,然后再说说数组里面删除一个元素会怎么样,插入一个元素会怎么样,修改一个元素会怎么样,会发生什么事情?(这个地方说的不是很好...)
- 平时用啥IDE?知道项目run之前干什么吗?
(说了个编译和检查错误,但是面试官似乎还想让我说点东西,知识盲区.....后来跟同学交流了一下,应该是预编译、编译、汇编、链接。) - 编译期和运行期的区别?
- 指针了解吗?
- 十亿个数,一个数4字节,然后你怎么找最大的十个数?十亿个数,占多少内存?
- 操作系统中有哪些内存知道吗?平时用什么Windows还是Linux?
- 说说寄存器?
- 了解编译原理吗?知道计算机组成原理吗?平时都学什么课?
- 一个人给另一个人发微信消息,说说可能会发生哪些事情?
- 长连接短连接说说区别,你知道的哪些是长连接,哪些是短连接?TCP是短连接还是长连接吗?
- http是基于什么实现的?1.0和1.1什么区别?
- MTU知道吗?以太网帧知道不?MTU大小你知道不?MTU的组成你知道不?
- TCP和UDP是否可靠,为什么不可靠or为什么可靠?
- 如果客户端长时间不发消息,那服务器端咋办?【差不多这个意思...】
- 有GitHub吗?写博客吗?有自己搭建博客吗叭叭叭的【就是问你对技术热爱吗....】
(他问我为什么这些东西不写简历上,我说太菜了不值一提...面试官说,那你也得写啊,说明你对技术热爱啊,面试官笑笑。) - 除了开发,你有没有考虑过别的就职意向?比如什么.....
- 你现在还在做项目吗?你们那个项目会去给他们做安装运维啥的吗?
- 你有啥要问的吗?
我个人有自己的一套学习方式和习惯,平时喜欢利用碎片时间来看点什么东西,比如一些技术性的书籍或文档,还有一些视频讲解等,经常会让我有一种恍然大悟的感觉,对我的工作和后面几面腾讯也起到了很大的帮助。
其实本人超容易紧张,所以面试的时候一直磕磕巴巴说话说不出来,明明能想到总是紧张的说不出话。
好在面试官本人挺好的,很有耐心,并且一直在我着急的时候引导我说答案,无奈我太慌了心理素质怎么这么差,还好最终结果是好的。
面试总结 讲一下大厂面试一些必备的技能
1. 一般情况下第一轮都是基础面试,需要扎实的基础
- 最常用的Android 基础知识
- Java 基础知识
- 了解一些 常用东西的原理,例如:handler, thread 等
- 项目中的技术点
- Android 事件分发机制原理
- Android 绘图机制原理
- WindowManager 的相关知识
- 进程间传输方式
- Java 内存管理机制
- 该轮一般是 老大或者部门负责人,问的问题一般都看 深度与广度
- 当问及薪水的时候,要说一个合适的,小公司随意,大公司一定要慎重,当心里没底的时候,可以告诉对方,让对方给一个合理的薪资。一般都是在原工资基础之上增长,听猎头说一般涨幅都在15%-30%,超 NB 的可以要30%及以上,如果感觉自己还不错的,挺厉害的,建议最高20%,一般人就定在15% 左右最靠谱。公司内部一般有一套机制,根据公司情况而定。
- 我们的面试原则就是拿到合理薪资,得到 offer
- 个人发展情况,这个问题很难回答,如果和公司方向不符合,极有可能和公司无缘。建议多试探性的问问公司缺少什么,你能否给予公司对应的东西。当然对于有自我追求的人,那可以放心大胆的提。我的方向就是开发,哈哈哈,挺极端的,别学我哦。我感觉选择都是双向的,因此我知道自己需要的是什么。
- 你最擅长什么UI 还是其他什么?这个问题更不好回答。你要说你擅长 UI,是不是意味着你其他能力就不行?虽然我不知道面试官的用意,但是我能感觉到,这个问题不是那么好回答,我会回答说自己都行,来什么业务接什么需求。可能回答不太好,总之和公司的职位吻合就行,这样总不至于出错吧。
其实客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
关于知识梳理,这里再分享一下我面试这段时间的复习路线:(以下体系的复习资料是我从各路大佬收集整理好的)
文章图片
知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。
文章图片
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2020-2021BAT 面试真题解析,我把大厂面试中常被问到的技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。
文章图片
还有 高级架构技术进阶脑图 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
文章图片
以上内容均放在了开源项目:【 github 】 中已收录,里面包含不同方向的自学Android路线、面试题集合/面经、及系列技术文章等,资源持续更新中...3.项目复盘
实际上,面试的一二轮所问到的技术问题,很多都是围绕着你的项目展开,因此在面试前最后要做好的一件事情就是项目复盘。关于项目复盘,我个人的思路如下,可供参考:
- 你在这个项目中承担了什么样的角色?
- 这个项目的背景是什么,如果是技术项目,为什么要做?
- 有哪些技术难点,是怎么解决的,是否还有更好的方案?
- 你认为项目中是否有可以改进的点?
- 这个项目解决了什么问题,最好用数据说话,这个数据又是怎么得出来的?
推荐阅读
- PMSJ寻平面设计师之现代(Hyundai)
- 杜月笙的口才
- 深入理解Go之generate
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- Linux下面如何查看tomcat已经使用多少线程
- 皮夹克
- 解读《摩根集团》(1)
- 绘本与写作
- 麦田社群
- 面对苦难——如何化解