如何为C++开发工程师做准备

顾名思义,C++开发工程师是使用C/C++语言进行程序开发的职位,具体工作内容根据侧重点不同主要可能包括Windows程序设计、Linux程序设计、Qt界面设计、驱动开发、游戏引擎开发、硬件嵌入式编程、汇编交互等。对C/C++编程语言和系统底层相关编程感兴趣的可以考虑这个岗位。

“目前国内的嵌入式开发非常火,而C++主要用于底层的嵌入式开发、驱动开发等,也用于WINCE等嵌入式系统的应用软件开发。可以说C++开发工程师的发展前景还是不错的,与Java和.NET比,C++是一种应用范围更广、运作效率更高的编程语言,软件开发行业一直流传着一句话:没有学过C++就不是真正的程序员,没有掌握C++编程技术就等于没有抓住通向国际一流企业的敲门砖。因此,C++是程序员的骄傲,是成为一名优秀程序员必备的知识底蕴和素养。”(本段节选自知乎)

通常认为,C++岗位的市场需求很大,但是招不到合适且有能力的人,也就是“有人没活干有活没人干”。所以C++开发工程师前景还是不错的。

一、入坑前需要掌握的知识和技能(包括但不限于以下内容)

1. 数据结构与算法的相关知识

(1)常用的数据结构及其性质,如数组、链表、堆、栈、二叉树等。

(2)常用的排序算法及其性质,如冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序等。

(3)常用于解决问题的算法及其性质,如贪心算法、分治法、动态规划法、分支界限法、回溯法等。

2. 计算机网络的相关知识

(1)OSI七层架构、TCP/IP四层架构和五层架构。

(2)常用网络协议的结构及其性质,如TCP、UDP、HTTP等。

3. 操作系统的相关知识

(1)CPU调度。

(2)进程、线程和协程。

(3)内存调度。

4. 软件工程的相关知识

5. Windows控制台、类UNIX终端常用命令

二、C++基础(必须掌握)

1. 环境设置

(1)编辑器:Visual Studio Code(简称VSCode);

(2)IDE:JetBrains公司的CLion,通过学生邮箱验证可以免费使用,如果是进行Windows系统开发则需要使用Visual Studio;

(3)编译器、调试器等工具:Windows系统上可以安装MinGW套件(需选择安装C++相关工具),类UNIX系统上一般自带gcc和g++,可以自行安装gdb;根据需要可以额外安装cmake;

(4)对于Windows系统,上述工具中的部分可能需要添加到环境变量中。

2. 基本语法:main函数、代码块、标识符、关键字、注释等基本概念。

3. 数据类型、变量、常量:bool、char、short、int、long、long long、float、double等,需要特别注意C/C++中部分类型变量在系统中所占空间是由环境决定的,并不像Java等语言是固定的。

4. 运算符:注意运算符优先级顺序,可以适当使用括号解决优先级问题。

5. 条件、循环语句

6. 函数、内联函数

7. 数组、C风格字符串、多维数组

8. 指针、多级指针、常量指针、指向常量的指针:非常重要。

9. 引用、常量引用:非常重要。

10. 面向对象:类和对象、继承、重载、多态、抽象、封装、接口。

11. 文件和流:一般不会考察。

12. 异常处理:一般不会考察。

13. 动态内存、智能指针:非常重要,面试会重点考察。

14. 命名空间:一般不会考察。

15. 模板:重要,面试是加分项。

16. 预处理器:面试可能会问及宏定义和内联函数的区别。

17. 信号处理、多线程:面试是加分项。

18. STL标准库:非常重要,面试会重点考察,除了考察各种容器的性质,还会问及底层实现。

三、C++进阶(根据自己的方向可选)

1. Windows程序设计(Windows开发)

2. Qt(可视化客户端开发)

3. Linux内核(Linux系统级应用开发)

4. 汇编语言(硬件、嵌入式编程)

四、除了上述知识技能,面试前还需要做的准备

1. 时不时通过LeetCode、牛客网等网站,刷几道编程题,特别是多刷几遍“剑指Offer”系列,为笔试、面试中常考的题目。

2. 除了C++相关基础,对后端、数据库等方面和其他高级编程语言能有一定了解,笔试选择题或者面试中可能也会涉及。

五、面试常见问题(列举部分)

1. 计算机网络

(1)TCP/IP四层模型都有哪些层?每层的有哪些协议?

(2)TCP和UDP通信的差别?

(3)HTTP常见的状态码?

(4)HTTP和HTTPS,为什么HTTPS安全?

2. 操作系统

(1)进程、线程和协程的概念和区别?

(2)进程调度算法有哪些?线程调度算法有那些?

(3)select、poll和epoll的区别?

(4)内存态和用户态的区别?

3. 面向对象程序设计

(1)类和对象的概念和区别?

(2)设计模式有哪些?举例说明。

(3)继承、封装和多态的了解。

4. 数据结构与算法

(1)数据结构有哪些?项目中常用的数据结构介绍?

(2)内存分为哪几块?区别?生命周期?

(3)常用的排序算法?时间、空间复杂度?优缺点?

(4)深度优先和广度优先的理解。

5. C++基础

(1)C和C++的区别?

(2)const关键字的用法?

(3)C++内联函数和C宏定义的区别?优缺点?

(4)new和delete、malloc和free的区别。

(5)类的成员函数重载、覆盖和隐藏的区别。

(6)什么是容器?常见的STL容器有哪些?

(7)对虚函数和虚表的理解。

6. C++进阶

智能指针有哪几类?区别?

六、学习资料

1. 菜鸟教程 – C++教程:https://www.runoob.com/cplusplus/cpp-tutorial.html

2. 牛客网 – C++教程:
https://www.nowcoder.com/tutorial/10003/7bdcb36b1ff74114b026c46b7ac64ac1

3. C++参考手册:https://zh.cppreference.com/w/%E9%A6%96%E9%A1%B5

4. Qt文档:https://doc.qt.io/

5. 菜鸟教程 – Linux教程:https://www.runoob.com/linux/linux-tutorial.html

6. 《C++ Primer》

(注:本文为本人为学院研究生学业工作指导手册编写的一个章节。)