跳到主要内容

研发类面试复习指南

简介

本站会尽量给出一个研发类的复习全景,尽量涵盖面试中可能会遇到的基础知识。本文为复习内容的总揽,同时提供了一个思维导图的版本,包含更细节的知识点,这部分的知识点也会在各条目的专题介绍中详细展开。

本人的技术栈以后端为主,因此后端部分的知识点会更加详细。同时,我也会尽量联系从事前端、测试、运维等其他技术栈的朋友,补充各个技术栈的复习指南。

对于复习时间不是很充分的同学,建议参考以下优先级复习:

  • 基础知识:这部分内容是面试中的高频考点,几乎一定会被问到,建议优先复习,确保理解并掌握。
  • 进阶知识:这部分内容是一些进阶知识点,不要求全部掌握,但与自身技术栈强烈相关的部分要牢记并理解。这是拉开候选人差距的关键。
  • 高难考点:这部分内容如果能掌握最好,但不是必须的,包含一些深入的理论和技能。能掌握这些内容会在面试中大大加分。

思维导图

最后更新时间:2024 年 7 月 5 日

研发类面试复习指南思维导图

复习大纲

1. 基础知识

1.1. 数据结构

数据结构是软件行业的基础之一,极其重要,不论是面试还是工作都需要掌握。重点内容包括:

  1. 掌握常见数据结构的定义与特点
  2. 了解不同数据结构的应用场景
  3. 掌握数据结构的基本操作
  4. 掌握数据结构在主修开发语言的实现方式

1.2. 算法

算法的考察形式通常为手写算法题,并且要掌握解法的时间复杂度与空间复杂度。由于是手写,因此需要注意以下几点:

  1. 理解题意:首先要仔细分析问题。如果有不清楚的地方,需要及时与面试官沟通
  2. 解题思路:理清题目的解题思路。手写代码较难更改,因此可以先写出问题的思路或者伪代码,不断调整实现方式。也可以与面试官沟通询问,确认思路是否正确
  3. 代码风格:代码风格要尽量规范,包括命名、缩进、注释等

有一些刷题网站可以帮助大家提升算法能力,例如 LeetCodeHackerRank 等。这里推荐优先刷以下内容:

  1. LeetCode Hot 100
  2. LeetCode 官方刷题路线

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。重点掌握以下内容:

  1. 熟练掌握 Git 的使用,尤其建议通过命令行操作 Git,是我心中“界面”最好的命令行工具
  2. 复习时间充裕的话,可以了解一下 Git 的原理
  3. 如果缺少个人项目,可以在了解 Git 原理的基础上,尝试自行实现一个 Git,会是简历中的加分项

相关内容可以查阅本站提供的:超简明 Git 指南

4.2. 构建工具

构建工具了解日常使用即可,感兴趣的话可以了解一下实现原理,但是优先级不如 Git 的原理高。

  • Maven
  • Gradle

4.3. 数据存储

面试中的重点考察部分。数据是系统的核心,数据应该以什么样的形式存储、如何存储、如何查询、如何保证数据的一致性等等,都是软件开发中的核心问题。

下面列举了一些常见的数据存储服务,建议了解每种工具的常见使用场景、优缺点、原理等,要做到给定一个数据存取场景,知道选用何种工具,以及为什么选用这种工具。

  • MySQL
  • PostgreSQL
  • Redis
  • MongoDB

4.4. 容器化技术

容器化是近年来非常火热的技术,容器化技术以及后续的 Kubernetes 等技术,开启了云计算的新时代。

由于云计算本身综合性极强,涉及到网络、存储、操作系统、虚拟化等多个领域,而且在校园中应用的场景有限,因此优先级较低。

有时间的话,可以优先了解 Docker 的使用与基本原理。

  • Docker:建议了解 Docker 的基本使用,对于日常的开发与环境的搭建有很大帮助
  • Kubernetes:容器编排技术,涉及内容很多,感兴趣可以了解一下基本的概念与使用

4.5. 开发框架

开发框架可以极大的简化日常的开发工作。虽然初学开发框架可能会接触到一大批新的概念,但是考虑开发框架是用来简化开发的,稍微学习之后,会发现各种开发框架其实很好上手。

在了解了各种框架的基本使用后,更重要的是了解框架的设计思想与核心组件的原理,甚至可以尝试自己实现一个简单的框架。

开发框架是面试中拉开候选人差距的关键,决定性的因素就是对框架原理了解的是否透彻,以及是否有相关经验(使用 or 实现)。

以下介绍了一些 Java 常见的开发框架,不同语言可以根据自己的生态,自行选择。

  • Spring
  • Spring Boot
  • Hibernate
  • MyBatis