1
这篇文章是《软件技术领域就业大纲——编程语言》的升级。《软件技术领域就业大纲——编程语言》中,我对Java、前端、go、Python、C/C++、Android/iOS等各种语言做了统篇介绍,但过去半年多以来很多C/C++方向的同学跟我聊的时候依然有很多的问题,比如,有些什么样的具体领域、公司、岗位可以选择,未来如何发展等。这些问题是上篇文章中没有覆盖的,于是,有了这次升级,希望可以在学习、就业选择上帮助到大家。宏观局势的分析替代不了个人微观层面的决策,大家在学习、就业方面有任何问题,欢迎私信找我沟通。以下开始分领域讲一下C/C++在不同领域的应用,作者个人能力及视野有限,必定有覆盖不到的地方,或不准确的地方,欢迎留言指正或私信讨论。高性能服务器开发软件工程中的编程语言没有万能的,从来都是效率、成本、生态之间的权衡,所以即使90%以上的公司都在使用Java来做应用服务器开发,依然有少量的公司选择C/C++,原因就是C/C++虽然开发成本高、效率低,在大型复杂工程开发中的生态也比较弱,但是运行效率高。就这很像软件技术人员的发展逻辑一样,不需要全能,只要抓住一个点打透成为领域内的专家,就能在市场上生存。因为C/C++的这个优点,在对性能有特别高的需求场景下,企业都会使用它做服务端开发,比如,处理音视频流的多媒体服务,高性能高并发并伴随大量密集计算的游戏服务,计算密度度大性能要求高的大模型后端服务等场景。工具软件主流的工具软件开发一般都基于QT、MFC等框架,如果想进入这个领域,有必要深入了解这些基础框架。一些工具软件做得比较深入的公司,像金山这种,通用框架满足不了需求,也会有自己的UI库。工具软件细分下来有很多的领域:像我们经常使用的IM软件、浏览器、WPS、Office、作图软件、PhotoShop、PDF阅读器、各种开发IDE等。近2年金山就发了很多C/C++方向的offer,base地以北京、武汉、珠海为主,不提361淘汰、卷这些私企的传统问题,给的待遇都很不错。广联达看起来也在走金山的路线,重构自己的工具软件系统,因此也招了很多C/C++方向的工程师。这里要单独提一下微信、抖音、淘宝、支付宝等超级App因为要承载的业务多而杂,所以一般都会自己改造浏览器内核搞出一个容器,并对容器中代码的编译、渲染、Runtime、发布等核心环节做管控,这种内核严格来说属于浏览器领域了,国内超级App都在走这样的技术路线,影响面很大。这里要单独提一个领域,工业设计软件。因为中美竞争,工业软件在近几年迅速崛起成为热门领域,像EDA、CAD、CAE、Matlab以前都是用老外的,现在都要构建自己的。但这类软件都有很高的业务知识门槛,加上底层技术变化速度慢,迭代升级周期长,领域内的软件技术人员经验积累比较重要,职业生涯生命周期也比较长。在这个领域中8年、10年的人属于核心的资深工程师,而不像互联网那样35岁就面临中年危机成为被淘汰的人。近两年就有很多同学拿着华大九天、中望、广立微、概伦电子的offer找我咨询,虽然领域偏狭窄一些,跳槽空间有限,但这个领域本身就属于稳打稳扎的类型,不像应用软件或者互联网公司那样2、3年一跳,再加上壁垒高、毛利率高,在成都、武汉、西安、杭州、苏州这些二线城市都有研发中心,给的待遇也十分有诚意,整体来看是个性价比很高的选择。另外,在工业领域中还有上位机和下位机的区别,在制造业产线上用于显示、控制的终端软件,一般都是运行在Windows系统上,基于QT开发,但上位机对于性能、架构、稳定性等方面要求不高,而运行在产线设备上的下位机一般都有严苛的稳定性要求,所以开发门槛也会高很多。还有在监控场景下使用的PC监控软件严格来说也是属于这一类,大家进入任何一家商店、超市、小区物业办公室应该都能看到这样的东西。游戏客户端随着toC的超级App占据消费者的绝大多数流量,应用软件、互联网领域在做业务时都倾向于到超级App平台上去挂个链接或者开个账号来做业务。但游戏领域因为涉及到大量的多媒体渲染,需要密集的计算,再加上比较注重性能、体验、实时性,大部分还是要开发个客户端软件的,而C/C++的运行效率高,十分合适开发游戏,不管是PC游戏还是手机游戏。对于手机游戏来说,Android、iOS两大平台的开发语言不同,厂商为了降本提效不可能完全做两套,就往往使用C/C++开发引擎、游戏核心逻辑,然后在两个平台上通过应用层加壳的方式来做。游戏客户端软件的开发一般都是基于Unity、UE等引擎,所以对这类引擎需要有足够的了解,以及熟悉openGL、D3D、vulkan等API。如果用一句话来形容游戏公司研发岗的话,就是卷、领域狭窄、待遇高。就我的经验来看,同等规模的公司,游戏公司比软件厂商、互联网公司开的要高一些,当然也要累得多。卷这个问题有普遍性,就不展开了,在现实中领域狭窄的问题更难受,游戏领域两极分化,腾讯、网易、米哈游几个头部玩家就占了市场的大部分份额,第二梯队的上市游戏公司虽然有一些,但整体数量不多,剩下就是一些长尾公司。具体的公司可以看我的《软件技术领域就业大纲——公司分类》中的游戏领域一节。游戏公司都是私企路线,对于绝大多数普通家庭的人来说,当工作8年、10年之后想找个二线城市定居的时候,你会发现杭州、苏州、南京、西安、成都、武汉这些适合软件技术领域就业的第二、三梯队城市中根本就没有几个游戏公司,小作坊有一些但十分不稳定。当我们年轻且身处一线城市时,遍地都是机会,根本不怕跳槽,此处不留爷自有留爷处,反正一人吃饱全家不饿,但对于工作8年、10年以上的中年人来说,游戏领域就业选择面窄的这个短板就很拉跨了。多媒体开发图形、图像引擎类,比如,OpenCV,OpenGL、CGAL、OpenCL、Unity、Cocos2DX、Unreal、Skia、QT等引擎。多媒体处理类软件,如,OpenCore引擎、各类播放器、直播软件、短视频(抖音)、视频处理软件(Premiere)等,因为涉及到音视频多媒体流的处理,处理数据量大、对实时性要求高,往往使用C/C++开发。最近就有几个同学找我咨询,他们收到了Oppo、Vivo、小米、荣耀等手机厂商的多媒体开发offer,做音视频编解码等工作。另外安防领域,像海康、大华、宇信、天地伟业这些公司在产品线上都会有大量的视频、图像处理工作,也有不少的C/C++开发岗位。只是多媒体领域过于狭窄,且市场上在这块重投入的公司并不多,干的时间久了积累起来的领域经验并不能带来太多的收益,跳槽时选择空间有限,这是一大短板。网络防火墙、监控、负载均衡、网关、代理、路由器、基站等,因为涉及到大量的数据处理工作,且对实时性要求极高,往往都是C/C++开发。网络领域最大的问题是就业空间比较狭窄,市场上除了华为、中兴之外,深度玩家极少,外企也基本被华为给干趴下了,所以不到万不得已,千万不要去干协议层。那些拿着华为、中兴无线部门的offer来找我咨询的同学,有其它选择的时候基本都被我劝退了。至于应用层的工程开发,即使是跟网络打交道比较多,但并没有被局限在网络领域中,那倒无所谓。这问题的核心其实是IT技术的倒金字塔特性,即越向上的应用层,在市场上提供的就业机会越多,而越往底层的基础设施层,市场上的玩家数量越少,提供的就业机会也就越少。中间件中间件有很多种,像数据库、操作系统、存储、AI Infra等,这些领域都需要大量的C/C++岗位。现在国家搞信创,数据库是一个非常热门的领域,我这里每年都会收到很多拿到蚂蚁OB、华为数存、中科曙光、人大金仓等offer的同学的咨询,数据库领域对性能极其看重,C/C++使用度非常高。但数据库领域跟网络一样都属于有技术壁垒但玩家太少不好跳槽的领域,做选择时需要慎重考虑。至于操作系统,不管Windwos、Linux、OSX、Android本身,还是围绕着操作系统的驱动开发,编译器、解释器、IDE等,都大量使用C/C++了。尤其Linux、Android这两个操作系统,在消费、工业等场景下被各种魔改,而对操作系统的魔改必然大量使用C/C++。就拿Android来说,上层应用看起来是用Java,到Framework层也有许多Java代码,但再往底层的各种Service就全是C/C++了。从就业角度来说,Linux、Android是最佳选择,因为设备多、公司多,跳槽时选择多。半导体相关芯片公司并不是单独卖裸芯片的,往往都有配套的软件工具体系,让上层应用开发商可以做二次开发,强悍的公司基于通过工具体系建立起自己的标准和壁垒,比如英伟达的CUDA。还有我以前待过的一家做多媒体芯片的公司,在CPU之外公司自己做了一颗MediaCore,并基于这颗MediaCore的指令集来做Codec算法开发,为应用厂商提供SDK工具包。另外,芯片公司为了扩展销售渠道,往往会跟下游厂商一起做解决方案,这里就会有大量的C/C++开发场景。之前就有拿了高通中国研发中心offer的同学来找我聊,在做芯片的公司内搞机器人是否值得去。还有英伟达也挖了小鹏的高管,在上海组建自动驾驶团队,虽然最终目的还是卖芯片,其实销售的是解决方案。终端设备这个也算是C/C++的一个热门方向了,现在单片机、机器人、监控摄像头、无人机、汽车ECU、路由器、光猫、网关、行车记录仪等大量的终端设备上,存储、计算等可用资源很少,这时就需要C/C++这类运行效率特别高的语言。像车载嵌入式,一般会涉及到嵌入式Linux的开发,而ARM方向,一般要求属于ARM体系架构,以及CPU、MCU、DSP等各种各样的嵌入式处理器,或者可编程逻辑器件(FPGA、cpld)及其外围电路等。嵌入式是一个软硬结合的领域,往往既要懂软件还要懂嵌入式操作系统、网络协议、熟悉操作系统内核及底层的各种SDK驱动包,大学时的数电、模电不能丢,甚至还得有硬件基础,能看懂原理图、电路板图,会用示波器、万用表等常用仪器。因为上面这些特点,导致这个领域内除了传统的计算机专业之外,嵌入式领域内还充斥着大量的自动化、电子信息等专业的人。如果是从机械电子、电子信息、自动化、通信等专业转码过来的,本身有一定的硬件基础,倒是可以优先考虑,利用下自己的差异化优势。有一个特殊领域是军工航天,尤其中电、中电科、兵工、航天科工等旗下的院、所、子公司,每年都会在市场上招聘大量计算机、通信、电子等专业背景的工程师去干嵌入式开发。虽然这些单位都是干乙方,但从稳定性上来说比市场上大多数私企其实要好很多,只是卷、出差、待遇低这三座大山压着,真正优秀的院、所、子公司不多,大家遇到这类选择时务必谨慎。这里要单独提下几个领域,汽车终端软件、手机、各类智能电子设备。因为汽车硬件电子架构从分布式向域控、集中式演进,也带动软件在汽车产值中的占比大幅提升,我们可以把每辆新能源汽车都当作一个大号的智能终端设备,就像智能手机一样。过去一辆汽车上软件开发比较简单,嵌入式开发工程师按照AutoSar标准堆ECU就可以了,而现在的域控、集中式架构让汽车出现高性能计算平台,头部主机厂开始放弃AutoSAR自己写操作系统,还有自动驾驶、智能座舱的兴起,汽车上的大型复杂软件越来越多,这就带来汽车终端软件开发的兴旺,而汽车终端软件开发时C/C++的使用量也很大。拿就业市场上来说,无论是长安、一汽这样的国字辈,长城、吉利、比亚迪这些民营汽车巨头,蔚小理这些新势力,德赛西威、经纬恒润这些汽车Tier1领域的创新玩家,还是禾赛这种汽车零部件厂商,甚至是华为、大疆、立讯精密、百度这些跨界玩家,都在招聘大量的C/C++工程师。在手机领域,Android、iOS开发占据绝对主流,但涉及到大量的底层库,如,安全、敏感业务等少量用C/C++写的代码,音视频,游戏,浏览器等引擎SDK,都是C/C++实现在2个平台上分别编译,所以有手机App产品的游戏、互联网公司也会招C/C++开发。另外,荣耀、小米、OPPO、VIVO、华为这些手机厂商也会招聘大量C/C++工程师来做操作系统、手机侧中间件的开发。除手机之外,市场上还有大量各式的智能终端电子设备,手表、POS机、自提柜、电视机等等,有些是Android魔改版有些是Linux,这些智能终端电子设备的开发也需要大量的C/C++工程师。金融软件曾经听一个恒生的朋友聊起过,恒生电子内部就有专门做交易系统优化的团队,主要是提升高性能计算能力、降低通信延迟等,因为像股票、大宗商品这种交易场景下,下单速度如果能比别人快一步,就会有大量的利润空间。其实在证券交易领域,无论是恒生、金证这类金融软件厂商,还是在市场上的私募公司,做交易终端产品的公司,万得、同花顺这类做数据服务的公司,都会有大量的交易系统、行情系统、数据系统方面的开发需求。券商自身因为有基于软件厂商交易平台的二次开发需求,也会招聘C++开发岗位。甚至像中金所(上海金融期货信息技术有限公司)也投入资源开发了“飞马”系统,用于极速交易和行情数据场景。具体单位方面,市场上主流的金融软件厂商、私募基金、券商等。具体单位数量庞大,可以看我的《软件技术领域就业大纲——公司分类》中的金融领域一节。这里有一个领域值得单独拉出来,就是量化交易,他们的研发团队规模不大,但在市场上一直有稳定的需求,做量化交易的私募给的待遇相比同等规模的软件、互联网公司高一截。不过这类公司的核心业务是特征挖掘、交易策略,软件工程开发只是后台支撑团队,不属于创造现金流的业务,算是成本中心,加上量化私募的软件开发团队规模都不大,发展空间有限。当然了,要是图谋转金融领域开发,拿这个当跳板,另当别论。安全如果我们的软件运行在终端,而又需要考虑做源码级的安全防护时,Java、Python之类的语言是没有保密性可言的,就需要使用C/C++来实现,编译成二进制的可执行文件,再进一步做加壳处理,从而提升安全性。另外,软件技术领域中做加解密、安全认证时往往计算量大且对性能有比较高的要求,因此这类逻辑往往使用C/C++实现。网络安全也是很重要的一方面,涉及到网络设备安全、网络协议安全、流量分析与监控等不同领域,都是计算密集型场景,也往往使用C/C++实现。就业方面来说,市场上的安全类公司,安恒、安奇信、绿盟、360等上市公司都会大量招聘C/C++开发工程师,具体可以看《软件技术领域就业大纲——公司分类》中的安全领域一节。算法实现算法是计算密集型场景,尤其手机、汽车、机器人等各类终端上的算法,非C/C++莫属。如果走算法方向,C/C++是几乎必选项。另外,大型企业对于算法的应用几乎无处不在,一般都会抽象出支撑算法的通用能力下沉成为算法平台,让各业务线、产品线的算法工程师可以在平台上低成本地高效开发业务算法,如,数据采集、导入、清洗,特征加工,模型训练、一键部署、AB实验等。在这种算法平台的开发过程中,就会大量使用到C/C++。传统的互联网业务中,对于算法的应用集中在搜索、推荐、广告等场景,因为涉及到召回、粗排、精排等涉及到大量的计算且对实时性有极高的需求,都会有大量C/C++的开发场景和岗位需求。自动驾驶是近几年兴起的一个在工程开发中大量使用C++的领域,华为汽车BU、大疆、小鹏、Momenta等都算是头部玩家,汽车主机厂对自动驾驶的投入非常坚定,德赛西威、经纬恒润这类汽车产业链上的创新型Tier1厂商也非常重视这个领域的发展,我有专门文章分析过这个领域,这里不再展开。总结C/C++在市场上的招聘总量虽然非常大,但因为涉及到的领域非常杂,且随着工作经验的增长,不同领域之间壁垒又会越来越高,所以在具体的领域方向选择上有很多需要仔细思考的地方。从就业角度来说,招聘C/C++岗位的公司还是集中在大量的细分技术领域,以及终端设备领域,所以主要的就业单位是私企,以及军工航天电子类的国企,这里可以躺平的机会是比较少的。如果就业目标是躺平或者半躺的优质国企,像银行、运营商、能源系统等市场上的甲方单位,那么C/C++并不适合,Java会更好。作为主流软件工程编程语言中的一个,C/C++经常会被大家拿来和Java一起对比,比来比去就会发现它的许多问题,其中最突出的一个就是领域特别杂。虽然市场上C/C++的整体使用量大,但是涉及到的领域特别多,且不同领域之间比较难跳槽,比如,干上3、5年高性能服务器开发之后想转数据库?干了几年EDA工具之后想去干渲染引擎?干了几年操作系统之后想去做网络安全?且不说自己是否愿意丢掉多年的积累去一个完全陌生的机会,对企业来说,与其接受一个来自其它领域的高薪高级工程师,就不如找一个刚入行但基础扎实的初级工程师从头培养,因为很多领域的业务壁垒还是挺高的。从软件工程师的发展路径来说,从初级到高级工程师这2、3年的时间主要是在需求分析、做技术方案、架构设计、编码、排查问题等通用的软件技术能力方面快速提升,而且到3年之后,领域内的经验积累在个人核心竞争力中的占比就越来越高了。举个例子,如果一个工程师干了3年游戏开发之后想转交易系统,那些券商、金融软件厂商是愿意接盘的,因为这个工作年限的工程师已经对语言、工程这些基础问题驾轻就熟,且学习速度快,待遇不高。而如果一个工程师干了8年游戏开发之后再想转交易系统开发,因为在游戏开发领域积累了多年,经验丰富,待遇也高了,接盘的公司就要考虑,要不要花这么高的价钱找一个年龄大、新领域知识学习速度慢,待遇还高的人。具体到C/C++领域的就业选择逻辑上,如果我们在C/C++的一个应用领域中发现自己并不适合,想换一个新领域,最好在工作前几年完成这个转变,因为越到后面机会成本越高,转换起来也难。除了领域杂,门槛高也是一方面,C/C++上可以干应用层的Server、App,下可以与硬件直接打交道搞嵌入式、操作系统等,这么牛逼自然是有代价的,那就是技术体系庞大无比。通过市场上那些编程速成培训班的课程设置也可以看出来,他们普遍都是培训Java、Python、前端这些为主,C/C++的课程设置很少,原因就是门槛高、师资少、领域杂,当一门生意做的话性价比低。另外,过去十几年互联网的兴起和大发展,给Java提供了大量高薪就业岗位,也培养了无数的Java工程师,这些又让Java领域的学习进一步形成了正循环。以上几个因素导致学C/C++的人相比Java大幅减少,愿意分享也少,C/C++学习教程、技术类Up主也少。讲到这里可能有人会问,这样说来大家可以不用围观C/C++了,那也不是。因为互联网的成熟甚至衰落,以及Java领域需求旺但供给更旺,导致市场上C/C++方向的就业与Java各有所长,再加上很多技术领域Java根本就进入不了,C/C++反而活得很滋润。说到底还是市场供需情况决定了一切。学习渠道最后,鉴于经常有同学问我C/C++的学习路线,而我作业工作十几年的老码农脱离这个阶段有点太久了,自己经验不足,就在朋友圈发了个消息,从跟我聊过offer的往届毕业生中收集来了下面这些C/C++的学习渠道和资料,希望能帮助到大家:带了这一部分具体内容之后就会被审核卡住发不出来,应该是带其它平台名称导致被拦截了。大家想要的私信我吧。
点赞 72
评论 3
全部评论

相关推荐

牛客279957775号:铁暗恋
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务