从超高频的后端面试题出发,指明学习方向
大家好,我是鱼皮。
还记得我的老弟小阿巴么?他目前正值大一暑假,在家自学编程(刷短视频)中。
他整个大一期间基本都在学习前端。后来,我带他写了一次后端,结果就崩了,写了一堆 bug!
详情请阅读:前端老弟第一次写后端,崩了!
但没想到,这货踩了坑后,反而爱上了后端开发。这一到周末就缠着我,让我给他讲讲后端开发应该学习哪些知识。
虽然很想给他总结一份后端学习路线,但我也很忙,于是就思考有没有什么更快捷的方式让他了解到后端要学的技术。
我想想:他学编程是为了找好工作,想找到好工作就要先通过面试。。。
有了!正好我朋友在大厂 “阿巴阿巴” 做 Java 后端面试官,我直接把小阿巴送过去参与面试,不就能让他知道自己要学的技术了么?
OK,起飞!
起飞
一天后,小阿巴回来了,一脸苦样,说自己一道题都没答出来。
我问了下考点,大笑道:你运气太好了,这不全是后端面试中的 超高频 经典题目么?全中!
好了,下面就通过这次的大厂面试题,分享下后端程序员要学的知识以及缘由。
从面试题看后端必学知识
大纲:
后端必学 - 思维导图
编程语言
对于开发岗位的程序员,无论是前端还是后端,最低要求都是 熟练使用 至少一门编程语言。像前端的核心语言是 JavaScript,后端有 Java、C++、Golang、Python 等。
目前 Java 后端岗位的需求量比较大,所以这里以 Java 为例。
基础
面试题
Java 中 == 和 equals 的区别?
题解
https://blog.csdn.net/qq_38162448/article/details/81611894
分析
熟练并不只是能写出代码就够了,很多编程语法层面的 小细节 也必须关注!在工作中,很多 bug 的产生正是因为对细节知识的欠缺,因此这些细节也是面试官最爱考察的点。
比如 Java 中的 == 和 equals 都是判断变量是否相等,但有啥区别呢?如果使用不当,很有可能会把相同值的变量判断为不相等,导致业务逻辑错误。还有 final 关键字、volatile 关键字等,都是常用的 Java 语法,也是高频考点。
所以,巩固语法基础很重要,推荐《Java 核心技术卷 I》。
类库
面试题
Java 中的集合及其继承关系?
题解
https://www.bilibili.com/video/BV1zD4y1Q7Fw
分析
每种编程语言都有内置的类库和函数,虽然可能不是最方便的,但通常源码实现都比较合理、性能也不错。想熟练使用一门编程语言,提高开发效率,或者编写自己的封装库,就一定要先掌握语言原生的类库。
比如 Java 中提供了集合类,让我们很轻松地操作各种数据结构,比如数组、链表、Set、Hash 等,这些都是工作中常用的类,因此有必要了解它们的原理,才能更合理、正确地去使用。像 HashMap 的实现原理、HashMap 和 HashTable 的区别、ArrayList 和 LinkedList 的区别,也是高频考点。
Java 集合框架关系
框架
面试题
什么是 Spring 的依赖注入?
题解
https://zhuanlan.zhihu.com/p/25459839
分析
除了做基础架构之外,在企业中开发基本都是用现成的框架,不用什么都自己写,能够大大提升开发效率。但会用框架只是最基本的要求,怎么能最大化框架的性能、降低出 bug 的概率、进一步降低开发成本、甚至如何自己设计实现一个框架,才是优秀的程序员应该思考的。因此,常用框架的设计原理是高频考点,比如 Java 中 Spring 框架的核心设计 IOC 和 AOP、使用多级缓存解决循环依赖等。
底层
面试题
JVM 的内存结构是怎样的?
题解
https://www.bilibili.com/video/BV1iJ411d7jS?p=2
分析
大厂面试中,少不了编程语言的底层实现。
虽然工作中很少会直接用到这方面的知识,但书到用时方恨少,大厂对求职者的需求通常不是你现在能做什么,而是你未来是否能够应对潜在的挑战。万一到时候线上程序出一个紧急且严重的 bug,需要分析垃圾收集器的日志,让你现学,还来得及么?这就要求我们了解底层,对 Java 来讲,关键就是 Java 虚拟机(JVM)。
此外,了解底层能够加深你对编程语言的理解和对架构的认知,很多底层的设计原理是可以应用到工作写程序中的,像如何分配管理内存、垃圾收集器的设计、回收算法等。
简单来说就是:把工具玩儿明白,让造工具成为可能。
推荐书籍:《深入理解Java虚拟机》第3版
《深入理解 Java 虚拟机》第3版
计算机基础
无论你学习什么编程语言,这些知识都是程序员重要的基本功。虽然未必在工作中直接用到,但打好基础,能够全方面提升你的编程能力和素养,在面对问题时才会有更多的想法和思考。
面试官通过这些问题,能看出你的学习是否扎实,是否可靠。
数据结构
面试题
如何用栈实现队列?
题解
https://leetcode-cn.com/problems/implement-queue-using-stacks/solution/
分析
数据结构是独立于编程语言的重要思想,像链表、数组、栈、队列、集合、字符串、哈希表、树等等,都是写程序常用的数据结构,因此也是面试高频考点。
工作中,虽然不会让你自己实现一个数据结构,但至少要了解每个数据结构的特点、使用场景、时间和空间复杂度,否则写出来的代码可能会 “又重又慢”,稍有不慎,内存溢出!
栈
算法
面试题
假设你正在爬楼梯。需要 n 阶才能到达楼顶。每次你可以爬 1 或 2 个台阶,有多少种不同的方法可以爬到楼顶呢?
题解
https://leetcode-cn.com/problems/climbing-stairs/solution/
分析
和数据结构类似,算法也是程序员的核心素养。像排序、动态规划、递归、迭代、二分、分治、深搜广搜等基础算法,都是面试的重点。
计算机网络
面试题
TCP 三次握手、四次挥手经历了哪些过程?
题解
https://blog.csdn.net/ThinkWon/article/details/104903925
分析
对后端开发而言,大部分的工作就是写接口,接受前端或其他客户端发送的网络请求,给出对应的数据响应。因此,网络知识相当重要。
比如工作中常用的网络协议、HTTP 请求与响应、会话、四七层负载均衡等,都是常见考点。因为很多的协议都是在 TCP、UDP 的基础上进行封装,所以 TCP 和 UDP 也是高频考点。了解这些有助于写出更优雅规范的接口、减少网络请求的耗时、或者提高整个接口的并发度等。
TCP 三次握手
操作系统
面试题
什么是死锁?
题解
https://zhuanlan.zhihu.com/p/26945588
分析
操作系统虽然是很底层的知识,但毕竟我们编写的程序都是跑在操作系统上的,因此操作系统的一些概念无时无刻不在被开发者使用,比如进程和线程、死锁、文件、套接字、CPU、内存管理、输入输出等。你思考问题的深度、程序性能优化的极限,很大程度上取决于对操作系统的了解。
软件开发
Mysql
面试题
MySQL 如何性能优化?
题解
https://www.zhihu.com/question/19719997/answer/549041957
分析
大部分做后端开发的程序员离不开数据库,而且工作中基本就是写 CRUD,从数据库中增删改查数据。
对于在学校里做的小项目,基本了解数据库的使用,会写几条简单的 SQL 语句就够了。但是在大厂业务(尤其是 ToC)中,数据量动辄百万千万、甚至数亿,这就对数据库设计和性能优化提出了要求。
因此,大厂后端面试中,超高频的面试题就是:MySQL 如何性能优化?对于这类问题,只靠背诵很容易被面试官揭穿,比较推荐自己去做个项目,设计个库表实战,看看不同的优化方式是否有效、能得到多大的效果。
还有很常见的面试题就是:给你一个场景,让你去设计数据库表结构。大部分题目都要求你临场发挥,所以在平时多做项目、多去参考其他系统的设计真的很重要。
此外,还要了解数据库中的常见概念,比如事务、锁、索引等;还有一些基本操作,比如存储过程、备份、定位慢查询。否则可能写出的代码会有 bug、一不小心插入的数据就不一致了、一不小心就把整个表给锁住了、删库跑路也无能为力等。
Redis
面试题
Redis 有哪些数据类型?
题解
https://www.runoob.com/redis/redis-data-types.html
分析
Redis 是一款高性能的 Key-Value 数据库,它在后端开发中的作用非常大。
比如为了提高接口性能、减轻数据库压力,用 Redis 做缓存;为了解决并发冲突,使用 Redis 做分布式锁;为了实现单点登录、提高用户效率,使用 Redis 存储会话或令牌;Redis 还可以用于做实时排行榜、计数器、布隆过滤器、队列系统等。
因此,大厂面试中,Redis 的考点也越来越多,常见的有 Redis 的基本使用(有哪些数据类型?有哪些应用场景?集群搭建)、工作机制(持久化机制 RDB 和 AOF 的区别?为什么单线程?) 、场景设计等。
设计模式
面试题
请手写单例模式的实现代码?
题解
https://www.cnblogs.com/yuanxion/p/14600626.html
分析
设计模式是程序员们在软件开发过程中抽象出的、用于同一类问题的解决方案,一般是比函数、组件更高层的抽象,用了设计模式的代码一般有如下特点:
重用代码,减少重复的代码编写和复制粘贴
更好维护、可扩展
提高开发效率
新手看不懂,懂设计模式的程序员一看就懂
正因为这些优点,设计模式无论是对工作效率还是思想的提升都很有帮助,也成为了面试高频考点。常见的设计模式虽然有 3 大类、23+ 种,但面试重点主要是单例模式、工厂模式、观察者模式等。
并发编程
面试题
为什么用线程池?
题解
https://www.cnblogs.com/xinxindiandeng/p/6383311.html
分析
如何用最少的资源,写出性能更高、更可靠、更可扩展的程序是后端程序员需要思考的问题。因此,高并发编程是面试的重点。像线程池、锁、队列、并发包、同步异步等,都是高频考点。有时还会给一些实际问题让你分析,比如经典的秒杀系统的设计、订单超卖问题如何解决。
线程池
Linux
面试题
Linux Top 命令的输出信息分别表示什么?
题解
https://blog.csdn.net/weixin_41427129/article/details/113102533
分析
企业项目一般都是部署在云服务器上的,大部分服务器的操作系统都是 Linux,因此后端开发工作中,必不可少地要操作 Linux 服务器,比如部署项目、安装和配置服务、查看系统运行信息、定位线上问题排障等。
因此,要熟悉基本的 Linux 命令,能够适应无鼠标的命令行操作。
还要了解一些常用的系统分析命令,帮助排查问题。比如 top 命令,可以查看系统的资源占用、整体负载,还能具体查看每个进程占用了多少 CPU、内存,从而锁定异常线程。
Linux top 命令
Git
面试题
你用过 Git 版本控制系统么?
题解
https://github.phodal.com/
分析
企业开发大部分都是团队协同而非单兵作战,很多人要同时编写同一个项目的代码,那么如何保证代码的同步、减少冲突、查看改动呢?这就需要使用版本控制系统,目前最主流的是 Git。
如今,Git 已经是程序员的必修课了,但很多同学只是草草了解几个简单的 Git 操作,比如上传和更新代码到 GitHub,这是不行的。在工作中,还经常会用到工作区、分支、合并、回退、解决冲突的功能,也必须知道如何操作。
顺带一提,大多数员工刚进公司要做的事就是用 Git 拉取代码,如果连这个都不会,就真的很尴尬了。
架构
面试题
什么是微服务?和传统架构有什么区别?
题解
https://www.zhihu.com/question/55511712
分析
如今的架构形式丰富多彩,早就不是一套架构吃遍天的时代了。单点、集群、分布式、SOA、微服务、容器、云原生、服务网格,这些架构都有什么特点?分别适用于哪些场景?如何选择?如何实现?这些问题都是后端程序员需要考虑、学习和实践的。
架构图示例
听完我这一通分析,一向嚣张的小阿巴竟也变得沉默了,点了个 赞 就放下了手机。
想学好后端进大厂,真的是任重而道远,大家加油!