1. 编程语言
编程语言是实现思想和算法的基础,所有想法最终都需要使用某种语言来实现。由于之前做项目接触过挺多 C++,只是没有系统学习过。再加上本身对底层操作也比较感兴趣,因此选择 C++ 作为编程语言。
豆瓣上评分较高的书有《C++ Primer》,但这本书写的过于全面详细,上来看这么厚一本书不光浪费时间,还容易被劝退。因此可以从《Essential C++ 中文版》入门,看完之后可以对 C++ 有一个大概的了解,之后再看《C++ Primer》,再到《Effective C++中文版》。编程语言相对其他知识来说并不是最重要的,因此在学这部分的时候最好短时间、高强度地啃下来,战线拉太长的话不但会耽误时间,也会影响学习效果。
当然,编程语言的选择要结合自身兴趣和职业规划来确定,这部分学习内容是因人而异的。
2. 数据结构与算法
数据结构与算法在学习内容里非常非常重要! 不但笔试会考查,面试的时候也经常会要求手撕代码。
如果之前没学习过数据结构或是已经忘的差不多了的话,可以看一下《大话数据结构》,书里的内容都是大白话,而且还图文并茂,便于快速了解数据结构相关知识点。
至于算法,推荐看书+刷题结合的学习方式。参考书可以选择《剑指Offer:名企面试官精讲典型编程题(第2版)》,刷题推荐使用LeetCode。牛客网上也有面试速刷TOP101题单,可以配合使用。
《剑指 offer》作为大经典,是一定要刷两遍以上的,很多题都是面试时的原题,里面包含了很多笔试常用的思想方法,需要反复看。此外,刷题还需要不断地总结和回顾才能达到有效刷题。在巩固完弱项的情况下,建议将 LeetCode 前 300 题刷熟练。此外,还可以参考一下《labuladong总结的算法小抄》,对算法的理解很有帮助。
根据我的面试经历,根据个人感觉,公司常考题有:
1. 链表类(链表反转类题目)
2. 二叉树类(二叉树的遍历类型题,最大公祖先类题目)
3. 字符串操作题目
4. dfs/bfs
5. 动态规划(这个考的基本都是 leetcode 上的或者是背包问题,对于动态规划问题其实有很多种类,比较见到的就是一维动态和二维动态),另外还有区间调度类型的题目(贪心算法,也属于动态规划的一种特殊情况。
3. 操作系统
操作系统比较重要的四大模块分别是内存管理 (opens new window)、进程管理 (opens new window)、文件系统管理 (opens new window)、输入输出设备管理 (opens new window)。这是推荐的学习顺序,因为内存管理不仅是最重要、最难的模块,也是和其他模块关联性最大的模块,先把它搞定,后续的模块学起来会相对轻松一些。
B站关于操作系统课程资源很多,比较好的入门课程是清华大学的《操作系统》,课程授课的顺序为「内存管理→进程管理→文件系统管理→输入输出设备管理」。此外还有哈工大的《操作系统》,这个相对清华的更加细节,老师会用 Linux 内核代码的角度进一步讲解操作系统。
当然也可以直接看书,初学者可以先看一下《操作系统导论》,这本书讲的比较浅而且易懂,然后再看《现代操作系统》,看的差不多了,最后看《深入理解计算机系统》。最后这本可以跳着看,有几章节是用纯汇编演示的,不懂的同学粗略看一看也没关系。
4. 计算机网络
入门 HTTP 最好书籍就是《图解 HTTP》了。如果要入门 TCP/IP 网络模型,推荐《图解 TCP/IP》,这本书也是以大量的图文来介绍了 TCP/IP 网络模式的每一层,但是这个书籍的顺序不是从「应用层→物理层」,而是从「物理层→应用层」顺序开始讲的,这一点我觉得不太好。一上来就把最枯燥的部分讲了,很容易就被劝退了。可以先跳过前面几个章节,先看网络层和传输层的章节,然后再回头看前面的这几个章节。
另外,如果想了解网络是怎么传输,推荐《网络是怎样连接的》,这本书相对比较全面的把访问一个网页的发生的过程讲解了一遍,其中关于电信等运营商是怎么传输的,这部分可以跳过。
对于 TCP/IP 网络模型深入学习的话,推荐《计算机网络:自顶向下方法》,这本书从我们最熟悉 HTTP 开始说起,一层一层的说到最后物理层的,有种挖地洞的感觉,这样的内容编排顺序相对是比较合理的。
但如果要深入 TCP,前面的这些书还远远不够,赋有计算机网络圣经的之说的《TCP/IP 详解 卷一:协议》这本书,是进一步深入学习的好资料,这本书的作者用各种实验的方式来细说各种协议,但真的很枯燥。可以只看 TCP 部分,其他部分选择性看。一定要过几遍这本书的 TCP 部分,涵盖的内容非常全且细。
5. 设计模式
可以通过《大话设计模式》入门,对设计原则和常用的设计模式有个印象。在没有商业项目和工作经验的前提下,应届生很难真正熟悉这些。此外也可以找一下别人博客总结的一些知识。
6. 数据库
数据库方面 MySQL 和 Redis 是两个比较常用的数据库。
MySQL 入门推荐《SQL必知必会》,这一本很薄的书,主要是讲数据库增删查改的 SQL 语法,之后看《MySQL是怎样运行的》。MySQL 用的最多的就是 InnoDB 引擎了,进一步学习 InnoDB 是很有必要的,可以看《MySQL技术内幕》。最后稍微看一看《高性能MySQL》(挑章节看,这本书讲的太深,理解起来比较困难)。
最好在学完这些之后自己动手去部署一个 MySQL,然后挑一些小项目做一做。
介绍下 MySQL 的重点知识,也是面试常面的知识点:
1. 基本语法:
select/delete/insert/update、limit、join等
2. 索引:B+树,聚族索引,二级索引,组合索引,最左匹配原则,索引失效、慢查询
3. 事务:事务四大特性ACID,事务隔离级别,MVCC
4. 锁:全局锁、表级锁、行级锁、快照读、当前读、乐观锁、悲观锁、死锁
5. 日志:重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)
6. 架构:读写分离、主从架构、分库分表、数据库和缓存双写一致性
Redis 的话推荐圣经级别的书——《Redis设计与实现》。这本书不是教你如何使用 Redis,而是讲解跟你讲Redis是怎么实现,怎么设计的,也就说源码级别的学习,但是书上并没有大段贴代码,作者是用伪代码的方式来讲解,所以读起来不会太难。书本上主要围绕这几大知识点:数据结构、AOF 和 RDB 持久化技术、网络输入输出系统、主从复制、哨兵模式、集群模式。看完基本就入门 Redis 了,不仅会了 Redis 基本命令,还懂 Redis 的实现,剩下的就是学习如何在实战中运用 Redis。这里推荐《Redis实战》,该书通过实际的例子, 展示了使用 Redis 构建多种不同的应用程序的方法。
7. Linux
Linux 的话可以先看《鸟哥的 Linux 私房菜》,对 Linux 整体有了一些了解之后再看一看《Linux 系统编程》。
走后端方向的话可以看一下《Linux高性能服务器编程》,都是干货。跟着书上做一个服务器相关的项目,会有助于加深理解。Linux 系统的话纯看书可能事半功倍,最好在 Linux 环境下做两个小项目,对整体学习可能更有用处。