非985、211毕业,我是如何加入腾讯的?(附Android通关
前言
本文是给想进入“BAT”等企业的开发朋友们提供思路的,内容全部来自于真实经历。
关于我
大家好,我是小白(化名),一名 Android 开发工程师。
有些人在毕业的时候就能顺利进入“BAT”、“TMD”、“FLAG”,但是更多的人并没有这个机会,比如,最典型的——我。
努力就能改变命运。这是真的吗?
在我看来,虽然我不是特别聪明(但也不笨),但是努力确实给我带来了更多的机会。通过努力,我顺利拿到大厂offer,相信此时正在看这篇文章的你也一定可以的。
所以,无论你是想跳槽去大厂的工作党,还是即将毕业找工作的应届生,如果你想要进大厂却不知从何着手,希望你能将这篇文章反复看几遍,根据本文的内容找到正确且适合自己的方法,努力打磨,然后坚持坚持再坚持,我相信你一定能拿到大厂的offer。
颓废的校园经历
我毕业于一所普通的二本院校,大学时曾梦想成为学霸,幻想进入 BAT 大企业。然而,现实啪啪打脸,学渣一名。毕业的第一天,就成为一名待业状态的社会人。
曾经的我就是现实版的“余欢水”:“努力”地活着,却总是被生活“欺骗”。
上大学时,兴趣广泛,但叶公好龙,无一擅长; 我想要成为学霸、有所成就,但好高骛远,无所作为; 毕业那年考研,顺利落榜; 后来痛定思痛,背水一战,参加公务员考试,意外通过笔试,却惜败在面试。
那一年,我深刻地感受到 世界辣么大,却没有我的容身之处。
初入职场
首先,介绍一下我的背景。本人坐标广州,2016年毕业于一个普通二本大学,曾经在某机构培训过Android。
作为一名,android菜鸟,经历了4个月,高强度的学习深造(每天早上9点学到晚上9点),敲了近10万行代码,从最简单的short,int ,long,学到了if,where,for,再后来,知道什么叫class,interface,学了一个叫变形金刚的demo,知道了有一种思想叫抽象思想,面向对象。从这之后,算是开始了,程序代码的路途。各种java的API,各种java的lang包,java的方法,还有java写了一个小小的服务器,用tomcat传到网上,自己使用(还是很有成就感的)。
不过,这依旧只是开始,只是学习了java的基础应用,这都是为了,之后学android打下的基础。之后,又各种项目,紧随其后。学习,android控件,布局,各种view,各种layout,写航空订票系统界面,写员工管理界面等等,不过,界面其实,算是非常简单的东西,并没有多少逻辑可言,只是简单的记住和应用就可以了。
然后,开始学习android的4大组件,从activity到,service,最后便是broadcastreceiver和contentproverder。知道了活动的各个生命周期,服务的背后操作、内容提供者的跨线程通信,广播的全局通知,,,说起来东西真的是太多太多了,一个简单的音乐播放器,可以一改二改三改,,从本地到网络,从单线程到多线程,从前端到后台。还记得老师说的一句话,小案例大学问,这话真的不假。
组件学完了,接着就开始了数据之旅,从文件存储,到偏好设置,再到数据库,最后网络数据!i/o流,sheredprefrence,sqlite、xml、json等等,同样是那么的多。用的这些文件存储和修改方法,写了一个单词本的项目,最后,还把数据传到网络服务端,再从网络服务端获取数据,各种解析,请求!这时候,感觉,有点吃力了!
难度,都是阶梯形的,慢慢的,开始接触框架,设计模式,框架的二次封装,框架结构的了解,设计模式的选择,实践!
迫于生活压力,在亲戚的介绍下,我顺利进入深圳的一家创业公司做Android 开发。
2019年初的时候已经在两家小公司工作干了两年的android开发,然后会一些Tomcat、Servlet之类的技术,当时的年薪大概也就15万这样子。
职场进阶
2019年Android 的行情还没有像现在这么恶劣,趁热打铁,我自己投简历面试,很轻松就进入一家 Top 10 的金融互联网公司。
大公司的分工更细,流程更规范,我在这里待了两年,时刻保持一颗学习的心态。
在这两年中 Android 开发的大环境已经出现了拐点,由于开发者数量供大于求,整体上找工作的情况不如之前。 为了让自己不掉队,我复制在我在上家公司的成长模式——疯狂学习。
我研究并实践了当时社区比较流行的技术,比如Flutter、Jetpack、kotlin、逆向开发、组件化、源码等等。但我明白,由于我大学时候基础太差,离去一线互联网大厂的水平还有差距。
加入鹅厂
有一天,我收到猎头的电话,问我是否考虑腾讯?我欣然答应,沉睡在我心中多年的幻想又被唤醒。
然而想进入大厂没那么容易,需要对面试做系统性的准备。
我开始利用业余时间夯实面试需要的基础知识,经过大概三个月的准备,通过了五轮面试,终于顺利加入鹅厂!
下面我把准备面试的经验分享给大家(为了尊重公司,我不能把原题告诉大家,但我会把方向告诉大家,因为方向里自然有“题库”),分为基本功、软实力、加分项三个方面。下面一个个来说。
基本功
所谓基本功,就是你需要练到有肌肉记忆的技能,当面试官问起的时候,你能够信手拈来。
简历基本功
简历的好坏决定第一印象。
很多人可能技术很牛逼,却没能获得面试机会,就是吃在简历的亏上。比如,错别字连天、排版混乱、语句冗余不通顺。下面是我总结出的要点:
排版
我走的是极简风格,直接使用 Markdown 进行书写,然后转换为 PDF 格式。
作为一个 GUI 开发者,你也可以把简历制作成一个静态页面,加上漂亮的动画效果,来展示你优秀的基本功,给面试官眼前一亮的赶脚。比如,我的一位朋友就是这样制作简历的,当时也顺利地通过了面试。
书写逻辑
请遵循“STAR”法则。即情境(situation)、任务(task)、行动(action)、结果(result)。
比如,“为解决项目中遗留的回调地狱和内存问题,我用了 RxSwift 重构了 XX 模块,在团队内普及了响应式编程思想,受到了团队成员的一致好评”。这通常也是面试官提问的逻辑。
内容
请你一定要熟悉简历中写过的内容。因为面试官的面试思路无非有两种。
第一,顺着你的简历问; 第二,根据他自己的思路来问。
如果你遇到的是第一种,面试官问到你在简历上的内容你却卡壳了,那真的是非常尴尬,面试官很可能怀疑你的简历不太真实。
如果你遇到的是第二种,那么你简历上的内容也会给面试官心理暗示,那么接下来的问题很有可能是你简历上知识点的发散。
关于面试准备,我个人认为可以这样排:数据结构与算法,****Java****,****Android(如果不找安卓的就去掉这部分),计算机网络,操作系统,设计模式。下面我就按照这个顺序给出一些准备建议。
Ø 数据结构与算法
推荐书籍:大话数据结构,数据结构与算法分析(java语言描述),剑指offer,进军硅谷。
推荐在线刷题网站:Leetcode(LeetCode Online Judge),Lintcod(LintCode - 主页),牛客网(在线编程_C++Java前端经典笔试面试题库)
推荐方案:主要做三件事。
1, 先看一遍大话数据结构,熟悉一些基本概念,大话这本书只讲了一些基本的数据结构,像是B树,B+树,红黑树需要自己看一些博客或是网站,推荐一个讲解算法的网站-七月算法,另外海量数据处理也是一个经常考的专题,它结合了数据结构和操作系统的一些知识,这个需要进行针对性准备。
2,然后开始刷题,最推荐的肯定是leetcode,刷题建议按照标签进行刷题(比如队列,栈,哈希表),刷题从易到难,最好能够刷一百题左右,如果一天一题,至少要三个月以上,所以这个耗时比较长,要从比较早开始准备。进军硅谷这本书有按照专题进行编排,基本上的题目来自leetcode,可以作为一个参考。
2, 然后要分析一些常见数据结构的源码实现(比如队列,栈,hashmap之类的),数据结构与算法分析这本书有讲一些,可以结合一些博客进行准备。
** Java**
找程序员工作,大多数情况下需要掌握好一门面向对象的语言,主流上分为Java和C++两大阵营。这里讲Java需要怎么准备。
入门书籍:Java核心技术卷一,Head first in java(如果一点面向对象的概念都没有那就看这本)
提高书籍:Java编程思想
Java虚拟机:深入理解Java虚拟机
Java多线程:Java多线程编程核心技术,Java并发编程实践
其实我觉得如果有一定基础建议直接看Java编程思想,面试中的考点经常都会在这本书中有讲到。当然Java虚拟机和多线程这两块需要再看一些专门讲解的书,每一次java面试考查内容几乎都离不开这两块。
总体来说java考察内容包括以下这些:
1,面向对象的一些基本概念:继承,多态之类的
2, 抽象类和接口
3, 静态类,内部类
4, Java集合类,同步和非同步
5, Java类加载机制
6, Java内存模型和垃圾回收算法
7, 线程同步机制(volatile,synchronized,重入锁,threadlocal),线程间通信(wait,notify)
8, 异常处理
9, 多线程同步问题,生产者消费者,读者写者,哲学家就餐,用java实现
10, 了解java中设计模式的思想,用了哪些设计模式,有什么好处
Android
入门书籍:第一行代码。
提高书籍:Android群英传,Android开发艺术探索。
上面的书看好了,一般问题不大。主要问的一些问题:
1, Activity,Service,BrocastReceiver,Intent,Fragemnet,ContentProvider,这些组件的基础知识,比如Activity两种启动方式,生命周期,四种启动模式,Service则主要是:两种启动方式,生命周期。还有组件之间怎么通信之类的问题。
2, Android的数据存储方式,数据库,sd卡,SharedPreferences 这些
3, Listview的优化,与scollview的区别
4, view状态与重绘,view的绘制过程,view的事件分发机制,view的事件冲突处理
5, Android多线程异步机制,AsyncTask工作原理与源码实现,Handler,Message,Looper异步实现机制与源码分析
6, Android常见的开源框架(主要是网络通信,图片加载这些),了解怎么使用,分析源码
7, Oom和anr异常引发的原因,怎么解决
8, 了解一些常见的图片缓存技术
计算机网络
推荐书籍:计算机网络自顶向下,tcp/ip协议详解卷一
主要看:主要看应用层,传输层,网络层,其中传输层最为重要。主要的一些考察内容有:
1, TCP和UDP的区别
2, TCP的三次握手,和四次挥手,为什么需要三次握手,为什么要四次挥手(这两个为什么要考虑非常清楚)
3, TCP拥塞控制算法(慢启动,拥塞避免,快速恢复),流量控制算法,滑动窗口协议,选择重传。
4, TCP可靠性是怎么保证的(通过哪些机制保证)?
5, HTTP协议报文格式,请求方法字段以及各个方法之间的区别,了解常见的响应状态码,了解cookie机制,了解WEB缓存技术(条件get方法)。
6, DNS协议的各层域名服务器,两种查询方式(递归和迭代),dns缓存
7, Udp的特点,适用场景,校验机制
8, 从输入一个网址到最后网页显示整个过程发生了什么?
9, IP地址组成,ARR,RARP,ICMP协议,路由选择算法
软实力
沟通能力
我用四个词来概括: 自信、流畅、耐心、礼貌。
很多小伙伴可能编码技能不错,却不能在面试中表达出来。
在面试过程中,无论面试环境怎样,面试官态度如何,你都要保持积极的态度。请记住,你是在求职,就要创造一切对你有利的因素。
比如,你可以与面试官主动握手,增加好感。
如果面试官问你的问题,你刚好不会,也要尽可能列举这个问题相关的概念,然后推测出这个问题的答案。
比如,面试官问,二进制重排的原理是什么?
假设你刚好不知道这个知识点,你可以答 App 启动前 dyld 相关的概念或者说一下 Mach-O 二进制格式的原理,来推测可能的二进制的重排机制,即使推测错了也没有关系,因为在这个过程中至少展示了你积极解决问题的能力。
当然,如果连相关概念也想不出来,那就诚实地回答不知道或者向面试官请教一下吧。
逆商能力
作为开发人员,难免会在工作中与各种人撕B,能够扛过这些压力,也是一项重要的素质。
比如,面试官问,你的学历背景一般,学校排名靠后,和211、985的毕业生竞争有什么优势?
那你要怎么作答?
如果你是一个心理素质不好的面试者,很可能就会支支吾吾或者愤而离场了。 相反,你应该不卑不亢,冷静作答,因为这恰恰可能是某些面试官看好你的信号。 通过压力面试给你最后的考验,所以千万不要失之交臂。
作答举例:
虽然我的学历不是211、985,但是我仍然通过了前面的技术面试,说明了贵司对我的技术实力的认可; 学历证明了过往的学习能力,我是普通本科,却能与211、985的毕业生同台竞争,说明我的学习能力并不输给他们。
加分项
加分项就是一切能突出你优点的经历,最好是技术相关的。比如,你
参加过 ACM 竞赛获得过名次; 曾经造了一个轮子,解决了开发中的痛点,在 github 上发表过; 常驻 StackoverFlow 社区,是某个板块儿的资深答主; 有自己的技术博客,常常发表文章,在某一技术方向有一定深度积累,并且博客的订阅量不错。
我技术优势没太多,但是英语还可以,大学考六级时有 600 多分,我把这项写进了简历,也成功引起了面试官的兴趣。
后记
现在很多大公司招人已经明确限制需要 211、985 的学历,而我这种双非二本学历,连敲门砖都木有。但是,我能拿到 offer,是真的很幸运,但是也和我的努力分不开。
如果有什么问题或疑问,欢迎大家在下方留言,一起讨论。
最后,祝愿所有想进入大厂的同学早日如愿!!!
本文在开源项目:https://github.com/Android-Alvin/Android-LearningNotes 中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中...