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