C++相较于其他编程语言而言,学习门槛略高,主因在于其学习路径不够明确,缺乏像Java那样丰富的学习资源。然而,在众多大型企业中,如腾讯、百度、阿里云、网易和华为等,C++岗位的需求量与Java相仿。以下是我个人的C++与Linux后端学习路线和阅读方法的分享,希望能为大家提供一些参考。
让我们C++起飞!
C++基础知识学习
对于初学者,建议通过B站的C++教学视频辅助《C++ Primer 第五版》进行学习。
在B站搜索C++学习视频,推荐黑马程序员的教程。
《C++ Primer 第五版》是学习的好书。
当涉及到选择《C++ Primer 第五版》和《C++ Primer Plus 第六版》时,如果只能选择一本,我个人推荐《C++ Primer 第五版》。
《C++ Primer 第五版》对于初学者而言可能稍难,因为某些章节知识点跳跃。但其讲解深入透彻,配合视频学习效果更佳。读完一遍后,该书可作为参考书或工具书,遇到不懂的问题时查阅总能找到启发。
《C++ Primer Plus 第六版》讲解较为连贯,不太跳跃。主要基于C++98/03讲解,C++11相关内容大多放在附录中,且介绍不够深入。我个人在阅读完此书后,又重新购买并阅读了《C++ Primer 第五版》,才真正入门C++。
选择任何一本书都建议与视频教程结合,因为仅靠阅读书籍可能会感到枯燥。如果时间紧张,建议根据自己的基础跳过某些章节直接学习C++部分。
C++11及以上版本
C++11是对C++进行的重大更新,不仅使使用C++更安全、更便捷,也是校招中的重点考查内容。推荐阅读以下三本书来学习C++11及以上版本的新特性:
《深入理解C++11:C++11新特性解析与应用》
《Effective Modern C++》
《Modern C++ Tutorial》
如果时间有限,建议优先阅读重要知识点,然后再补充其他细节。
C++进阶学习
为了提升C++内功,推荐以下三本书:
《深度探索C++对象模型》:尽管这是一本较旧的书籍,但内容依然适用,能显著提升C++的内功。如果时间紧张,可以仅阅读前四章。
《Effective C++》和《More Effective C++》:这两本书能帮助你了解如何正确且更好地使用C++。
《STL源码剖析》:建议阅读,可以深入了解STL的实现原理,不仅涉及各种数据结构的实现,还包括一些设计模式和模板知识。
这些书籍内容可能偏硬核,均由侯捷翻译。如果感觉枯燥,可以配合侯捷的视频教程一起学习。
操作系统(OS)与Linux
推荐两本书《深入理解计算机系统》和《程序员的自我修养-链接、装载》,它们能帮助你从编译器的视角理解C/C++语言规则。如果准备时间有限,可以选择不阅读《程序员的自我修养-链接、装载》。
进入Linux后端开发之前,需要学习Linux系统编程和网络编程。无疑,《UNIX环境高级编程》和《UNIX网络编程》是必读的书籍。但这两本书篇幅较长,对初学者不太友好。我的学习方法是:
首先阅读列出的重点章节,其余章节在需要时再看。
结合视频学习,推荐黑马程序员的Linux全套视频及Linux网络编程视频,可以选择性观看。
对于搭建Linux环境,有两种方法:
在Windows中安装WSL2,并在VSCode中安装Remote-WSL插件,直接在WSL环境下使用VSCode,非常便捷。
如果需要调试网络功能,如tcpdump等,可以使用虚拟机,并通过VSCode的Remote SSH插件远程连接。
后端开发
具备了C++和Linux后端开发的基础后,可以开始学习服务器开发相关知识:
《Linux高性能服务器编程》:游双老师的这本书深入剖析了服务器设计的各个要点,很多面试题也会涉及到这些内容,强烈推荐。
开源项目《Muduo》及其讲解视频:陈硕老师的Muduo项目在设计上遵循了《Linux高性能服务器编程》的原则,B站有逐行代码讲解视频,虽然音质可能稍差,但内容非常丰富。
后端进阶
RPC:如果你对RPC感兴趣,可以从jsonrpc开始学习,进一步了解brpc的设计,如协程设计等。
Redis:如果时间允许,可以深入学习Redis的源码。《Redis设计与实现》和《Redis 5设计与源码分析》是推荐的学习资源。
数据结构与算法
推荐《算法》一书和清华大学邓俊辉老师的《数据结构与算法》课程。
LeetCode刷题:建议至少完成前300道题目,重点是《LeetCode精选TOP面试题》。
剑指Offer:至少复习2遍,熟悉其中的题目,这对于获取offer至关重要。
计算机网络
- 如果时间允许,可以阅读《TCP/IP 卷一》。但如果时间紧张,可以跳过,因为上述推荐的书籍和代码中已包含了必要的TCP/IP知识。
工具使用
- 学会使用cmake和gdb,这对于开发和调试非常有帮助。
最后的建议:学会使用Markdown进行笔记记录,这对于学习过程中的知识整理非常有用。