【校招方向】C++输麻了,C++后端开发还能学吗?
本文于2023年11月23日在牛客网首发,已同步至微信公众平台。
本人bg:24届校招生,双9本硕科班,方向C++/Go后端开发。有两段大厂实习经历,第一段实习在滴滴C++/Go后端开发,第二段实习在阿里控股C++后端开发(已拿到转正offer,防定位不说具体部门)。希望研究生顺利按时毕业!发完这篇文章就正式退网了,真的怕毕不了业。
很多人把握不清本文的主旨,本文主旨是为了从C++选手就业情况入手,科普「真正的C++后端开发需要学习什么,大厂的C++后端开发又是干什么的,C++后端开发这个方向值得入吗?」,所以手工打个目录(本文预计不会继续修改了):
- 前言
- C++选手就业形势分析
- 在学习上要避开的认知误区
- C++选手的求职后端开发的劣势只有语言不匹配吗?
- 真的存在C++后端开发岗位吗?
- 对未来C++求职形势的预测?明年C++真的会比Java好吗?
- 如何选择校招方向?
- 彩蛋
前言
我不会写什么经验帖,因为我的个人背景比较普通,技术水平勉强及格,也因为各种不可抗力因素,秋招就这样了,很多C++后端选手秋招情况或许比我强很多。按理说没资格谈论什么经验,自然也会有一些不够专业的观点。如果有不一致的意见可以理性友善讨论,但是你杠就是你对。
今年从暑期实习到秋招,网络上能到处看到吐槽C++方向不好找工作和劝退C++的声音。本文提出的问题,部分公众号也有分析过,但是我又觉得略微片面,想根据自己的实际经历补充一些不同的观点,帮助大家对校招方向做出更理性的选择。也希望本文可以聚集到各种有用信息,让平台能够减少类似C++和Java选择、要不要转语言这种重复且冗余的问题,实现高效学习和沟通。
注意,本文不仅对纠结选C++还是Java的选手有参考价值,也对确定了C++或Java有转语言想法的选手有参考价值,因此Java选手看到本文可以不用划走。
C++选手就业形势分析
大概在我读本科的时候,身边的声音都是劝学Java而不是学C++的。因为在大家的传统认知里面都是,互联网行业后端基本上都用Java,用C++比较少;C++比较难学,还要深入底层,岗位少且岗位都是为大佬们准备的。这会还没什么人去鼓吹学习C++,C++的简历基本上也都是科班的学生(有大佬,也有来不及准备被迫用C++直接秋招的选手),大家的看法还是很理性的,当时C++方向还是一片蓝海,哈哈。
不知道从什么时候开始,某些前辈就开始鼓吹《Linux C++后台开发方向学习路线》,堪称万恶之源,号称剑指腾讯C++后台开发岗位的那种,然后类似的学习路线就开始满天飞,天下文章一大抄,你抄我我抄你的,长得都挺像的。然后在前2-3年,互联网还在红利期的时候,有些前辈靠C++和webserver拿到很多大厂的offer,也开始写自己的学习路线和心得,就已经劝了很多人入坑,批量制造了C++语言+webserver版本的简历,这部分人里面还有一大半非科班选手。
那么以前C++语言+webserver为什么这么香?
- 它作为一个求职C++开发岗位的通用方向,无论什么行业、什么方向的C++开发岗位均可投
- 很多人的课程体系里面,只学习过C++,所以只会C++;或者某些人的研究方向需要大量使用C++。使用C++去求职的额外学习成本较低,这也意味着C++选手的人数一直都很多,从来就没少过。再加上很多人的课设项目都很水,或者没认真做过,webserver在以往众多的C++选手的校招项目里面也算相对有技术含量的,在当年也容易脱颖而出。
- 互联网大厂后端开发岗位虽然以Java为主,但是之前竞争不激烈,会编程就是有潜力的校招人选。既然能啃下C++,那么进去转Java和Go也不在话下,公司有时间和精力培养。早些年很多Java程序员确实都是学校只学C++,然后校招入职后转语言的。
总而言之,这条路线就是「进可互联网,退可制造业」的万金油,看似性价比极高。23届互联网行业寒冬,互联网行业招聘需求萎缩,但是制造业的嵌入式软件开发招聘需求增多,更倾向于C++选手,所以23届确实是C++拿到的offer比Java多,所以这又劝了更多人入坑。
今年为什么又突然不香了?
- 这条路线作为一个准备C++开发岗位的通用路线,C++开发的各个方向除了语言相同之外,其他处处都不同,大家没有明确一个具体的求职方向。面试官看腻了批量生产的C++语言+webserver版本的简历,更希望看到有对应领域经历的候选人。
- 互联网大厂后端开发岗位就是Java,竞争现在很激烈,有大量技术栈匹配的候选人。候选人本来就会Java,进去不需要转语言,减少培养成本。因此今年互联网大厂招聘需求稍微增加(尤其是以Java为主语言的美团、阿里、快手),利好了Java的候选人。
- 芯片爆雷(参考zeku)、车厂盈利难(参考蔚来)。实际上23届因为互联网行业招聘需求萎缩,用Java求职互联网大厂后端本就已经难度很大了,可想而知C++会更难,这就已经初见惨淡了。但是制造业招聘需求增多,所以23届C++多出来的offer大部分多出来的就是这些制造业的。今年恰逢制造业招聘需求萎缩,这块遮羞布被撕破。
所以与其说C++不香了,不如说今年校招形势的变化,加上大量批发的C++语言+webserver版本的简历,让C++开发岗的定位回到了初期它原本该在的位置——难学、机会少、给有准备的大佬准备的,所谓的通用路线也失去了它万金油的定位——跟哪都匹配度不够。
在学习上要避开的认知误区
C++后端开发要学习的内容比Java后端开发少吗?C++和网络编程就是所谓的「C++后端开发」吗?
相信很多人因为某个众所周知的鄙视链,选择开发岗都会一窝蜂地去选择后端开发。然后看到网传现有的C++后端开发学习路线上宣称只需要学习C++语法、网络编程、必须学习的MySQL、可学可不学的Redis即可,但是Java后端开发还得学其他各种后端组件和开发框架,觉得C++后端开发要学习的东西比Java后端开发少很多,就入坑了。
事实上真如此吗?其实并不是。我并不愿意将所谓的学习路线中的内容称为C++后端开发,更愿意称之为【C++和网络编程】,附带数据库的路线那就是【C++和网络编程】plus。
有人可能要问,既然现有路线上的内容不够全,那我额外补充点后端组件的知识不就完了。个人认为,后端组件(包括数据库)的学习离不开理论和实践,你只看了常见八股文中的理论,但是你没用过,不会用,那么你背这些八股文就显得很生涩,跟背高中课文一样,没办法对理论形成一个良好的理解。
这就需要通过项目实战,通过在自己的项目中引入后端组件,简单使用这些后端组件,了解各种后端组件的使用场景,加深对理论知识的理解。Java后端开发有很多相对比较完善的web项目/微服务项目来学习(例如众所周知的谷粒商城、黑马点评)。虽然C++也可以自己造一个类似的项目,用上后端组件。但是以个人实际经历来看(曾在C++个人项目中引入过RocketMQ),不够划算,理由如下:
- 很多后端组件官方开源/第三方开源C++ SDK会发布自己的静态库、动态库,要自己处理一堆编译和链接的问题。
- 更有甚者,很多后端组件并没有官方开源/第三方开源C++ SDK,或者是发布了SDK没啥人用,处于很久没人维护的状态。难不成你开发一个学习项目,还要自己去改、自己去开发C++ SDK吗?
- 阿里云MQ的朋友说,RocketMQ C++ SDK压根没啥人用,所以他们自己也不咋维护,奇怪的bug也很多。之前自己引入RocketMQ的时候,也发现了C++ SDK功能相比Java/Go SDK不够完善,扒源码一看C++ SDK太老了,不支持消费者启动后设置关注的topic(但其实这个特性也没啥人用吧),但Java/Go SDK可以。
这些麻烦的因素结合在一起,使得你很可能费尽心机在你的项目中用了后端组件,还是被同类的Java项目虐成渣,吃力不讨好。那么实战这些后端组件,做Java项目会容易很多,做Java项目前又得先学习Java,闭环了。
虽然语言只是工具,但是对学习后端技术栈而言,Java是更好的工具。C++就不是为后端而生的语言,C++自然也不是一个学习后端技术栈的好工具。因此,学习C++后端开发的正确打开方式是,先学习C++和Java,Java本身具有很强大的后端生态,用Java把整个后端生态了解一遍,然后再酌情补充网络编程的知识。更简单一点,C++后端开发要学习的知识,约等于Java后端开发要学习的所有东西,加上C++语法和网络编程的东西,要学的东西反而更多,然而想对C++的语法有更好的理解又得啃书很久(我除了本科学了一年C++基本语法,还啃过好几个月的《C++ Primer》、《effective C++》、《STL源码剖析》、《深度探索C++对象模型》)。
总之,如果你选择学习C++后端开发的理由仅仅是因为要学的东西比较少,那你大概率会失业。
这边再汇总一下后端开发主要学习的东西(不分语言,如不全可以补充):
-
编程语言
-
计算机基础:操作系统、计算机网络、数据结构与算法
-
数据库:MySQL、Redis
-
开发框架/中间件:(仅举例,不是都学完的意思)
- 消息队列:RocketMQ、Kafka
- 配置中心:ZooKeeper、Nacos
- 搜索:Elasticsearch
- Web框架/RPC框架/ORM框架:Gin、Spring Boot;Dubbo、Spring Cloud、gRPC;Gorm、MyBatis……
- 网络库/服务器:Netty、Muduo、libevent;Nginx、Tomcat
- 容器化部署/云原生:Docker、k8s
-
设计模式:六大原则、常用设计模式
-
Linux网络编程相关(C++后端开发需要学习):
- Linux系统调用、多线程编程、socket、I/O多路复用(epoll、select、poll)、高性能网络模式(Reactor、Proactor)
-
业务相关:分布式、微服务、高并发高可用相关概念
- 微服务基本概念、服务限流/降级/熔断、服务治理(服务注册和发现、监控和日志系统)、负载均衡、灰度发布和回滚……
-
分布式理论和算法(选学,业务岗很少问,鸡架岗可能会问):CAP理论、分布式共识算法(Raft、Paxos)、一致性哈希……
反正大厂也接受转语言,我就不能先学C++后端开发然后转大厂Java/Go后端吗?
之前有人私信问过我这个问题,我曾经也有过这样的心态(仿佛看到了当初倔强的自己)。因此在这当作一个典型的问题去回答。
校招大厂后端开发岗在写出来的岗位要求上确实不会很纠结你的主攻语言,但是落实到团队或者小组就不一定是这样了。从今年校招的情况来看是这样的:
- 如果组里本来就是做Java的,已经收够了足够数量语言匹配且足够优秀的简历,那么就减少考虑语言不匹配的简历,除非你的简历和面试表现都非常突出,或者面试官真的看你看对眼了。
- 一个极端的例子:见到一个人的美团面经,面试官说自己之前也是C++转Java的,从他身上看到了曾经的自己,这种就看缘分了,也许组里没收几个C++简历吧。
- 但是如果组里本来就是做Java的,没收够对应语言的简历,那就有机会。
- 另一个极端的例子:我朋友投了阿里某bu的C++岗,但是面完所有技术面,hr告知hc没了,就把他转去了同部门Java岗,加面的一轮就问了一嘴能否接受转Java就过了,成功上岸。
所以从今年情况来说,你学了C++后端开发,能否转语言到Java/Go后端开发,需要看点运气,可遇不可求。如果你要抱着一个反正可以转语言的心态,大概率会失败,除非你真的对后端生态和业务有不错的理解而且运气也不差。不能把你所有上岸的可能性都押注在转语言上。
C++选手的求职后端开发的劣势只有语言不匹配吗?
可能有人又要问了,学了C++后端开发,面试Java/Go后端开发通不过难道只有语言不匹配,难道没有面试者自身的原因吗?两个主语言非Java的大厂——腾讯和字节在招人的倾向性也给了大家答案:
- 有一个Java选手朋友说,秋招面试字节同一个部门,他自己和其他某个Java选手泡出池子了,但是那会面同一个部门的C++选手都没泡出来。说明C++选手面试大厂Java/Go后端的排序确实普遍偏后。但是字节主要用Go,为什么Java选手优先泡出来了,Java也是语言不匹配啊。
- 腾讯的C++后端开发岗位非常多(指纯业务开发类),这些岗位按理说跟C++选手是最匹配的,今年C++选手这么多,也没见着很多C++选手拿了offer的,但他们也很愿意招语言不匹配的Java/Go选手。
从这两个例子可以发现,似乎大厂校招对转语言的容忍度也没有这么低,Go后端和C++后端都接受Java选手进来转语言,为什么反过来难度却更大呢?而且C++和Java选手简历都一样不少呢。
- 根据我对前面问题的回答,可以看出今年校招C++选手,普遍对后端生态以及业务的理解相比Java选手存在一些短板(其实按理说校招不应该强迫应届生学这些东西,还是人太多,太卷了)。当然,如果你运气足够好,有一段像样的后端实习,或许能凭借你对组里或公司业务的理解来弥补这个短板。这也说明在不同语言的后端简历数量差不多的前提下,C++后端简历在后端技能栈的质量表现,普遍不如Java后端的简历,因为所谓的C++业务后端也就不像Java后端偏好Java选手一样,去偏好C++选手了。
- 另外就是大量批发的C++语言+webserver版本的简历,破坏了面试官对C++选手【科班+基础过硬的大佬】的第一印象,容易导致部分实际很厉害的大佬被误伤。
因此,语言本无罪,本质上还是学习方法和路线出了问题。
真的存在C++后端开发岗位吗?
很多人都说,根本就没有C++后端开发这样的方向,都是凭空捏造的,不少大厂面试官也都不知道C++后端开发岗位的存在。我必须在这澄清一下,虽然互联网中小厂迫于研发成本,一般没有C++后端开发岗位,但是常见的大厂,比如腾讯、字节、阿里、百度、滴滴、京东、快手等,都是有C++后端开发岗位的,只是数量相对少,并且组相对都不太边缘,这就会对候选人的学历和技术背景有更高的要求。
为什么大厂某些领域的后端会选择C++?
这些大厂里面,C++后端常见的领域主要集中在游戏服务端,自动驾驶,搜广推架构或其他一切支撑业务通用能力的基础服务(例如地图),部分偏后端的基础架构或基础平台(RPC框架、分布式存储、机器学习系统……)等。纯上层业务的C++后端只在腾讯见过。这些领域选择C++无外乎这些原因:
- 追求所谓的高性能、低延迟:一方面是对于搜广推这种支撑业务通用能力的基础服务,上游有大量的业务去调用这些功能,上游如果流量就很大了,势必下游的这些基础服务会承受更大的流量。另一方面是机器学习系统或游戏服务端,模型训练、游戏的物理动作往往会带来大量密集的计算,Java显然没法满足这种性能要求。那就需要C++这种既有面向对象特性又具备高性能的语言出马了。
- 历史遗留和积累:很多C++后端(包括腾讯之前很多业务开发是用C++),基本上是因为开发初期选择了C++,有大量历史遗留,重构服务容易对已有的业务带来一系列问题。很多私募或公募的高频量化交易系统也是如此,你说追求所谓的高性能和低延迟go和rust也能做到,其实也是开发初期选了C++,不容易重构,顺便图一个高性能。另一方面就是历史积累的习惯,早年这类服务大家都选C++,那么新开发的这类服务在习惯上也会选择C++,毕竟它们开发的套路也千篇一律。
- 能直接访问Linux系统调用API,所以相对来说也比较适合做相对底层一点的服务或基础架构/基础平台的开发。
跟Java/Go应用开发的异同?实际体感?
由于C++相比Java和Go原始很多,这也意味着大量库的缺失。所以对于后端,在平时开发上,C++程序员显然比Java/Go程序员更喜欢造轮子。一方面是造对应的库或者SDK,比如 std::string
在字符串上的功能表现就很简陋,那么就在自己的库里面封装更强大的字符串,或者访问某些后端组件没有合适的C++ SDK,那么也会自己造一个。另一方面就是造各种组件,例如我们自造了专用于自己业务的消息队列,而不是用现成的。
大厂的C++后端其实和Java/Go后端一样大部分都采用微服务的架构,然后常用的后端组件也都会用,例如MySQL、Redis、Elasticsearch等(所以你还会觉得【C++语法和网络编程】就是所谓的C++后端开发吗?)。内部也有很多C++相关的基建能够满足日常的开发需求(例如自研的项目构建工具、公司内部组件的C++ SDK、用C++写好的各种库等),虽然不一定比Java和Go的基建强,但是基本上也够用。
其实我两段实习也没做什么复杂的工作,方向都偏向于支撑业务通用能力的服务。从实际体感上看(无论是自己实习还是同事的工作),靠近下层的服务平时在干的活当中技术需求会偏多,纯crud的业务需求会相对较少。并且就算只学习不开发这些服务的代码,也会觉得靠近下层的服务相比具体业务的服务而言,更具有一些趣味性。大抵是相比调接口/查数据库的纯业务逻辑而言,能看到更多在数据结构和算法层面的选型,还是很有意思的。
大厂的C++后端开发,发展前景相比Java后端开发的优缺点?
缺点很明显,在于跳槽选择面较窄,互联网公司内基本只有大厂有相关岗位;但Java就大小厂、国企银行都可以跳,匹配的业务也更多。现在大厂增长乏力,在内部一路升职实现猥琐发育的机会越来越少,都倾向于通过跳槽涨薪间接实现升职的,因此是否容易跳槽也是越来越重要的考虑因素。当然,跳槽去量化私募开发高频量化交易系统也是一个不错的选择。
优点大概有这些(通俗点说就是上限高):
- 岗位少,社招跳槽大概率跟你竞争的人也少
- 工作相比相比纯crud趣味性更足,造轮子的机会更多一些,技术成长也会稍大一些
- 由于岗位少,也意味着社招很难招到业务非常匹配且C++技术很强的选手,这些岗位有很多会更倾向于培养校招生,校招生进去后猥琐发育的概率更大,中年危机相比也没那么严重(这是我目前观察到的情况,但以后不好说了,毕竟现在C++的校招生也越来越强,老人的优势越来越不明显)。
对未来C++求职形势的预测?明年C++真的会比Java好吗?
有人说,C++和Java的求职难度跟考研一样分大小年,上一年Java难,那么下一年C++难,再下一年Java难……以此类推。但我并不完全苟同此类观点,需要结合具体的行业和岗位。
由于今年C++有各种劝退的声音,会吸引一堆人转Java,所以明年Java选手势必会更多。但是也由于众所周知的鄙视链,大部分人还是首选后端开发。所以后端开发的热度只会有增无减,而大厂后端开发hc就这么点,明年Java选手增多意味着和大厂后端开发岗在语言匹配的简历会更多,会更挤占C++选手的生存空间。所以,按照网传现有的路线去学习C++后端开发并投递不分语言的大厂后端开发岗的形势,只会越来越寄,这个是不分大小年的。
在今年劝退C++的潮流背后,纯C++岗位(无论是大厂还是其他非互联网公司,标明了开发语言是C++的岗位)在明年的热度预计会有所降低,这一方面确实可能有大小年的存在。而且也保不准又会有什么行业,给C++选手带来了新的就业机会。
如何选择校招方向?
校招方向的选择,应该结合自己感兴趣的领域去做理性的选择,而不是看别人都学Java/C++自己去无脑跟风。当你经过了仔细地调研,确定了你感兴趣且适合自己发展的领域,再看看这些领域内有什么公司,这些公司主流的技术栈又是什么。你就对你的目标公司、要学习什么语言、学习什么技术栈、补充什么领域内的其他知识有了合适的答案。
C++后端开发适合什么人学习?webserver还能做吗?
看完了本文,相信大家对于互联网大厂内的C++后端开发岗位情况有了全方位的了解。如果已经确定好要走后端开发并且目标要进互联网大厂,那么C++后端开发还能学吗?我的答案是,如果你学历有优势,且对我提到互联网大厂内C++后端开发主要涉及的领域有特殊偏好,那就可以选择。否则只要有一点不满足,那就选Java后端开发一步到位吧,用的业务领域更多,且绝大部分互联网公司和国企银行都在用。
在时间充裕的前提下,也可以选择同时主攻Java、C++、Go后端开发,反正后端组件这一块是共同的,这样基本上能覆盖所有公司和领域的后端开发岗位了。但个人觉得,只同时主攻Java和C++后端开发的性价比会更高,毕竟Go后端开发的业务岗,Java也能面进去。如果对云原生赛道不感兴趣,可以不用专门学习Go后端开发。
本文的观点也不是说webserver不好。尽管在现今形势下,普通的、没有自己优化的webserver已经不适合作为简历上的校招项目了。但webserver仍然是入门Linux系统调用、Linux多线程编程、网络编程的好项目,甚至可以说是必做的项目,有了webserver的基础,你才能学习更复杂的网络库和著名开源的服务器源码(例如Nginx),进而在它们的基础上往项目中融入你的个人思考。
我需要转语言吗?
转语言相当于转行业,转赛道
那么又有人问了,我已经选择了C++/Java,但是看大家都在劝退,自己在求职过程中也不太顺利,是否需要转语言?首先你前一年应届生的就业情况和他们个人的反馈,确实是一个不错的风向标。但是也建议评估一下以自身情况选择C++/Java进入理想赛道的概率再做决定,不用无脑跟风,也不用完全听信某些人说的坚持之前的选择就行(出发点是怕你顾此失彼),种一棵树最好的时间是现在。毕竟如果赛道都选错了,为什么不给自己纠错的机会呢?就算是临近暑期实习和秋招,大不了在校招准备的过程中慢慢过渡。
C++有什么就业方向?建议走什么方向?
这不是本文的主题,我对其他C++开发的方向也不甚了解,只能简单回答一下,没有明确建议,如何选择主要还是结合你的学历和兴趣。
后端开发(本文有细说),基础平台或基础架构(存储、数据库、os内核、渲染引擎、AI框架、编译器等)
游戏客户端、量化交易系统、自动驾驶、音视频、网络安全、桌面客户端(Qt、MFC)、工业软件(Qt,例如中望软件)、嵌入式软件开发(制造业相关,常见的车厂、芯片厂、通信/手机厂、硬件厂都有)。
总体都需要学习对应的领域知识。高学历选手什么方向都可以入。
- 基础平台或基础架构一类的高端岗位,尤其是数据库,岗位比较少,学历、实习、开源都不能差,有相关论文很加分。
- 量化交易系统主要存在于私募/公募,招人不多,但是给钱很大方,适合高学历+算法基础拉满(例如ACM金或LeetCode周赛靠前名次)的选手,不需要太多领域背景。
- 正在变卷的方向:游戏客户端、音视频、工业软件开发、嵌入式软件开发。
- 目前不需要过多领域背景,但有学历或领域背景会很加分的方向:嵌入式软件开发、自动驾驶。
- 有少量需求,但前景一般的方向:大厂存在的桌面客户端(Qt、MFC),非游戏客户端,因为大部分人已经不用桌面客户端而是用移动客户端了,但还是有少部分人用。
彩蛋
其实本文的一些道理,并不是自己一开始就明白的,而是走了很多弯路才后知后觉。正所谓,道理都明白,却还是过不好这一生。我也承认我对于后端生态和业务的理解相比大佬Java选手稍差,如果有时间,我也打算强化一下相关的理解。
虽然在求职道路上确实也屡次碰壁,但是也很感谢滴滴和阿里的选择让我见识了大厂C++后端开发的真实面貌。offer什么的就不放出来了,就放个连续两封美团感谢信,博大家一笑。
#我的求职思考##后端开发##C++##滴滴##阿里巴巴#