目录
【岗位需求】
C++后台方向的岗位有很多,大致可以分为以下几类:
一、基础服务开发服务端开发工程师
- Web服务
提供Web应用的API接口,处理用户请求,例如电商网站、社交网站的后台服务。
- 游戏服务器
负责游戏逻辑、玩家数据管理、网络通信等,例如MMORPG、MOBA等游戏的服务器。
- 数据库服务
负责数据库的管理和维护,包括数据备份、恢复、性能优化等。
二、基础架构工程师
- 操作系统内核开发
负责操作系统内核的开发和维护,例如Linux内核开发。
- 分布式系统开发
负责构建和维护分布式系统,例如集群管理、负载均衡、容错机制等。
- 虚拟化技术开发
负责虚拟化技术开发,例如容器技术(Docker)、虚拟机技术(VMware)等
三、数据处理与分析数据平台开发工程师
- 数据采集
从各种数据源采集数据,例如数据库、日志文件、传感器等。
- 数据存储
存储海量数据,例如分布式数据库、数据仓库等。
- 数据处理
对数据进行清洗、转换、分析等操作,例如数据挖掘、机器学习等。
- 数据分析工程师
负责对数据进行分析,发现数据背后的规律和趋势,为业务决策提供支持
四、嵌入式开发/嵌入式软件工程师
- 智能硬件:
智能手机、智能家居、智能汽车等设备的软件开发。
- 工业控制系统:
工厂自动化、机器人等设备的软件开发。
- 医疗设备
医疗器械的软件开发。
五、其他方向安全工程师
- 漏洞挖掘
寻找系统和软件的漏洞。
- 安全防护
设计和开发安全防护机制,例如防火墙、入侵检测系统等。
- 安全审计
对系统进行安全审计,发现安全风险。
- 游戏开发工程师
负责游戏引擎、游戏逻辑、游戏界面等方面的开发。
- 音视频开发工程师
负责音视频处理、传输、播放等方面的开发。
【笔试准备】
📍笔试考察内容
笔试主要考察基础和思维,主要涉及C++语言基础,数据结构与算法,TCP/IP协议,网络编程,Linux。能使用高级的设计模式,并且能够使用相关工具对模块进行性能测试和分析,优化服务的性能瓶颈。
掌握批处理脚本的编写,自动化的完成服务的搭建,并能使用常用的系统工具定位复杂问题。熟悉操作系统的常用命令,能完成服务的搭建,并具备日志分析和常规问题的解决能力。使用监控、告警等基础设施,基于相关运营工具及运营系统处理线上问题。
了解导致后台系统被入侵的安全漏洞,在日常开发中理解并按规范避免这些漏洞。了解主流的分布式架构,能参与到分布式服务的协同开发。
📍笔试具体形式
技术题较少,大部分都是数学、逻辑、概率等类型
时间:90分钟
题型:单选3道,多选5道,填空2道,编程2道
📍笔试前可以做哪些准备
一、学习基础
1.语法基础
重点掌握:指针和引用的概念、指针与内存关系、程序编译过程、static、const、#define的用法和区别、C和C++区别、内存模型、内存中的栈和堆分配
2.面对对象基础
面向对象理解、析构函数、构造函数、拷贝构造、多态、纯虚函数和虚函数、虚函数实现机制、虚函数表、访问限定符 public/private/protected、继承原理/虚继承/菱形继承、静态绑定和动态绑定、new/delete和malloc/free、重载、重写和隐藏
3.语法进阶
智能指针、左值、右值引用和move语义、类型转换方式、常用的设计模式、线程安全的单例模式、内存溢出和内存泄漏、C++11新特性、静态链接库和动态链接库
4.STL标准模板库
迭代器、空间配置器理解、常用容器特点、用法以及底层实现vector、list、deque、set、map、unorderedmap
5.推荐书籍
《C++Primer》可作为工具书,随手查阅
《EffectiveC++》深入了解C++的程序设计规范
《STL源码剖析》剖析STL的源码底层,非常具有学习价值
有精力还可以看《深度探索C++对象模型》《more EffecticeC++》
- 推荐课程
视频链接:
二、算法与数据结构
对于普通人而言,算法的学习最重要的是能够形成基本的算法思维,懂得从程序设计的角度对高重复性的操作做优化。这其中基本算法思想的掌握和常用数据结构的理解是必不可少。这方面的学习更倾向于多看多想多练。
1.常见算法类型
排序算法(冒泡、插入、选择、快排、希尔、堆排、归并、桶排、基数、计数)、字符串操作、数组操作、递归、回溯、分治、动态规划等
2.常用数据结构
链表、栈、队列、树(二叉树、平衡二叉树、红黑树、B树、B+树、哈夫曼树、字典树)、跳表、图
3.推荐书籍
《大话数据结构》适合入门学习
《剑指offer》必刷66题
《算法导论》尽量看,能啃完就是大神
- 推荐课程
视频链接:
三、计算机网络
网络相关的东西不是很多,关键在于对常见网络协议簇的认识和理解,以及一些常规操作底层设计实现的剖析。
1.重点掌握知识点
OSI七层模型、TCP/IP五层模型、TCP/IP协议总结、TCP、UDP区别、TCP三次握手、四次挥手、TCP状态转换、TCP状态中TIME_WAIT、TCP连接建立需要为什么不是两次握手、TCP第三次握手失败会出现什么、TCP长连接和短链接及优缺点、TCP拥塞控制-慢启动、拥塞避免、快重传、快启动、TCP如何保证可靠性传输、TCP如何解决粘包、拆包问题、TCP为什么可靠、UDP如何实现TCP可靠传输、IP地址和子网掩码、ARP解析过程、DNS原理、HTTP状态、码HTTP1.0、HTTP1.1、HTTP2.0区别、HTTP和HTTPS区别、HTTPS加密过程、非对称加密和对称加密算法、Nagle算法
2.推荐书籍
《计算机网络自顶向下方法》教材书,可放手边查阅
《TCP/IP详解》重点了解TCP、IP、UDP协议实现
3.推荐课程
视频链接:
四、数据库
数据库的一般使用其实不难,但是对于不同数据库的特性、实现机制、应用场景和性能优化方面却能够难倒一大批面试者。同样数据库本身也是非常好的项目实例,往往能够从中学习到许多程序设计的思想和模式。因此,对数据库要明白怎么用、为什么用、怎么用得好这几个方面的问题。
1.重点掌握
数据库类别
和非关系型数据库区别
MySQL:
SQL常见语句、MySQL内链接,外链接(左链接、右链接、全链接)、MySQL索引类型和原理
MySQL事务实现原理ACID、MySQL引擎、MySQL主从复制原理、作用和实现、MySQL日记系统redo log、binlog、undo log、MVCC实现原理、Sql优化思路、范式理论、数据库高并发解决方法
Redis:
Redis支持的数据类型、Redis持久化、Redis 架构模式、主从复制、一致性哈希算法
2.推荐书籍
《高性能 Mysql》能够加深对Mysql的理解和使用
《Redis设计与实现》比较全面的书,可以多看看
- 推荐视频
视频链接:
五、操作系统
操作系统的问题会集中在进程和线程,但是这一类的问题往往会以开放题的形式出现。主要考察的是对操作系统组件以及运行过程的理解。比如:
| 开机登录系统发生了什么?
| 复制粘贴是怎样操作的?
1.重点掌握
物理内存和虚拟内存、缓存IO和直接IO、作业调度算法、线程和进程、进程和线程的调度、线程的创建和结束、线程状态、线程间通信与线程同步机制、互斥锁和信号量、线程池、消费者和生产者、死锁、并发和并行
2.推荐书籍
《深入理解计算机系统》很全面的书,这一本就够用了
- 推荐视频
视频链接:
六、Linux系统
对Linux系统的熟练使用是后台开发/服务器开发的必备技能点。这年头,不会几个Linux指令都不好意思说自己是敲代码的。(客户端和前端的同学表示不服)不管怎样,对于Linux系统的掌握无论在哪个方向上,都会有用武之地的。
1.Linux系统操作和命令
top命令、ps命令、netstat命令、awk命令、find命令、grep命令、wc命令、sed命令、head和tail命令、正则表达式、如何查找出现频率最高的100个IP地址、linux如何统计文件中某个字符串出现的频率、linux启动的第一个进程、linux查看端口占用、linux查看CPU和内存使用、Linux查看系统负载命令、Linux调试程序、Linux硬链接和软连接、core dump、cmake和makefile、Shell脚本基本语法和使用
2.推荐书籍
《鸟哥私房菜》入门足够了,多敲多写才能更快掌握
3.推荐课程
视频链接:
七、Linux网络编程
后台开发是离不开网络编程的,甚至简单来说,后台开发就是用厉害点的电脑去处理大规模的网络请求。所以作为一名合格的后端开发人员,对Linux网络编程的熟悉是必不可少的。
1.重点掌握
孤儿进程、僵尸进程和守护进程
进程间通信方式signal、file、pipe、shm、sem、msg、socket
线程同步机制线程:互斥量、锁机制、条件变量、信号量、读写锁
fork返回值
五大IO模型:阻塞I/O、非阻塞I/O、I/O复用、信号驱动I/O、异步I/O
IO复用机制
epoll与select/poll
LT水平触发和ET边缘触发
Reactor和Proactor模式
反向代理、
2.推荐书籍
《UNIX环境高级编程》APUE 比较难啃,可以挑着看
《Unix网络编程》UNP 同样比较难啃,可以挑着看
《Linux多线程服务器端编程》Muduo网络库,推荐看看源码实现
《深入理解Nginx》深入了解基于C的web服务器实现
- 推荐课程
视频链接:
【项目准备】
如果以上的东西你都已经准备好了,那么相信你已经了具备C++后台开发能力。但是要记得,一个大型线上项目的开发,从来都不纯粹是单一语言的设计和实现。
所以,可以准备一些基础向的相关项目:
- Web 服务器
实现一个简单的 Web 服务器,可以处理 HTTP 请求和响应。
例如:TinyWebServer(12.3k+ star)
Linux 下 C++ 轻量级 Web 服务器,助力初学者快速实践网络编程,搭建属于自己的服务器
使用 线程池+ 非阻塞socket+ epol(ET和LT均实现)+事件处理(Reactor和模拟Proactor均实现)的并发模型
使用状态机只解析HTTP请求报文,支持解析GET和POST请求
访问服务器数据库实现web端用户注册、登录功能,可以请求服务器图片和视频文件实现同步/异步日志系统,记录服务器运行状态
经Webbench压力测试9可以实现上万的并发连接数据交换
项目链接:
- 聊天服务器
实现一个多人在线聊天服务器,支持用户之间发送消息和私聊。
例如:smallchat(7.2k stars)
一个聊天服务器的最小编程示例
项目链接:
- 游戏服务器
实现一个简单的游戏服务器,例如一个多人在线游戏。
例如:
ketoo/NoahGameFrame(3.9k stars)
一个快速、可扩展的分布式游戏服务器引擎/框架,适用于C++,包括Actor库、网络库,可作为实时多人游戏引擎(MMO RPG/MOBA),支持C#/Lua脚本/ Unity3d、Cocos2dx并计划支持Unreal。
项目链接:
egametang/ET(8.7k stars)
Unity3d 客户端c#服务器框架,支持分布式客户端服务器共享代码
项目链接:
- 数据分析工具
实现一个数据分析工具,可以读取数据文件、进行数据处理和分析。
例如:google/pprof(7.8k stars)
PPROF是一种用于可视化和分析分析数据的工具
项目链接:
【面试准备技巧】
📍大厂最新面经
1.腾讯天美后台开发面经(已oc)
26届,非科班,日常实习,只有腾讯给面了,项目就webserver和xv6,被二面面试官搞得挺难过的,但是最后还是给过了。
一面:
时间:05.27
算法题:
实现memmove
字符翻转 hello world, god bless you -> world hello, you bless god
语言:
new 和 malloc具体做了啥 然后又深入问这过程C++做了啥C++的内存管理
回答系统调用sbrk然后说了一点操作系统的东西,他说不是他问的 应该是问的C++的内存模型吧(不懂
多态
构造函数可以是虚函数吗,析构函数呢
C++11、14、17有哪些特性 auto、智能指针
auto怎么实现的
八股:
linux怎么查看空闲内存
mysql熟悉吗 直接说了不熟悉,只用过一点
进程间通信方式 只说了pipe
TCP四次挥手
Timewait有什么用 只回答了一点
epoll和select相比有哪些优势
ET和LT的区别
另一端断开连接了,本端如何知道它断开了 没答对
快排是否稳定,有哪些是稳定的 忘了
最后又问了“两个链表相交怎么检查”,给他画了一下图
反问:
后续流程
项目规模
一面面试体验还是很好的,一面面试官一直说没关系不知道也很正常,答对了应该70%的内容。
二面
时间:05.30
算法题:
快速排序 提前押题,秒了,后续说我基础不扎实的时候,夸了一下能写代码
语言:
多态
构造函数可以是虚函数吗,析构函数呢
八股:
后台发了FIN之后,客户端还可以发包过来吗,服务端还可以发包过来吗 没答上来
数据库熟悉吗 不熟悉
开始压力:
基础不扎实,虽然能够写代码,平时是怎么学习和提高自己的认知水平的
能否接收996
能不能实习一年
高考成绩 被说考的不高
家里经济条件
是否独生
有无女朋友
最后布置了一个数学建模的题目,第二天交
没学过数学建模,就想着做一下不被腾讯拉黑就行,熬了一夜,交上去了
hr面
时间:06.03
没想到二面没挂,不知道该高兴还是难过。
自我介绍。
就问了一些项目上遇到困难怎么解决,平时爱好之类的。
oc
时间:06.07
等入职了,希望能安全度过这段实习。
2.【科大讯飞】后台开发秋招一面
🍎2024.7.30 一面
🍐实习相关:
对其中某个功能详细描述
难点如何解决
讲讲自己的提升
开发与非开发时间占比
🍐其他
线程池相关八股
了解哪些数据库&归纳讲讲MySQL的优势
Redis的优势和使用场景
学过哪些技术栈&学习方法
聊自己除了项目和实习外的实践
聊阅读的技术书籍
聊最近阅读的某引擎源码,以及收获
秋招毫无准备的第一场面试,总的来说比较开放平和。大概率就是在实习公司转正了,不过还是会投递几家武汉企业发发面经聊完后告诉我岗位在合肥(投递时我选择的武汉不接受调剂),问我是否有可能到合肥就职,婉拒,不知是否还会有后续。
3.【腾讯WXG】后台开发秋招二面
🍎2024.8.16 二面
🍐算法:
大数相乘
数组通过加减找到和为S的组合总数
🍐实习+项目拷打
这里面试官对回答过的问题反复问,体验一般
🍐其他(部分)
正则表达式的实现原理是什么(经历相关)
回归算法的实现原理(经历相关)
相似度算法的实现原理(经历相关)
时间序列算法
分布式事务考察,代码中如何使用
rabblitmq本身会丢失数据吗
rabbitmq的持久化原理
如果硬盘坏了,rabbltmq会怎么办
mq一主多从是否是强同步?同步超时怎么解决?
raft协议
mysql执行语句的过程
口述实现一个负载均衡组件,阐明实现要点
健康检查可以包括哪些
如何通过不上报主动发现异常
设计模式,责任链模式
只记得这些,全程快两小时,有压力面的感觉。
4.腾讯金融科技后台开发一面
自我介绍,然后简单了解一下情况(如学了哪些课程,考研情况等)
专业知识考察:
1.问了排序算法有哪些,复杂度和稳定性分析。
2.问了三次握手和四次挥手过程,可以不是三次吗,挥手的时候不等待直接释放行不行。
3.对称加密和非对称加密算法
4.堆和栈的区别
5.Mysql有哪些关键字(增删查改分组排序),数据库安全级别和四大特性
6.linux常用命令,还给了个题目问用linux命令怎么实现
7.算法题(动态规划):给一个整数数组,数组中任意数量的数字可以求和,求能被3整除的最大和是多少
8.逻辑思维题:感觉像脑筋急转弯
总结:面试官很和善,还会引导你一步步思考,奈何我太菜了,感觉后续无望......
5.【微众】后台开发OC流程
2024.4.11 一面
手撕反转m到n链表
线程池参数 拒绝策略 阻塞队列
事务传播行为
设计模式单例和多例使用场景
限流熔断
对限流组件如何选型
索引失效场景
sdk
项目组中开心/不开心的点
项目优化点
实习时间
职业规划
工作地点
反问
2024.4.11 二面
手撕接雨水
项目冲突如何解决
java内存模型
2024.4.11 HR面
转正率70-80 氛围福利好
深圳免费住房 转正回武汉
怎么了解的微众
📍常用面试题整理
1.什么是类?
答:把一些具有共性的对象归类后形成一个集合,也就是所谓的类
2.函数重载是什么意思?它与虚函数的概念有什么区别?
函数重载是一个同名函数完成不同的功能,编译系统在编译阶段通过函数参数个数、参数类
型不同,函数的返回值来区分该调用哪一个函数,即实现的是静态的多态性。
但是记住:不能仅仅通过函数返回值不同来实现函数重载。
虚函数实现的是在基类中通过使用关键字 virtual 来中明一个函数为虚函数,含义就是该函数的功能可能在将来的派生类中定义或者在基类的基础之上进行扩展,系统只能在运行阶段才能动态决定该调用哪一个函数,所以实现的是动态的多态性。它体现的是一个纵向的概念,也即在基类和派生类间实现。
3.解释堆和栈的区别。
答:栈区(stack)-由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
堆(heap)一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
4.虚拟函数与普通成员函数的区别?内联函数和构造函数能否为虚拟函数?
答案:区别:虚拟函数有 virtual 关键字,有虚拟指针和虚函数表,虚拟指针就是虚拟函数的接口,而普通成员函数没有。内联函数和构造函数不能为虚拟函数。