在大多数开发人员的认知中,C/C++ 是一门非常难学的编程语言,很多人知道它的强大,但因为“难”造成的恐惧让很多人放弃。在我看来,C/C++ 一旦学成,其妙无穷,就像武侠小说中的“九阳神功”一样,有了这个基础,学习任何语言和编程技术都非常快速!
本文就为大家分享我学习C/C++ 的经验,不少人都说看完这篇文章感觉醍醐灌顶,想一看再看,希望你也能有所收获!
01
C/C++ 当前的应用领域
通常情况下,C++ 可以看成是 C 的一个超集。
C 语言目前主要用于像操作系统一类偏底层的应用开发,包括像 Windows/Linux 这样的大型商业操作系统,以及嵌入式操作系统、嵌入式设备上的应用,还有一些开源的软件,也会选择 C 开发。
我们再来说说 C++,C++ 的应用领域目前有三大类:
第一类就是我们目前见到的各种桌面应用软件,尤其 Windows 桌面软件,如 QQ、安全类杀毒类软件、各种浏览器等;
另外就是一些基础软件和高级语言的运行时环境,如大型数据库软件、Java 虚拟机、C# 的 CLR、Python 编译器和运行时环境等;
第三类就是一些业务型应用软件的后台,像游戏的服务器后台,如魔兽世界的服务和一些企业内部的应用系统。
02
C++ 语言基础与进阶
2.1 基础:
这里说的基础不是狭义上的 C++ 语言基础,而是包括 C++ 开发这一生态体系的基础,笔者认为的基础包括:
C++ 语言本身熟练使用程度。
必须结合一个具体的操作系统平台,所以得熟悉某个操作系统平台的 API 函数,比如 Linux,以及该操作系统的原理。
网络通信,网络通信在这里具体一点就是 Socket 编程。
说了这么多,你可能会觉得很抽象。举个具体例子,假设我们现在要开发一个类似电驴这样的软件,软件界面如下图:
如上图所示,假设操作系统选择 Windows,使用语言使用 C++,这款产品的实现技术分为 UI 和网络通信部分,下面将详细介绍这两部分。
UI 部分
无论你是在阅读别人的项目还是需要自己开发这样的项目,在确定了这款软件使用的 UI 库,您就需要对 Windows 的窗口、对话框、消息产生、派发与处理机制进行了解。
接着,根据上图中的软件功能,大致分为三大模块,即资源、下载和分享。这三大块是可以使用一个Windows Tab 控件去组织,这个时候您需要了解 Windows Tab 控件的特性。
网络通信部分
网络通信部分,主要有两大块,第一个是程序启动时,与服务端的交互;第二个就是文件下载与分享的 P2P 网络。
2.2 进阶:
如果您达到了我上面说的三点后,可以再找一些高质量的开源项目去实战一下。需要注意的是,最好找一些没有复杂业务或者您熟悉其业务的开源项目(如开源的 IM 系统)。
我个人学习一套陌生的开源项目时,总是喜欢将程序用调试器正常跑起来,然后再中断下来,统计当前的线程数目,然后通过程序入口 main 函数从主线程追踪其他工作线程是如何创建的;接着,分析和研究每个线程的用途以及线程之间交互的,这就是先整体把握,然后找感兴趣的细节去学习。
03
关于 C++ 的面试
关于 C++ 面试,面试的要求到底是侧重代码量、项目经验,还是侧重操作系统、数据结构这种基础知识?
如果你是想进入大型互联网公司的应届生:
应该优先好好准备算法和数据结构知识以应对面试,这是大型互联网公司面试频率最高的考察范围。
如果是社会人士参加的 C++ 职位的面试:
如果是大型互联网公司,虽然社招问的更多的是项目经验,但适当准备一些基础的算法和数据结构知识也是非常有用的。
另外,C++ 是一门讲究深度的编程技能,对于有一定工作年限的面试者,面试官往往会问很多原理性的细节,这就要求广大 C++ 开发者在平常多留心、多积累、多思考技术背后的原理。
本文转载自 | Chat-《如何成为一名合格的 C/C++开发者》
作者 | 范蠡