博主本人是非科班硕士,今年三四月份时开始刷题准备找工作。实习加秋招投了很多大厂&中厂,但是有小一半都没能进面试。秋招最终拿到了OPPO提前批测开、腾讯音乐后台开发、阿里云Java开发的offer。写这篇文章是为了复盘顺便记录面试经历(一段痛苦迷茫难忘的时光),然后为和我一样到研二才开始学这些的半路出家者提供可以快速掌握面试所需知识的一些知识点outline(攒攒人品)。
重申:想好好学计算机的一定要一点点的看书构建知识体系,本文学习路线仅为提供快速混进春招秋招的队伍接受各种面试捶打的捷径。本人知识量有限,如有错漏请指出,感谢。
OUTLINE
- 后端岗位需要掌握的知识点
- 面经部分
-
- 春招实习阶段
- 秋招正式阶段
-
-
- 1. 字节 提前批测试开发 一面(挂)(有认真复盘) 50min
- 2. OPPO 提前批 测试开发 一面(过)40min
- 2. OPPO 提前批 测试开发 二面(过)30min
- 3. 腾讯音乐-QQ音乐 后台开发 一面(过)1h20min
- 4. 腾讯音乐-QQ音乐 后台开发 二面(过)50min
- 5. 阿里云 JAVA开发 一面(过)1h
- 6. 阿里云 JAVA开发 一面(换了一个事业群)(过)1h40min
- 7. 阿里云 JAVA开发 笔面 (过)1h
- 8. 阿里云 JAVA开发 二面(突然打电话的)(过)30min
- 9. 阿里云 JAVA开发 三面 (过)1h
- 10. 阿里云 JAVA开发 主管面 (过)30min
- 11. 阿里云 JAVA开发 交叉面 (过)40min
- 12. 字节-飞书 大数据工程 一面 (挂)55min
- 附录1 笔试题1 代码
- 附录2 笔试题2 代码
-
后端岗位需要掌握的知识点
分成两部分来说,第一部分是和你选择的编程语言相关的东西,第二部分是和编程语言无关的计算机基础。
- 语言相关的东西,如果你选的是Java,那针对这个语法基础的东西可能不会被问太多。因为Java没有指针,比较简单。但是在大部分的一面中,会涉及到:
Java 相关
- 关于面向对象的一些概念(继承,封装,多态),并结合JAVA语言特性的一些问题(Java不允许多继承,引入接口)
- 一些关键字(static,volatile,extends, final等)和一些常用类/接口相关(StringBuilder,StringBuffer,Comparator等)
- JAVA的集合类的一些问题,也是常考的,这块结合数据结构和算法以及多线程,内存的东西也能展开很多问题,我自己也总结了一些问题和答案。
- JVM(JAVA 虚拟机)相关问题,这是面试的重点了。Java最大的特性就是他的运行是不依赖操作系统的硬件平台的(一次编译到处运行),因为JVM的存在,为Java程序的运行屏蔽了不同操作系统间复杂的差异性,同时又提供了自动的垃圾回收(GC)机制,相对安全的内存管理和访问限制。
JVM涉及到的知识点有:垃圾回收,及 内存管理 两大块
这部分内容有时间可以好好看看《深入理解JAVA虚拟机》,没时间可以看马士兵老师的公开课,或者公众号“码海”关于GC和内存的文章,也讲得很好很细 (这块就是,平时可能用不到,但是面试需要造火箭所以经常问)。 - JAVA多线程相关内容,也是大部分会结合操作系统问, 这块也可以看看马士兵老师的公开课。
- Java的反射机制,泛型等稍高级的特性(会结合spring那些问)。
- 与语言无关的部分,就是无论你选择JAVA,还是C++,或是Python, go,都会被问的东西。无非就是计算机考研408的那四门课,再加上后端开发工作中常用的数据库和linux,还有网络编程相关的(这个我自己是没看但是被问过)。但是面试中会考察的计算机原理,计网等内容都有限,大致看看面经背背答案就能应付大部分面试了[\doge].
接下来具体列出每个板块必须要掌握的知识点,需要注意的是,在一点点去找相关知识点看的过程中,需要想办法把他们连成线和面,尽量去把有限的知识量构建成知识体系。因为面试官问的问题有时候不仅仅只针对一个点的,如果能往深里答那就很加分了。
知识点的列出按照先后顺序,列在前面的表示更重要(高频)
计算机网络
- TCP链接可靠建立和取消相关,即三次握手和四次挥手(为什么三次握手能保证链接的可靠建立?为什么四次挥手?time_wait为什么2MSL…)
- TCP的可靠传输相关,拥塞控制等
- HTTP/HTTPS协议
- UDP协议(和TCP的区别,现实场景中哪些用UDP,哪些TCP)
- IP地址、MAC地址、OSI七层模型(或者 TCP/IP 五层模型)各层模型对应的常见协议也要有所了解
- 常见网络攻击及应对方法,结合网络协议(DDOS攻击,TCP SYN Flood等)
数据结构和算法
这块结合算法题去看(应付面试刷完剑指offer就差不多,笔试得多刷力扣)
两部分来看:
part 1 数据结构:
- 线性表(数组,链表,是基础)
- 二叉树(结合算法,回溯,动归,分治,非常重要)
- 栈,队列
- 堆
- 图
part 2 算法:
- 排序
- 二分法
- 动态规划(背包问题)
- 回溯(深度优先搜索)
- 递归
- 贪心
- 分治
- kmp
- LRU
操作系统
- 进程,线程概念
- 进程间的通信方式
- 多线程(结合JAVA线程池问,结合内存管理问)
- 各种锁(JAVA中的synchronized关键字,锁升级过程等等)
- 死锁,死锁预防和避免(银行家算法)
- 同步问题(生产者-消费者,哲学家进餐问题)
- 孤儿进程,僵尸进程概念
- 虚拟内存管理(结合计组,页面置换算法)
- 磁盘调度算法
计算机组成原理
- 虚拟存储器相关的,缓存分页等
- cache的基本工作原理
数据库
数据库部分也可以分为两个部分,一部分是数据库操作
- 常用的增删改查的操作
- 高级一点的操作比如分组排序,join查询等
另一部分是数据库原理,包括了索引和并发控制(MYSQL数据库)。
- 索引存储结构(为什么用B+树)
- 索引使用相关,主键索引,最左前缀原则等
- 数据库的锁分类,按照不同方式可以分乐观悲观锁,行锁表锁,读锁写锁等
- 事务(ACID)
- MVCC
还有关于NoSQL数据库比如redis相关的问题
- Redis的特点(纯内存操作,性能高,单线程多路IO,非关系型)
- Redis的持久化(AOF, RDB)
- 日志相关,redo log, bin log(这个mysql的也有)
- redis内存淘汰机制
- 一致性hash
还有分布式数据库相关的问题,一般涉及主从架构,读写分离,一致性保证,性能调优等。
Linux
这块知道常见的命令就可以,主要分几个部分,进程管理(ps,top, kill,df),文本编辑匹配(grep,sed,echo,awk),网络通信(ping,ssh, ifconfig),文件管理(ls,mkdir,cp,mv,rm)等,还有linux
系统的文本编辑器vim的操作
设计模式
- 单例(要会写代码,七种写法,掌握饿汉,懒汉,DCL线程安全写法就可以了)
- 工厂方法模式,抽象工厂模式
- 动态代理
其他
Java后端常问的还有关于Spring家族的问题,如果有自己找一些微服务的小项目练手,可以对这部分的知识重点关注,面试的时候聊聊这个也可以。
博客资料推荐
Java选手可以参考以下博客的基础知识总结
算法部分
面经部分
因为hr面我基本没有录音所以就不记录了。本人其实投了挺多中厂的,但是要么简历没过要么笔试没过(大厂一般都会给面试机会,但中小厂如果看你没有相关项目经历,或者hc没了就不会面你了,所以投递的时间点很重要,尽早投。然后就是,笔试很重要啊T-T)
春招实习阶段
(这个时候我还啥都不会,所以面试官基本都是问基础.)
1. 腾讯 (不知道哪个g) 的事务型后台开发 (挂)(有认真复盘)50min
- 自我介绍(学校,专业,论文),问了项目,为什么找工作不找和现在的论文研究方向相关的东西,论文偏理论还是实践?
- python 内存管理了解吗 (因为我项目关于机器学习要用python,面试官后来说他们平时用C++,像python这种脚本语言也用)
- python 常用的数据结构了解吗(回答了类,数组的切片,然后就扯到了tensorflow,好像面试官不了解这个,就没问)
- 垃圾回收机制 (终于问到我会的但是答得乱七八糟)
- java的内存空间(栈,堆,静态区)
- 常用的GC算法(反问了一下是不是指判断对象是否无用的方法,然后回答了引用计数和根搜索)
- C++熟悉吗(我说不太熟悉了)
- redis中的数据结构(答了set,list,soret set,hash table)
- 使用redis时内存达到瓶颈,集群达到瓶颈?就是缓存需要放到内存里,不然断电了就没了(不会。后来反应过来应该问的是持久化)
- 分布式锁 ?
- Tcp和Udp区别
- Tcp为什么是可靠的? 三次握手说一下过程
- 服务端发的ack包的值是多少? 如果客户端发了很多包,那么服务端回的是哪一个包?
- 服务端收到客户端的SYN后进入什么状态?
- 四次挥手说一下 (time wait, 多久)
- unix命令(listen什么的)
- mysql用的什么引擎(innoDB)
- 数据库的并发控制了解吗(我答了悲观锁乐观锁和Mvcc)
- 在什么场景下需要用到这些(我答得好像错了,面试官说mvcc其实是乐观锁的一种,他希望这个问题我可以说一下行锁,共享锁这些)
- 多进程与多线程的区别(妈耶这个我会太激动了然后就答得乱七八糟啰里八嗦…面试官中间问了一下进程之间能不能共享资源,然后说最根本的区别是进程是资源分配的最小单位,线程是独立调度的最小单位)
- 排序算法知道哪些
- 快速排序的过程说一下,平均的时间复杂度,最好的最坏的情况的复杂度
- 最坏的情况是怎么造成的,既然这样,如何优化快排,避免最坏情况发生(问了一下是不是就是找靠近中位数的数做基准,我答了在每次递归选基准数之前先获取几个数找中指,以这个中值做基准)
- 你这么优化算法复杂度还是挺大的(我说那不是就O(nlogn),然后面试官说你这个找中位数可以简化一下,找三个数出来求中位数,我说我一开始想的是这个,但是想着要是n和3相差不大的话,取整个分区的中位数也不会增加很多复杂度)
- 有什么问我的?(腾讯的事务型开发做什么,就是后台,用c++)(校招中比较重要的是哪些方面,基础知识,计网算法数据库操作系统那些,还有就是面试者的研究方向和项目中体现的解决问题的能力。)
2. 阿里-钉钉 测试开发 笔面 (挂) 1h
两道代码题,给一个小时
- 编写两个线程,一个线程打印‘你好‘、’钉钉’、‘你好‘、’钉钉’……,另一个线程打印‘hello‘、’dingtalk’、‘hello‘、’dingtalk’…….然后通过一个main函数启动这两个线程,打印出‘你好hello钉钉dingtalk你好hello…’
- 判断111 - 333之间有多少个质数
3. 阿里 (不知道哪个部门给我捞起来的) 测试开发 一面 (又挂了)1h30min
- 介绍论文项目 ,从项目中取得了哪些能力
- 觉得自己和别的同学比,优势和弱势分别是什么
- 在项目中,如何测试强化学习算法有效性(感觉是结合测试,采集的数据要考虑哪些方面)
- hashmap 的工作原理(底层实现?),它是线程安全的吗?
- 悲观锁和乐观锁的概念和区别
乐观锁如何得知访问的对象是不是被修改了(CAS,加版本号) - 多线程如何实现,线程启动
- Runnable和callable的区别
- 栈和堆的区别
- 对象存储在栈还是堆里?
数据库部分(基本全不会):
- 左连接右链接
- 数据库的事务概念,有哪些特性(原子性,一致性,隔离性,持久性)
- 索引加在哪?
- 如何更新数据?
linux:
- 想看一个文件内容,用什么命令(cat)
- 如何查看日志
- ps -a是什么意思
- 如何打印出文件中以数字开头的行
- 正则
- linux 自带一个文档编辑软件VIM?
撕代码:
输入10个整数,输出其中乘积最大的三个数
(要考虑负数哦)
归并不同的情况,其实是一样的。。
int[] nums = new int[10];
System.out.print(nums[7]*nums[8]*nums[9]>nums[0]*nums[1]*nums[9]? nums[7]+nums[8]+nums[9]+"":nums[0]+nums[1]+nums[9]+"" );
被喷打字速度?
有什么要问我的?(被夸问了好问题)
- 您为什么要做测试?
- 在您的实际工作中,如何判断一个项目/产品已经ok,可以交付了呢?是通过经验还是有硬性的数据指标这样?
4. 美团 Java开发 一面(挂) 40min
- Java中常用的集合介绍一下
- HashMap 介绍一下
- HashMap --常用的解决冲突的方法
- jdk 1.7和1.8在hashmap的实现上有什么区别
- volatile关键字了解吗
- 什么场景下会使用volatile关键字
- 在一个数组中找特定的数字
- 一个表里有三个字段,name, course1_grade, course2_grade, 查找出每门课成绩大于80分的人的姓名
- 介绍一下JVM(你了解的部分)
5. 网易互娱 游戏测试开发 一面(过)50min
- 论文(描述做了什么,为什么这么做,有什么没解决的问题,接下来有新的解决方向吗)
- 代码题:角色A从一个二维矩阵的左上角出发寻找右下角的角色B, 二维矩阵中有障碍物不能通过, 设计一个算法计算有多少种走法
Example:
下面的3*3的地图中只有一个障碍物
[
[0,0,0],
[0,1,0],
[0,0,0]
]
总共有2种走法 - 平时会玩游戏吗,都玩些什么游戏
- 单机游戏和网游在实现上有什么区别
6. 网易互娱 游戏测试开发 二面(过)1h
- 论文 (为什么用强化学习解决这些问题,怎么采集数据的)
- 算法题:输入不确定个数(很多),重新排序使得所有的奇数都在偶数前面,如何插入一个数到已经排好序的数组中(用什么数据结构实现)
- 玩什么游戏比较多(玩什么英雄,谈谈对这个英雄的理解)
7. 京东 (广告数据部) 大数据开发 两面连着 (过) 1h+1h10min
这一part我没记面经,只记了代码题,大致问的题目就是计算机基础的常规问题。以及针对我的论文的一些问题
代码题:
-
实现一个函数: input:A = [1,1,2,2,3,3,8], target = 7 output: false
实现一个函数: input:A = [1,1,2,2,3,3,8], range = [3, 5] output:2 -
req_time 10:00:00 click_time 10:00:30 在10:00:00-10:00:30之间这个点击是延迟点击
10亿条点击日志 log[req_time,click_time] 10亿条点击日志,统计00:00:00 - 23:59:59内的延迟点击数
8. 字节 Java开发 一面(过)1h10min
- 谈一谈Java中的Hashmap
- hashmap实现中的链表用的是头插法还是尾插法
- Java中并发安全的hashmap有哪些,是如何实现的
- sychronized关键字的实现,锁升级过程
- sychronized是可重入锁吗
- 对基本的设计模式有了解吗
- 写个单例模式的懒加载,以及线程安全的实现
- 二叉树打印
9. 字节 Java开发 二面(挂)1h
- volatile 关键字了解吗
- 讲一个必须使用volatile关键字的场景