开通VIP,畅享免费电子书等14项超值服
首页
好书
留言交流
下载APP
联系客服
2023.11.25湖南
前言:24届校招生,双9本硕科班,方向C++/Go后端开发。有两段大厂实习经历,第一段实习在滴滴C++/Go后端开发,第二段实习在阿里控股C++后端开发(已拿到转正offer,防定位不说具体部门)。
我不会写什么经验帖,因为我的个人背景比较普通,技术水平勉强及格,也因为各种不可抗力因素,秋招就这样了,很多C++后端选手秋招情况或许比我强很多。按理说没资格谈论什么经验,自然也会有一些不够专业的观点。如果有不一致的意见可以理性友善讨论,但是你杠就是你对。
今年从暑期实习到秋招,网络上能到处看到吐槽C++方向不好找工作和劝退C++的声音。本文提出的问题,部分公众号也有分析过,但是我又觉得略微片面,想根据自己的实际经历补充一些不同的观点,帮助大家对校招方向做出更理性的选择。也希望本文可以聚集到各种有用信息,让平台能够减少类似C++和Java选择、要不要转语言这种重复且冗余的问题,实现高效学习和沟通。
注意,本文不仅对纠结选C++还是Java的选手有参考价值,也对确定了C++或Java有转语言想法的选手有参考价值,因此Java选手看到本文可以不用划走。
大概在我读本科的时候,身边的声音都是劝学Java而不是学C++的。因为在大家的传统认知里面都是,互联网行业后端基本上都用Java,用C++比较少;C++比较难学,还要深入底层,岗位少且岗位都是为大佬们准备的。这会还没什么人去鼓吹学习C++,C++的简历基本上也都是科班的学生(有大佬,也有来不及准备被迫用C++直接秋招的选手),大家的看法还是很理性的,当时C++方向还是一片蓝海,哈哈。
总而言之,这条路线就是「进可互联网,退可制造业」的万金油,看似性价比极高。23届互联网行业寒冬,互联网行业招聘需求萎缩,但是制造业的嵌入式软件开发招聘需求增多,更倾向于C++选手,所以23届确实是C++拿到的offer比Java多,所以这又劝了更多人入坑。
所以与其说C++不香了,不如说今年校招形势的变化,加上大量批发的C++语言+webserver版本的简历,让C++开发岗的定位回到了初期它原本该在的位置——难学、机会少、给有准备的大佬准备的,所谓的通用路线也失去了它万金油的定位——跟哪都匹配度不够。
相信很多人因为某个众所周知的鄙视链,选择开发岗都会一窝蜂地去选择后端开发。然后看到网传现有的C++后端开发学习路线上宣称只需要学习C++语法、网络编程、必须学习的MySQL、可学可不学的Redis即可,但是Java后端开发还得学其他各种后端组件和开发框架,觉得C++后端开发要学习的东西比Java后端开发少很多,就入坑了。
事实上真如此吗?其实并不是。我并不愿意将所谓的学习路线中的内容称为C++后端开发,更愿意称之为【C++和网络编程】,附带数据库的路线那就是【C++和网络编程】plus。
有人可能要问,既然现有路线上的内容不够全,那我额外补充点后端组件的知识不就完了。个人认为,后端组件(包括数据库)的学习离不开理论和实践,你只看了常见八股文中的理论,但是你没用过,不会用,那么你背这些八股文就显得很生涩,跟背高中课文一样,没办法对理论形成一个良好的理解。
这就需要通过项目实战,通过在自己的项目中引入后端组件,简单使用这些后端组件,了解各种后端组件的使用场景,加深对理论知识的理解。Java后端开发有很多相对比较完善的web项目/微服务项目来学习(例如众所周知的谷粒商城、黑马点评)。虽然C++也可以自己造一个类似的项目,用上后端组件。但是以个人实际经历来看(曾在C++个人项目中引入过RocketMQ),不够划算,理由如下:
这些麻烦的因素结合在一起,使得你很可能费尽心机在你的项目中用了后端组件,还是被同类的Java项目虐成渣,吃力不讨好。那么实战这些后端组件,做Java项目会容易很多,做Java项目前又得先学习Java,闭环了。
虽然语言只是工具,但是对学习后端技术栈而言,Java是更好的工具。C++就不是为后端而生的语言,C++自然也不是一个学习后端技术栈的好工具。因此,学习C++后端开发的正确打开方式是,先学习C++和Java,Java本身具有很强大的后端生态,用Java把整个后端生态了解一遍,然后再酌情补充网络编程的知识。更简单一点,C++后端开发要学习的知识,约等于Java后端开发要学习的所有东西,加上C++语法和网络编程的东西,要学的东西反而更多,然而想对C++的语法有更好的理解又得啃书很久(我除了本科学了一年C++基本语法,还啃过好几个月的《C++Primer》、《effectiveC++》、《STL源码剖析》、《深度探索C++对象模型》)。
总之,如果你选择学习C++后端开发的理由仅仅是因为要学的东西比较少,那你大概率会失业。
这边再汇总一下后端开发主要学习的东西(不分语言,如不全可以补充):
之前有人私信问过我这个问题,我曾经也有过这样的心态(仿佛看到了当初倔强的自己)。因此在这当作一个典型的问题去回答。
校招大厂后端开发岗在写出来的岗位要求上确实不会很纠结你的主攻语言,但是落实到团队或者小组就不一定是这样了。从今年校招的情况来看是这样的:
如果组里本来就是做Java的,已经收够了足够数量语言匹配且足够优秀的简历,那么就减少考虑语言不匹配的简历,除非你的简历和面试表现都非常突出,或者面试官真的看你看对眼了。
一个极端的例子:见到一个人的美团面经,面试官说自己之前也是C++转Java的,从他身上看到了曾经的自己,这种就看缘分了,也许组里没收几个C++简历吧。
但是如果组里本来就是做Java的,没收够对应语言的简历,那就有机会。
另一个极端的例子:我朋友投了阿里某bu的C++岗,但是面完所有技术面,hr告知hc没了,就把他转去了同部门Java岗,加面的一轮就问了一嘴能否接受转Java就过了,成功上岸。
所以从今年情况来说,你学了C++后端开发,能否转语言到Java/Go后端开发,需要看点运气,可遇不可求。如果你要抱着一个反正可以转语言的心态,大概率会失败,除非你真的对后端生态和业务有不错的理解而且运气也不差。不能把你所有上岸的可能性都押注在转语言上。
可能有人又要问了,学了C++后端开发,面试Java/Go后端开发通不过难道只有语言不匹配,难道没有面试者自身的原因吗?两个主语言非Java的大厂——腾讯和字节在招人的倾向性也给了大家答案:
从这两个例子可以发现,似乎大厂校招对转语言的容忍度也没有这么低,Go后端和C++后端都接受Java选手进来转语言,为什么反过来难度却更大呢?而且C++和Java选手简历都一样不少呢。
因此,语言本无罪,本质上还是学习方法和路线出了问题。
很多人都说,根本就没有C++后端开发这样的方向,都是凭空捏造的,不少大厂面试官也都不知道C++后端开发岗位的存在。我必须在这澄清一下,虽然互联网中小厂迫于研发成本,一般没有C++后端开发岗位,但是常见的大厂,比如腾讯、字节、阿里、百度、滴滴、京东、快手等,都是有C++后端开发岗位的,只是数量相对少,并且组相对都不太边缘,这就会对候选人的学历和技术背景有更高的要求。
这些大厂里面,C++后端常见的领域主要集中在游戏服务端,自动驾驶,搜广推架构或其他一切支撑业务通用能力的基础服务(例如地图),部分偏后端的基础架构或基础平台(RPC框架、分布式存储、机器学习系统……)等。纯上层业务的C++后端只在腾讯见过。这些领域选择C++无外乎这些原因:
由于C++相比Java和Go原始很多,这也意味着大量库的缺失。所以对于后端,在平时开发上,C++程序员显然比Java/Go程序员更喜欢造轮子。一方面是造对应的库或者SDK,比如std::string在字符串上的功能表现就很简陋,那么就在自己的库里面封装更强大的字符串,或者访问某些后端组件没有合适的C++SDK,那么也会自己造一个。另一方面就是造各种组件,例如我们自造了专用于自己业务的消息队列,而不是用现成的。
其实我两段实习也没做什么复杂的工作,方向都偏向于支撑业务通用能力的服务。从实际体感上看(无论是自己实习还是同事的工作),靠近下层的服务平时在干的活当中技术需求会偏多,纯crud的业务需求会相对较少。并且就算只学习不开发这些服务的代码,也会觉得靠近下层的服务相比具体业务的服务而言,更具有一些趣味性。大抵是相比调接口/查数据库的纯业务逻辑而言,能看到更多在数据结构和算法层面的选型,还是很有意思的。
优点大概有这些(通俗点说就是上限高):
有人说,C++和Java的求职难度跟考研一样分大小年,上一年Java难,那么下一年C++难,再下一年Java难……以此类推。但我并不完全苟同此类观点,需要结合具体的行业和岗位。
由于今年C++有各种劝退的声音,会吸引一堆人转Java,所以明年Java选手势必会更多。但是也由于众所周知的鄙视链,大部分人还是首选后端开发。所以后端开发的热度只会有增无减,而大厂后端开发hc就这么点,明年Java选手增多意味着和大厂后端开发岗在语言匹配的简历会更多,会更挤占C++选手的生存空间。所以,按照网传现有的路线去学习C++后端开发并投递不分语言的大厂后端开发岗的形势,只会越来越寄,这个是不分大小年的。
在今年劝退C++的潮流背后,纯C++岗位(无论是大厂还是其他非互联网公司,标明了开发语言是C++的岗位)在明年的热度预计会有所降低,这一方面确实可能有大小年的存在。而且也保不准又会有什么行业,给C++选手带来了新的就业机会。
校招方向的选择,应该结合自己感兴趣的领域去做理性的选择,而不是看别人都学Java/C++自己去无脑跟风。当你经过了仔细地调研,确定了你感兴趣且适合自己发展的领域,再看看这些领域内有什么公司,这些公司主流的技术栈又是什么。你就对你的目标公司、要学习什么语言、学习什么技术栈、补充什么领域内的其他知识有了合适的答案。
看完了本文,相信大家对于互联网大厂内的C++后端开发岗位情况有了全方位的了解。如果已经确定好要走后端开发并且目标要进互联网大厂,那么C++后端开发还能学吗?我的答案是,如果你学历有优势,且对我提到互联网大厂内C++后端开发主要涉及的领域有特殊偏好,那就可以选择。否则只要有一点不满足,那就选Java后端开发一步到位吧,用的业务领域更多,且绝大部分互联网公司和国企银行都在用。
本文的观点也不是说webserver不好。尽管在现今形势下,普通的、没有自己优化的webserver已经不适合作为简历上的校招项目了。但webserver仍然是入门Linux系统调用、Linux多线程编程、网络编程的好项目,甚至可以说是必做的项目,有了webserver的基础,你才能学习更复杂的网络库和著名开源的服务器源码(例如Nginx),进而在它们的基础上往项目中融入你的个人思考。
转语言相当于转行业,转赛道
这不是本文的主题,我对其他C++开发的方向也不甚了解,只能简单回答一下,没有明确建议,如何选择主要还是结合你的学历和兴趣。
后端开发(本文有细说),基础平台或基础架构(存储、数据库、os内核、渲染引擎、AI框架、编译器等)
总体都需要学习对应的领域知识。高学历选手什么方向都可以入。
很多有c/c++语言基础的朋友,在面试后台岗的时候都会有一个疑问,面试大厂的时候,技术水平要到一个什么程度才能进?
这里就分为校招和社招。校招的话对于技术层面的要求会相对较低。会CwithSTL以及常见的数据结构与算法,并且笔试能当场做出leetcode中等难度以下的人就有70分了,如果笔试的时候对STL、auto、lambda等用法都很熟练,都有加分。对于实习生来说,表现不错就可以招进来,剩下网络编程和linux进去之后会再教你。
所以校招更看重的是你的基础和学习能力。实习进去之后再观察你的技术学习进度决定是否给你发offer。当然,如果你能提前掌握Linux环境编程,网络编程等技术更会加分,毕竟不管是哪个赛道,内卷都是有的。
还不熟悉的朋友,这里可以先领取一份Linuxc/c++全栈开发新手学习资料包(入坑不亏):
【后端开发】这里给大家推荐零声教育全网独家的【LinuxC/C++全栈开发】课程体系,通过原理技术+源码分析+案例分析+项目实战,全面解析LinuxC/C++,8个上线项目,2W+行手写代码,全面解析:LinuxC/C++全栈开发1、精进基石专栏(一)数据结构与算法
(二)设计模式
(三)c++新特性
(四)Linux工程管理
(一)网络编程异步网络库zvnet
(二)网络原理
(三)自研框架:基于dpdk的用户态协议栈的实现(已开源)
(一)池式组件
(二)高性能组件
(三)开源组件
(一)Redis
(二)MySQL
(三)Kafka
(四)Nginx
(一)游戏服务器开发skynet(录播答疑)
(二)分布式API网关
(三)SPDK助力MySQL数据落盘,让性能腾飞(基础设施)
(四)高性能计算CUDA(录播答疑)
(五)并行计算与异步网络引擎workflow
(六)物联网通信协议mqtt的实现框架mosquitto
(一)Docker
(二)Kubernetes
(一)性能与测试工具
(二)观测技术bpf与ebpf
(三)内核源码机制
(一)分布式数据库
(二)分布式文件系统(录播答疑)
(三)分布式协同
(一)dkvstore实现(上线项目)
(二)图床共享云存储(上线项目)
(三)容器化docker部署
(四)零声教学AI助手一代(上线项目)
(五)魔兽世界后端TrinityCore(上线项目)
学习成果检验
如果是想在c/c++开发方向得到有效的快速提升(不是所谓的速成),这份学习体系是大家绕不过的具有参考意义的提升路线。从学习路线中可以对c/c++开发方向的技术栈有一个清晰的认识。
还不熟悉的朋友,这里可以先领取一份Linux内核驱动开发新手学习资料包(入坑不亏):
这里给大家推荐零声教育全网独家的【Linux内核源码分析与项目实战】课程体系,通过原理技术+源码分析+案例分析+项目实战,全面解析计算机底层原理,20项目案例,2W+行手写代码,全面解析6个内核底层原理开发技术:
(一)操作系统与汇编基础
(二)进程管理基础
(三)进程调度模块
(一)内存管理基础部分
(二)内存管理进阶部分
(一)网络基础架构
(二)网络协议栈架构
(一)设备驱动基础架构
(二)NIC网络接口卡
(一)虚拟文件系统
(二)文件系统调用
(三)挂载文件系统
(四)磁盘文件系统
(五)数据同步
(一)内核活动组件
(二)开源社区
7、内核难点与学习方法8、内核适宜的工程师人群至于学习效果怎么样?
而如今音视频的知识纷繁复杂,自己学习非常困难,既需要非常扎实的基础知识,又需要有很多的工程经验;而音视频从业者基本上有两个层面:一个层面是搞音视频算法,这类人非常少,需要有深的数学能力和算法背景,这类人一般都会选择去大公司,薪水百万是最low的。
还不熟悉的朋友,这里可以先领取一份音视频开发新手学习资料包(入坑不亏)
什么是音视频开发音视频开发是指涉及音频和视频处理、编解码、传输、存储等方面的软件开发领域。它包括了实时音视频通信、流媒体服务、多媒体应用程序等内容。
音视频开源项目
音视频应用领域
各类活动场景都在不断加深线上开展业务的方式,有人的业务场景基本.上都需要音视频技术。
FFmpeg零基础入门:如何快速入门,需要哪些知识点?
这里给大家推荐零声教育全网独家的【音视频流媒体高级开发】课程体系,通过原理技术+源码分析+案例分析+项目实战,全面解析音视频开发技术:
(一)音频基础知识
(二)视频基础知识
注:具体H264编码格式见FFmpeg章节
(三)解复用基础知识
注:具体复用格式详解见FFmpeg章节
(四)FFmpeg开发环境搭建
(五)音视频开发常用工具
(一)FFmpeg命令
注:掌握FFmpeg的目的
(二)SDL跨平台
注:SDL兼容Win、Ubuntu、Mac三大平台,主要用于后续项目的画面显示和声音输出
(三)FFmpeg基石精讲
注:目的熟悉FFmpeg常用结构体和函数接口
(四)FFmpeg过滤器
(五)FFmpeg音视频解复用+解码
注:FFmpegAPI学习:视频解复用->解码->编码->复用合成视频
(六)ffplay播放器
注:ffplay.c是ffplay命令的源码,掌握fplay对于我们自己开发播放器有事半功倍的效果
(七)FFmpeg音视频编码+复用合成视频
(八)ffmpeg多媒体
注:ffmpeg.c是ffmpeg命令的源码,掌握ffmpeg.c的大体框架对于我们要实现一些不知道怎么编写代码的功能(用ffmepg命令行可以但不知道怎么调用ffmpegapi时可以参考ffmepg.c的逻辑)有极大的帮助,比如要裁剪视频长度。
(九)FFmpeg+QT播放器
(一)RTMP推拉流项目实战
(二)RTSP流媒体实战
(三)HLS拉流分析
注:理解HL.S的拉流机制,有助于我们解决HL.S播放延迟较高的问题
(一)SRS源码剖析协程
注:对于SRS流媒体服务器,我们长期更新,从3.0->4.0->5.0
(二)ZLMediaKit源码剖析
(一)WebRTC中级开发手把手写代码
注:学习WebRTC建议从web端入手,可以直接调用js接口(千万别刚接触WebRTC就忙着去编译WebRTC源码),对WebRTC通话流程有清晰的理解再考虑其他端。
(二)WebRTC高级开发-SRS4.0/5.0源码分析
(三)WebRTC高级开发-MESH模型多人通话
(四)WebRTC高级开发-JanusSFU模型多人通话
(一)AndroidNDK开发基础
(二)AndroidFFmpeg编译和应用
(三)AndroidRTMP推拉流
(四)AndroidIjkplayer源码分析
(一)IOSFFmpeg6.0编译和应用
(二)IOSFFmpegRTMP推拉流
(三)VideoToolbox硬件编解码
(四)IOSjkplayer编译和应用
(五)IOSijkplayer编译和应用
(一)0voice播放器
(二)0voice录制推流软件
支持屏幕+麦克风RTMP直播,支持本地文件推送;支持录制保存到本地,支持录制预览功能,支持添加图片水印功能;支持文字水印功能,支持屏幕+摄像头同时捕获,支持降噪功能。
(三)0voice低延迟拉流直播
实现500毫秒~1秒的低延迟直播
帮助大家全面掌握FFmpeg的核心技术点:
音视频自学难点音视频自学非常困难,网上通俗易懂的难找到。
网上部分资源是对应的开源版本较低,比如雷霄骅(雷神)博客的FFmpeg版本较低
音视频涉及大量的开源库和协议:
部分嵌入式音视频的朋友技术面窄,技术不深入。比如有同学做了2年的音视频驱动,一帧音频能持续播放多久都不明白。
至于学习效果怎么样?
还不熟悉的朋友,这里可以先领取一份dpdk新手学习资料包(入坑不亏)
本文介绍下DPDK进阶到高性能专家的学习路线,整个学习路线,直接对标DPDK资深架构师岗位,知识点包括dpdk、储存、网关开发、网络协议栈、网络安全、TRex、vpp、OVS、DDos、虚拟化技术等等。其次你把整个内容,全部消化,是完全可以胜任任何DPDK资深架构师岗位招聘,DPDK开发招聘。
(1)dpdk基础知识
(2)网络协议栈
(3)dpdk组件项目
(4)dpdk经典项目
(1)高效磁盘io读写spdk(C)
(2)spdk文件系统的实现
(3)spdkkv存储的实现
(1)可扩展的矢量数据包处理框架vpp(c/c++)
(2)golang的网络开发框架nff-go(golang)
(1)DPDK的虚拟交换机框架OvS
(2)高性能4层负载均衡器DPVS
(1)perf3
(2)TRex
(3)dpdk-pktgen
(4)fio
(1)性能指标
(2)测试方法
7、适学人群
(一)CMake的使用
(二)Windows和Linux下编译调试环境搭建
(一)连接池设计概要
(二)同步连接池实现
(三)异步连接池实现
(四)事务处理
(五)数据库模块实践
(一)日志模块概要
(二)日志模块实现
(三)日志模块实践
(一)阻塞io网络模型编程
(二)reactor网络模型编程
(三)windowsiocp网络编程
(三)boost.asio网络编程
(四)网络缓冲区设计
(五)网络模块实践
(一)地图模块概要
(二)地图模块AOI核心算法
(三)AABB算法实现碰撞检测
(四)A*寻路算法
(一)技能设计
(二)AI设计
(三)怪物管理
(四)战场副本设计
(一)任务系统设计
(二)背包设计
(三)工会系统设计
(一)lua程序设计
(二)c++新特性
(三)C++设计模式
9、适宜工程师人群
Qt是一个1991年由QtCompany开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(MetaObjectCompiler,moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。
还不熟悉的朋友,这里可以先领取一份qt开发新手学习资料包(入坑不亏)
本文介绍下qt开发从入门到高级进阶的学习路线,整个学习路线,直接对标qt工程师开发岗位,知识点包括语言编程基础、Qt编程入门到精通专栏、Qt高级进阶专栏、Qt项目开发实战专栏、Qt开发工程师提升专栏等。其次你把整个内容,全部消化,是完全可以胜任任何qt开发招聘,C++qt开发招聘。1、QtC++语言编程基础专栏(一)QtC++语言编程基础
(二)QtC++语言进阶
(三)QtC++语言新特性
(一)Qt开发基础体系
(二)Qt开发常用控件详解
(三)Qt布局及对话框详解
(四)Qt图形&模型&视图
(五)Qt文件操作及事件处理
(六)Qt服务应用操作
(七)Qt网络及多线程
(八)Qt数据分析:图表详解
(九)Qt应用程序打包及发布
(一)MySQL数据库编程技术
(二)sQLite数据库编程技术
(三)OpenCV编程开发常用技术
(四)C++23种设计模式
(一)文字编辑:Word处理软件
(二)音频项目实战:MP3播放器搜索引擎(Qt5+SQLite)
(三)信息管理项目:库存管理系统(Qt5+MySQL)
(五)视频项目实战:视频播放器(Qt+FFmpeg)
(一)Qt开发工程师提升:Quick编程常用技术
(二)Qt开发工程师提升:QSS编程常用技术
(三)Qt开发工程师提升:核心技术模块
6、Qt参考书籍资料
反之报班学习的优势在于:
要说报班学习的弊端,那我只能想到一个,就是会有金钱上的一个付出,但是技术学会了是会跟随你一辈子的,现在的付出可能就是以后你一个月的涨薪部分,这个账怎么算都不会亏。投资自己是风险最低收益最高的,在大环境中安于现状才是井底之蛙,不断学习提升自己才是程序员最需要做的,提升工作竞争力,让自己在现在的公司被需要!
现如今各行各业内卷都很严重,不要说行业不行,而是大家越来越专业,这个是行业发展的必然性,优胜劣汰适者生存,时代在改变,不提高自己的核心竞争力就要出局。
最后:
给校招的小伙伴一句话:第一份工作不亚于一次高考,珍惜校招,社招的竞争是你目前想象不到的。能去大厂觉不妥协,IT行业第一份工作背景越好,起点越高,后续发展空间越好!
给那些1-3年的安于现状的伙伴一句话:
不要抱怨市场,不要安于现状,在低端,往中端领域看,在中端往高端领域看。认知以及对自身的要求,都会有所改变。
给那些担心35岁的伙伴一句话:
决定上限的不是年纪,而是技术。最后:希望学习路线对你有所帮助,希望码农的我们越来越好!