LinuxC/C++后端技术都要学啥?
在我大学刚毕业的时候,对这个问题也一直很迷茫。
先说下我自身的情况,我本科既不是985也不是211,知乎上称这种毫无存在感的大学为普通高校,学的还是非计算机专业,比起知乎上众多其他网友人均 985,不是 C9 毕业都不好意思说上过大学。
我毕业之后通过自学后端技术进入腾讯做「后端开发」工作
如果你是985、211院校,恭喜你,起点比我高。如果和我一样,不要放弃,看看我,还有机会。
像我这样非科班、无名校光环,经历过自学计算机成功转行软件开发(有想听转行之路经历的话,点赞的人多就写写)的人有,但不是很多。一开始也不愿意分享自己的这段经历,毕竟也没什么光环,但是我深切的体会过,当初想学又不知从何学
起的迷茫,还好最后摸索出了一条正确学习的路线,知道这条路不好走,最终,还是决定,把我这一路摸爬滚打过来的,后端学习经验分享给需要的同学
如果是初学者,可能就想直接问我:从哪里开始学习?
那我就不卖关子,如果你不知道从哪开始学,对于学习路线各个节点,我就按个人的学习经验并结合认识的大厂高 P 给的建议,给你把以上技术路线学习优先级做个排序,你照着学就行,排序规则:
星级越高,排名越靠前,重要程度越高,优先安排时间学习。
计算机基础—— 5星
Linux ——5 星
数据库 ——5 星
设计模式—— 5 星
工具 ——5 星
中间件 ——4 星
分布式 ——4 星
高并发、高可用、高性能 ——4 星
搜索引擎 ——4 星
测试 ——3 星
监控与统计 ——3 星
虚拟化 ——3 星
安全—— 3 星
大数据 ——3 星
学习方向和路线很重要,比起具体的技术细节,可复制的经验、清晰的学习路线,是大部分人更加需要的东西。
朝着正确的方向努力,否则只会离目标越来越远,不是吗?
只顾着写各种技术,不告诉大家这个知识点在后端技术图谱的什么位置,有点盲人摸象不知全貌的感觉,很多在我看来大家都懂的内容,其实只是我以为,信息差是客观存在的,抹平信息差是分享的价值所在。所以我花了半个月时间,整理了一张后端技术学习路线思维导图,来和你聊聊:
要成为一个符合 BAT、TMD 大厂要求的后端技术工程师,到底需要学哪些技术?
后端技术学习路线是怎样的?
这门课程让你了解计算机的组成和工作原理,要学习的内容包括:
数据在计算机中的表示和运算(柠檬说:计算机不识数,只认得高低电平,所以数据在计算机内部都用二进制的0和1表示)
存储系统(数据和程序指令都要存储下来,学习计算机的存储层次,内存、外存、高速缓存、虚
拟存储技术)
指令系统(写的代码最终都要被翻译成计算机指令,指令格式和寻址方式有多种,控制器来控制
指令执行)
中央处理器(也就是 CPU 计算机的大脑,主要构成是运算器和控制器)
总线(计算机的血管动脉,连接计算机各功能组件,用来传输数据、地址信号、控制信号)
输入输出系统(Input/Output 也叫 IO 系统,连接和管理各种外部设备比如键盘、显示器等等)
世界上第一台通用计算机「ENIAC」于 1946 被发明出来,如其名字一样仅仅是用于计算,在后来计算机越来越多,如果没有网络每台计算机都将成为一个孤岛,也不会有现在互联网的繁荣,「计算机网络」这门课程的学习路线非常清晰,就是围绕着如何让地理位置上不同的计算机连接起来,并高效可靠的交换数据信息,实现人在家中做,天下事尽知。
计算机网络有分层次,根据各层属性和特点,分为:
物理层
数据链路层
网络层
传输层
应用层
这个层次划分从上到下就是一个网络数据包的接收路径,反之就是发送路径。既然要交换信息肯定得商量一套通用的协议,就像我们和老外交流,要么他们学中文要么我们学英文,反正得统一出一个标准语言出来,这在计算机网络中称之为「通信协议」。如上述的网络分层,每层都有各自适配的协议,所以计算机网络的学习基本就是围绕着分层协议的学习。
操作系统也是一种软件。你熟悉的微软Windos操作系统,后台开发熟悉的各种发行版的 Linux 系统,都是通过软件的形式安装在计算机上。
只不过这个软件和我们平常接触的应用程序软件不同,它比较特殊,因为它向下和计算机硬件(就是我们在计算机组成原理中学习的那些硬件)打交道,向上给其他应用程序和用户提供通用的交互的接口,说白了操作系统就是个中介和管家的角色。它帮我们做了下面这些事情:
进程管理(你写的程序运行起来才能干活,运行起来的程序称为进程,进程是资源的最小单位)
内存管理(计算机内存又贵又少,动不动又要来个高并发,内存管理大有学问)
文件管理(计算机中的资料和信息需要通过文件系统来保存、管理)
输入输出管理(各种外部设备如何接入计算机和接入之后又如何管理)
数据结构大家最熟悉,即使毫无计算机基础或是想转行计算机,第一个遇到的就是数据结构,因为面试刷的算法题本质上就是对各种数据结构的运用。所以单纯对面试功利的角度来说,数据结构也是必须要掌握的计算机基础,数据结构要学到:
线性表(链表、数组、循环链表)
栈和队列
树和各种二叉树(二叉排序树、平衡二叉树、哈夫曼树、B树、B+树、Trie树)
图(图的存储结构、BFS、DFS、最短路径、最小生成树、拓扑排序、关键路径)
查找算法(二分查找、B树查找、HASH表、KMP字符串模式匹配)
排序算法(插入排序、冒泡排序、归并排序、基数排序、堆排序)
贪心算法
位运算
分治算法
动态规划
好了,计算机基础四大专业课已经大概过了一遍,当然这是我给没有计算机基础同学的实用主义建议,等你学完这四门课程也只能够说入门计算机了,不过这已经比很多人厉害了。如果想真正的了解计算机这门学科,可以等学完了这 4 门基础课程之后,再花写时间挑一些上面培养方案中的课程去学习,做一个知识体系完备的计算机软件后端开发工程师。
在后台开发领域,你所能接触到的后端服务不敢说 100%,至少也有 90% 以上是运行在 Linux 系统之上,因为它开源、便利、功能强大,需要学习以下技术点:
【文章福利】小编推荐自己的linuxC/C++语言交流群:832218493,整理了一些个人觉得比较好的学习书籍、视频资料共享在里面,有需要的可以自行添加哦!~
协程的原理与工程案例
协程的调度器实现
滑动窗口 拥塞控制 满启动
tcp定时器的实现
epoll的源码实现
进程管理与调度
锁与进程间通信
系统调用 如何自己实现一个syscall
物理内存 伙伴算法 2.进程虚拟内存 mm_struct
页的回收与页交换
虚拟文件系统
Ext2/3/4 文件系统
无持久的存储
工具 wrk/ webbench/ loadbalance/valgrind
Google gTest/Memtrack
火焰图/热图
腾讯的Tars
虚拟化的docker
分布式注册中心etcd
P2P 网络穿透 打洞 去中心化的网络
说来惭愧有些我画在导图上的技术我也只是懂点皮毛,但整个后端技术栈的学习路线和方向是没问题的,我都画出来了,大家参考着学习和查漏补缺,在技术上我也需要继续精进学习,咱们共勉。
1、Linux系统编程:《Unix高级环境编程》
2、Tcp/ip:《tcp/ip详解卷一卷二卷三》
3、数据结构与算法:《算法导论》(第三版)
4、性能分析:《性能之巅 洞悉系统、企业与云计算》
5、Linux内核:《深入理解Linux内核架构》(郭旭 译)