研发类面试复习指南
简介
本站会尽量给出一个研发类的复习全景,尽量涵盖面试中可能会遇到的基础知识。本文为复习内容的总揽,同时提供了一个思维导图的版本,包含更细节的知识点,这部分的知识点也会在各条目的专题介绍中详细展开。
本人的技术栈以后端为主,因此后端部分的知识点会更加详细。同时,我也会尽量联系从事前端、测试、运维等其他技术栈的朋友,补充各个技术栈的复习指南。
对于复习时间不是很充分的同学,建议参考以下优先级复习:
- 基础知识:这部分内容是面试中的高频考点,几乎一定会被问到,建议优先复习,确保理解并掌握。
- 进阶知识:这部分内容是一些进阶知识点,不要求全部掌握,但与自身技术栈强烈相关的部分要牢记并理解。这是拉开候选人差距的关键。
- 高难考点:这部分内容如果能掌握最好,但不是必须的,包含一些深入的理论和技能。能掌握这些内容会在面试中大大加分。
思维导图
最后更新时间:2024 年 7 月 5 日
复习大纲
1. 基础知识
1.1. 数据结构
数据结构是软件行业的基础之一,极其重要,不论是面试还是工作都需要掌握。重点内容包括:
- 掌握常见数据结构的定义与特点
- 了解不同数据结构的应用场景
- 掌握数据结构的基本操作
- 掌握数据结构在主修开发语言的实现方式
1.2. 算法
算法的考察形式通 常为手写算法题,并且要掌握解法的时间复杂度与空间复杂度。由于是手写,因此需要注意以下几点:
- 理解题意:首先要仔细分析问题。如果有不清楚的地方,需要及时与面试官沟通
- 解题思路:理清题目的解题思路。手写代码较难更改,因此可以先写出问题的思路或者伪代码,不断调整实现方式。也可以与面试官沟通询问,确认思路是否正确
- 代码风格:代码风格要尽量规范,包括命名、缩进、注释等
有一些刷题网站可以帮助大家提升算法能力,例如 LeetCode、HackerRank 等。这里推荐优先刷以下内容:
1.3. 计算机网络
计算机网络作为现代互联网行业的基础,除了面试之外,在实际工作中也有很多应用之处,强烈建议理解并掌握网络相关的核心概念。
重点推荐的题目:《在地址栏输入一个链接会发生什么》,基本涵盖了网络的核心概念。
其他的一些关键知识点:
- OSI 七层模型 vs TCP/IP 四层模型
- TCP 与 UDP
- DNS
- HTTP 与 HTTPS
- 待补充
1.4. 操作系统
1.5. 编译原理
编译原理作为 CS 领域的基础知识,但是实际开发工作中用到的并不多,因此优先级较低,可以针对常见的面试题重点复习一下。
- 抽象语法树
2. 开发语言
语言因个人喜好而已,这里仅从岗位数量上介绍一些常见的语言。如果对某种语言有特殊喜好,并且也了解有公司在招聘,依然可以去学习不在列表中的语言。
2.1. Java
Java 可能是国内互联网公司使用最多的后端语言。虽然近些年有公司开始转向 GoLang,但是每年依然会有大规模的 Java 岗位放出。如果想走后端,又对编程语言没有明确的倾向,那么 Java 就是首选。
Java 常见的考点有:
- 集合
- 范型
- JUC 工具类
- JVM
- 待补充
2.2. GoLang
GoLang 是服务端语言的后起之秀,凭借着对服务端、异步、多线程等功能的良好支持,目前也 是互联网公司的主流语言之一。
2.3. Python
从应用开发的角度,Python 作为解释型语言存在一定的性能劣势,岗位可能相较 Java 和 GoLang 会少一些。但是在数据分析、人工智能领域,Python 有着无可替代的优势。在 AI 火热的当下,Python 就是相关行业的首选。
由于本文会侧重于开发岗位,类似数据、AI 等领域不会在本文中详细展开,因此列出的考点也是针对开发岗位的 Python 知识。
- Python 基础语法
- Python 高级特性
- Python Web 开发框架(Django、Flask)
2.4. TypeScript, Vue, React
这三个放在一起将,因为它们三个从不同的领域改变了前端的生态。
TypeScript 可以说是升级版的 JavaScript,提供了类似 Java、C# 等强类型语言的特性,在 JavaScript 的基础上更健壮易维护,更适用于大规模服务的开发。
在 TS 的基础上,一些前端框架也简化了应用开发流程,最具代表性的就是 Vue 和 React。Vue 在国内市场占有率极高;而在海外市场,更多的则是使用 React。
3. 系统设计
3.1. 面向对象程序设计
软件开发某种程度上是对现实世界的抽象。当我们设计一个系统时,需要对我们的需求进行解耦与建模,这一步做的事情就是“面向对象对象的程序设计”。所谓对象,就是我们的需求建模的结果。
面向对象也有很多的“范式”可以遵循,但是最重要的还是要理解自己所面对的需求。
举例一个我实际遇到的面试题,来自阿里巴巴:《设计一个奶茶店》。
更多的面向对象内容也可以参考本站后续更新。
3.2. 设计模式
设计模式是一个经久不衰的考点,而且在实际工作中也有很多应用场景。熟练掌握设计模式,可以帮助我们写出更佳优雅的代码,增加代码的可读性和可维护性。
有时间的话,建议掌握全部的设计模式,当然时间不充裕的话,也可以优先复习以下几种设计模式:
- 单例模式
- 工厂模式(简单工厂、工厂方法、抽象工厂)
- 策略模式
3.3. 分布式系统设计
分布式系统设计属于高难考点,理解起来存在难度,学习与工作中又未必会遇到大规模分布式的场景。但是很多分布式系统 的设计理念、架构十分精妙,对于我们自己进行系统设计也有很大的帮助。
分布式系统设计的核心内容:
- CAP 理论
- Raft
如果时间充裕,强烈建议学习 MIT 6.824 课程,这是一门非常优秀的分布式系统课程,当然难度也很高,里面的 Lab 也可以充当简历中的项目。
4. 工具与框架
4.1. 版本控制
版本控制工具有很多,但是使用最广的无疑是 Git。重点掌握以下内容:
- 熟练掌握 Git 的使用,尤其建议通过命令行操作 Git,是我心中“界面”最好的命令行工具
- 复习时间充裕的话,可以了解一下 Git 的原理
- 如果缺少个人项目,可以在了解 Git 原理的基础上,尝试自行实现一个 Git,会是简历中的加分项
相关内容可以查阅本站提供的:超简明 Git 指南
4.2. 构建工具
构建工具了解日常使用即可,感兴趣的话可以了解一下实现原理,但是优先级不如 Git 的原理高。
- Maven
- Gradle