大家可能听过“XXX是世界上最好的语言”,实际上的情况是每个语言都有它最适合的领域,Java适合Web,Python适合人工智能与数据分析,C/C++适合开发底层程序,即使是汇编也会在某些对性能要求极其高的项目中用到。当然了不是说某某某语言只能干什么,只是最适合,也可以用来干其他事,只不过很费劲,很麻烦而已,而且有很大可能达不到预期的效果。
目前国内的嵌入式开发非常火,而C/C++主要用于底层的嵌入式开发、驱动开发等,也用于WINCE等嵌入式系统的应用软件开发。
与Java和.NET比,C/C++是一种应用范围更广、运作效率更高的编程语言,软件开发行业一直流传着一句话:
没有学过C++就不是真正的程序员,没有掌握C/C++编程技术就等于没有抓住通向国际一流企业的敲门砖。
从目前就业市场上看,企业对C/C++人才有大量需求,但苦于招不到合适的人。
很多应聘者因为C/C++工作能力的缺乏而被用人单位拒之门外,C/C++人才职场正面临着“有人没活干有活没人干”的尴尬局面。
本篇收集自各招聘要求,基本包括了C/C++不同的发展方向和所要具备的知识和技能点,供参考学习。
一、嵌入式就业方向
岗位技能:
1、熟悉交叉编译的原理,熟练构造/使用交叉编译工具链
2、熟悉Linux(x86,arm)的内核裁减,配置,编译和部署
3、熟悉Linux根文件系统的组成,并能够配置,编译,使用buzybox等工具按照实际要求裁减,构造根文件系统
4、熟练运用C/C++语言进行Linux下应用程序编程
5、熟悉Linux下的多进程/多线程编程,理解进程/线程间同步/通信的概念和方法
6、了解Linux下内核模块的编程的原理和方法,能够修改/添加内核中的驱动程序
7、了解Uboot/GRUB/LILO等bootloader的配置,编译和部署
8、了解Socket编程……
嵌入式知识架构体系:
1、懂硬件
懂硬件的一些原理,至少能看懂原理图,会设计原理图加分;
PCB设计软件AltiumDesigner,PADS等;
会结构设计,会焊板,交付专业制板公司制板
2、C/C++语言和数据结构以及简单算法
基本C/C++语法、数据类型、数组、指针、结构体、链表、类、模板、文件操作、队列、栈等
3、Linux操作系统基础
Linux操作系统的概念、安装方法;
详细了解Linux下的目录结构、基本命令、编辑器VI、编译器GCC、调试器GDB和Make项目管理工具;
MakefileShell脚本编写等知识;
嵌入式开发环境的搭建;
SDK做二次开发
4、Linux网络编程
TCP/IP协议、socket编程、TCP/UDP网络编程、HTTP;
走物联网方向,更要了解一些与云存储相关的网络接口,比如亚马逊、阿里云等
5、外设协议与射频
简单通信接口:UART、I2C、SPI、CAN、USB、GPIO、WiFi、SDIO芯片;
网络通信接口:以太网;
其它输入接口:键盘、鼠标、AD器件、LCD、、2.4G等无线通信模块;
走物联网方向,务必要熟悉MQTT协议
6、了解嵌入式平台系统原理
系统资源、时钟控制器、电源管理、异常中断控制器、nandflash控制器等模块,为底层平台搭建做好准备;
Linux平台包括:内核裁减、内核移植、交叉编译、GNU工具使用、内核调试、Bootloader制作与原理分析、根文件系统制作,以及向内核中添加自己的模块,完整的移动软件
7、驱动开发
熟悉Linux的内核机制、驱动程序与用户级应用程序的接口,掌握系统对设备的并发操作;
熟悉所开发硬件的工作原理,具备ARM硬件接口的基础知识;
熟悉处理器各资源、掌握Linux设备驱动原理框架;
熟悉工程中常见Linux高级字符设备、块设备、网络设备、USB设备等驱动开发;
在工作中能独立胜任底层驱动开发,做好配置
二、桌面应用程序开发(MFC/QT)就业方向
岗位技能:
1、熟练掌握C、C++、ATL、COM等编程技术。
2、熟练掌握Windows系统编程,熟悉窗口、网络和多线程技术。
3、两年以上的嵌入式或windows平台QT应用软件开发经验.
4、熟悉QT跨平台框架,QT图形库和相应的开发工具。至少参加过一个完整的QT项目。
5、具备数据结构、面向对象、多线程和内存管理的基础和经验
6、掌握window/wince开发环境
7、熟悉通用的代码管理工具,例如SVN,GIT等
……
桌面应用知识架构体系:
1、C/C++语言、常用数据结构以及常用设计模式
基本C/C++语法;
数据类型、数组、指针、结构体、链表、文件操作、队列、栈、二叉树、单例;
工厂模式、策略模式等设计模式
2、控件和组件应用
VC++控件,组件、MFC文档类;
Menu、Windows消息;
sendmsg函数、动态链接库;
QtCore、QtGUI、QtMultimedia、QtMultimediaWidgets、QtNetwork、QtQML、QtQuick、QtSQL、QtTest、QtWidgets等Qt基本模块(QtEssentials);
应用QPainter绘图系统、QSS样式表,实现各种自绘窗口
3、操作系统原理和IDE
Windows核心编程、多线程、多进程、线程同步以及进程间的通信;
字符解析协议,如XML和Json;
熟悉VS和QT环境
4、网络编程
TCP/IP协议、socket编程、HTTP;
重点学习网络编程相关API;
了解HTTP协议及其实现方法;
熟悉UDP广播、多播的原理及编程方法;
掌握混合C/S架构网络通信系统设计;
QTCP、QHttp等实现网络编程;
异步非阻塞框架IOCP等
5、调试技术
IDA+windbg高级调试Windows;
产生dump文件进行代码调试;
使用DebugView工具调试
6、数据库设计
掌握SQL语言的实用技巧;
SQLite与Oracle、MySQL的使用方式及区别
7、良好的框架设计
三、图像处理与音视频开发就业方向
岗位技能:
1、熟悉图像处理基本法(边缘检测,区域提取,低通滤波,特征提取);
2、熟悉机器学习算法(例如LR,SVM,ANN等)和深度学习算法CNN等;
3、熟悉opencv,具有运动标检测、特征提取、物体识别相关开发经验者优先;
4、有OCR或字检测等相关研究或项经验;
5、熟悉linux开发环境,熟悉C/C++/Python等任语;
6、有良好的沟通能,责任强,善于协助与分享;
7、可熟练阅读在线英技术站、技术标准者优先。
……
图像处理与音视频知识架构体系:
1、C/C++语言和设计模式
基本C/C++语法、数据类型、数组、指针、类、模板等;
常用的设计模式
2、OpenCV/OpenGL知识体系和各种图像格式和视频格式
OpenCV的环境配置,数字图像处理相关知识;
图像滤波,图像识别,膨胀,腐蚀,直方分布图,二值化,灰度,目标识别、检测、定位等图像处理相关技术;
模式识别相关算法如二值化,SIFT特征,边缘轮廓检测等;
计算机图形学/计算机视觉/相机标定;
三维建模;
各种图像格式的基本概念;
rgbyuvjpg;FFmpeg常见编解码格式用法;
写MP4容器
3、操作系统原理和网络编程以及相关协议
Linux/windows操作系统核心原理、线程/进程;
tcp/udp协议rtmprtpRTSP
4、良好的算法能力
掌握深度学习算法原理和基本模型;
熟练使用深度学习开源框架(如TensorFlow,Keras,Caffe等);
人群、手势、人脸识别
5、良好的数学知识
熟悉matlab的使用、矩阵论;
具备阅读SCI论文等能力
6、开源代码
音视频:Live;webrtc;
图像处理:OpenCV源码
四、Linux后台服务开发就业方向
岗位技能:
1、精通Linux操作系统,具备扎实的Linux环境编程能力;
2、精通C++编程语言并具备丰富的面向对象编程经验;
3、精通网络编程并有高并发系统的开发经验;
4、熟悉MYSQL或其他大型数据库,能够快速根据需求完成高性能数据库设计;
……
Linux后台服务知识架构体系:
1、C/C++语言和设计模式
基本C/C++语法、数据类型、数组、指针、结构体、链表、文件操作、队列、栈等
2、操作系统基础
Linux操作系统的概念、安装方法,线程、进程;
详细了解Linux下的目录结构、基本命令、编辑器VI、编译器GCC、调试器GDB和Make项目管理工具;
MakefileShell脚本编写等知识
3、Linux系统编程与linux操作系统
重点学习标准I/O库,Linux多任务编程中的多进程和多线程;
进程间通信(pipe、FIFO、消息队列、信号量、共享内存、信号)同步与互斥,对共享资源访问控制等重要知识;
提升对Linux应用开发的理解和代码调试的能力;
Linux文件系统
4、网络原理与网络编程
TCP/IP协议、socket编程、TCP网络编程、UDP网络编程、HTTP;
重点学习网络编程相关API;
熟悉HTTP协议及其实现方法;
对比网络框架,做源码分析,如ACE/ICE/ZMQ/Libevent/Muduo等
5、数据库、中间件
Mysql、redisnginxmongdb等中间件
6、集群与分布式架构
7、高性能组件造轮子的能力高并发IO
五、逆向与反外挂就业方向
岗位技能:
1、熟悉X86汇编、C/C++语言;熟悉PE文件格式;
2、熟悉windows或Android平台下反汇编,熟悉X86和arm汇编指令;
3、熟练掌握软件逆向静态分析、动态调试、代码跟踪等技术;
4、熟练使用OllyDBG,IDAPro、GDB等逆向工具;
5、熟悉反跟踪调试技术、脱壳技术;
6、了解各种通用加解密算法;
7、有andriod、IOS反汇编经验优先
……
逆向与反外挂知识架构体系:
1、C/C++语言的逆向表现与X86汇编语言
C语言/C++逆向语法表现,内存分布,X86汇编语言、数组和指针的逆向表现、函数的逆向表现;
学习逆向如果不掌握一些汇编,基本就是盲人摸象,能出成果就只能靠运气。
随着64位机器的普及,32位程序会越来越少,这块的学习难点在于64位CPU和32位CPU差异明显,甚至可以说是差异巨大,大家学习时要注意区分。
2、操作系统与windowsPE
操作系统进程/线程概念,互斥量、信号量、事件等;
PE头,导入/导出表;
重定位/资源/延迟加载导入表
3、游戏反外挂/HOOK/注入
基于注入的反外挂攻防;
基于HOOK的反外挂攻防;
基于CALL的反外挂攻防;
基于窗口的外挂检测;
游戏多开的逆向分析
4、加密/编码算法
基础的,比如异或、url编码等;
base64(出镜率极高)crc校验算法md5;
学习tea和aesdes
这里建议,可以先学习正向开发的部分算法。用不同的算法处理过的数据,会有一些特征;见得多了,很多时候可以在你研究逆向时给予很大帮助。
5、工具类
OD、CE、Windbg等调试工具;
wireshark、x64dbg、frida、visualstudio,其中有一些是开发工具,比如visualstudio;
虽然这些工具是开发工具,但是其中包含很多小工具,比如spy++、depends等
6、框架
逆向框架比较多,比如Cydia、xposed、substrate、ghidra等;
每个框架所适用平台和条件也略有差异,例如:
Cydia是在苹果下做逆向;
xposed是Android下逆向;
substrate是一种拦截方案;
ghidra是一个集成环境等
逆向与反外挂这一部分比较特别,它们的知识点没有尽头。
除了这些就业方向,还有智能硬件和可穿戴设备(智能硬件VR/C++,)、音视频解码(协议优化)、C++游戏开发(游戏方向,熟悉游戏引擎cocos2dx等)等就业方向可以选择。
智能硬件和可穿戴设备(智能硬件VR/C++)
岗位技能:
1、熟悉Unity3D引擎架构设计者优先;
2、熟悉网络编程和多线程编程;
3、熟练掌握C/C++,具有3年以上的C/C++软件开发工作经验;
4、有3D图形引擎开发相关经验;
5、对物理引擎有深入研究,并在游戏等实际应用中有过相关实践;
6、对图形学知识有深入了解,熟练使用DirectX、OpenGL或Metal,并有相关作品。
7、具有一定的英语水平,能够阅读外国学术文档。
8、有OculusRift,SamsungGearVR,或HTCVive开发经验者优先。
……
音视频解码(协议优化)
岗位技能:
1、熟悉音视频编解码处理算法,有相关领域一年以上工作经验;
2、熟悉ffmpeg体系结构,能够移植和优化该系统到移动客户端;
3、熟悉RTMP、HLS等流媒体直播协议(或者相关协议);熟悉vlc或者ffplay、mplayer架构者优先;
4、熟悉TCP/IP和Socket网络编程;
5、熟悉C/C++开发语言;
6、熟悉WINDOWSPC客户端软件开发
……
C++游戏开发(游戏方向,熟悉游戏引擎cocos2dx等)
岗位技能:
1、精通Linux操作系统下的C/C++软件开发;熟悉基础的数据结构和主流数据算法,了解棋牌算法等优先。
2、精通分布式系统设计原理,熟悉TCP/IP网络模型,熟悉网络异步通讯;
3、具有C/S结构软件系统的设计及开发经验;
4、熟悉数据库设计与SQL语言,精通MySql数据库尤佳;
5、熟悉Redis、MQ等开源技术尤佳;
6、熟悉protocolbuffer、json等协议;
7、熟悉主流软件开发流程,有Scrum等敏捷开发团队管理经验者尤佳;有很强的沟通协调能力。
……
往细了说,后端、客户端、游戏引擎开发以及人工智能领域都需要它。
往大了说,构成一个工程师核心能力的东西,都在C/C++里。
如果你希望把工作当成事业、深入了解软件编程的主心骨,那么C/C++这一类底层语言,是你必须要学习和掌握的。
尤其是C++,它作为C语言的延伸和强化,一直是大公司大厂钦点的开发语言。
如今自学成风,C/C++也不乏大佬自学……
但是,在初期找不到感觉和项目练手写代码的话,学习效率非常低。
找我获取编程视频课程+语法词汇解析+面试题库