Bootstrap

非常详细的 Linux C/C++ 学习路线总结!助我拿下腾讯offer

点击关注上方“五分钟学算法”,

设为“置顶或星标”,第一时间送达干货。


转自后端技术学堂

正文

我的另一篇文章 《腾讯 C++ 后台开发面试笔试知识点参考笔记》整理了 C++ 后台开发知识点,本文尝试从自身学习过程出发,介绍这些技术点的掌握途径和学习路线。

本身我从事的的 C++ 后台开发的工作,目前在腾讯负责产品软件开发,所以写这篇文章,分享自己的 C++ 后台开发学习路径和点过的技能树,希望能给想从事后台开发的同学一点参考,若能帮你少走些弯路就更好。

工欲善其事必先利其器,好的书籍能让学习事半功倍,所以每个技能点之后我会推荐一些书,都是我读过且口碑不错的书,供参考。

分享的是我的学习路径,如果你也能顺着这个学习路径认真学一遍,我想在后台开发技术上你已经有一个很不错的技术积累,加上项目练习通过大部分大厂面试是没有问题的。


计算机基础综合

考过 CS 或者软件工程研究生的同学可能对这个标题不陌生,是的,我说的就是专业课代号 408 的计算机基础综合。这门专业课包含:数据结构、计算机组成原理、计算机网路、操作系统。

为什么提起这门课程呢,因为基础知识太重要了!理论知识不一定马上能用于项目上,但当与人讨论起某个技术问题时你能够知道它深层次的原因,看问题的角度会更加全面和系统。

打个比方:

  • 你可能听过堆栈的名词,但知道它的具体结构和不同吗?学完数据结构就明白了;

  • 你知道计算机会算加减乘除,但具体是如何实现的呢?组成原理会告诉你;

  • 知道程序执行的时候怎么区分指令地址和数据地址的吗?操作系统会告诉你答案。

所以如果你大学不是计算机相关专业,或者是本专业但是没有完全吃透基础的话,强烈建议你务必抽时间好好学习这几门课程。

推荐书:

计算机基础综合推荐看大学的计算机专业教材就可以:数据结构、计算机组成原理、计算机网路、操作系统。

  • 数据结构 

  • 教材:
    《数据结构》 清华大学出版社 

  • 辅导书:
    《算法与数据结构考研试题精析(第二版)》

  • 计算机组成原理  

  • 教材:
    《计算机组成原理》唐朔飞 高等教育出版社 

  • 辅导书:
    《计算机组成原理考研指导》徐爱萍 清华大学出版社 
    《计算机组成原理--学习指导与习题解答》唐朔飞 高等教育出版社  

  • 操作系统 

  • 教材:
    《计算机操作系统(修订版)》汤子瀛 西安电子科技大学出版社  

  • 辅导书:
    《操作系统考研辅导教程(计算机专业研究生入学考试全真题解) 》电子科技大学出版社 
    《操作系统考研指导》清华大学出版社 

  • 计算机网络 

  • 教材:
    《计算机网络(第五版)》谢希仁 电子工业出版社  

  • 辅导书:
    《计算机网络知识要点与习题解析》哈尔滨工程大学出版社 

视频教材

看上面的课本教程估计非常枯燥,下面是我觉得讲的不错的国内大学公开课我听过一部分,讲的都是计算机专业的基础内容,如果你没有系统的学过或者学的不好,都是非常建议刷一遍视频课的。

  • 武汉大学 —— 数据结构 MOOC 网络课程

  • 华中科技大学 —— 计算机组成原理

  • 电子科技大学 —— 计算机组成原理

  • 华中科技大学 —— 操作系统原理

  • 哈尔滨工业大学 —— 计算机网络

这一小节写的有点多,因为基础实在是太重要了!科班和非科班的差距不是谁学的编程语言多,也不是谁框架用的溜,本质区别是理论知识储备差别和用 CS 思维独立思考分析解决问题的能力。


C++和C语法基础

语法是一门语言的基础。 C++ 的基础语句和语法和C是很像的,最大的不同在 class 和异常处理机制,还有模板的应用,所以有 C 基础语法学起来是很快,没有 C 基础也没关系,啃完下面推荐的书也差不多,光说不练假把式,看完之后趁热把课后习题敲一遍并且自己编译通过才算看完。

推荐书:

《C++ Primer 中文版(第 5 版)》

经典的入门书籍,不要拿大学教材 XX 强来对比,不是一个等级。


标准库STL学习

STL 提供了丰富的算法库支持和各种容器。 C++ 标准库提供了包括最基础的标准输入输出iostrem、各种容器vector、set、string ,熟练掌握标准库,不用重复造轮子(练手学习目的的造轮子除外)写出更C++的代码。

推荐书:

《C++ Primer 中文版(第 5 版)》

《STL源码剖析》


C++进阶

学完了上面的C++基础只是会用,要用好还需要不断学习进阶。站在巨人的肩膀上写出更健壮高效的代码,你没踩过的坑前人已经踩过一遍,关于一些语言细节和更好的编码习惯,有很多优秀的书籍可以学习。

推荐书:

《Effective C++》

改善程序与设计的55个具体做法,非常值得一看,老手和新手的差别由此产生!

《More Effective C++(中文版)》

同一个作者,继 Effective C++ 之后,Scott Meyers 于1996推出这本《 More Effective C++ (35个改善编程与设计的有效方法)》“续集”。条款变得比较少,页数倒是多了一些,原因是这次选材比“一集”更高阶,尤其是第5章。Meyers 将此章命名为技术。

《深度探索C++对象模型》

大厂爱问对象的模型


C++11新标准

新标准提供了解决现有问题更优雅、更 C++ 的实现。现行的大部分 C++ 软件还是 C++98 的标准,C++98 是 C++ 的第一个标准,经历这么多年的发展,从前你需要从Boost库(一个在 C++98 年代的准 C++ 标准)获得的对 C++ 的扩充支持的大部分功能已经纳入了 C++11 和甚至 C++2X 更新的标准当中,与时俱进拿起更先进的生产工具,工具就是效率。

推荐书:

《深入理解C++11》


Linux 系统基础和 shell script

如今几乎所有的互联网服务都是跑在linux系统上面的。对 Linux 系统一无所知那更加谈不上后台开发了,所以要先学习 linux 系统操作,比如文件管理,系统命令,文件系统,权限管理,系统服务等。

至于 shell script 就类似win的批处理脚本,相信我,你在 Linux 下干活早晚会需要它,所以趁早系统学起来。

推荐书:

《鸟哥的Linux私房菜基础学习篇》这个系列还有一个服务器架设篇,前期学习个人感觉没必要看

《Linux Shell脚本攻略》

《Shell脚本学习指南》


Linux环境高级编程

普通用户只需懂系统操作,软件开发人员还要懂编程接口。上一阶段你已经能够完成熟练操作 Linux 系统,知道一些常规的系统命令和服务,并且能够利用 shell script 写一些小工具提高日常开发效率。

我们的目标是星辰大海,作为软件工程师,还需要更加深入的掌握 linux 系统编程技巧,学习系统编程接口、系统调用 API 、内存管理、进程间通信( IPC ),这是本阶段的学习目的。

推荐书:

《UNIX环境高级编程》

这本是 linux 编程必看的 APUE,强烈推荐通读一遍,后续值得反复翻阅。

《Linux/UNIX系统编程手册》

这本书和 APUE 有点重复,我看完 APUE 这本就跳着看了,平常可以看目录查阅。


TCP/IP协议

目前网络通信中应用最广泛的协议就是 IP TCP 协议,后面 Unix 提供的 TCP 套接字也是基于协议实现,所以很有必要系统的学习 TCP/IP 协议。

推荐书:

大学的计算机网络教程

《TCP/IP详解 卷1:协议》

《TCP/IP详解 卷2:实现》

《TCP/IP详解 卷3:TCP事务协议、HTTP、NNTP和UNIX域协议》

这几本书很厚,可以先看卷1、卷3


Linux网络编程套接字

在同一台机器上进程间的通信(IPC)有多种方式,可以是通过消息队列、FIFO、共享内存等方式。网络编程套接字是指:分布在不同机器上的程序通过系统提供的网络通信接口,跨越网络将不同机器上的进程连接起来,实现跨机器的网络通信。一般有UDP套接字、TCP套接字,当然,如果你是通信从业者对 SCTP 套接字肯定也不会陌生。

推荐书:

《UNIX网络编程 卷1:套接字联网API(第3版)》

《UNIX网络编程 卷2:进程间通信(第2版)》


数据库和存储

程序运行数据都在易失性的内存中,需要持久化存储时就需要数据库。一个后台服务系统一般来说都需要考虑数据落地和持久性存储的问题,这时就会涉及到数据库选型和应用,数据库分为关系型数据库和非关系型数据库。

关系型数据库:指采用了关系模型来组织数据的数据库,代表是 MySql。
关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。

非关系型数据库:以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,不局限于固定的结构,可以减少一些时间和空间的开销。代表有redis、memcached,腾讯内部组件 ckv 也是非关系型数据库。

推荐书:

《SQL必知必会》

《高性能MySQL》

redis官方文档

关于redis还有很多应用,比如基于 redis 的分布式锁的应用,高并发抢红包模型等.


算法基础

计算机算法就是利用编程语言编写出计算机能理解的解决问题的方法。

好的算法能更简洁高效的解决问题,如今不论是校招还是社招,大厂笔试都会考察算法,即使不是为了笔试作为软件从业者也应该经常练习算法,保持手感。学习算法是学习解决问题的通用性方法有助于提高逻辑思维能力。

学习方法

就我个人经验来说,不推荐直接啃书的方式学习算法,建议看书的同时结合刷在线编程算法题的方式。

具体的:边看数据结构或算法导论,同时在牛客或者 leetcode 上刷题,因为看书太枯燥很容易失去耐心,在线刷题的好处是你可以每天定目标,享受每个题目通过的快感,有正向反馈更容易坚持下来。


架构能力

架构能力是利用已有知识来设计整个后台服务系统的能力。不仅要求掌握技能的维度还要深度,需要能根据不同需求和系统约束,制定不同的设计方案。

这时候考虑的东西会更多,包括服务模型的设计:是多进程还是多线程甚至协程微线程,分布式还是集中式;

存储的选型:考虑数据库选型用哪个?需要根据存储的数据特征和应用场景来区分,如果是社交应用的数据用非关系型数据库来存储可能更好,如果是电商订单类型的数据,那么用关系型数据库来存储可能更好;

当然,还有后台系统的其他方方面面需要考虑,不一一举例了。


更多的练习

说了这么多,最最重要的还是练习练习练习。理论知识储备是必要条件,移动互联网时代大家接触到的碎片化信息太杂太乱,我个人经验,高浓度的知识精华还是需要在大师的书本中汲取,所以看书是最正确和快速的学习路径,没有捷径可走。

不过光看书也是不行,编程能力和技术是也是一门现代手艺活,还需要日常不断的打磨手艺,正如一万小时定律

人们眼中的天才之所以卓越非凡,并非天资超人一等,而是付出了持续不断的努力。1万小时的锤炼是任何人从平凡变成世界级大师的必要条件。要成为某个领域的专家,需要10000小时,按比例计算就是:如果每天工作八个小时,一周工作五天,那么成为一个领域的专家至少需要五年。这就是一万小时定律。

怎么打磨提高编程技术能力呢?找项目,找感兴趣的东西用代码去实现它,兴趣是最好的老师,这点在编程和技术学习上也完全适用。

人们总倾向于去做快速获得的愉悦感的事情,比如打一盘游戏 30 分钟就能获得快感。相反,技术碎片的提高是一个长期的过程,三分钟热度肯定是难以成功的。

所以要用技术做自己感兴趣的东西和带趣味性的编程,比如写个爬虫小程序抓取网站数据或者写个小游戏,再或者自己造轮子给自己用,并乐此不疲的优化轮子。这样每走一步都能获得一点成就感,激励自己继续走下去,慢慢的一定会有质的飞跃。


一个网站

这个网站一定要告诉大家,网站就是个 C++ 百科全书,类似 Linux 的 man 手册,平常开发查忘记了函数名或者容器用法直接搜索非常方便。

网址:C++参考:  cppreference

推荐阅读:
一个我超喜欢的动态博客系统,五分钟即可部署上线!

作为计算机专业学生,最应该学习的课程前五位是什么?

为什么魂斗罗只有 128KB 却可以实现那么长的剧情?
作为计算机专业学生,最应该学习的课程前五位是什么?

;