如何系统地学习 C++ 语言?

如何成为一名合格的 C/C++ 开发者?

写在前面的话

在大多数开发或者准开发人员的认识中,C/C++ 是一门很是难的编程语言,不少人知道它的强大,但由于认为“难”形成的恐惧让不少人放弃。javascript

笔者从学生时代开始接触 C/C++,工做之后前后担任过 C++ 客户端和服务器的开发经理并带队开发,至今已经有十多年了。虽然时至今日哪一种编程语言对我来讲已经再也不重要(我目前主要从事 Java 开发),但 C/C++ 仍然是笔者最喜欢的编程语言。在我看来,C/C++ 一旦学成,其妙无穷,就像武侠小说中的“九阳神功”同样,有了这个基础,您能够快速学习任何语言和编程技术。html

目前 C/C++ 的应用领域

须要注意的是本文不细分 C C++ 的区别,一般状况下,C++ 能够当作是 C 的一个超集,在古典时期,能够认为 C++ 就是C with classes。虽然现在的C++从功能层面上来看,离 C 愈来愈远了;可是从语法层面来上来看,大多数 C++ 语法仍是与 C 基本一致的,所谓 C++ 的面向对象特性,若是细究 C++ 类方法的具体语法仍是 C 的过程式语法。固然,面向对象是一种思想,语言自己对其支持的程度当然重要,可否熟练地使用则是更要看开发者的水平了。前端

C 语言目前主要用于像操做系统这样一类偏底层的的应用开发,包括像 Windows/linux等这样的大型商业操做系统,和嵌入式操做系统、嵌入式设备上的应用。还有一些开源的软件,也会选择C开发,这些系统主要优先考虑程序执行效率和生成的可执行文件的体积(C 代码生成的可执行文件体积相对更小),固然还有一些是历史技术选型问题,这类软件以redis、libevent、nginx,目前像国内的电信服务商所使用的电话呼叫系统通常也是基于一款叫 freeswitch 的开源C程序作的二次开发(项目地址:https://freeswitch.com/)。java

C++ 面向对象的语法与C相比较起来,在将高级语言翻译成机器二进制码的时候C++ 编译器在背后偷偷地作了大量工做,生成了大量的额外的机器码,而这种机器码相对于C来讲是否是必须的。例如,对于一个C++类的实例方法,编译器在生成这个方法的机器码时,会将函数的第一个参数设置成对象的this指针地址,以此来实现对象与函数的绑定。正由于如此,许多开发者会优化和调整编译器生成的汇编代码。python

咱们再来讲说 C++,C++ 的应用领域目前有三大类,第一类就是咱们目前见到的各类桌面应用软件,尤为Windows上桌面软件,如QQ、安全类杀毒类软件(如金山的安全卫士,已开源,其代码地址:http://code.ijinshan.com/sour...)、各类浏览器等等;另外就是一些基础软件和高级语言的运行时环境,如大型数据库软件、Java虚拟机、C#的 CLR 运行时、python编译器和运行时环境等等;第三类就是一些业务型应用软件的后台,如游戏的服务器后台,例如魔兽世界的服务器(代码地址:https://github.com/azerothcor...)和一些企业内部的应用系统,笔者从在某交易所从过后台开发,其交易系统和行情系统就是基于 C++ 开发的。linux

C++ 与操做系统平台

从上面的介绍能够看出,与Java、python等语言相比,C/C++语言是运行在离操做系统最近的一种高级语言,所以其执行效率也比较高,可是有得必有失,也由于如此,因此C/C++这门语言存在以下特色:nginx

  • C/C++ 整套的语法不具有“功能完备性”,单纯地使用这门语言自己提供的功能您没法建立任何有意义的程序,您必须借助操做系统的 API 接口函数来达到相应的功能。固然,随着 C++ 语言标准和版本的不断更新升级,这种现状正在改变;而像Java、python这类语言,其自带的 sdk 提供了各类操做系统的功能。举个例子,C/C++语言自己是不具有网络通讯功能的,必须使用操做系统提供的网络通讯函数(如socket系列函数);而对于Java来讲,其 jdk 自带的 java.net 和 java.io 等包则提供了完整的网络通讯功能。我在读书的时候经常听人说,QQ、360安全卫士这类软件是用 C/C++ 开发的,可是当我学完整本 C/C++ 教材之后,仍然写不出来一个像样的窗口程序。许多过来人应该都有相似的困惑吧?其缘由是通常 C/C++ 的教材不会教你如何使用操做系统 API 函数的内容。
  • 正由于 C/C++ 语言须要直接使用了操做系统的接口功能,这就形成了 C/C++ 语言繁、难的地方,如操做内存方面不当容易引发程序宕机,不一样的操做系统的 API 接口使用习惯和风格也不同,接口函数种类繁多,开发者若是想开发跨平台的程序,必需要学习多个平台的接口函数和对应的系统原理。
  • 在应用层开发,直接使用操做系统的接口的函数,每每执行效率高,控制力度大,您的开发能力仅仅限制于操做系统自己,Java 这类语言,不少功能即便操做系统提供的,若是 Java 虚拟机不提供,开发人员也没法使用。正如著名的编程大师 Charles Petzold 说的:git

    显而易见,究竟用哪一种方式编写应用程序最好,其实并没有必定之规。应用程序自己的特性应该是决定采用何种编程工具的最主要因素,可是不管未来你采用什么样的编程工具,经过了解操做系统 API 从而深刻理解操做系统的工做原理,这自己就有很重要的意义。操做系统是一个很是复杂的系统,在 API 之上加一层编程语言并不能消除其复杂性,最多不过是把复杂性隐藏起来而已。说不定何时,这种复杂的那一面早晚会蹦出来拖你的后腿,懂得系统 API 能让你到时候更快地挣脱困境。

    在基本操做系统 API之上的任何软件层或多或少都会限制你使用操做系统的所有功能。好比,你或许发现采用 Visual Basic 来编写你的应用程序很是理想,可是就有那么一两项很是基本的功能 Visual Basic 没法支持。每每这个时候你得非要调用基本 API 。做为直接使用操做系统 API 的程序员,咱们的活动空间彻底由 API 来规范,再没有什么其余方式比直接调用 API 更有效、更灵活多样了程序员

总结起来,C/C++语言的开发核心是创建在直接调用操做系统 API 的基础上的,优势是执行效率高、发挥空间大;缺点是,须要通过系统深刻的学习,学习周期长,编写代码较复杂、容易出错。github

linux C++ 与Windows C++ 领域之争

我之因此把这一个标题单独列出来,是想纠正如今不少 C/C++ 新人和初学者的一些的不当认识,通常有如下几种观点:

  • linux C++开发就是后台开发,而 Windows C++ 开发就是客户端开发;
  • 后端开发比客户端开发(前端)高级,所以后端开发行业薪资水平比客户端开发薪资要高;
  • 我只学 linux,不学Windows。

我相信对于80和90这一代的开发者来讲,当初接触计算机并进入软件行业,都是从接触 Windows 开始的。时至今日,大数据、人工智能等各类新技术方兴未艾,移动互联网如火如荼。可是不管是 linux 仍是 Windows,尤为是Windows,仍是咱们大多数人工做、学习、娱乐使用最多的操做系统,咱们天天都会使用上运行在其上的各类软件。咱们使用这些软件像喝水、呼吸空气同样天然,因此不少人就忽视了这类软件的“基础做用”。对于 Windows 上的软件开发因为其发展了不少年了,这些领域也比较成熟,通常再也不招初中级开发,而是须要水平较高、经验较丰富的高级开发者,这让不少人形成了“Windows C++”开发市场需求已经很小了的错觉。试问,PC QQ部门这些年对外招了多少人?

另外,linux C++ 和 Windows C++ 同样,没有孰高孰低之分,只是两种不一样的操做系统而已,不要以为在linux 下敲命令就比在 Windows 的图形化界面点击鼠标达高级。图形化界面之于命令行,是人们对更高级、更方便的工具的追求的必然结果。linux C++ 也不必定就是后台开发,Windows C++ 也不必定就是客户端开发;所谓的服务器与客户端是个相对的概念,即谁给谁提供服务,提供服务的咱们认为是服务端(后台),被服务的咱们认为是客户端(前台)。而 Windows 做为后台服务的应用也比比皆是,如笔者以前所在的某交易所的服务器后台都是Windows下的C++程序;另外如一些游戏类的服务器端,也很多是Windows的。

借用《UNIX编程艺术》这本书的观点,Windows 和linux 的哲学理念不同,Windows是假设你不会操做,它教你如何操做,而 linux 是假设你会操做而后进行操做;根据这个理念,Windows 通常普通人用的多,而linux 程序员用的多。从编程的角度来讲,Windows的代码风格是使用所谓的匈牙利命名法,而linux使用的短小精悍的连字符风格,例如同一个表示屏幕尺寸的整型变量,Windows 上可能被命名为 iScreen 或 cxScreen ,而 linux 多是 screen;再例如 Windows 上建立线程的函数叫 CreateThread,linux 下叫pthread_create。有时候,我以为 Windows 的匈牙利命名法反而更容易理解代码。

这里既然提到前端(客户端)开发和后端开发,这里不得不提一下,这两者没有优劣之分。其侧重点和开发思惟是不同的,前端(客户端)开发通常有较多的界面逻辑,它们是直接与用户打交道的,于是一款客户端软件的好坏很大程度上取决于其界面的易用性和流畅性,开发者只要把这一端的“一亩三分地”给管理好便可;然后端服务,对于普通用户是透明的,开发者的程序必须尽可能体现“服务”这个字眼,即更有效地为更多的客户端服务,这就要求兼顾请求响应的正确性及时性流畅性,因为服务软件也是运行在某台物理机器上的程序,鉴于CPU、内存、网络带宽资源有限,而服务程序通常是长周期运行的,所以必须合理的分配和使用资源(如尽可能回收再也不使用的各类资源),开发者应从全局考虑,不能在某个“客户端”这一棵树上“吊死”。

从我的的职业发展来看,建议从事客户端开发的读者适当地了解一下服务器开发的思路,反过来也建议从过后端开发去学习一下客户端开发,两者相得益彰。从我的的技术提升来讲,也是颇有帮助的。例如您要学习一套开源的软件代码,若是您熟悉客户端和服务器的基本开发和调试技巧,您能够更好地学习它。而在工做上,一个项目,每每是由客户端和服务器程序组成,若是您都熟悉,您能够站在一个更高的角度去审视它、规划它,这也是架构师的基本要求之一。

最后就是不少读者关心的客户端和服务器的薪资问题,这个没有绝对的谁高谁低,因人而异,因能力而异,因岗位而异。

如何看待 C++ 11/14/17 新标准

C++ 开发者有个不成文的规定就是,即便您对 C++ 很熟悉,也不要在简历上写上您精通 C++,缘由很简单—— C++ 这门语言包含的东西实在太多了,没有人能真正“精通”全部。C++ 既支持面向对象设计(OOP),也支持以模板语法为表明的泛型编程(GP)。并且新的 C++ 标准和遵循 C++ 新标准的编译器也参出不穷,这些年,C++ 变化愈来愈大,愈来愈快,从最初业界和开发者翘首以盼的 C++11 标准,历经C++1四、C++17 到今天的 C++20,这门语言与以前的版本差异愈来愈大,更多原来须要使用第三库的功能也被陆续添加到 C++ 标准库中。以至于C++之父 Bjarne Stroustrup 也开始对这门语言表示担心:

在 C++11 开始的基础建设还没有完成,而 C++17 基本没有在使基础更加稳固、规范和完整方面作出改善。相反,却增长了重要接口的复杂度,让人们须要学习的特性数量愈来愈多。C++ 可能在这种不成熟的提议的重压之下崩溃。咱们不该该花费大量的时间为专家级用户们(好比咱们本身)去建立愈来愈复杂的东西。(还要考虑普通用户的学习曲线,越复杂的东西越不易普及。)

文章参看这里:https://zhuanlan.zhihu.com/p/...,在Bjarne Stroustrup 的信中,他担忧C++会像历史的瓦萨号军舰同样,启航即沉没。

固然,咱们不用有这种担心,毕竟咱们既不是 C++ 标准委员会成员,也不是 C++ 编译器开发厂商。就我我的经验来讲,对于C++十一、C++1四、C++17乃至C++20,咱们学习它们的准则应该是以实用为主,也就是说咱们应该学习其实用的部分,至于新标准提到的一些高级特性和各类复杂的模板,咱们大可没必要去了解。咱们并非作学术研究,咱们学习 C++ 是为了投入实际的生产开发,因此应该去学习 C++ 新标准中实用的语法和工具库。关于C++11经常使用一些知识点,这里也简单地给读者列举一下:

auto关键字、for-each循环、右值及移动构造函数 + std::forward + std::move + stl容器新增的emplace_back()方法、std::thread库、std::chrono库、智能指针系列(std::shared_ptr/std::unique_ptr/std::weak_ptr)(智能指针的实现原理必定要知道,最好是本身实现过)、线程库std::thread+线程同步技术库std::mutex/std::condition_variable/std::lock_guard等、lamda表达式(JAVA中如今也经常考察lamda表达式的做用)、std::bind/std::function库、

其余的就是一些关键字的用法(override、final、delete),还有就是一些细节如能够像JAVA同样在类成员变量定义处给出初始化值。

C++语言基础与进阶

基础

这里说的基础不是狭义上的 C++ 语言基础,而是包括C++开发这一辈子态体系的基础,笔者认为的基础有:

  1. C++语言自己熟练使用程度
  2. 前面也介绍了单纯的 C++ 您啥也干不了,您必须结合一个具体的操做系统平台,因此您得熟悉某个操做系统平台的 API 函数,好比linux,以及该操做系统的原理。这里说的操做系统的原理不局限于您在操做系统原理图书上看的知识,而是实实在在与系统 API 关联起来的,如熟练使用各类进程与线程函数、多线程资源同步函数、文件操做函数、系统时间函数、窗口自绘与操做函数(这点针对Windows)、内存分配与管理函数、PE 或 ELF 文件的编译、连接原理等等。
  3. 网络通讯,网络通讯在这里具体一点就是socket编程。这里的socket编程不只要求熟练使用各类网络 API 函数,还要求理解和灵活运用像三次握手四次挥手等各类基础网络通讯协议与原理。关于 socket 编程实践,《TCP/IP网络编程》这本书是很是好的入门教材。

说了这么多,您可能会以为很抽象。笔者在这里举个具体例子,假设咱们如今要开发一个相似电驴这样的软件。软件界面以下图:

图片描述

图片描述

图片描述

如上图所示,假设咱们的操做系统选择Windows,使用语言咱们使用 C++,这就要求您必须熟悉 C++ 经常使用的语法,若是您还不熟悉,您就须要补充这方面的知识。

在熟悉 C++语法的前提下,从这款产品实现技术来看,咱们的目标产品分为 UI网络通讯部分。下面将详细介绍这两部分:

UI 部分

对于UI部分,咱们的认识是这须要使用 Windows 的窗口技术。咱们能够直接使用原生的 Win 32 API 来制做本身的界面库,也能够选择一些咱们熟悉的界面框架,如mfc,wtl、duilib、wxWidgets等。不管您是在阅读别人的这样的项目仍是须要本身开发这样的项目,在肯定了这款软件使用的 UI 库(或者使用原生Win 32 API),您就须要对 Windows 的窗口、对话框、消息产生、派发与处理机制须要了解,一样的道理,若是不熟悉您须要补充相关的知识(关于这一点,下文再也不赘述)。

接着,根据上图中的软件功能,大体分为三大模块,即资源下载分享。这三大块是可使用一个Windows Tab控件去组织,这个时候您须要了解 Windows Tab控件的特性。

  • 对于资源模块,本质上是一个窗口中嵌入了一个浏览器控件(WebBrowser控件),那么您须要了解这一个功能点的相关知识。当用户点击了某个列表中某个具体的资源,能够对齐进行下载。这就又涉及到WebBrowser 控件与 C++ 宿主程序的交互了,那么如何实现呢?能够选择使用ActiveX技术,也可使用 javascript 与 C++交互技术。
  • 再来看下载模块,当产生一个下载操做时,界面上会产生如下下载列表,每一个列表项会实时显示下载进度、下载速率等参数,同时正在下载的项目也能够被暂停、中止和删除。那么这又设计到ListView控件的相关功能,以及 ListView 如何与后台网络通讯逻辑交互。
  • 分享模块是将本地资源分享到服务器或者给其余用户。界面左侧是对文件系统的一个快照,那么这又涉及到如何遍历文件系统(了解枚举文件系统的API),右侧也是一个 ListView 控件,这里再也不赘述。
网络通讯部分

网络通讯部分,主要有两大块,第一个是程序启动时,与服务端的交互;第二个就是文件下载与分享的 P2P 网络。您在阅读或开发的过程当中,若是对这些技术比较陌生,您须要补充这些知识,具体的也就是socket的各类 API函数,以及基于这些 API 逻辑的组合。固然可能也会用到操做系统平台所特有的网络 API 函数,如WSAAsyncSelect 网络模型。

再一点,网络通讯部分如何与 UI 部分进行数据交换,是使用队列?全局变量?或者相应的 Windows 操做平台提供的特殊通讯技术,如 PostMessage 函数、管道?若是使用队列,多线程之间如何保持资源的一致性和解决资源竞态,使用 Event、CriticalSection、Mutex、Semaphore等等?

固然,笔者这里只列举了这个软件的主干部分,还有许多方方面面的细节须要考虑。这就须要读者根据本身的状况,斟酌和筛选了。您想达到什么目的,您就去学习和研究相关的代码。

总结起来,能够获得以下公式:

一款C++软件 = C++语法 + 操做系统API函数调用

进阶

若是您达到了我上面说的三点后,能够再找一些高质量的开源的项目去实战一下。须要注意的是最好找一些没有复杂业务或者您熟悉其业务的开源项目(如开源的IM系统),若是你不熟悉其业务,不只要学习其业务(软件功能),还须要再去学习它的源码,最后可能让咱们迷失了最初学习这款软件的目的。

学习这些项目的同时,读者应该先肯定本身的学习目的,若是您的目的是学习和借鉴这款软件的架构,那么先从总体去把握,不要一开始就迷失在细枝末节中,这类我称之为“粗读”;或者,您的目的是学习下开源软件的在一些细节上的处理与作法,这个时候,您能够针对性地去阅读您感兴趣的模块,深刻到每一行代码上去。

学习开源软件存在一种风气,许多新手喜欢道听途说,一听别人说这个软件很差,那个软件存在某某瑕疵就放弃阅读它的打算了。而后到了实际开发中,由于心中没有任何已有软件开发问题的解决方案,产生挫败感,长此以往就对原本喜欢的 C/C++ 开发失去了兴趣。学习的过程是先接触,再熟悉,再模仿,再创造。无论什么开源项目,在您心中没有任何思路或者解决方案时,您应该先接触熟悉,不断模仿,作到至少心中有一套对于某场景的解决方案,而后再来谈创新谈批判、改造别人的项目。

我我的学习一套陌生的开源项目时,老是喜欢将程序用调试器正常跑起来,而后再中断下来,统计当前的线程数目,而后经过程序入口main函数从主线程追踪其余工做线程是如何建立的;接着,分析和研究每一个线程的用途以及线程之间交互的,这就是总体把握,接着找我感兴趣的细节去学习。

这里我以学习 redis 为例,将 redis 源码从官网下载下来之后,使用您喜欢的代码阅读器管理起来,我这里使用的是Visual Studio,以下图所示:

图片描述

在大体了解了 redis 有哪些代码模块之后,咱们把代码拷贝到 linux 平台,而后编译并使用 gdb 调试器跑起来。以下图所示:

![1542094133679](20181113161555.png)

而后使用按 ctrl + C 将gdb中断下来,输入info threads查看当前程序的全部线程:

图片描述

接着挨个使用 thread + 线程编号bt 命令去查看每一个线程的上下文调用堆栈:

![1542094133679](20181113161924.png)

而后对照每一个线程的上下文堆栈,搞清楚其逻辑,并结合主线程,看看每一个线程是在什么时候启动、端口在什么时候启动侦听的等等。等作完这一步,关于 redis-server 的框架也基本清楚了。

接着咱们能够选择一个本身感兴趣的命令,搞清楚redis-cliredis-server命令的交互流程。

最后,若是对 redis-server 源码中各类数据结构和细节感兴趣,咱们能够进一步深刻到具体的代码细节。

固然,不熟悉 gdb 的读者看笔者这段操做流程比较困难,这是正常的,说明若是想经过调试去研究 redis这一款开源软件,您须要去补充一点 gdb 调试的知识。这就是我上文中所说的,针对性地补缺补差。

C++ 面试

关于C++面试,面试的要求究竟是侧重代码量、项目经验,仍是侧重操做系统、数据结构这种基础知识?我在知乎上曾经专门写过一篇文章来介绍我面试曾经C++的面试的经历和经验,有兴趣的读者能够点击这里查看:https://www.zhihu.com/questio...

关于C++面试常见的面试题,能够参考这里:https://zhuanlan.zhihu.com/p/...,这篇文章问题点整理的很是详细,读者能够参考一下。

须要注意的是,不只仅是 C++ 面试,其余语言开发面试也是同样。若是您是想进入大的互联网公司的应届生,那么您应该优先好好准备算法和数据结构知识,以应对面试,这是大的互联网公司面试频率最高的考察范围;至于其余的基础知识,如操做系统原理、网络通讯等基础知识,做为计算机相关专业的学生,这些应该是您的专业课,若是您已经在平时的学习中掌握的很好,那就不用担忧,这类问题通常对于应届生求职不会问的太深;假若您还没有学的扎实,而春招或秋招又时间临近,没有足够的时间去准备这些,您应该只是尽可能去补,实在来不及也不要紧,仍是应该把重心放在好好准备算法和数据结构等知识上。

对于社会人士参加的 C++ 职位的面试,若是是大的互联网公司,虽然社会招聘问的更多的是项目经验,适当地为一些基础的算法和数据结构知识作一些准备也是很是有用的,举个例子,若是问到二分查找这一类基础算法,若是答不出来未免会让面试官印象不太好,场面也比较尴尬。另外,C++是一门讲究深度的编程技能,对于有必定工做年限的面试者,面试官每每会问不少原理性的细节,这就要求广大 C++ 开发者在日常多留心、多积累、多思考技术的背后的原理。

而对于大多数小的企业,不管是应届生仍是社会人士,只要有能力胜任必定的工做便可,因此通常只要对所面试的公司的项目有相似经验或者相关的技术能力,基本上就可经过面试。大多数小公司在意的是您来了能不能干活,因此这类公司对实际项目经验和技能要求更高一点。

再者就是关于项目经验,许多人可能以为项目经验必定是本身参与的项目,其实否则,项目经验也能够来源于您阅读和学习其余人的项目代码或者开源软件,只要您能看懂并理解它们,在面试的时候说起到,能条理清晰、自圆其说便可。固然,若是不熟悉或者只是了解些皮毛,切记不可信口开河、胡编乱造甚至张冠李戴,我曾经面试过一些开发者,看简历项目经验丰富,实际一问的时候,只是把别人的框架或者库拿来包装调用一下,问及其技术原理时,不是顾左右而言他就是说不清道不明模棱两可含糊不清,这一类人每每比不知道还让人讨厌,面试官通常反感这一类面试者的所谓的项目经验的。

学生与社会人士学习 C++ 的方式的区别

若是是学生的话,有充裕的时间,建议除了把 C++ 语法学好,系统地多读一点基础的书籍,如操做系统原理、网络编程、数据结构与算法相关的各方各面的经典书籍,能够参考下这里:https://mp.weixin.qq.com/s/Ej...。尽可能作到等您毕业走出校园之后,至少熟悉一门编程语言和其相应的开发环境的,是一个基础扎实、理论清晰、编码能力强的求职者。惋惜的是,从如今的各类招聘反馈来看,大多数学生在求职时,对相关开发工具和语言的陌生程度实在让人瞠目结舌,面试官在面试的时候会很纳闷:这位学生大学四年(或者七年)究竟是否调试过程序?

社会人士因为已经走上工做岗位,家庭、工做的杂事繁多,没有太多的时间去系统地阅读一些相关基础书籍,若是您当前工做正好是从事 C/C++ 开发,那么请结合您当前的项目来学习,搞清楚项目的体系结构、吸取项目中优秀的实现细节,针对性地补充相关知识,这是进步最快的方式。可是实际情形中,不少人以为公司的项目代码又烂又杂,不肯意去研究,这种思想千万不能有的,在您没有本身足够好的能力给公司提供更好的解决方案,请先学习和模仿,咱们此时要保持“空杯”心态,公司的代码再烂,它也是公司的商业价值所在;即便是纯粹的业务代码,也有它的可取之处,择其善者而从之,其不善者而改之。尤为是开发者处于一些初中级的开发岗位时,可能接触不到公司核心框架的源码,此时千万不要盲目地去排斥。学业务,补基础,时刻意识清醒本身所需,明白本身想要学的东西。

若是从事的不是 C++ 相关的开发,那么能够挤出一些时间去学习一些开源的代码,在阅读开源代码的过程当中,针对性地补缺补差。不建议系统地去看《C++ primer》《UNIX环境高级编程》诸如此类的大部头书籍,实际开发中不须要太多的这类书中的细枝末节,阅读这类书每每只会事倍功半,甚至最后因书籍太厚、时间不够,最后坚持不下去,最终放弃。

固然,对于社会人士,当您有必定的时间的时候必定要去补充一些基础的、原理性的东西,千万不要沉溺于“面向搜索引擎编程”或者“面向工资编程”,有些问题虽然当时经过搜索引擎解决了,但若是想在技术或职业上有长足的发展,必定要系统地去读一些经典的、轻量级的书籍(如《C++对象模型》)。长期在网上的文章中寻章摘句,只会让您的知识结构碎片化、凌乱化,甚至混乱化。并且互联网上的技术文章质量参差不齐,有时候也容易对本身造成误导和依赖。总而言之,做为技术开发人员,提升本身技术水平是改变现状、改善生活最直接的途径。

小结

关于C/C++,暂且就讨论这么多。最后再强调一遍,C++是一门讲究深度的语言,其“深度”不是体如今会多少 C++ 语法,而是可以洞察您所写的C++代码背后的系统原理,这是须要长期不断的积累的,没有速成之法。反过来一旦学成,能够快速地学习其余语言和框架。我的以为,若是自主创业或者想在二三线城市长期发展的读者,C/C++ 应该是优选语言,有了它做为基础,您能够跳出依赖各类环境和框架的窠臼,快速地学习和开发您想要的软件,完成您想要的业务产品。

最后,限于笔者经验水平有限,欢迎读者就文中的观点提出宝贵的建议和意见。若是想得到更多的学习资源或者想与我作进一步交流,也欢迎关注个人公众号『高性能服务器开发』,一块儿交流C/C++编程技艺与思想。也能够加入C++开发交流群:578019391 一块儿交流。

图片描述

相关文章
相关标签/搜索