作者:解学武
C/C++后台开发学习路线(超级详细,新手必看)
后台开发又称服务端开发,后端开发一般指的也是它。
“前后端分离”是现阶段非常热门的一种开发方式,简单来说就是将一款应用的实现代码分为前端代码和后台代码两部分:
举个简单的例子,微信的聊天界面就是由前端代码呈现给用户的,而聊天功能由后台代码负责实现。
负责开发前端代码的程序员称为前端工程师,负责开发后台代码的程序员称为后台工程师,前端和后台都能 hold 得住的程序员称为全栈工程师。
C/C++ 能做的事情有很多,比如后台开发、游戏开发、嵌入式开发、界面开发等等,对于想扎根在 C/C++ 方向、尤其想进大厂的小伙伴,建议优先选择后台开发方向。
和其它开发方向相比,C/C++ 后台开发岗位的薪资是非常客观的。其次 C/C++ 后台开发有技术深度,轻易触摸不到天花板,只要你持续进步,不躺平摆烂,就能走出内卷成为卷王,不需要担心 35 岁中年危机的问题。
支持后台开发的编程语言有很多,比如 Java、C/C++、GOlang、Python、PHP 等。每个公司都有自己主打的后台开发语言,比如腾讯和百度使用较多的是 C++,阿里和美团使用较多的是 Java。本节给大家介绍的 C/C++ 后台开发学习路线,只是众多后台开发技术体系中的一个。
这是一套非常详细的 C/C++ 后台开发学习路线,它坚持实用主义,追求前沿技术,不但为初学者规划好了具体的学习步骤,还为初学者指明了常见的陷阱和困难。
这套 C/C++ 后台学习路线将解决以下几个问题:
和互联网上其他博主分享的学习路线相比,这套学习路线不仅更加完整和详细,而且还会帮你做出选择和取舍,让你尽快学有所成,找到一份高薪工作。
注意,拥有选择权是一件非常重要的事情!
C/C++ 后台开发涉及到的技能板块非常繁杂,短期内不可能全部都掌握,为了加快学习进度,尽早达到工作要求,我们需要暂时先舍弃一些过时的技能,或者对这些技能浅尝辄止,等到以后有余力/有需要的话再回来学习。
这套学习路线就肩负了这个使命,它将告诉你各种技能的重要程度,以及在不同场景下的适用情况,让你知道如何选择,避免折腾和踩坑。
学习 C/C++ 后台开发,我建议你选择 Linux 平台,本文提供的也是 Linux C/C++ 后台服务端开发的完整学习路线。
我强烈建议先学习 C语言,然后再学习 C++。
C++ 和 C语言虽然是两种编程语言,但它们的关系非常密切。你可以这样理解,C++ 是在 C语言的基础上发展来的,C++ 在 C语言的基础上增加了很多新的特性,玩出了新花样,大大提高了开发效率。因此学习了 C语言也就学习了 C++ 的一半,从 C语言转向 C++ 时,不需要再从头开始,接着 C语言往下学就可以。
如果你没有任何编程基础,我建议先从 C语言学起,等熟悉了 C语言,能编写上百行的代码了,这个时候再去了解 C++ 究竟在 C语言基础上增加了什么,你就站在了一定的高度。
有人可能会问,能不能跳过 C语言直接学习 C++ 呢?原则上是可以的,但是初学者直接学习 C++ 会比较吃力,尤其在对计算机底层知识不太理解的情况下,C++ 是很难学懂的,所以不建议你直接学习 C++。
另外,就算你直接学习 C++,也要先学习 C语言部分,然后才能学习 C++ 的新增特性。
除了掌握 C/C++ 的基础语法外,以下这些知识也是需要掌握的:
初学者花费两个月左右的时间就能掌握 C/C++ 常用语法,并初步建立起编程思维,做出类似学生信息管理系统这样的“小玩意”,此时你的 C/C++ 水平就足够支撑后续的学习了。
当然,如果你想找一份后台开发工作,尤其是进大厂,C/C++ 一定要玩得非常溜。这个可以在后续的实际项目开发中逐步深入,并在找工作之前进行一下突击。
只有亲自做过项目,才能知道哪里是重点,才能有的放矢,才能节省学习时间;如果一开始就陷进编程语言的沼泽中,捣鼓那些万年不用的“语法糖”,那么只会让自己越学越吐血,逐渐消磨掉兴趣和热情。
对于初学者来说,首先要掌握一些常用的 Linux 命令,初步具备操作 Linux 的能力。可以下载一个带图形界面的 Linux 发行版,比如 Ubuntu、CentOS 等,边玩边学。
在 Linux 上编写 C/C++ 程序,以下罗列的内容是必须掌握的:
如果你想找一份后台开发的工作,尤其是进大厂,建议系统地学一下操作系统。如果你只是想自己鼓捣一些小玩意,那就看着办吧,操作系统的底层原理貌似没有那么重要。
数据结构研究数据的存储和读取方式,算法研究解决问题的方法和步骤;在不同的开发场景中,需要采用不同的数据结构和算法。
数据结构和算法的选择会极大影响程序的运行效率和资源占用,一种高效的数据结构和算法的组合,有时候能让程序的综合性能提升一个数量级。
数据结构和算法设计极其考验一个程序员的逻辑思维能力和问题解决能力,一个强者往往胜过十个臭皮匠。那些在大厂搞算法的程序员,工资往往都比那些搞软件开发/应用开发的程序员高一截,年薪百万都司空见惯。
总起来说,数据结构和算法是一个程序员最硬核的能力之一。这里给大家列举几个比较重要的数据结构和算法,面试经常会问:
在实际开发中,常见的数据结构和算法其实都已经被编程语言/库/框架封装好了,很多时候你不用自己手撸代码去实现,只需要调用一下 API 就行。但是,调用 API 之前你需要知道它的优势和劣势,明确它能够胜任的具体场景,此时就需要你了解数据结构和算法的底层原理。
也就是说,学习数据结构和算法的目的并不一定是手写代码,而是知道如何使用现有的 API,让自己掌握选择权。
当然,为了尽快入门后台开发并找到成就感,你可以暂时先简单了解一下常用的数据结构和算法,等到找工作之前再回来恶补。想进大厂的小伙伴要辛苦一点啦,需要多刷一些算法题。
如果你只是想自己捣鼓一些小玩意,那么只需要简单地了解一下常用的数据结构和算法,不用自己手撸代码去实现。
好吧,不得不承认,即使你不学习数据结构和算法,很多时候也不影响开发后台程序。
实际开发中我们会经常和各种库打交道,包括 C/C++ 标准库、系统库、第三方库和自己编写的库。不管你是找工作还是自己捣鼓后台程序,都需要学习链接库,即使你不自己开发链接库,也需要调用别人的链接库。
学习链接库,重点是掌握两种库的使用方法和制作方法,并搞清楚它们的优缺点和适用场景。
并发编程是实现高并发服务器的利器,不仅是笔试面试的必考知识点,也是实际开发中常用的技术,每个 C/C++ 后台程序员都必须熟练掌握。
并发编程的方式主要有两种,分别是多进程编程和多线程编程,两种方式各有优缺点。一般情况下,并发编程采用多线程编程来实现。
实现多进程/线程编程,既可以调用 Linux API,也可以调用 C/C++ 标准库或者第三方库。
如果你想找一份靠谱的工作,最好先从 Linux API 开始学习,然后再熟悉 C/C++ 标准库或者第三方库的使用方法。多线程是 Linux 系统内核提供的功能,学习 Linux API 能够从底层搞明白多线程的工作原理。
如果你只是想自己捣鼓一些小玩意,那就看着办吧,怎么方便怎么来,多线程的底层原理貌似没有那么重要。
C/C++ 后台开发是离不开网络编程的,甚至整个后台开发的过程都是在做网络编程。对于用户数量众多的服务器,网络通信至关重要,扛不住高并发可能会导致服务器宕机。
网络编程是 C++ 后台开发岗位面试的重头戏,重点要掌握的内容包括:
越是大型的互联网公司就越是重视网络编程,如果你想进大厂,我建议你一定要好好研究一下。
目前流行的网络库也有很多,大部分都是针对服务器端的,比如著名的 C++ 网络编程三剑客——Libevent、libev 和 Libuv。
另外,如果你的项目中使用的库/框架恰好包含了网络模块,那么也可以使用这些内置模块,比如 Boost 中的 Asio 模块。
没有哪种网络库能够一统江湖,很多企业内部还有自己开发的网络库,实际开发中需要根据具体场景做出正确的选择。
网络通信由 Linux 内置的 TCP/IP 协议栈提供支持,如果你想找一份靠谱的工作,我建议先从 Linux API 学起,把底层原理吃透,然后再学习一两个常见的网路库。
在此基础上,初学者可以找一个代码量少、代码精简的开源网络库(比如 muduo 库),反复琢磨内部的实现原理,既能提升 C/C++ 编程功底,也有加深对网络通信的理解。
如果你只是想自己开发一款小玩意,那就看着办吧,怎么方便就怎么来吧,很多时候使用网络库更加快捷和方便。
设计模式一共有 23 种,初学者不需要把所有设计模式全部搞懂,先学会实际开发中常用的几种即可,包括工厂模式、单例模式、观察者模式、代理模式等。
实际开发中随着代码量的积累,对设计模式理解得越深入,你的 C/C++ 代码会变得越来越美观,可读性、可移植性方面也会提升好几个 Level。
的确,使用文件确实可以达到目的,早期的互联网就是这个干的。但是,文件系统的“增删改查”效率极其低下,操作也非常麻烦,有了数据库以后,再也没有程序员使用这种原始的解决方案了。
总之,不学习数据库就没法从事 C++ 后台开发,不学习数据库就是耍流氓。
MySQL 是一款免费、开源的关系型数据库,受到许多后台开发者的青睐,对于中小型规模的项目,MySQL 完全可以胜任。
我建议初学者从 MySQL 入手,先玩转数据库的基本操作,包括安装、配置、连接和增删改查等;如果有余力的话,再继续学习一下 Oracle 数据库。
SQL 语言虽然有标准版本,但是基本所有数据库都针对自己的应用场景对标准 SQL 进行了裁剪或者扩充,这导致不同数据库所支持的 SQL 细节有所区别。
当然,这些特定版本的 SQL 都是从标准 SQL 演化而来,整体用法都是类似的,只要我们玩转了一种数据库,也会很快掌握其它数据库。
传统的开发模式会将所有的代码都编写在同一个工程/项目中,随着业务量和用户量的增加,整个系统暴露出的问题会越来越多,比如:
为了解决这些问题,企业需要采用分布式微服务架构:
总起来说,分布式微服务架构的核心思想就是先打散,再拼装。
熟悉 Java 后台开发的小伙伴都知道,Java 有两个大而全的分布式框架 Spring Boot 和 Spring Cloud,用这两个框架搞分布式足矣。遗憾地是,C++ 后台开发没有集成度这么高的分布式框架,只有一些集成度相对较高的框架,比如 bRPC(百度开源)、ZooKeeper、Etcd 等。
分布式知识体系非常庞大,C/C++ 后台程序员可以从以下几个方面入门分布式:
此外,分布式系统运行时极易受到各种外界因素的影响,比如网络延迟、服务器宕机等。针对各种突发状况,分布式技术的解决方案有均衡负载、流量控制、故障隔离等,这些也是需要了解的。
声明:当前文章为本站“玩转C语言和数据结构”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
“前后端分离”是现阶段非常热门的一种开发方式,简单来说就是将一款应用的实现代码分为前端代码和后台代码两部分:
- 前端代码:负责和用户打交道,用良好的视觉效果把产品(数据)呈现给用户,并完成和用户的交互(比如搜集用户填写的资料);
- 后台代码:负责处理底层的业务逻辑,比如实现登录、下单、支付等功能。
举个简单的例子,微信的聊天界面就是由前端代码呈现给用户的,而聊天功能由后台代码负责实现。
负责开发前端代码的程序员称为前端工程师,负责开发后台代码的程序员称为后台工程师,前端和后台都能 hold 得住的程序员称为全栈工程师。
C/C++ 能做的事情有很多,比如后台开发、游戏开发、嵌入式开发、界面开发等等,对于想扎根在 C/C++ 方向、尤其想进大厂的小伙伴,建议优先选择后台开发方向。
和其它开发方向相比,C/C++ 后台开发岗位的薪资是非常客观的。其次 C/C++ 后台开发有技术深度,轻易触摸不到天花板,只要你持续进步,不躺平摆烂,就能走出内卷成为卷王,不需要担心 35 岁中年危机的问题。
支持后台开发的编程语言有很多,比如 Java、C/C++、GOlang、Python、PHP 等。每个公司都有自己主打的后台开发语言,比如腾讯和百度使用较多的是 C++,阿里和美团使用较多的是 Java。本节给大家介绍的 C/C++ 后台开发学习路线,只是众多后台开发技术体系中的一个。
这是一套非常详细的 C/C++ 后台开发学习路线,它坚持实用主义,追求前沿技术,不但为初学者规划好了具体的学习步骤,还为初学者指明了常见的陷阱和困难。
这套 C/C++ 后台学习路线将解决以下几个问题:
- C/C++ 后台开发需要掌握哪些技能,每种技能需要掌握到什么程度?
- 先学什么,后学什么,具体的学习顺序是怎样的?
- 哪些技能可以暂时跳过,哪些技能可以浅尝辄止,哪些技能必须深入学习?
- 自己玩该怎么学习,找工作该怎么学习?
和互联网上其他博主分享的学习路线相比,这套学习路线不仅更加完整和详细,而且还会帮你做出选择和取舍,让你尽快学有所成,找到一份高薪工作。
注意,拥有选择权是一件非常重要的事情!
C/C++ 后台开发涉及到的技能板块非常繁杂,短期内不可能全部都掌握,为了加快学习进度,尽早达到工作要求,我们需要暂时先舍弃一些过时的技能,或者对这些技能浅尝辄止,等到以后有余力/有需要的话再回来学习。
这套学习路线就肩负了这个使命,它将告诉你各种技能的重要程度,以及在不同场景下的适用情况,让你知道如何选择,避免折腾和踩坑。
开发平台的选择
很多操作系统都可以作为运行后台程序的平台,比如 Linux、Windows Server、Unix、NetWare 等。在国内,后台程序基本都是运行在 Linux 系统上,Linux 的市场占用率是最大的,没有之一。选择 Linux 作为后台程序的运行平台,至少有以下优势:Windows Server 是微软专为服务器设计的操作系统;NetWare 是一款网络操作系统,市场占用率较小。
- Linux 系统开源、免费,是大部分公司和企业选择它的重要原因;
- Linux 系统的稳定性、安全性都是一流的,可以不间歇地工作很长时间,不需要频繁地更新,维护成本低;
- 几乎所有后台开发相关的软件都默认支持 Linux 环境,因此 Linux 后台开发的配套工具是最全的,没有之一。
学习 C/C++ 后台开发,我建议你选择 Linux 平台,本文提供的也是 Linux C/C++ 后台服务端开发的完整学习路线。
Linux C/C++后台开发学习路线
1. 编程语言
所谓 Linux C/C++ 后台开发,其实就是在 Linux 环境下编写 C++ 程序,因此 C++ 是必须要掌握的。我强烈建议先学习 C语言,然后再学习 C++。
C++ 和 C语言虽然是两种编程语言,但它们的关系非常密切。你可以这样理解,C++ 是在 C语言的基础上发展来的,C++ 在 C语言的基础上增加了很多新的特性,玩出了新花样,大大提高了开发效率。因此学习了 C语言也就学习了 C++ 的一半,从 C语言转向 C++ 时,不需要再从头开始,接着 C语言往下学就可以。
如果你没有任何编程基础,我建议先从 C语言学起,等熟悉了 C语言,能编写上百行的代码了,这个时候再去了解 C++ 究竟在 C语言基础上增加了什么,你就站在了一定的高度。
有人可能会问,能不能跳过 C语言直接学习 C++ 呢?原则上是可以的,但是初学者直接学习 C++ 会比较吃力,尤其在对计算机底层知识不太理解的情况下,C++ 是很难学懂的,所以不建议你直接学习 C++。
另外,就算你直接学习 C++,也要先学习 C语言部分,然后才能学习 C++ 的新增特性。
除了掌握 C/C++ 的基础语法外,以下这些知识也是需要掌握的:
- 系统地学习 STL 标准库,最好剖析一下 STL 底层源码;
- 了解一些 C++11/14/17 常用的语法,比如 auto、右值引用、智能指针等;
注意
编程语言只是一种工具,千万不要在学习 C++ 语法上浪费太多时间,陷在编程语言的泥潭里拔不出来,纠缠于各种语法细节。初学者花费两个月左右的时间就能掌握 C/C++ 常用语法,并初步建立起编程思维,做出类似学生信息管理系统这样的“小玩意”,此时你的 C/C++ 水平就足够支撑后续的学习了。
当然,如果你想找一份后台开发工作,尤其是进大厂,C/C++ 一定要玩得非常溜。这个可以在后续的实际项目开发中逐步深入,并在找工作之前进行一下突击。
只有亲自做过项目,才能知道哪里是重点,才能有的放矢,才能节省学习时间;如果一开始就陷进编程语言的沼泽中,捣鼓那些万年不用的“语法糖”,那么只会让自己越学越吐血,逐渐消磨掉兴趣和热情。
2. Linux操作系统
很多人学习 C/C++ 都是在 Windows 环境中,使用类似 Visual Studio 这样的集成开发环境(IDE)中一键运行 C/C++ 程序。还是那句话,企业里 C/C++ 后台开发几乎都是基于 Linux 平台的,因此必须转战到 Linux 操作系统,尽可能深入地了解 Linux。对于初学者来说,首先要掌握一些常用的 Linux 命令,初步具备操作 Linux 的能力。可以下载一个带图形界面的 Linux 发行版,比如 Ubuntu、CentOS 等,边玩边学。
在 Linux 上编写 C/C++ 程序,以下罗列的内容是必须掌握的:
- 学会 Vim 编辑器的基本用法;
- 学会用 GCC 编译、链接和运行程序;
- 学会用 GDB 调试程序;
- 学会 Makefile 的书写规则,还有精力的话可以研究 Bazel、CMake 等一些构建工具的用法。
C/C++ 的执行效率高,但它也更偏向底层,实际开发过程中碰到的很多“偏难怪”问题都可能和操作系统有关系,解决此类问题要求对操作系统的底层原理有较深入的理解,重点包括内存管理(虚拟内存、内存分配机制等)和进程管理(进程和线程、并发、锁机制等)等。当然,如果你想尽快学有所成,可以暂时跳过操作系统的学习,等找到工作之前再回来恶补。在 Linux 环境中编写 C/C++ 程序,很多功能都可以直接调用 Linux API(接口)实现,一些常用 Linux API 函数的功能和用法是需要记住的,而且记住得越多越好。
如果你想找一份后台开发的工作,尤其是进大厂,建议系统地学一下操作系统。如果你只是想自己鼓捣一些小玩意,那就看着办吧,操作系统的底层原理貌似没有那么重要。
3. 数据结构和算法
数据结构和算法本质上是两门课程,但是它们之间又相互依赖,有时候很难分得一清二楚,所以很多教材喜欢将它们掺杂到一起,讲解数据结构的时候也会涉及一些常见算法。数据结构研究数据的存储和读取方式,算法研究解决问题的方法和步骤;在不同的开发场景中,需要采用不同的数据结构和算法。
数据结构和算法的选择会极大影响程序的运行效率和资源占用,一种高效的数据结构和算法的组合,有时候能让程序的综合性能提升一个数量级。
数据结构和算法设计极其考验一个程序员的逻辑思维能力和问题解决能力,一个强者往往胜过十个臭皮匠。那些在大厂搞算法的程序员,工资往往都比那些搞软件开发/应用开发的程序员高一截,年薪百万都司空见惯。
总起来说,数据结构和算法是一个程序员最硬核的能力之一。这里给大家列举几个比较重要的数据结构和算法,面试经常会问:
- 数据结构:链表、队列、栈、平衡二叉树、红黑树、B 树和 B+ 树等;
- 算法:常用的排序和查找算法、迪杰斯特拉算法、广度优先遍历和深度优先遍历算法、递归算法、贪心算法、动态规划算法、跳表、哈希表、布隆过滤器等;
在实际开发中,常见的数据结构和算法其实都已经被编程语言/库/框架封装好了,很多时候你不用自己手撸代码去实现,只需要调用一下 API 就行。但是,调用 API 之前你需要知道它的优势和劣势,明确它能够胜任的具体场景,此时就需要你了解数据结构和算法的底层原理。
也就是说,学习数据结构和算法的目的并不一定是手写代码,而是知道如何使用现有的 API,让自己掌握选择权。
需要学到什么程度?
如果你想找一份靠谱的工作,尤其是进大厂/独角兽,那么就要认真研究一下常用的数据结构和算法,并亲自手撸代码去实现一遍。当然,为了尽快入门后台开发并找到成就感,你可以暂时先简单了解一下常用的数据结构和算法,等到找工作之前再回来恶补。想进大厂的小伙伴要辛苦一点啦,需要多刷一些算法题。
如果你只是想自己捣鼓一些小玩意,那么只需要简单地了解一下常用的数据结构和算法,不用自己手撸代码去实现。
好吧,不得不承认,即使你不学习数据结构和算法,很多时候也不影响开发后台程序。
4. 链接库
中大型程序往往是以模块化的方式进行开发,对于 C/C++ 而言,所谓的模块就是链接库,具体来说包括动态链接库和静态链接库。- Linux 下的动态链接库文件后缀是 .so,静态链接库文件后缀是 .a。
- 动态链接库在程序运行阶段被加载,静态链接库在程序编译阶段被合并,它们各有优缺点,适用于不同的场景。
实际开发中我们会经常和各种库打交道,包括 C/C++ 标准库、系统库、第三方库和自己编写的库。不管你是找工作还是自己捣鼓后台程序,都需要学习链接库,即使你不自己开发链接库,也需要调用别人的链接库。
学习链接库,重点是掌握两种库的使用方法和制作方法,并搞清楚它们的优缺点和适用场景。
5. 并发编程
并发编程指的是充分利用 CPU 多核的计算能力,让计算机同时执行多个任务,提高程序的整体性能。并发编程是实现高并发服务器的利器,不仅是笔试面试的必考知识点,也是实际开发中常用的技术,每个 C/C++ 后台程序员都必须熟练掌握。
并发编程的方式主要有两种,分别是多进程编程和多线程编程,两种方式各有优缺点。一般情况下,并发编程采用多线程编程来实现。
实现多进程/线程编程,既可以调用 Linux API,也可以调用 C/C++ 标准库或者第三方库。
如果你想找一份靠谱的工作,最好先从 Linux API 开始学习,然后再熟悉 C/C++ 标准库或者第三方库的使用方法。多线程是 Linux 系统内核提供的功能,学习 Linux API 能够从底层搞明白多线程的工作原理。
如果你只是想自己捣鼓一些小玩意,那就看着办吧,怎么方便怎么来,多线程的底层原理貌似没有那么重要。
6. 网络编程
所谓网络编程,就是学习联网计算机之间如何通信,并用编程语言来实现它。C/C++ 后台开发是离不开网络编程的,甚至整个后台开发的过程都是在做网络编程。对于用户数量众多的服务器,网络通信至关重要,扛不住高并发可能会导致服务器宕机。
网络编程是 C++ 后台开发岗位面试的重头戏,重点要掌握的内容包括:
- 学习 Socket 编程,学完后最好手撕出一个入门级别的 server 端服务器;
- 三种经典的 IO 复用技术分别是 select、poll 和 epoll,搞清楚它们各自的实现方式和区别,掌握得越深入越好;
- LT 水平触发和 ET 边缘触发的区别;
- Reactor 和 Proactor 两种高性能 IO 模式的实现方式和区别(重点是 Reactor);
- 阻塞 I/O 和非阻塞 I/O、同步 I/O 和异步 I/O。
越是大型的互联网公司就越是重视网络编程,如果你想进大厂,我建议你一定要好好研究一下。
目前流行的网络库也有很多,大部分都是针对服务器端的,比如著名的 C++ 网络编程三剑客——Libevent、libev 和 Libuv。
另外,如果你的项目中使用的库/框架恰好包含了网络模块,那么也可以使用这些内置模块,比如 Boost 中的 Asio 模块。
没有哪种网络库能够一统江湖,很多企业内部还有自己开发的网络库,实际开发中需要根据具体场景做出正确的选择。
网络通信由 Linux 内置的 TCP/IP 协议栈提供支持,如果你想找一份靠谱的工作,我建议先从 Linux API 学起,把底层原理吃透,然后再学习一两个常见的网路库。
在此基础上,初学者可以找一个代码量少、代码精简的开源网络库(比如 muduo 库),反复琢磨内部的实现原理,既能提升 C/C++ 编程功底,也有加深对网络通信的理解。
如果你只是想自己开发一款小玩意,那就看着办吧,怎么方便就怎么来吧,很多时候使用网络库更加快捷和方便。
7. 设计模式
设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决某些特定问题的成熟套路。设计模式一共有 23 种,初学者不需要把所有设计模式全部搞懂,先学会实际开发中常用的几种即可,包括工厂模式、单例模式、观察者模式、代理模式等。
实际开发中随着代码量的积累,对设计模式理解得越深入,你的 C/C++ 代码会变得越来越美观,可读性、可移植性方面也会提升好几个 Level。
8. 数据库
后台程序存储各种数据都需要数据库的支持,比如用户信息、文章内容、操作日志、商品详情、购买记录等。没有数据库就没有互联网,数据库是每个 C++ 后台程序员必须掌握的。文件系统
有些初学者为了逃避数据库的学习,可能想过使用文件来保存数据。的确,使用文件确实可以达到目的,早期的互联网就是这个干的。但是,文件系统的“增删改查”效率极其低下,操作也非常麻烦,有了数据库以后,再也没有程序员使用这种原始的解决方案了。
总之,不学习数据库就没法从事 C++ 后台开发,不学习数据库就是耍流氓。
学习哪种数据库?
市面上有很多优秀的数据库,其中最流行、最受欢迎、适用 C++ 后台项目的有两个,分别是 MySQL 和 Oracle。MySQL 是一款免费、开源的关系型数据库,受到许多后台开发者的青睐,对于中小型规模的项目,MySQL 完全可以胜任。
我建议初学者从 MySQL 入手,先玩转数据库的基本操作,包括安装、配置、连接和增删改查等;如果有余力的话,再继续学习一下 Oracle 数据库。
SQL
MySQL 和 Oracle 属于关系型数据库,所有的关系型数据库都使用 SQL 语言进行操作,因此学习数据库的同时,也要配合学习 SQL 语言。SQL 语言虽然有标准版本,但是基本所有数据库都针对自己的应用场景对标准 SQL 进行了裁剪或者扩充,这导致不同数据库所支持的 SQL 细节有所区别。
当然,这些特定版本的 SQL 都是从标准 SQL 演化而来,整体用法都是类似的,只要我们玩转了一种数据库,也会很快掌握其它数据库。
学到什么程度?
数据库是 C++后台程序员必备的硬核技能之一,从某种程度上来说,它决定了一个程序员的上限。当然,初学者的首要任务还是掌握数据库的基本概念,并能够熟练地使用 SQL 语句对数据库进行增加、删除、修改、查询等操作。9. 分布式微服务框架
如果以上罗列的的知识点都掌握了,就具备了一定的 C++ 后台开发能力,可以尝试面试一些 C++ 的后台开发岗位。还有精力的话,可以了解一些和分布式相关的技术。传统的开发模式会将所有的代码都编写在同一个工程/项目中,随着业务量和用户量的增加,整个系统暴露出的问题会越来越多,比如:
- 系统变得越来越复杂,一台服务器的承载能力(CPU、I/O、网络等)终究是有限的,当硬件资源无法满足系统的需要时,整个系统的运行效率就会降低;
- 需要的开发人员越来越多,复杂生乱,人多生乱,在这种情况下,哪怕一行代码出现问题,都有可能导致整个系统不可用,可谓“牵一发动全身”。
为了解决这些问题,企业需要采用分布式微服务架构:
- 所谓“微服务”,就是将原来复杂而庞大的系统拆分成多个能够独立运行的小型模块,其中每个模块只负责实现一部分功能,然后再将它们组合起来构成完整的系统。
- 因为每个微服务模块都是相互独立的,所以它们可以部署到不同的服务器上,然后再通过网络相互通信(交换数据),共同完成用户的请求,这就是所谓的“分布式”。
总起来说,分布式微服务架构的核心思想就是先打散,再拼装。
熟悉 Java 后台开发的小伙伴都知道,Java 有两个大而全的分布式框架 Spring Boot 和 Spring Cloud,用这两个框架搞分布式足矣。遗憾地是,C++ 后台开发没有集成度这么高的分布式框架,只有一些集成度相对较高的框架,比如 bRPC(百度开源)、ZooKeeper、Etcd 等。
分布式知识体系非常庞大,C/C++ 后台程序员可以从以下几个方面入门分布式:
- 微服务的构建和通信:构建一个一个的微服务,以及为这些微服务之间建立通信,可以使用的框架有 bRPC(百度开源)、gRPC(谷歌开源)、TARS(腾讯开源)、SRPC(搜狗开源)等;
- 注册中心:负责让多台服务器协同工作,提供服务注册、服务发现等功能,可以借助 ZooKeeper、Etcd 框架实现;
- 分布式同步:避免多个模块同时访问共享资源,可以借助 chubby 分布式锁框架实现,也可以借助 ZooKeeper、Etcd 等注册服务中心提供的分布式锁功能实现。
此外,分布式系统运行时极易受到各种外界因素的影响,比如网络延迟、服务器宕机等。针对各种突发状况,分布式技术的解决方案有均衡负载、流量控制、故障隔离等,这些也是需要了解的。
10. 其它知识
除了上面罗列的知识外,我们还需要掌握一些实际开发中常用的技术和工具。工 具 | 说 明 |
---|---|
脚本语言 |
除了 C/C++ 以外,你还需要掌握至少一门脚本语言,例如 Python 和 Shell。 脚本语言可能不会是你开发的主语言,但是它可以帮你完成一些轻量级的工作。做 C/C++ 后台开发,很多情况下会和其它脚本语言做混合编程,所以建议大家掌握至少一门脚本语言。 |
Redis |
除了 MySQL 这种传统的关系型数据库之外,很多企业还要求掌握非关系型数据库,比如 Redis。 Redis 是一款开源的键值型非关系型(NoSQL)数据库,通常被用来缓存一些经常被访问的热点数据,或者需要耗费大量资源的内容。把这些内容放到 Redis 中,可以让应用程序快速地读取它们。 |
Git |
目前最流行的分布式版本控制工具,更是大多数互联网公司首选的版本控制工具。Git 主要负责记录文件(包括代码和配置)的变更,将文件的修改时间、文件名、修改人、修改内容等信息一一记录下来。 Git 有效地解决了团队协同开发(多人同时开发同一个项目)中代码和配置的版本同步问题,提高了团队协同开发的效率。 |
消息队列 |
可以把消息队列理解成一个存放消息的容器,当我们需要使用消息时,就可以直接从这个容器中获取。 消息队列通常是分布式系统中不可或缺的重要组件,目前流行的消息队列中间件有 Kafka、ZeroMQ 等。 |
日志框架 | 在项目开发中,日志十分的重要,不管是记录运行情况还是定位线上问题,都离不开对日志的分析,流行的日志框架比如 glog、log4cplus 等。 |
总结
以上学习路线可能比较混乱,为了让读者有一个更加直观的印象,我特地制作了一份简明扼要的汇总表格,并标注出了不同技能的重要程度,这其中:- ☆☆ 表示可以跳过或者放弃,以后有需要的话再来学习;
- ★☆ 表示需要进行了解,但是不需要深度学习;
- ★★ 表示非常重要,需要深度学习。
序号 | 技术栈 | 说 明 | 重要性 |
---|---|---|---|
01 | C/C++ | 建议先学习C语言,再学习 C++。 | ★★ |
02 | Linux系统 | 熟练使用 Linux 系统,掌握 GCC、GDB 的用法,了解 Makefile 的书写规则和 CMake 工具。 | ★★ |
03 | 数据结构和算法 | 可以不用,但不能不了解。 | ★☆ |
04 | 链接库 | 掌握静态链接库和动态链接库的制作方法和使用方法。 | ★☆ |
05 | 并发编程 | 系统学习多进程编程和多线程编程。 | ★★ |
06 | 网络编程 | 先学习 TCP/IP 协议栈,接着了解 Linux API,然后学习一两个常用的网络库。 | ★★ |
07 | 设计模式 | 只需要重点了解几种常见的设计模式,比如单例模式、工厂模式、观察者模式和代理模式。 | ★☆ |
08 | 数据库 | 熟悉 SQL 语句,然后学会使用 MySQL 数据库,包括 MySQL 的安装、配置、连接和对数据的增删改查等。 | ★★ |
09 | 分布式微服务框架 | 搞清楚什么是分布式,然后再学习微服务的构建、通信、同步等技术。 | ☆☆ |
10 | 其它知识 | 实际开发中常用的技术和工具。 | ☆☆ |
声明:当前文章为本站“玩转C语言和数据结构”官方原创,由国家机构和地方版权局所签发的权威证书所保护。