工作了几年,面试了国内的很多大厂,在拿到了阿里、百度、拼多多、微软等一系列大厂的Offer之后,我总结了一些经验,发现认真准备简历和面试是非常重要的,因为每家公司的面试风格都是有迹可循的,掌握好这些信息加上充足的准备,大厂Offer不是梦!!!
1. 知己知彼 - 了解你面试的公司
不同的公司乃至部门,面试的流程和着重点都有颇大的差别。国内以腾讯为例,微信部门与深圳总部的面试流程和着重点就不一样。微信一面的时候需要五十分钟内手写 4 道偏简单的算法题,但是在深圳总部面试的时候一面却是没有算法题,两小时的考卷。更多的是与面试官聊技术与项目经验。国外的话,甲骨文五轮的面试可能四轮是系统设计,一轮是算法。亚马逊虽然注重算法,但是非技术问题在面试中占比非常高。你首先需要知道面试中考察什么内容之后才去开始准备,这块可以参考网上的技术面试题。
2. 全力准备 - 根据面试时间有的放矢
面试准备不能无休止地进行下去,因为计算机知识永远都学习不完。可以给自己设立一个时间点,在时间点之后就开始投简历进行面试。在面试之前,根据时间长短制定不同的面试策略,比如有一年时间,你可以仔细研究下面我提到的几个技术方向,然后多花些时间深入学习准备。但是如果你只有1个月时间,那肯定计划上要做调整, 主要就面试考察重点进行复习,有的放矢,在最后我会给出一份283页的紧急面试宝典,以Java语言为基础,涵盖了语言基础、中间件、计算机网络、数据结构等方方面面的内容,有需要可以联系我。
3. 面试基础知识
基础知识主要包括:编程语言基础,第三方工具基础(框架,中间件等),算法与数据结构,计算机网络,操作系统,数据库。 下面我举几个常见的例子:
3.1 编程语言基础
比如对于Java程序员而言,如下是一些基础的语言面试题:
- 数据结构的实现细节以及比较: 数组,链表,哈希表是如何实现的,底层内存分配是怎样的?插入与查找的时间复杂度是多少,分别有什么优缺点。
- 编程语言特性: Java 的字符串池是怎么实现的,垃圾回收的流程以及原理。
- 关键字特性: 包括 Java 中的 static,final,Python 中的 init 关键字的含义以及使用场景。
- 面向对象的细节: 类的封装,函数与变量继承,抽象类和接口有什么区别等。
- 多线程与多进程: 线程如何同步,进程如何同步,wait() 函数使用场景以及常用的并发编程模式。
3.2 第三方架构
- 整体架构: 这个工具整体的架构是怎样的?主要由哪几个部分组成,它们之间是如何通信以及合作的。
- 使用场景: 这个框架适合于什么使用场景?为什么选它作为项目实现? 多种方案之间的对比如何选型?
- 实现原理: 核心功能是如何实现的?对比另外一款工具做了哪些优化以及改进。
3.3 算法基础
这方面不用说,在我之前的分享中也强调过很多次,是面试准备中的重中之重,一定要多花时间来积累算法经验,培养解题的感觉。
- 算法题: 链表操作,二分查找,动态规划,DFS,BFS 等(可以使用 Leetcode 来进行学习)。
- 算法复杂度的分析: 时间复杂度,空间复杂度,平均时间复杂度。
- 数据结构的实现: 实现二叉查找树,AVL树。
这块我后面会具体分享,如何快速提高刷题效率和培养解题思路和感觉。
3.4 计算机网络
计算机网络作为程序交互的基础,也是考察的重点,但是以基础概念为主,需要掌握主要的协议内容等。
- 协议的基础组成与用途: HTTP 协议中不同头部,方法,状态码的含义。
- 协议的使用场景:DNS 协议,ARP 协议,SSH 命令的使用场景以及原理。
- 不同协议的区别: TCP 与 UDP 的区别,HTTP 与 HTTPS 的区别。
- 协议具体功能实现: TCP 三次握手原理,TCP 慢启动以及滑动窗口的原理与实现方式。
3.5 操作系统
虽然我们不需要去开发操作系统,但是掌握操作系统的知识,对后续研究程序的性能优化非常有帮助。这种属于程序员的内功,决定了你的上限在哪里。
- 操作系统基础概念: 进程,线程,虚拟内存,文件权限,信号量等概念考察。
- Shell 的基础使用: ls, find, top, ps 等命令的应用与原理。
- 常见功能的实现: 进程调度,用户态与内核态的切换,系统调用的实现方式,select, epoll 的实现以及区别。
- 常用函数的实现: memcpy,strcpy,strstr 等常用库函数的实现方式与优化。
3.6 数据库
只要是涉及到状态记录的程序,我们都需要用到数据库。常见的数据库有MySQL、NoSQL等等,我们至少得了解基本的概念以及如何编写高效的SQL语句。对于高级程序员,可能需要进一步了解如何分库分表、主从架构等一系列进阶内容。
- 基本概念: 事务,存储引擎,隔离级别,索引等概念考察。
- 数据库基准测试与性能分析: 基准测试的策略,性能剖析工具的使用和分析。
- 数据库设计与优化: 范式和反范式,索引的类型,如何选择合适的索引,如何使用硬件优化。
- 数据库原理及高级特性: 数据库分区分表,存储过程的使用,全文索引,主从热备等常用策略的使用与原理。
4. 总结项目经验
4.1 公司的项目
简历中提到的项目需要认真回顾一遍,常见的问题包括: 1)这个项目遇到了什么技术难点,你是如何解决的? 2)这个项目你学习到了哪些技术知识点?
即使你在项目做的只是一些看起来非常基础的工作,例如数据库的增删改查。你也可以通过在复习的时候深挖原理以及要点来展现能力 ,例如写入数据的时候如何防止丢失,如何保持最终一致性,要扩展的话如何分库分表?会增删改查的虽然多,但是懂得上面问题答案的求职者却很少,有了这些过硬的基础知识,面试官可能也会对你刮目相看。由于每个人对于每个系统的理解都不一样,涉及的业务以及遇到的问题也各不相同,所以面试中引导面试官向自己熟悉的技术点提问也非常重要了
4.2 参与的开源项目或自己写的项目
如果有参与过一些著名的开源项目那么当然是很好,曾经阅读过它的源码,知道一些核心功能的实现原理也是加分项。自己的项目最主要是突显技术能力,能够说出自己遇到的一些问题是如何通过分析来解决以及优化的话,能够极大地提高印象分。
比如我之前写过一个基于ES、SpringBoot和Vue的搜索网站,主要用于搜索知乎上发的征友信息。这个项目完全是我的个人项目,只是想把学到的知识实践一下,当时在面试的时候面试官也非常感兴趣,提出了很多相关的问题。所以我想说很多时候,如果公司的项目并没有那么的挑战性,可以自己在平时去尝试做一些技术的实践,一方面加深技术理解,另一方面也可以写在简历上,丰富自己的项目经验。
5. 模拟面试
在这一块,我自己的经验是把常见的面试题拿出来,自己对着过一遍,看是不是能很快把答案脱口而出,如果做不到,那就需要针对薄弱环节再进行多轮复习,直到对常见的面试题都能对答如流的程度。
以下是我总结的一些面试重点,里面总结了语言基础、常见的面试题、中间件、数据结构等面试的方方面面,方便大家在面试前能快速复习,提升效率。
更多信息参考:如何快速准备技术面试
欢迎关注【码老思】,第一时间获取更多技术干货!