5月初离职,7月中 offer 谈好。我终于进大厂了,西二旗百度,工作两周,状态良好。20年我来北京时的目标终于达成了!
离职空档期两个月,小一个月回家了,一个月学习&面试。心态经历了从信心满满,到自我怀疑,再渐入佳境的一系列变化。一路面下来很不容易,虽然结果看起来还不错。
面经总归要写的,分享一些这期间的心得,也曾想发到掘金、知乎这样的平台,但我终究不是那种面霸,给不出一个标准的好答案,而且坦诚讲也有一些运气的成分。不过总归算是对自己一个阶段的总结,也给相似背景的朋友一个小小的参考。
一. 基础
- 包括计算机、开发语言、与其它一些编程基础知识。很多都是常规面试题,可以多看别人的面经,试着回答别人遇到的问题,比如:
网络协议 TCP/IP 协议,TCP 三次握手,TCP 和 UDP 区别;
Linux 常用指令有哪些,如何从 Nginx 访问日志中统计出访问最高的 IP,awk 命令;
有没有看过 PHP 的源码,用的哪一个版本,有什么新特性,PHP 垃圾回收机制的实现,PHP 数组这么灵活是如何实现的,global, static 关键字的本质是什么?
常见的设计模式有哪些,你可以手写一个单例模式吗?
这里推荐王争老师在极客时间的的专栏, 「设计模式之美」,相信即使开发经验丰富的朋友,看过这个专栏也会有不小收获。
线程和进程的区别、什么是线程锁;
100G 的大文件,里面全是数字,机器只有 1G 内存,让你对里面的数据做排序,如何做?
二. 数据结构&算法
- 所有大厂都会要求算法,最好的准备方法就是刷 LeetCode, 建议至少把 HOT100 刷掉,也可以系统性的看一些专栏,这里同样王争老师在推荐极客时间的专栏, 「数据结构与算法之美」。 你还需要知道一些常见的概念与算法:
1.常见算法与其时间复杂度,比如快排、和堆排序的时间复杂度都是多少?
2.快排、双指针排序、快慢指针、递归、动态规划,你可以自如的运用这些算法吗?
3.常见的数据结构有哪些,链表、数组有什么区别?
三. WEB 开发基础组件
- MySQL、Redis、Nginx、Kafka 等组件,它们的底层原理你知道吗?
I. MySQL
- 强烈推荐丁奇老师在极客时间的专栏, 「MySQL实战45讲」。(PS: 是因为看了这个课,我就觉得极客时间课程的品质很高,可以花钱。)
常见的存储引擎有哪些、它们有什么区别?
索引的底层数据结构是什么,什么是聚簇索引,MyISAM 和 InnoDB 底层的索引结构都一样吗?
事务的隔离级别有哪些,分别都会有什么典型问题存在?
什么是 binlog, 什么是 redolog, 什么是 MVVC,Mysql 是如何能保证 crash safe 的?
索引中的最左原则是什么,什么样的情况下会用不到,什么样的字段不应该加索引?
如何看慢日志,如何分析 SQL 语句性能,如何优化大表?
你们项目是如何使用 Mysql 的,遇到过什么性能问题吗?
II. Redis
- Redis 和 MySQL 都是面试必考题。推荐推荐蒋德钧老师在极客时间的专栏, 「Redis核心技术与实战」。别以为使用熟练就都知道了,深入学习其基本原理,你可能会像我一样眼界大开。
Redis 常用的数据类型有哪些,分别有什么应用场景。
Redis 底层数据类型的底层实现是什么,比如列表的数据结构的底层实现是什么?
简单动态字符串、跳表、压缩表这些都是什么,为什么这么用?
Redis 的持久化方式有哪些,它们各自的优缺点,分别有可能丢数据吗?
Redis 单线程为什么这么快?
Redis 是二进制安全的吗,为什么?
Redis 分片集群是什么,哨兵模式又是什么?
III. Nginx
Nginx 与 Apache 的区别?
PHP 和 Nginx 是如何交互的。客户端发起一个请求,到它收到响应结果,这个过程中发生了什么?
php-fpm 有哪些配置?
IV. Kafka 等
你了解过 Kafka 吗?它有什么特点,解决什么问题?
四. 一些「高级技术」概念
- 有些技术会在某种场景下特别好用,也会使你的程序设计更安全,面试聊起来你也会从容一点:
幂等性、鲁棒性、原子性;
Bitmap、布隆过滤器;
两阶段提交、延迟双删;
Redis 实现分布式锁;
MapReduce;
五. 开发能力&项目经验
- 这里就要靠平时的积累了,集中补是补不上了,平时做开发的时候可以多想一想。我再推荐一下美图CTO唐扬老师的专栏, 「并发系统设计40问」。(PS:我去面试的时候,他推荐给我的 😂)
简单介绍一下项目,你在其中负责什么内容,有什么亮点?
工作中有遇到什么难点,是如何解决的?
项目发展遇到过什么性能问题吗,你项目 QPS 多少了解吗?
项目中用到了什么技术栈,为什么这样选型?
你们项目是如何做迭代开发的?
你如何排查线上问题?
如何设计一个支持高并发的支付系统、如何设计一个抢购系统、如何设计一个发号器?
六. 常见问题
- 这里可以好好准备一些标准回答,也可以站在招聘者的角度,看看你的回答是否能说服自己:
为什么离职?为什么这么短的时间就离职?
如果能回到原来的公司,你会回去吗?
对于新的公司,你最看重什么?
你如何学习?
有什么职业规划?
〇. 个人条件
- 这个我放到最后,你可以与自己的情况做个比较:
1. 先说劣势:
我的技术背景很不好。14年毕业,17年我才从传统行业,自学转行过来做 web 开发,期间经历过三家公司。我经历的几家公司也没有很成规模的,尤其前两家公司是在内蒙古,我最近的一家是北京公司,在网文行业内小有名气,有2款核心产品大概 50w、100w 日活这样,不过只在这家公司待了9个月就离职了(不稳定)。还有就是平时业务开发多,底层知识积累少。
2. 再说优势:
虽然是非 CS 专业,但我学校还不错,是武汉一所 211,这也是很多大厂在我背景不好的情况下,依然能约到很多面试的原因。而且虽然我经历的公司规模都不大,不过没有外包,都是做自己的产品,特别是最后两家,都是做网文产品。并且我很喜欢做开发,也对自己有一些要求,这期间积累的不少实践经验。还有我爱产品,我有热情,我想….进大厂。
复习资料:
LET’S BEGIN A NEW JOURNEY 😗