个人主页:个人主页
系列专栏:C/C++基础与进阶
推荐一款模拟面试、刷题神器,从基础到大厂面试题点击跳转刷题网站进行注册学习
目录
1、学习C语言
2、学习C++
3、了解基础的网络知识
4、Linux相关知识
5、数据库知识
6、数据结构与算法
7、需要重点关注的编程技术
7.1、socket网络编程
7.2、多线程与多线程编程
7.3、多进程及多进程通信
7.4、动态链接库编程
7.5、数据库编程
7.6、设计模式
7.7、学习一些C/C++开源代码
8、最后
VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931 在CSDN上认识了学习C/C++在校朋友,他们在和我交流时时常会问有没有好的C/C++学习路线推荐,博客内容主要面向有工作经验的人,很少写过针对初学者的文章。因为大家问的比较多,最近正好有时间,就详细地思考了一下这个学习路线的问题。作为IT行业的从业者,结合多年的实战经验,给大家大概地总结一下C/C++学习路线方面的内容,以供广大C/C++初学者借鉴和参考!
C/C++的知识点与学习路线图总体如下所示:
C语言是C++的基础,C++是在C语言的基础上发展起来的,要学C++,必须要先学好C语言。C语言学习,推荐使用谭浩强的《C语言程序设计》。
有不少开源库就是使用C语言实现的,比如著名的音视频开源库ffmpeg、轻量级数数据库sqlite、高性能的HTTP和反向代理web服务器Nginx、轻量级web服务器容器Lighttpd等。使用C语言开发的软件,一是运行效率比较高,二是具有良好的跨平台特性。除了开发一些开源项目,目前C语言主要用于底层软件的开发,比如与硬件芯片相关的驱动软件的开发。
该部分学习需要掌握的内容有:
了解C语言的基础语法,了解结构体、分支与循环,熟悉字符串、操作符和函数,掌握数组和指针的使用,了解内存管理和文件操作,熟练掌握C程序的调试方法。
推荐使用《C++ Primer》这本书进行学习,也可以搭配这《C++ Primer Plus》这本书一起看,前者更详细、系统一些。两本书可以互补着看,各有特点。C++主要学习内容有:
(1)学习C++基础语法;
(2)学习模板编程:模板类和模板函数;
(3)了解C++11标准引入的部分常用新特性,比如常用的auto、overide、final、mutable、volatile、智能指针(std::unique_ptr、std::shared_ptr和std::weak_ptr)、lamda表达式、nullptr等。这些新特性在C++开源代码中会频繁的使用,比如WebRTC开源代码,开源代码比较喜欢使用C++新标准的东西。我们在日常编码的过程中,也会使用到C++11的部分新关键字和新特性。所以,不管是日常编码工作,还是学习开源代码,学习并掌握C++11的新特性都很有必要!此外,C++开发岗位的面试都会涉及C++11相关的内容!《C++ Primer》和《C++ Primer Plus》这两本书的新版本,都有详细讲到C++11的新特性。
C++新标准引入了很多新特性,解决了部分语言上的缺陷,使得C++变得更加高效灵活!但同时也让C++变得更加臃肿复杂,让原本就有学习难度的C++变的更加让人难以驾驭!
该部分学习需要掌握的内容有:
了解C++的基础语法,理解C++面向对象和类的思想,了解继承、虚函数与多态,理解动态内存管理,了解深拷贝与浅拷贝,了解函数重载与函数重写,了解智能指针与异常处理,熟练掌握STL标准模板库中vector、list、map等常用容器的使用,熟悉模板函数与模板类的模板编程。
对于开发语言的学习,想通过看几篇博客文章就能学好是不可能的,必须要找一本书或者一个系统的视频教程静下心去学,脚踏实地一步一个脚印去学,才能学好,看别人的文章只能起个辅助的作用!
现在的软件系统都不再是单机版的了,都是基于网络的,基本都是客户端与服务器的模式,客户端需要通过网络和远端的服务器进行通信,在使用过程中会出现这样那样的网络问题。所以网络知识是少不了的,无论是从事哪个IT技术岗位,都需要用到一些常用的网络知识。特别是开发和测试岗位,要分析网络通信中遇到的通信故障,排查网络数据传输过程中的数据异常问题等。
网络基础知识,笔试时会有涉及,面试的时候也会问到。比如OSI的七层分层、TCPIP四层分层、TCP与UDP的区别,建立TCP连接的三次握手等等。这方面的内容,可以参看我之前写的文章:
【网络入门】详解常用的基础网络知识(面试笔试常考内容)https://blog.csdn.net/chenlycly/article/details/124433936掌握上述文章的内容,基本可以应付日常的笔试面试,这部分内容可以在面试前的一两个月看看,搞不懂的地方可以硬背下来。此外,如果要深层次了解TCPIP网络知识,可以参看TCPIP详解相关的书籍。
做服务器软件开发或测试的岗位,会对Linux方面的知识有一定的要求,因为后台服务器中使用的操作系统就是Linux的。现在大部分IT公司产品的后台服务器使用的都是Linux系统,有少部分根据客户要求需要会使用Windows Server服务器系统。
之前大家主要使用免费开源的CentOS版本的Linux系统,但现在RedHat公司已不再维护CentOS系统了,这意味着一旦系统内核发现bug,将没人负责去修改更新了。为了应对CentOS停止维护,国内几大重量级IT厂商纷纷推出了基于开源Linux系统的服务器专用操作系统,比如华为的欧拉系统、腾讯的tencentos系统以及阿里的龙蜥系统,实现对CentOS的替代!并且这些国内的服务器系统已陆续宣布开源,并建立了相应的开源社区,以推进这些系统的广泛应用与普及!这些国产服务器系统,不仅这些头部厂商会自己使用,其他厂商也可以免费使用,这对系统的普及及生态的发展有着强有力的推进作用!
这部分内容,需要了解Linux文件系统,了解常用的Linux命令。
很多IT岗位对数据库也有一定的要求,并不是说工作中肯定会直接涉及到数据库的操作与查询,数据库已经是个基本的技能要求了。部分岗位可能会直接操作数据库,去读写数据库,需要对数据库中的数据进行查询。一般要了解数据库表的创建、修改、删除;了解数据库表中的数据的增删改查(查询);了解索引、视图、事务、触发器、存储过程等概念。
当前常用的数据库有甲骨文公司商业收费版的Oracle数据库、免费开源的MySQL数据库以及微软的SQL Server数据库。除了这些国外的数据库,近几年国内一些公司在开源数据库的基础上也陆续开发了自己的数据库产品,比如阿里的OceanBase数据库、华为的高斯数据库、腾讯的TBase数据库等,都达到了业界的顶尖水平!
本部分随便找一本数据库的教材学习一下即可,SQL Server或者MySql都可以。不同的数据库在SQL语义上是类似的或者是相通的,可能在具体的细节上会有所差别,一般我们只要选一种数据库学习即可。
一般服务器侧需要存储大量的数据到数据库中,在大型的互联网公司的大型系统中要存储海量的数据,这对数据的存储与查询性能有着很高的要求,所以在这些公司会有专门的数据库工程师来负责这部分的业务!此外,在一些客户端软件或者嵌入式终端软件中,也会使用到数据库,一般数据量较小,会选用轻量级的sqlite数据库。
找一本数据结构与算法的书学习一下。要了解单链表、双链表、双向循环链表的实现,熟悉八大排序算法(了解算法实现的时间复杂度与空间复杂度),了解B树、红黑树、动态规划、背包等经典算法问题。算法是互联网大厂的必考题,要面试大厂必须要提前准备的,中小型公司可能对这一块没有大多的要求。
编程语言最终是为实现目标业务系统服务的,我们要使用编程语言去编写业务实现代码的。所以,除了系统地学习C与C++这两门开发语言,我们还需要重点学习以下具体的编程技术,这些技术在以后的工作基本都会涉及到。
首先要系统地学习一下socket套接字网络编程,熟悉常用的socket编程接口,了解Windows下的select模型、IOCP完成端口模型、Linux下的epoll模型等。虽然工作后不一定从事网络通信模块的开发,但是这些基本的网络编程知识比较重要,对于理解和分析开发过程中遇到的网络问题时是很有帮助的。
此外,作为技术进阶,也可以去了解一下开源的libevent网络库和大型开源项目boost中的asio网络库,这两个开源库在很多公司都有使用到。
在软件程序中,仅有一个主线程是远远不够的,为了处理一些并发的任务,必须要使用到多线程技术。我们将一些任务放到新建的线程中去做,并且线程之间需要进行通信,这就需要了解线程间通信的常用方法(面试常问问题)。
此外,多个线程可能要访问共享的资源(比如内存资源),需要做好多线程之间的同步。我们通过锁实现多线程之间的同步,这个锁的实现也有多个方式(面试常问问题)。
这里面还有一个比较高端的线程池技术。因为线程创建与销毁是有一定开销的,所以为了较少这部分开销,提高软件的运行效率,我们会创建一定数量的空闲线程放置到线程池中,需要使用时从池中取出一个空闲的线程,使用完成后再将线程归还给线程池。
有时为了提升软件的执行性能和效率,我们在启动软件时可能需要启动多个进程,不同的进程负责做不同的事务。比如我们常用的chrome浏览器,在启动时就会创建多个进程,不同的进程负责处理不同的事务。
多进程之间需要进行数据共享或数据通信,这就会涉及到多进程之间通信方法,这也是面试时常问的一个问题。
自从微软推出第一个版本的Windows操作系统以来,dll动态链接库一直是Windows操作系统的基础。动态链接库通常不能直接运行,它们是独立的二进制文件,只有在其他模块调用dll动态链接库中的函数时,它才发挥作用。
在实际编程时,我们可以把完成某种功能的函数放在一个动态链接库中,然后提供给其他模块或其他程序调用。不仅Windows系统中会使用到dll动态库,Linux系统也会频繁地使用到(linux系统中以. so结尾),所以动态库编程也是一个要学习的技术点。
其实动态库相对比较简单,学会动态库的封装,保证对外提供合理的API接口。
在很多软件中需要将数据保存到数据库中,并对数据库中的数据进行查询操作,这就会涉及到操作数据库的编程技术。
常用的数据库有轻量级的开源数据sqlite、大型开源免费数据库MySQL、商业数据库Oracle等。一般先要连接到数据库服务器上,然后通过该连接将数据写入到数据库中以及对数据库中的数据进行修改、删除、查询等操作。
在一些大型的IT公司,要存储海量的数据,对数据库技术有着很高的要求,会有专门的数据库开发的工程师岗位,由这些人去专门处理数据库开发的相关事务。有些岗位可能不会涉及到数据库编程,但数据库编程已经是开发人员必须具备的一个基本技能,所以我们需要学习一下。
上述几个编程技术的学习,推荐大家看孙鑫的《VC++深入详解》一书,上述技术在书中都有专门的章节去讲解。
在日常的编码工作中,会使用到一些常用的软件设计模式,比如单例模式、简单工厂模式和观察者模式等。这些设计模式可以很好地解决设计中的一些问题,不仅工作中会用到,面试时也会涉及到。
对于初学者来说,有必要学习部分常用的设计模式,面试时也是一个体现优势的加分项!注意,不仅要了解这些常用设计模式的实现思想,还要
此部分需要有很好的C/C++基础,属于C/C++进阶部分的内容,想深入学习C/C++的朋友,可以来尝试学习一下。
可以先看一些轻量级的开源库,比如分布式的高速缓存系统memcached、高性能事件通知库libevent、高性能的HTTP和反向代理web服务器Nginx、以及轻量级web服务器容器Lighttpd,这些开源库在实际项目中被广泛地使用,这些库都是用C语言开发的。
也可以去学习一些著名的C/C++大型开源库,比如多媒体处理开源库FFmpeg、实时音视频处理开源库WebRTC和Chrome浏览器内核开源库Chromium等。当然这些大型开源库对于初学者来讲,是有很大的难度的。关于这些大型开源库的说明,可以参看之前写的文章:
C/C++开发人员要了解的几大著名C/C++开源库https://blog.csdn.net/chenlycly/article/details/125959453
上面大概地介绍了C/C++学习路线的主要内容,希望能给广大C/C++初学者提供有效的借鉴和参考。有些朋友可能想了解搞C/C++开发都有哪些岗位可供选择,可以参见之前写的文章:
C++没落了?学习C++没有前途了?从业者给你揭晓答案https://blog.csdn.net/chenlycly/article/details/126881672