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