前言
惯例说一下自己的情况,南方地区,农村出生,家境一般,也没有什么人脉资源。专科毕业后,我去了培训机构。
从培训机构出来后,我被腾讯的外包公司骗了去,迫于家庭和经济等各种原因,我在那个外包公司做了三年。今年,我终于决定辞职了。今年,我在腾讯投了三次简历,最后终于获得了腾讯研发岗的offer。
本文较长,希望大家耐心看完一定能有所收获。另外,文末有惊喜。
缘起
深圳市腾讯计算机系统有限公司是中国最大的互联网综合服务提供商之一,也是中国服务用户最多的互联网企业之一。腾讯业务多元化,覆盖面广:社交、通信、娱乐全面开花。其中,腾讯QQ几乎是所有人的青春,各种气泡,装扮,是青春年少时的快乐,我对腾讯一直很有好感。
我对计算机的执念是从一款破解版QQ起。我当时机缘巧合从朋友那边得到了一款破解QQ软件,哪怕没有充会员,没买VIP也可以使用各种主题和气泡,于是,当时尚且年幼的我对各种破解版软件产生了兴趣,并决定长大后要破解所有软件,甚至是当黑客。
与代码结缘
我是在初中的时候,第一次知道有一个专业叫做“计算机”。
当时我的学习成绩并不好,尤其是英语,上课基本上都在和周公约会,其他的科目成绩也不理想。根据往年的分数线估分,除非是计负分,不然我是考不上高中的。
虽然中考前一百天,我突然开窍,想要好好学习。那段时间,我几乎是夜以继日的学习,连上厕所都带着语文书背诵,坐公交车手里都攥着一张写满单词的小卡片。功夫不负有心人,我的成绩也终于有了些起色。
中考很快就来了,也很快就结束了。
现实很残酷,没有那么多的励志鸡汤,也没有那么多的废柴逆袭。奇迹没有出现,我还是落榜了。
后面在我自己的要求下,我进了职业高中,选的是我喜欢的计算机专业。我终于接触到了梦寐以求的计算机语言。
我以为未来可期。
梦想破灭
入学后我才发现,我想象中的高端操作都不存在,老师基本上都是在照本宣科,同学中认真学习的寥寥无几。
高中的学习生活课程极度乏味,有时候还被老师带出去充当廉价劳动力,去一些公司打杂。
有一次,机缘巧合,老师说带表现好的几个同学去一个大公司看看,本来没什么期待,但是去了之后发现老师口中的大公司居然是腾讯。
在那边打杂的一个星期里我很开心,虽然并没有接触到什么真正的工作,但是,我还是被大厂的气势震撼到了,不管是工作环境还是食堂,都和以前去的那些小厂不一样。
我心中暗暗下定决心,以后我要去腾讯公司工作。
职高生活虚度了一年的时光,去腾讯打杂是大二那年,从那次后我便开始艰难的自学之路。
自学之路
在职高的三年很快就过去了,那时候也是有些年少轻狂,自以为学了三招两式就可以出去闯荡了,毕业后,我直接投了腾讯的Android岗。
结果可想而知,撞得头破血流,根本连面试通知的电话都没有接到。这是我在腾讯投的第一份简历。
我把这件事跟当初学校的一位给了我不少指导的老师说了下,顺便请他帮我看看是不是简历的问题。他直接跟我说,当初建议我专升本是因为我的学历太差了,和其他人比起来很掉分。而且我的技术沉淀的不够,全是一些浮于表面的东西,底层基本原理什么的一窍不通……总之就是一顿臭骂。
最后,我决定去北京的某培训机构恶补,一边跟着学习真正用得上的技术,一边买了底层原理的相关书籍在空闲的时间狂啃。
这一切都是在兼职的空闲时间完成的。因为前面我也说了,我是农村出身,家里没什么钱。去培训的时候身上就八千元,交了学费后本来就所剩无几,尽管我顿顿吃馒头,也没办法阻止余额迅速见底。
我也没好意思找家里要钱,就找了一份每天六小时的兼职,勉强能够满足基本温饱了。
那段时间是从未有过的辛苦,也是我觉得最充实,最有意义的一段时间。
第二次投简历
从培训机构出来后,有一家自称腾讯子公司的厂主动找上了我,我面试时去看了下,还挺像那么一回事的,当时特别开心的就去了。
直到 正式上岗了才发现只是一个外包公司。但是,那个时候家里很需要钱,而且腾讯是大公司,我知道以现在自己的经验是不可能面上的,想着先积累一下经验,就留下来了。
这一留就留到了现在,在外包公司待了三年。现在的我终于有勇气投腾讯了。
这次我是在腾讯的官方网站上面投的简历,当然,这次我的简历也是好好润色过的。
一开始,我等了很久都没有收到面试通知,我以为这次的面试又泡汤了,还安慰自己这很平常,自己的能力还不够,没想到第七天收到了面试 通知。
第一次在腾讯的正式面试,我很认真的记下了面试的题目。
一面经历
开始面试
0.自我介绍
1.一来就问我tcp/udp有哪些协议(就记得http和dns解析,估计是看我专业是网络工程的)
2.弱引用,软引用
3.volatile关键字(突然不知道怎么回答,然后记起来了跟java内存模型相关,就说了一下jmm)
4.多进程(莫名认为是多线程,说歪了)
5.什么场景需要用到多进程(回答中说了推送)
6.为什么推送需要多进程,有什么优势(不知道有什么优势)
7.hashmap的数据结构(回答了维护一个entry数组,hash冲突,1.8中链表会变成红黑树,然后面试官没继续深究)
8.anr分类有哪些,原因(具体不了解,就知道执行网络或者数据存储等耗时操作)
9.anr定位(不会)
然后……然后就结束了,没有二面,也没有三面……
回去后我深觉自己基础不牢,闭关了一个月,啃完了一份2960页的PDF资料,然后让朋友帮忙内推。
第三次面试
这次面试,我总结了前面的失败经验,进行了充分的准备。
比较巧的是我又遇到了上次一面的面试官,只是不知道他还记不记得我。
简单打个招呼后就开始进入正题。这次因为准备的更加充分,回答的内容就比较多,我下面就进行简单的描述吧。
技术一面
1.mmap + native 日志优化?
讲了传统日志打印的两个性能问题,一个是反复操作文件描述符表,一个是反复进入内核态,然后讲了 mmap 的原理机制。
2.广播和 EventBus 的区别?
说 EventBus 的实现原理是基于反射,里面管理了两张表,且代码之间关联性不大不易于维护,EventBus 不支持跨进程通信,被面试官反问你确定不支持跨进程?我说我的看的源码是不支持,面试官说那好吧。
3.常用设计模式你了解哪些?
我开始巴拉巴拉说了一大堆,其中说到了装饰设计模式,被面试官打断了,请你具体说说装饰设计模式。
4.跨进程通信有哪些?
管道,信号,信号量,文件,本地套接字,共享内存,binder 驱动
5.简单讲讲 binder 驱动吧?
从 Java 层来看就像访问本地接口一样,客户端基于 BinderProxy 服务端基于 IBinder 对象,从 native 层来看来看客户端基于 BpBinder 到 ICPThreadState 到 binder 驱动,服务端由 binder 驱动唤醒 IPCThreadSate 到 BbBinder 。然后又讲了虚拟内存、物理内存和内存映射,跨进程通信的原理是要基于内核的, 当我讲到 binder_open 、binder_mmap 和 binder_ioctl 是被面试官打断了,估计是怕我讲太久了。
6.跨进程传递大内存数据如何做?
我说 binder 肯定是不行的,因为映射的最大内存只有 1M-8K,可以采用 binder + 匿名共享内存的形式,像跨进程传递大的 bitmap 需要打开系统底层的 ashmem 机制。
7.说说 ConcurrentHashMap 的实现原理说下,初始化大小是多少?
是线程安全的,实现原理采用的是分段锁,初始化大小是 16 ,必须是 2 的幂次。
8.启动优化怎么优化?
我说了关键优化 Application ,被面试官打断了,说大家都能想到的东西你不要说了,我想听的是你能不能站在系统的角度去做一些优化,我提到了优化包体积大小能优化启动速度,优化 dex 分包能优化启动速度,可以参考最新的华为方舟编译器等等。
9.你写的 rxpay 和 rxlogin 具体怎么实现的?
一般我们集成第三方登录和第三方支付 SDK 都需要监听 onActivityResult 方法,我是参考了 RxPermission 的实现方案添加了透明 Activity 。
10.kotlin + fullter 方面的
这块知识点我记得资料里面有,我也看过,但是就是说不上来,可能是急于表现自己,过分紧张了。
我以为我挂了,但是第三天居然收到了二面通知!!
技术二面
这里介于本文篇幅过长,我把答案整理成了一份PDF资料,有需要的朋友可以去文末领取。
1.单例设计模式都写写,静态内部类是怎么保证线程安全的?
2.synchronized 底层实现原理,ReentrantLock 公平锁与非公平锁。
3.主线程等待所有线程执行完毕,再执行某个特定任务怎么实现?原理和源码看过没?
4.自定义 view 的一般流程,要注意些什么如何优化,点击事件和长按时间分别是怎么实现的?
5.四种启动模式,在源码分析中的原理是怎样的?
6.讲讲 bindService 的过程,你当初是怎么优化后台服务进程的?
7.开发中你都用到了哪些设计模式?说说当时具体的场景。为什么你要用方法工厂,另外两种呢?
8.RxJava 在使用过程中碰到了某些不友好的错误一般怎么解决?发现了内存泄露一般怎么解决分析,有没有碰到过系统服务内存泄露的问题?
9.你们用的 okhttp ?那你有没有做过一些网络优化呢?比如弱网环境。
10.给你个数 1 吧,比如 1000011 里面有几个 1 ?
11.快排了解不?最坏的情况是怎样?如果有大量重复数据怎么优化?
这次比较顺利,我已经不怎么紧张了。整个过程感觉自己表现得很好,三面的通知在意料之中。
技术三面
1.讲讲 handler 的底层实现原理?
这么简单?问到碗里来了,后面渐渐说到延迟消息是 nativePollOnce 来处理的,在 6.0 以上用的是 epoll 方式来监听文件描述符。接着问道了为什么要用这种方案?它跟 poll 和 select 比起来有哪些优势?它是怎么监听的你看过它的内部实现原理没?反正感觉很难受了。
2.说说你做的日志记录优化?
把第一轮面试的又讲了一通,你在每个文件的最后写入了当前内容的大小,你有没有想过如果文件被破坏的情况?这种异常情况怎么处理?后面还问到了加密和压缩。
3.你看过 binder 驱动的源码,说说他的内存映射过程,说说客户端等待服务端处理返回的流程,如果要跨进程传递大内存数据你具体会怎么做?简单写一写吧。
4.在公司做过哪些优化?
内存优化,启动优化,网络优化,包体积优化,具体说说包体积优化。我提到了包体积优化不仅仅是优化了包的大小,包体积太大从安装的那一刻开始,我们的应用就可能比较慢了,因为 pms 会去拷贝解压解析我们的 apk 安装文件,会去优化我们的 dex 等等,包体积太大还会影响我们的启动速度。然后就巴拉巴拉说具体怎么做,问到了为啥混淆资源能减少包体积大小?你当时优化的时候效果是怎样的减少了多少?
5.开发过程中遇到的一些最难解决的问题?
提到了动态修复替换加载 so ,那你知道怎么修复 class 吗?怎么修复资源呢?后面又聊到了插件化,提到了 360 用的是借尸还魂,那如果我们在插件的 Androidmanifest.xml 中注册了其它属性该怎么解决,资源方面怎么处理?
6.还有什么要问我的?
HR面
这个基本上就是闲聊,说了一下为什么离职,薪资期望这些。
值得一提的是,当对方得知我从小到大一直都想进腾讯的时候,对方看我的眼神都不一样了
(像是……老丈人看女婿?哈哈哈)
最后
非常感谢那么努力的自己,也非常感谢那份接近三千页的PDF资料。我愿意告诉大家这份资料的免费获取方式,希望对大家有帮助。
【超实用干货资源指路↓↓↓↓↓】
耗时268天,7大模块、2983页58万字,Android开发核心知识笔记!对标阿里P7!
不管是Android新手小白还是资深架构师都能从这份资料中有所收获和帮助。
虽然是对标阿里P7 的,但是这个大佬一定想不到我靠他进了腾讯!哈哈哈。
最后,希望大家长风破浪会有时,直挂云帆济沧海!你我共勉。
我在腾讯投了三次简历,终成正果。我相信,大家的努力也不会白费,你的汗水终将折射出钻石的光芒!