简介

  • C++工程师适合领域深度绑定的,一般初级都称为初级C++工程师,到了后期,分别是音视频高级C++工程师,人工智能高级C++工程师,医疗领域高级C++工程师等等

  • 要有深度和广度。有足够的广度,找到喜欢的一个方向,提高深度,当遇到技术壁垒时,再次回到广度扩展方面,寻找另一个方向,再挖深度

未来10年,C++5个非常有前景的就业方向

后台服务器开发

  • C++后台所需要具备的技能
    • 软件基础(数据结构与算法,设计模式,C++新特性,Linux工程管理)
    • 高性能网络(网络编程,网络原理,协程,用户态协议栈)
    • 基础组件(池式组件,高性能组件,开源组件)
    • 中间件(MySQL,Redis,Nginx,MongoDB, Elasticsearch)
    • 开源框架(Skynet, DPDK, TARS)
    • Rust(Rust特性, 网卡速度监控, OAuth2第三方登陆, tokio, Warp, hyper)
    • 性能分析(测试框架gtest以及内存泄漏检测, 火焰图的生成原理与构建方式)
    • 分布式架构(分布式消息, 分布式服务, 分布式API网关, 分布式存储)
    • 微服务( IM消息服务器/文件传输服务器, 消息服务器/路由服务器, 数据库代理服务器设计, 文件服务器和docker部署)
  • 应用场景
    • 处理大规模用户
    • 分布式计算
    • 处理大容量搜索 大规模响应
  • 企业
    • 当然,我们也关心,正在使用C++在哪些地方有使用,国内的大企业都有C++后台开发,因为他们需要处理大规模用户,分布式计算,大规模响应等。

云原生

  • 云原生其实是一套指导进行软件架构设计的思想。
  • 云原生的最大价值和愿景,就是认为未来的软件,会从诞生起就生长在云上,并且遵循一种新的软件开发、发布和运维模式,从而使得软件能够最大化地发挥云的能力。

  • 云原生的四要素
    • 微服务:
      • 几乎每个云原生的定义都包含微服务,跟微服务相对的是单体应用,微服务有理论基础,那就是康威定律,指导服务怎么切分,很玄乎,凡是能称为理论定律的都简单明白不了,不然就忒没b格,大概意思是组织架构决定产品形态,不知道跟马克思的生产关系影响生产力有无关系。
      • 微服务架构的好处就是按function切了之后,服务解耦,内聚更强,变更更易;另一个划分服务的技巧据说是依据DDD来搞。
    • 容器化:
      • Docker是应用最为广泛的容器引擎,在思科谷歌等公司的基础设施中大量使用,是基于LXC技术搞的,容器化为微服务提供实施保障,起到应用隔离作用,K8S是容器编排系统,用于容器管理,容器间的负载均衡,谷歌搞的,Docker和K8S都采用Go编写,都是好东西。
    • DevOps:
      • 这是个组合词,Dev+Ops,就是开发和运维合体,不像开发和产品,经常刀刃相见,实际上DevOps应该还包括测试,DevOps是一个敏捷思维,是一个沟通文化,也是组织形式,为云原生提供持续交付能力。持续交付:持续交付是不误时开发,不停机更新,小步快跑,反传统瀑布式开发模型,这要求开发版本和稳定版本并存,其实需要很多流程和工具支撑。
  • 云原生关键技术点
    • 如何构建自包含、可定制的应用镜像;
    • 能不能实现应用快速部署与隔离能力;
    • 应用基础设施创建和销毁的自动化管理;
    • 可复制的管控系统和支撑组件。
  • 场景
    • 深度学习应用场景
      • 云原生深度学习方案的基础架构模型
      • 容器化封装深度学习框架
      • 服务目录的形式提供多种板卡驱动
      • GPU 多机多卡的高效调度
    • 区块链应用场景
    • 边缘计算场景
      • 边缘计算按功能角色主要分为三个部分:
        • 云–传统云计算的中心节点
        • 边–又称基础设施边缘(Infrastructure Edge)
        • 端–又称设备边缘(Device Edge)
    • 传统业互联化应用场景
      • 项目周期短,需求快速变化。
      • 互联网高并发,不可预测的承载需求。
      • 兼顾数据安全和用户体验。

音视频流媒体

  • 音视频流媒体所需要具备的技能
    • 音视频基础(FFMPEG环境搭建,音视频基础)
    • FFMPEG编程(FFMPEG命令,音视频渲染,FFmpeg API,音视频编码,音视频封装格式,音视频过滤器,播放器开发,ffplay播放器,ffmpeg录制转码)
    • 流媒体(rtmp流媒体,hls流媒体,http-flv流媒体,RTMP/HLS/HTTP-FLV流媒体服务器,RTSP流媒体)
    • WEBRTC(WebRTC中级开发,WebRTC高级开发,Janus服务器源码)
  • 音视频流媒体应用场景
    • 视频点播
    • 视频会议
    • 远程教育
    • 远程医疗
    • 短视频
    • 在线直播系统
  • 主流的流媒体协议
    • 主流的流媒体协议主要有:RTMP, HLS, RTSP等。

虚拟化

  • 虚拟化所需要具备的技能
    • 两种架构、三个知识点
      • 两种架构
        • 共享存储的传统架构
        • SAN的”超融合”架构
      • 三个知识点
        • 在这两种架构中,主要用到三个设备:服务器、存储、网络交换机与光纤存储交换机,这对应计算、存储、网络三方面的知识。
        • 计算,是指服务器,要了解常用服务器的基础配置、最高配置(CPU、内存、硬盘接口与数量、单个硬盘支持的最大容量、网卡接口、速度,底层管理等),对项目中所需要用的服务器进行选择。
        • 存储,要了解常用存储的接口(iSCSI、SAS或FC)、配置(硬盘类型、数量)、支持的RAID、可扩充性、报价。
        • 网络,要了解常用网络交换机、光纤存储交换机的品牌、型号,了解网络交换机的速度、接口数量、可扩充性等。
  • 虚拟化系统集成
    • 去企业机房,看总体,有多少机柜,每个机柜中有那些设备。机柜中是否有足够的空闲机位、网络剩余接头。
    • 企业现有服务器与存储数量、配置,接口等。
    • 网络拓扑,出口带宽,网络防火墙、路由器、交换机等。
  • 硬件知识
    • 交换机、存储、服务器
  • 网络与软件知识
    • 了解TCP/IP协议、了解IP地址的分类、子网划分等内容。要了解华为交换机的基本配置(划分VLAN、配置LACP等)。
    • 掌握Windows的Active Directory的知识,掌握Windows Server中DHCP、DNS、Active Directory、证书、KMS的知识。
  • 熟悉vSphere产品安装、配置、故障排除
    • vSphere 5.5系列:vCenter Server安装、ESXi安装、配置,创建虚拟机等。虚拟机备份、恢复。
    • vSphere 6.0系列:vCenter Server安装、ESXi安装、VSAN、配置等。
    • vSphere 6.5系列:vCenter Server、ESXi、vCenter HA、VSAN。
    • Horizon View 桌面系列:Horizon View 7.0、6.0。
    • VMware P2V工具、VMware VDP、vCops等。
  • 熟悉或精通VMware Workstation

  • 虚拟化方案应用场景及优劣
    • Xen
      • 应用场景:x86、IA64和AMD、Fujitsu、IBM、Sun等公司的ARM以及x86/64 CPU商家和Intel嵌入式的支持的全虚拟化和半虚拟化解决方案。
      • 优势:Xen支持准虚拟化,需要修改客户机操作系统,而修改过的客户机操作系统能有更好的性能;此外Xen也支持全虚拟化,未经修改的操作系统也可以直接在Xen上运行(如Windows),能让虚拟机有效运行而不需要仿真,因此虚拟机能感知到hypervisor,而不需要模拟虚拟硬件,从而能实现高性能。
      • 劣势:如果你需要更新Xen的版本,你需要重新编译整个内核,而且,稍有设置不慎,系统就无法启动。
    • KVM
      • 应用场景:X86架构且硬件支持虚拟化技术(Intel V或AMD-V)的Linux的全虚拟化解决方案。
      • 优势:不需要重新编译内核,也不需要对当前kernel做任何修改,它只是几个可以动态加载的.ko模块,结构更加精简、代码量更小。所以,出错的可能性更小,并且在某些方面,性能比Xen更胜一筹。
      • 劣势:KVM可以运行在不支持虚拟化的CPU硬件上,但是在这样的话,效率会很低;KVM也可能会和虚拟机virtualbox冲突;KVM只是提供命令行接口,用户可以写脚本来管理KVM,并没有一个友好的GUI。
    • Hyper-v
      • 应用场景:适用于Monolithic Hypervisor 架构服务器虚拟化解决方案。
      • 优势:设备驱动不需要为每个设备都纳入Hypervisor层或者VMM Kernel;由于微软没有提供应用程序编程接口(API)来访问“Hypervisor层”,受到攻击的可能减小,没人可以插入外部代码到+ “Hypervisor层”;设备驱动不需要Hypervisor的感知,所以这种架构可以使用更多的设备;不需要关闭“Hypervisor层”,包括设备驱动程序。
      • 劣势:在操作“Hypervisor层”之前,需要在“控制层”安装操作系统,这是最大的一个缺点;如果在“控制层”正在运行的操作系统任何原因的崩溃,那么所有的虚拟机也都会崩溃;需要花费更多的经费在“控制层”的操作系统与“Hypervisor层”的虚拟机上。
    • VMware vSphere
      • 应用场景:适用于Microkernelized Hypervisor架构服务器虚拟化解决方案。
      • 优势:没有操作系统的要求,来控制所有的组件,这是它最大的优势超过微软的Hyper-V Microkernelized Hypervisor的架构;在“控制层”运行的组件没有安全补丁。
      • 劣势:Vmware的vSphere硬件支持不好;VMware vSphere不安全,因为VMware在“Hypervisor层”提供API的入口,恶意的代码有可能会进入到这层,甚至黑客可以控制“Hypervisor层”之后就可以控制运行在vSphere服务器上所有的虚拟机。

网络安全

  • 网络安全所需要具备的技能
    • 如果想做逆向,那么要掌握汇编
    • 如果想做数据库注入,那么要学SQL
    • 如果想做XSS,那么要学JavaScript
    • 如果想找驱动和内核的漏洞,那么要熟悉内核
  • 网络安全应用场景
    • 园区门禁(网络隔离):工业防火墙、工业网闸
    • 楼宇门禁(区域隔离):工业防火墙
    • 办公室门禁(具体职能单元/主机安全):工业主机安全卫士
    • 摄像头安防系统(网络监测与告警):工业安全审计监测、网络入侵检测
    • 中控室控制大厅(安全管理、安全运维、安全审计):安管平台、日志审计、堡垒机
    • 车联网安全
    • 城市安全
    • 社区安全
    • 家庭安全
    • 移动应用安全
  • 网络安全前景价值
    • 网络安全为数字未来创造的价值。
    • 智能制造时代,工业大数据作为制造企业的核心资产之一,其重要性不言而喻。“工业4.0”浪潮下,制造企业加快了迈向“数字化”和“智能化”的步伐,以云计算、大数据、5G、人工智能为代表的新兴技术正在深度渗透至工业生产领域,在推动工业生产体系与运营模式升级的同时,也带来了新的网络安全挑战。网络安全公司最新发布的报告称,制造业企业已成为网络犯罪分子、勒索软件和国家黑客的首要目标。其中,61%的企业工厂发生过网络安全事件,其中3/4的网络攻击导致线下生产停摆。
    • 随着工业信息安全事件频发和政策标准的落地,单纯的工业信息安全防护产品已无法满足工业企业用户需求。同时,由于工业企业普遍缺乏对工业信息安全防护策略的落地能力,安全体系设计和规划服务需求应运而生。

C++工程师职位要求

学历

  • 本科及以上学历,计算机相关专业毕业
  • 全日制本科及以上学历,计算机,电子信息,软件工程,通信工程等相关专业
  • 计算机,软件工程或力学相关等专业,本科及以上学历。
  • 统招本科或以上,通信工程,电子工程专业,学科基础扎实,有信号分析处理类项目经验者优先
  • 统招本科,计算机,通信专业
  • 全日制硕士及以上学历,5年以上嵌入式软件开发经验 [央企]
  • 统招本科及以上学历,计算机应用,软件工程等相关专业
  • 计算机,数学相关统招本科及以上学历
  • 年龄不大于46岁,Linux下C++从业经验不少于5年,QT经验不算在内,有雷达背景以上不做限制
  • 本科及以上学历,软件开发,通信工程,控制等相关专业
  • 本科及以上学历,具有良好的主动性,团队写作能力
  • 统招全日制本科或以上学历,计算机/软件开发/电子/自动化相关专业比
  • 统招全日制本科或以上学历,计算机软件,通讯相关专业
  • 本科以上学历,5-10年以上工作经历
  • 5年以上相关工作经历,本科以上学历
  • 本科及以上学历,计算机相关专业

编程语言

  • 精通C++语言,对背后的原理有一定了解,熟练使用模板技术,STL标准库以及C++11以上新特性
  • 精通C++编程,包括多线程编程,消息循环,内存分析,数据结构,标准模板库及其算法
  • 精通C++/C#/Java等语言一种或多种,具备面向对象编成思想,熟悉STL标准库中的常用数据结构,算法及容器类,熟悉多线程编程。
  • 精通C/C++,了解常见的数据结构,算法和面向对象的设计模式
  • 精通C/C++语言,熟悉ARM处理器体系架构,良好的编程习惯,逻辑分析能力
  • 有扎实的C/C++基础,熟练使用常见的数据结构
  • 精通C++语言,熟悉Windows和Linux下的软件开发
  • 精通Linux,三年及以上C++编程语言开发经验,有具体项目开发经验,能够独立完成项目需求分析,设计及实现各阶段工作
  • 熟练掌握STL库,C++11及多线程环境编程。
  • 具有良好的编程习惯,熟练掌握C++/java/python
  • 五年及以上C++编程语言开发经验,有具体项目开发经验,能够独立完成项目需求分析,设计及实现各阶段工作
  • 熟练掌握GUI库,STL库,C++11以及高可用,高并发环境编程
  • 具备深入的C++编程知识和经验,能够编写高性能,可维护的代码
  • 良好的数据结构和算法能力,精通C/C++开发。熟练使用QT或JUCE等UI软件编程工具;对OpenGL有了解
  • 熟练使用C,C++,Python,Rust语言,可以进行独立开发
  • 熟练掌握STL库,C++11以及多线程环境的编程。
  • 具有扎实的C/C++语言知识和应用经验,有良好的编程习惯
  • 熟练掌握数据结构和算法
  • 熟练使用C++语言,3年以上C++编程经验

操作系统

  • 熟悉Linux和常见RTOS系统架构,熟悉内核调度,中断,内存管理,文件系统,网络协议栈等原理
  • 掌握操作系统,体系结构,编译原理,计算机网络等基本知识
  • 需要在底层代码开发方便有丰富的经验,熟悉与操作系统,内存管理,多线程编程,性能优化等相关的底层技术
  • 熟悉linux操作系统基本操作,熟练使用linux系统工具
  • 数据结构,操作系统原理,编译器原理等基础知识扎实
  • 熟悉linux平台驱动开发优先,尤其是打印驱动,手写板驱动,扫描驱动等
  • 有扎实的计算机基础,熟悉Linux/Unix环境,熟悉主流开发工具和检测代码,性能监控工具。
  • 熟悉Linux/Unix环境

网络通信

  • 熟练使用socket网络编程以及IO多路复用技术,熟悉HTTP/HTTPS协议以及相关接口开发
  • 熟悉TCP/UDP网络通讯开发
  • 熟练掌握网络编程,以及多线程,多进程和进程间通信等相关技术,熟练使用VS等进行开发
  • 熟悉网络编程,多线程程序设计,熟悉常见设计模式
  • 精通多线程,多进程开发技术
  • 精通tcp,udp网络协议开发,熟悉HTTP,FTP等常用应用层协议
  • 精通TCP/IP,UDP,HTTP协议,熟悉Linux常见网络服务器模型
  • 精通多线程和网络编程,有音视频或流媒体项目开发经验,涉及UDP组播传输,RTP,RTCP传输协议,网络协议,信号传输,音视频监控类项目经验

数据库-缓存

  • 熟悉redis, mysql数据存储系统,熟悉mysql疑难问题解决方案
  • 熟悉MySQL/SqlServer/Access等数据库之一
  • 熟练使用一种现有数据库系统,例如mysql,mongodb等
  • 熟练使用一种缓存系统,例如memcache, redis等
  • 熟悉Linux平台开发,熟悉MySQL数据库,以及国产操作系统,国产数据库等开发者优先
  • 熟练使用mysql,oracle,sqlite等常用数据库
  • 独立完成数据库表设计,熟悉SQL语句优化,表结构设计优化
  • 熟悉数据库,消息中间件,虚拟化工具使用

架构设计能力

  • 具备架构设计能力,熟悉常用的设计模式,有良好的代码编写风格
  • 熟悉面向对象设计思想,熟悉设计模式,具有独立的模块设计能力
  • 精通面向对象开发,熟悉至少三种设计模式
  • 能够定制可扩展,可靠,高性能的软件架构,具备深刻的架构设计理解
  • 熟悉UML,OO设计理论及基本的设计模式
  • 熟练掌握软件设计模式
  • 熟练使用常见设计模式,能使用诸如单例,工厂,策略,模板,代理等模式,构建可重用,易维护的代码

开发经验

  • 有分布式,大数据相关开发经验优先
  • 有SIP,H323协议开发经验优先
  • 熟悉FFmpeg, H.264,H.265开发经验优先,并具备Windows,Linux开发经验优先
  • 具备Electron/Cocos2d-x/Unity3D等跨平台框架开发经验。

行业领域

  • 了解AAC,H264等音视频编解码技术规范;熟悉rtp,rtcp,rtmp,RTSP里的多种传输协议

其他软技能

  • 良好的英语听说能力,技术文档处理能力(需求,设计,使用说明等)
  • 熟练使用osip,xsip,openH323,ptlib,yate等开源库进行不同需求的开发,并可以根据需要对源码进行修改
  • 熟练使用wireshark抓包工具分析问题,对数据库sqlite工具使用熟练
  • 熟练掌握容器,分布式系统,性能分析工具,优先考虑
  • 有产品研发经验,能够理解产品需求,设计相应的解决方案,并推动产品开发的不同阶段
  • 熟悉各种算法和数据结构,能够选择和实现最佳的算法以解决复杂的问题
  • 具备跨不同操作系统和平台进行C++开发的经验,例如Windows,Linux,macOS等
  • 能够使用调试工具和性能分析工具来诊断和解决问题,并进行性能优化
  • 具备卓越的团队合作能力,能够与其他工程师,产品经历和设计师共同协作,共同推动项目的成功
  • 具备出色的口头和书面沟通能力,能够清晰地表达技术观点和解决方案
  • 愿意不断学习新的技术和工具,保持在领域内的领先地位。
  • 学位和认真:计算机科学或相关领域的学士学位,持有相关的认证(例如C++认证)优先
  • 熟练使用GDB,Valgrind等调试工具,有实际调试经验,能够独立完成linux上的问题排查
  • 关注开源社区动态,在上游社区有代码提交者优先。
  • 对基本的开发流程及模式有一定的认识
  • 熟悉openssl等加解密库优先
  • 熟练使用单元测试框架,设计单元测试用例,保障代码质量
  • 熟练使用常见的版本管理工具SVN,Git等
  • 熟悉主流开发工具和监测代码,性能监控工具
  • 能熟练使用单元测试框架,设计单元测试用例,保障代码质量
  • 熟练使用常见的版本管理工具SVN,Git等

现阶段的C++学习建议

  • 重点放在 std::vector, std::map, std::string, 类,模板编程 基础知识的学习

20231005 https://www.zhihu.com/question/537556535/answer/2535800615

  • 真心建议,初学C++,好好学习基础语法、惯用写法、对象模型,从而了解编写高效C++程序的方法,充分发挥C++的优势,学会规避它的劣势和问题。至于模板元编程,初学可以跳过,太容易走偏,走火入魔,最后就成了炫技技巧。

0515 谈话

理论知识

  • 隐藏的工作,这些工作,写不到文档中,但又必须得干。例如:
    • 选择什么样的系统环境,如何去适应操作系统
    • 使用那些依赖组件,这些依赖组件是从哪里来的,怎么安装使用,怎么升级维护
  • 当前,陈总提出的人脸库量集的问题,每一个人脸库最大支持多少张人脸图片,一般来讲,边缘盒子的是十万,服务器主机是一百万。
  • 这个工作涉及到两个方面
    • 第一个,要明白整个任务的流程,如果要测试准确度,需要明确理解人脸识别的流程框架,从技术需求,到开发环境,模型训练要求,测试标准等。
    • 第二个,要知道怎么去和算法工程师配合,不是说,找十万张图片,放入到人脸库中就可以的,而是要看训练的特征提取模型支持多少张图片,如果其本身仅只是五万张的图片,那么放入十万张图片,在进行人脸识别,势必其结果是不准确的。解决方法是,如果在训练模型时,训练集是十万张甚至更多,在进行测试的时候,放入十万张人脸图片,在进行人脸识别,测试识别结果;如果在训练模型时,少于十万张,那么就需要使用低于其训练集数量的图片进行初始化人脸库
  • 在进行人脸识别中,最关键的是两个,格式和比例,在放入到模型中,进行提取时,对这张图片的要求是什么,人脸比例为多少?百分之八十?图像格式是什么?RGB?

2024.01.08

  • 决策能力
  • 带领团队解决问题

  • 问题分析能力,自己作出选择,形成意见并表达

视频结构化方面

  • 视频拉流
    • 用什么拉取视频流?
    • 从什么地方拉取视频流?是从本地实体文件,还是从网络传输,
    • 拉取视频流的工具是什么
    • 这个工具从哪里获取,是手动编译成第三方库,还是通过apt安装,还是其他方式
    • 这个工具怎么升级,
    • 这个工具怎么使用
    • 这个工具可能会和已有的依赖组件冲突吗?如果冲突了怎么办?
  • 视频解码
    • 视频用什么工具解码,支持的视频格式是什么?h264,h265?
    • 这个功能怎么在多个平台使用
  • 效率
    • 如何减少内存使用搬运次数,是搬运一次就可以,还是必须要搬运多次,怎么搬运,如果提升效率
  • 变形
    • 图像变形,resize,怎么缩放
  • 2D图片
    • 如何解码,如何编码
    • 格式如何转换,
    • 尺寸怎么缩放,缩放大致分为等比缩放和非等比缩放
  • 模型
    • 如何加载模型,怎么进行推理
    • 前处理如何去做,一般模型都有前处理,涉及到各个模型特有的前处理数学公式,如何转换成代码实现
    • 推理工作如何完成?
    • 后处理如何实现,一般来说,后处理实现一次,只要模型不做改动,则不会改动
  • 数据结构设计
    • 后处理出来之后的数据怎么存放,怎么设计一个数据结构存放后处理数据,并且可以二次开发和利用
  • 数据传输
    • 如何将结构化数据提供给第三方使用,通过一种方式去传输数据,通过一种方式去接收,解析数据,
    • 传输数据,就涉及到网络通信,是使用zmq,还是kafka,还是redis,还是实体文件
    • 存储数据的格式,这个格式是需要第三方可以使用的,一般来说分为两种格式:
      • 与语言无关的,例如JSON,XML,HTTP等等
      • 与语言相关的,
  • vca项目
    • contrib,这个目录下存放的是与平台无关的接口,与业务无关的,其内存实现是各个平台的代码
    • util,这个目录下存放的是业务相关的接口