我进大厂了

我进大厂了

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,这也是很多大厂在我背景不好的情况下,依然能约到很多面试的原因。而且虽然我经历的公司规模都不大,不过没有外包,都是做自己的产品,特别是最后两家,都是做网文产品。并且我很喜欢做开发,也对自己有一些要求,这期间积累的不少实践经验。还有我爱产品,我有热情,我想….进大厂。


复习资料:

  1. 「设计模式之美」
  2. 「数据结构与算法之美」
  3. 「MySQL实战45讲」
  4. 「Redis核心技术与实战」
  5. 「并发系统设计40问」

LET’S BEGIN A NEW JOURNEY 😗