"C/C++后端开发"这张图,爆了!
大家好,我是唐唐。
今天先给大家看C/C++后端开发的,长文预警,发车~
路线图
开局一张图,内容全靠编,没错,咱们先来看一张全局图,先从总体上有个宏观的认识。
这张图有点大,由于微信对图片压缩的厉害,看不清楚没关系,下面会分割各种小图讲解
我将学习路线分为基础、进阶、拓展三大部分,每一部分又分为两个阶段,总共分为了六个阶段来进行。
第一阶段:基础
在我看来,相对来说,Python、Java这类上层语言是面向业务编程,而C/C++这类底层语言更多是面向计算机编程,所以第一个基础阶段需要补充一些计算机的基础知识,这个阶段我的建议是这样的:
计算机体系架构基础
首先,初学者需要了解计算机的基本常识和最基本的工作原理,像图灵机、冯诺伊曼体系架构,就属于这个范畴。
接着,还需要了解现代计算机的一些基本要素,比如计算机总线系统、数据信息的存储与表示,常见的CPU体系架构与指令集、程序的基本概念、编程语言的发展历史,类型等等。
这一部分的知识,可以参考的书目有:
《计算机组成原理》 《计算机存储与外设》 《深入理解计算机系统》
当然,上面这些书的内容其实有很多,一开始不用太过深入,不用想着把书看完,那是一个巨大的工作量,对新手来说也是不现实的,一开始了解我上面提到的内容就可以了。
Linux基础
上面是偏理论的知识,在这个小节,初学者可以开始来学习使用Linux了,做C/C++后端开发,那必然是要经常与Linux打交道的。
对新手而言,这个小节,主要是学习基本使用为主,旨在从熟悉的Windows切换到陌生的Linux系统,大家可以使用虚拟机软件在里面安装Ubuntu、CentOS来学习。需要学习的有了解下Linux基本的操作,常用的命令,权限管理基本概念,到后面可以使用命令开发一些简单的shell脚本等等。
这一部分的知识,可以参考的书目有:
《鸟哥的linux私房菜》
C语言基础
接下来,咱们可以正式来接触C语言编程了。
C语言是计算机编程的基础,虽然语法本身的知识点并不多,但想要学好,光学会语言本身远远不够,其背后涉及的复杂庞大的计算机系统知识才是大头。在这一个小节,咱们只是迈出万里长征第一步,掌握基本的语法知识,能顺利的编写一些简单程序即可。
这一部分的知识,可以参考的书目有:
《C与指针》
计算机网络基础
第一阶段的最后一部分,是时候来学习一些计算机网络的知识。
作为基础阶段,这一小节主要从宏观上学习计算机网络,而不是死扣某一个协议的某些字段意义。
首先从局域网出发,了解计算机通信的基本网络——以太网,局域网内是如何通信的?集线器、交换机有什么区别?MAC地址、IP地址、子网、子网掩码分别是做什么用的?
随后引出更大的广域网、互联网,什么是网络通信协议,通信协议分层的问题,通过七层和四层模型快速建立起计算机网络的基础概念,各层协议的作用,分别有哪些协议,这些协议在当今的互联网中具体是怎么应用的。
这一部分的知识,可以参考的书目有:
《计算机网络-自顶向下法》 《TCP/IP协议详解·卷一》
第一阶段的学习到此为止,新手通过上面几个基础课程,开始建立起对计算机和编程的初步认知。
第二阶段:基础
第二阶段还是打基础,这个阶段中,一方面在第一阶段之上,进行一些提升,另一方面是继续扩展学习需要掌握的基础课程。
C++基础
有了C语言的基础,这个阶段开始可以进入C++的学习。
基本上所有人都知道,C++是一门很复杂的课程,感觉永远也无法全部掌握。作为基础阶段,这一小节主要的目标是掌握C++最基本的面向对象编程即可。
面向对象的几个基本概念,继承、封装、多态、重载,以及友元、虚函数、引用与指针的区别,RAII编程技法,STL经典容器和迭代器的使用,到这里,能够编写基本的C++程序,能看懂C++项目源码就可。
这一部分的知识,可以参考的书目有:
《C++ Primer》
数据结构与算法
C和C++的基础具备了,是时候来接触一下数据结构与算法了。
这部分内容初学者可能觉得有些枯燥,但千万要顶住,这是每一个程序员必须翻过的一座山。
常用的数据结构都在下面的图中了,首先通过学习数据结构的基本定义,从理论上了解每个数据结构的应用场景,各自的特点。
接着,可以看一下牛客网上的《剑指Offer》和LeetCode,通过刷题来掌握常见数据结构的使用。
这一部分的知识,可以参考的书目有:
《大话数据结构》 《数据结构与算法分析》
编译原理
代码是如何变成CPU执行的指令的?可执行文件是如何构建的?这类问题需要学习编译原理才能了解,做C/C++开发多少需要了解一些编译原理的知识。
数据库基础
基础阶段的最后一部分,可以来接触一些数据库的基础知识了。
这个阶段主要学一些理论知识,重点掌握库、表、索引等概念,然后学习SQL的编写,学会增删改查数据。暂时不用编程来操作数据库。
这一部分的知识,可以参考的书目有:
《数据库系统概念》
第三阶段:进阶
经过前面两个阶段,这个时候你已经具备基本的编程知识,计算机系统、网络、数据库、编程语言、数据结构与算法都打过交道,可以开始比较正式的项目开发了。
接下来,开始进入第三个阶段:进阶。在这个阶段,主要是对之前学习的内容进行提升,学习的内容将更加深入。
操作系统基础
是时候开始和操作系统见面了,有了前面编程基础的铺垫,可以思考我们编写的程序,操作系统是如何来管理运行的。
进程与线程是什么、进程的地址空间布局是什么样的、虚拟内存是什么东西,内核态与用户态又是什么意思,操作系统又是如何如何处理系统调用、中断与异常的,这些知识都藏在操作系统这门课中。
这一部分的知识,可以参考的书目有:
《现代操作系统》 《Linux内核设计与实现》 《Windows内核原理与实现》
C++进阶
前面我们学习了C++基础,但那个时候,还只是停留在入门级,关于C++的高阶知识,在进阶阶段该来安排一下了。
把上面这部分内容掌握了,C++这门语言,你基本就上路了。
这一部分的知识,可以参考的书目有:
《C++沉思录》 《深度探索C++对象模型》 《Effective C++》
线程堆栈
学C/C++,光学语言不行,还得知道程序执行的底层原理。这一小节的内容,可以帮助你深入了解代码和数据在内存中的执行过程和原理,对理解计算机工作原理非常有帮助。
调试技术
一个优秀的程序员,一定也是一个调试高手。调试技术是每个程序员必须掌握的一项技能,这里的进阶内容,建议学习一下软件调试的原理,操作系统和CPU为调试提供的技术支持,GDB常用命令需要掌握,特定环境下排查问题非常管用。
如果有精力,可以简单了解一下汇编语言,在调试时候,如果能看懂汇编指令,也是大有裨益。
这一部分的知识,可以参考的书目有:
《软件调试》 《软件调试的艺术》 《汇编语言》
数据结构与算法进阶
基础阶段接触了常用的数据结构与算法,在进阶阶段将接触一些更加复杂的算法,也是各大公司面试中出镜率极高的内容。
这一部分的知识,可以参考的书目有:
《啊哈!算法》 《算法导论》
第四阶段:进阶
第四阶段,开始全面提升编程能力,这部分的内容都是偏实战化的,也是跟操作系统密切相关的部分,一方面需要继续补充学习操作系统相关的编程知识,另一方面需要通过大量编程和项目实际开发经历来锤炼提升。
网络编程
网络编程,socket编程,各种网络IO模型的区别与底层原理,尤其是epoll模型中的各种细节问题,需要摸得非常熟悉。
多进程与多线程编程
多线程与多进程技术,Linux上的fork机制、pthread线程库、C++的thread库、线程同步技术,这都需要在实际编程中去掌握学习。
进程间通信
多进程必然涉及进程间通信,进程间通信常用的方式有哪些?各自的原理是什么?这也是面试中经常出现的考题。
RPC与序列化技术
网络编程和多进程通信之中常用RPC和序列化技术,业界常用的几大RPC框架和序列化技术都可以学习使用下,比较它们的原理异同,各自的优劣势等等。
计算机网络进阶
学到这个阶段,对计算机网络的学习需要进一步加深。在之前的基础之上,更加专注一些重点协议的实现原理,关键的通信过程,比如TCP、HTTP等这些重点协议是需要重点研究的对象。
在这个阶段,你还需要学习使用抓包软件抓取网络数据包,实际的观察学习网络中的数据,加深对网络通信的理解和认知。
这一部分的知识,可以参考的书目有:
《计算机网络-自顶向下法》 《TCP/IP协议详解·卷一》
第五阶段:拓展
完成前面四个阶段,你完全可以开始开发一些更大型的项目了。在第五阶段,主要是拓展学习一些与后端开发相关的知识。
设计模式
开始接触大型项目开发后,建议补充学习一下设计模式的知识,有助于提升编程架构能力,写出更加优秀的代码。
课本上的设计模式有二十多种,但精力有限的情况下,挑选一些主要经常打交道的即可。
这一部分的知识,可以参考的书目有:
《设计模式:可复用面向对象软件的基础》 《Head First 设计模式》
网络安全
做C/C++编程,建议补充学习一些跟网络安全相关的知识,加解密技术、数字签名技术、常见的软件漏洞原理等等,拓展一下相关的知识面。
计算机底层技术
C/C++因为是比较底层的语言,经常需要与CPU、操作系统这些打交道,经常开发一些系统底层程序,所以了解学习一些计算机底层知识,对自己计算机系统知识的构建非常有帮助,也对将来在工作中遇到实际问题能提供一些更加底层的视角去分析看待问题。
这一部分的知识,可以参考的书目有:
《计算机组成原理》 《计算机存储与外设》 《深入理解计算机系统》
第六阶段:拓展
这个阶段,再来学习一些C/C++后端开发技术栈中经常打交道的第三方组件,比如数据库、缓存系统等等。不仅仅学会使用,还要掌握了解它们的底层原理,这个时候,前面所学的计算机底层知识在这里就能派上用场了。
MySQL
MySQL是互联网中应用非常多的数据库系统,在基础阶段只学习了数据库的理论知识和SQL的用法。
到这个阶段,需要更加深入,研究MySQL的底层原理,索引实现原理、事务实现原理、锁机制等等,不仅能用,还要能在开发大型项目遇到数据库性能问题时,了解原理更好的解决问题。
这一部分的知识,可以参考的书目有:
《高性能MySQL》 《MySQL技术内幕·InnoDB存储引擎》 《MySQL必知必会》
Redis
Redis作为MySQL的好搭档,缓存系统的主流选择,其重要性越来越强了。
除了基本的使用,还需要学习一下Redis背后的原理,内存数据结构如何实现,持久化、高可用、集群扩展、分布式锁如何实现等等问题都值得研究。一方面Redis作为非常优秀的开源软件,其本身就非常值得借鉴学习,另一方面学习背后的实现原理,对实际工作中解决问题也有非常大的帮助。
这一部分的知识,可以参考的书目有:
《Redis设计与实现》
其他第三方组件
除了MySQL和Redis,其他常见的后端开发软件有下面这些,有时间也建议学习下,一边学使用,一边学原理:
总结
以上就是做C/C++后端开发,从新手入门到工作所需要学习的内容整理了,可能并不全面,但掌握以上这些内容足以胜任大部分的岗位要求了。