掌握这些C++/Linux后台技术,助你年薪突破50万

发表时间: 2024-03-28 15:50

作为程序员,技术才是我们的根本。很多人表面上看起来很努力,但实际上他们只是通过战术性的勤奋掩盖了战略上的懒惰,在技术层面上却输掉了比赛。

在技术人员的职业生涯中,努力和选择同等重要,但在此之前,技术能力的确是最基本的门槛。在这样的“适者生存,物竞天择”的环境中,付费知识的学习、技术能力的提升和基础的打牢都至关重要。在这个瞬息万变的环境中,让自己稳步成长是至关重要的。否则,当机遇来临时,你可能无法恰到好处地抓住,而努力也只是低水平的重复。既然技术能力如此重要,那么我们应该掌握哪些技能,才能更好地抓住机遇呢?

一、C++/Linux后台开发岗位概述

C++/Linux服务器开发,俗称C++后台开发,在BAT等大型科技公司拥有大量岗位需求。尤其是像鹅厂这样的公司对C++后台开发人才的需求迫切。虽然这些岗位对技术水平有较高要求,但怀揣进入大厂的梦想的朋友们依然值得一试。

许多具备C/C++基础的人,在面试后台开发岗位时经常会问:要达到怎样的技术水平才能进入大厂呢?

在面试方面,可以分为校招和社招两种情况。对于校招而言,技术要求相对较低。懂得C with STL、常见的数据结构与算法,且能够在笔试中当场解决Leetcode中等难度以下的问题即可获得70分。此外,熟练掌握STL、auto、lambda等用法也会有加分。对于实习生来说,只要表现不错就有机会被录用,剩下的网络编程和Linux环境编程等技能可以在进入公司之后再进行培训。

因此,校招更看重的是你的基础和学习能力。实习期间公司会观察你的技术学习进度,以此来决定是否向你发放正式的offer。当然,如果你能提前掌握Linux环境编程、网络编程等技能,必定会为自己增加竞争力,毕竟在任何领域,内卷都是普遍存在的。

后端开发技能要求

  • 扎实的编程基本功,精通 C/C++/Java 等开发语言,熟悉常用算法和数据结构;
  • 熟悉 TCP/UDP 网络协议,具备相关编程经验,了解进程间通讯编程;
  • 具备对 Python、Shell、Perl 等脚本语言的了解;
  • 熟悉 MYSQL 数据库及 SQL 语言编程,了解 NoSQL 数据库,掌握 key-value 存储原理;
  • 全面、扎实的软件知识结构,包括操作系统、软件工程、设计模式、数据结构、数据库系统、网络安全等专业知识;
  • 具备分布式系统设计与开发经验,了解负载均衡技术,系统容灾设计,以及高可用系统等相关知识。

在这里,我向大家推荐零声独家推出的【Linux C/C++开发】技术全栈。通过原理技术讲解、源码分析、案例分析和项目实战,全方位解析Linux C/C++开发。涵盖8个实际项目,共涉及2W+行手写代码,旨在全面解析相关技术。

还不熟悉的朋友,这里可以先领取一份Linux c/c++开发进阶学习资料包,点击领取→C++高级进阶学习资料领取

一、基础理论专栏

1.1数据结构与算法

红黑树

  • 红黑树在进程调度CFS和内存管理中的应用场景
  • 红黑树的数学证明与推导
  • 红黑树的左旋与右旋手写演示
  • 红黑树添加操作的实现及三种情况的证明
  • 红黑树删除操作的实现及四种情况的证明
  • 红黑树的线程安全实现方式
  • 程实践中红黑树的实用特点

磁盘存储的B树与B+树

  • 磁盘结构分析与数据存储原理
  • 多叉树的应用以及B树的定义证明
  • B树插入的两种分裂方式
  • B树删除的借位与节点合并方法
  • B树的插入、删除、遍历、查找手写演示
  • B+树的定义与实现
  • B+树叶子节点的前后指针
  • B+树的应用场景与实用特点
  • B+树的线程安全实现方式

数据去重技术

  • Abhloriter Bitap算法用于海量数据去重
  • Hash原理与Hash函数实现
  • Hash的应用场景
  • 分布式Hash的实现原理
  • 布隆过滤器用于海量数据去重
  • 布隆过滤器的数学推导与证明

1.2、设计模式专栏

创建型设计模式

  • 单例模式
  • 策略模式
  • 观察者模式
  • 工厂方法模式与抽象工厂模式
  • 原型模式

结构型设计模式

  • 适配器模式
  • 代理模式
  • 责任链模式
  • 状态模式
  • 桥接模式
  • 组合模式

1.3、C++ 新特性专栏

STL 容器及智能指针

  • STL 容器
  • 智能指针 (shared_ptr, unique_ptr)
  • unordered_map 的使用
  • 哈希的用法与原理

正则表达式与函数对象

  • 正则表达式基础(basic_regex, sub_match)
  • 函数对象模板 (function, bind)

多线程与并发编程

  • 新特性的线程与协程
  • 原子操作与 atomic 的用法与原理
  • Lambda 表达式的应用
  • thread_local 变量与 condition_variable 的使用

异常处理与错误处理

  • 异常处理 (exception_ptr)
  • 错误处理 (error_category)
  • 协程的使用与原理

1.4、Linux 工程管理及系统监控

构建工具与版本控制

  • Makefile / CMake / configure 原理与应用
  • 构建工具参数传递与操作函数
  • git 的工作流程、基本操作、分支管理与服务器搭建

系统监控工具

  • Linux 运行时参数命令及系统运行时状态
  • 进程间通信设施状态 (ipcs) 与系统运行时长 (uptime)
  • CPU平均负载、磁盘活动及多处理器使用情况的分析工具 (iostat, mpstat)
  • 监控、收集和汇报系统活动 (sar) 、内存使用情况 (pmap) 及多处理器使用情况 (nmon)

系统监控与网络工具

  • glances 、strace 、ftptop 和电源管理 (powertop)
  • MySQL 性能监控 (mytop) 、系统运行参数分析 (htop/top/atop)
  • Linux 网络统计监控工具 (netstat) 、网络数据包分析 (tcpdump)
  • 远程登陆服务的标准协议 (Telnet) 、实时网络统计信息获取 (iptraf) 和网络接口带宽使用情况 (iftop)

二、高性能网络设计专栏

2.1、 网络编程异步网络库zvnet

  • 网络I/O与I/O多路复用:select/poll/epoll
  • Socket与文件描述符的关联
  • 多路复用select/poll的代码实现
  • 实现LT/ET模式的区别
  • 事件驱动reactor的原理与实现
  • reactor针对业务实现的优点
  • poll封装send_cb/recv_cb/accept_cb
  • reactor在多核环境中的实现
  • 跨平台(select/epoll/kqueue)的封装reactor
  • 网络组件:redis、memcached、nginx
  • HTTP服务器的实现
  • reactor中sendbuffer与recvbuffer的封装HTTP协议
  • HTTP协议格式
  • 有限状态机FSM解析HTTP
  • 其他协议:WebSocket、TCP文件传输

2. 2、网络原理

  • 实现服务器百万并发处理(实际操作)
  • 同步处理与异步处理数据的差异
  • 网络I/O线程池的异步处理
  • ulimit对FD的支持达到百万级别
  • sysctl.conf中rmem与wmem的调优
  • 连接追踪(conntrack)的原理分析
  • POSIX API与网络协议栈
  • connect、listen、accept与三次握手
  • listen参数backlog
  • 防范SYN泛洪的解决方案
  • close与四次挥手
  • 11个状态迁移
  • 大量close_wait与time_wait的原因与解决方案
  • TCP keepalive与应用层心跳包
  • 拥塞控制与滑动窗口
  • UDP的可靠传输协议QUIC
  • UDP的优缺点
  • UDP高并发设计方案
  • QQ早期为何选择UDP作为通信协议
  • UDP可靠传输原理
  • QUIC协议的设计原理
  • QUIC的开源方案quiche
  • KCP的设计方案与算法原理

2.3、 自研框架:基于DPDK的用户态协议栈的实现

  • 用户态协议栈的设计与实现
  • 用户态协议栈的适用场景与实现原理
  • netmap开源框架
  • 实现eth协议、IP协议、UDP协议
  • 实现ARP协议、ICMP协议
  • 应用层POSIX API的具体实现
  • socket/bind/listen的实现
  • accept的实现
  • recv/send的实现
  • 滑动窗口/慢启动解释
  • 重传定时器、坚持定时器、time_wait定时器、keepalive定时器
  • 实现epoll
  • 封装epoll数据结构,并实现线程安全
  • 协议栈中FD就绪回调的实现
  • 实现epoll接口
  • 实现LT/ET模式
  • 高性能异步I/O机制IO_uring
  • 与epoll相媲美的IO_uring
  • IO_uring系统调用: io_uring_setup、io_uring_register、io_uring_enter
  • liburing与IO_uring的关系
  • IO_uring与epoll性能对比
  • IO_uring的共享内存机制
  • IO_uring的使用场景
  • IO_uring的accept、connect、recv、send实现机制
  • IO_uring网络读写
  • IO_uring磁盘读写
  • proactor的实现

三、组件设计

3.1、池式组件

  • 手写线程池与性能分析(项目)
  • 线程池的异步处理使用场景
  • 线程池的组成任务队列执行队列
  • 任务回调与条件等待
  • 线程池的动态防缩
  • 扩展: nginx线程池实现对比分析
  • 内存池的实现与场景分析(项目)
  • 内存池的应用场景与性能分析
  • 内存小块分配与管理
  • 内存大块分配与管理
  • 手写内存池,结构体封装与API实现
  • 避免内存泄漏的两种万能方法
  • 定位内存泄漏的3种工具
  • 扩展:nginx内存池实现
  • mysq|连接池的实现(项目)
  • 连接池性能的影响的2个因素,top连接和mysq|认证
  • 连接请求归还策略
  • 连接超时未归还策略
  • 链接断开重连策略
  • 连接数量最优策略

3.2、高性能组件

  • 原子操作CAS与锁实现(项目)
  • 互斥锁的使用场景与原理
  • 自旋锁的性能分析
  • 原子操作的汇编实现
  • 无锁消息队列实现(项目)
  • 有锁无锁队列性能
  • 内存屏障Barrier
  • 数组无锁队列设计实现
  • 链表无锁队列设计实现
  • 网络缓冲区设计
  • RingBuffer设计
  • 定长消息包
  • ChainBuffer 设计
  • 双缓冲区设计
  • 定时器方案红黑树,时间轮,最小堆(项目)
  • 定时器的使用场景
  • 定时器的红黑树存储
  • 时间轮的实现
  • 最小堆的实现
  • 分布式定时器的实现
  • 手写死锁检测组件(项目)
  • 死锁的现象以及原理
  • pthread_ mutex lock/pthread_ mutex _unlock dIsym的实现
  • 有向图的构建
  • 有向图dfs判断环的存在
  • 三个原语操作 lock before, lock_ after, unlock_ after
  • 死锁检测线程的实现
  • 手写内存泄漏检测组件(项目)
  • 内存泄漏现象
  • 第三方内存泄漏与代码内存泄漏
  • malloc与free的dIsym实现
  • 内存检测策略
  • 应用场景测试
  • 手把手实现分布式锁(项目)
  • 多线程资源竞争互斥锁
  • 自旋锁
  • 加锁的异常情况
  • 非公平锁的实现
  • 公平锁的实现

3.3、开源组件

  • 异步日志方案spdlog (项目)
  • 日志库性能瓶颈分析
  • 异步日志库设计与实现
  • 批量写入与双缓存冲机制
  • 崩溃后的日志找回
  • 应用层协议设计ProtoBuf(项目)
  • IM, 云平台,nginx, http, redis协议设计
  • 如何保证消息完整性
  • 手撕protobuf IM通信 协议
  • protobuf序列化与反序列化
  • protobuf编码原理 以上是基础组件设计专栏的内容,涵盖了池式组件、高性能组件和开源组件等相关主题。

四、中间件开发

4.1、Redis

  • Redis相关命令详解及其原理
  • 分布式锁的实现
  • Lua脚本解决ACID原子性
  • Redis事务的ACID性质分析
  • Redis协议与异步方式
  • Redis协议解析
  • 存储原理与数据模型
  • 主从同步与对象模型
  • Redis的3种集群方式以及4种持久化方案
  • 特定数据结构的实现(如string、list、hash、set、zset等)

4.2、MySQL

  • SQL语句,索引,视图,存储过程,触发器
  • MySQL体系结构,SQL执行流程
  • SQL CURD与高级查询
  • MySQL权限管理
  • MySQL索引原理以及SQL优化
  • MySQL事务原理分析
  • 锁的类型,锁算法实现以及锁操作对象
  • MySQL缓存策略

4.3、Kafka

  • Kafka使用场景与设计原理
  • 发布订阅模式和点对点消息传递
  • Kafka Brokers原理
  • Topics和Partitions的存储机制
  • offset查找message
  • kafka的存储机制
  • 微服务之间通信基石gRPC
  • gRPC的内部组件关联
  • 异步gRPC的实现
  • 回调方式的异步调用

4.4、Nginx

  • Nginx反向代理与系统参数配置conf原理
  • Nginx静态文件的配置
  • Nginx动态接口代理配置
  • Nginx对Mqtt协议转发
  • Nginx对Rtmp推拉流
  • Openresty对Redis缓存数据代理
  • Nginx过滤器模块实现
  • Nginx Handler模块实现
  • 如何实现负载均衡
  • Nginx的核心数据结构ngx_cycle_t,ngx_event_module_t
  • Upstream机制的设计与实现

五、开源框架

5.1、游戏服务器开发 - Skynet设计原理

  • 多核并发编程:包括多线程、多进程、CSP模型和Actor模型
  • Actor模型实现:Lua服务和C服务的实现
  • 消息队列实现和Actor消息调度
  • Skynet网络层封装以及Lua/C接口编程
  • Skynet Reactor网络模型封装
  • Socket/SocketChannel封装
  • 高性能C服务开发
  • Lua编程和Lua/C接口编程
  • Skynet重要组件和游戏项目开发
  • 基础接口:Skynet.send, Skynet.call, Skynet.response
  • 广播组件:Multicastd
  • 数据共享组件:SharedData, DataSheet
  • 万人同时在线游戏开发

5.2、分布式API网关

  • 高性能Web网关Openresty
  • Nginx与Lua模块
  • Openresty访问Redis和MySQL
  • Restful API接口开发
  • Openresty性能分析
  • Kong动态负载均衡和服务发现
  • Nginx、Openresty和Kong之间的整合
  • 动态负载均衡的原理
  • 服务发现的实现原理
  • Serverless架构
  • 监控、故障检测与恢复
  • 代理层缓存与响应服务
  • 系统日志

5.3、SPDK助力MySQL数据落盘

  • SPDK文件系统设计与实现
  • NVMe与PCIe的原理
  • NVMe Controller与Bdev之间的RPC
  • Blobstore与Blob的关系
  • 文件系统的POSIX API实现
  • 4层结构设计VFS
  • SPDK的异步改造和POSIX同步API
  • Open/Write/Read/Close的实现
  • 文件系统的性能测试与承接MySQL业务
  • 使用LD_PRELOAD优化MySQL系统调用实现
  • Iodepth讲解和随机读写、顺序读写性能比较

Linux c/c++开发进阶学习资料包,点击领取→C++高级进阶学习资料领取

5.4、高性能计算 - CUDA开发

  • GPU并行计算CUDA的开发流程
  • CPU+GPU的异构计算
  • 计算机体系结构中的GPU
  • CUDA的环境搭建:NVCC和SRUN的使用
  • CUDA的向量加法和矩阵乘法
  • MPI与CUDA
  • 音视频编解码中的并行计算
  • CUDA的H.264和MPEG编解码
  • FFmpeg的CUDA支持

5.5、并行计算与异步网络引擎工作流

  • Workflow的应用场景和编程范式
  • MySQL/Redis/Kafka/DNS的请求处理
  • 并行处理和任务组装
  • Workflow的组件实现和线程池实现
  • DAG图任务和消息队列的实现
  • 纯C的JSON解析器实现

5.6、物联网通信协议MQTT的实现框架 - Mosquitto

  • MQTT的高效使用场景
  • MQTT的发布订阅模式
  • 解决低带宽网络环境的数据传输
  • 3种QoS等级
  • OAuth与JWT的安全认证
  • MQTT的Broker
  • MQTT的遗嘱机制
  • 发布订阅的过滤器
  • Mosquitto的Docker部署
  • MQTT的日志实时监控

六、云原生

6.1、Docker

Docker内核功能

  • 进程namespace
  • UTS namespace
  • IPC namespace
  • 网络namespace
  • 文件系统namespace
  • cgroup的资源控制

Docker容器管理与镜像操作

  • Docker镜像下载与镜像运行
  • Docker存储管理
  • Docker数据卷
  • Docker与容器安全
  • 5种Docker网络驱动
  • pipework跨主机通信
  • 0vS划分vlan与隧道模式
  • GRE实现跨主机Docker间通信

Docker云与容器编排

  • Dockerfile的语法流程
  • 编排神器Fig/Compose
  • FIynn体系架构
  • Docker改变了什么?

6.2、Kubernetes

k8s环境搭建

  • k8s集群安全设置
  • k8s集群网络设置
  • k8s核心服务配置
  • kubectl命令工具
  • yam|文件语法

Pod与Service的用法

  • Pod的管理配置
  • Pod升级与回滚
  • DNS服务之于k8s
  • http 7层策略与TLS安全设置

k8s集群管理的相关内容

  • Node的管理
  • namespace隔离机制
  • k8s集群日志管理
  • k8s集群监控

k8s二次开发与k8s API

  • RESTful接口
  • API聚合机制
  • API组
  • Go访问k8s API

七、性能分析专栏

7.1、测试框架

  • gtest及内存泄漏检测
  • googletest与googlemock文件
  • 函数检测及类测试
  • 测试夹具(test fixture)
  • 类型参数化
  • 事件测试
  • 内存泄漏检测
  • 设置期望、期待参数、调用次数、满足期望等功能
  • 性能工具与性能分析 MySQL性能测试工具:mysqlslap Redis性能测试工具:redis-benchmark HTTP性能测试工具:wrk TCP性能测试工具:TCPBenchmarks 磁盘、内存、网络性能分析 火焰图的生成原理与构建方式 火焰图工具讲解 火焰图使用场景与原理 nginx动态火焰图 MySQL火焰图 Redis火焰图

7.2、观测技术BPF与eBPF

内核观测技术

  • 内核BPF的实现原理
  • 跟踪、嗅探、采样、可观测的理解
  • 动态hook: kprobe/uprobe
  • 静态hook: tracepoint和USDT
  • 性能监控计时器PMC模式
  • CPU的观测与taskset的使用
  • BPF工具:bpftrace,BCC
  • BPF对内核功能的观测
  • 内存观测:kmalloc与vm_area_struct
  • 文件系统观测:VFS的状态
  • 磁盘IO的观测:bitesize, mdflush
  • BPF对网络流量统计
  • BPF对Redis服务器的观测
  • 网络观测:tcp_connect、tcp_accept、tcp_close

7.3、内核源码机制

内核源码机制相关内容

  • 进程调度机制
  • QEMU调试内存
  • 进程调度:CFS与其他四个调度类
  • task_struct结构体
  • RCU机制与内存优化屏障
  • 内核内存管理运行机制
  • 虚拟内存地址布局
  • SMP/NUMA模型
  • 页表与页表缓存原理
  • 伙伴系统实现
  • 块分配(Slab/Slub/Slob)原理与实现
  • brk/kmalloc/vmalloc系统调用流程
  • 文件系统组件
  • 虚拟文件系统(VFS)
  • Proc文件系统
  • super_block与inode结构体
  • 文件描述符与挂载流程

八、分布式架构

8.1、分布式数据库

  • 不同于kv存储的RocksDB的使用场景
  • 前缀搜索
  • 低优先级写入
  • 生存时间的支持
  • Transactions(事务) 快照存储
  • 日志结构的数据库引擎
  • TiDB 存储引擎原理 基于RBAC的权限管理
  • 数据加密
  • 集群方案与Replication原理
  • TiDB集群组件 TiDB Server PD Server TiKV Server
  • Raft协议
  • OLTP与0LAP

8.2、分布式文件系统

  • Ceph 内核级支持的分布式存储
  • 群部署
  • 5个核心组件
  • 集群监控
  • 性能调优与benchmark
  • Ceph存储集群部署
  • 同步机制
  • 线性扩容
  • 高可用实现
  • 负载均衡

8.3、分布式协同

  • Etcd 注册服务中心
  • 配置服务、服务发现、监控、leader选举、分布式锁
  • 体系结构详解
  • 存储原理
  • 读写机制以及事务的acid特性分析
  • Raft共识算法详解
  • 协同事件用户态文件系统fuse 使用场景
  • 文件系统读写事件
  • 实现原理 /dev/fuse的作用

8.4、P2P网络技术

  • 快播核心技术揭秘P2P框架的实现
  • 网关NAT表分析
  • NAT类型
  • 代码逻辑实现NAT类型检测
  • 网络穿透原理
  • 网络穿透的3种情况

九、项目实战

9.1、DKV存储实现(上线项目)

  • KV存储架构设计
  • 存储节点定义
  • TCP服务器/客户端
  • 哈希数据存储
  • 列表数据存储
  • SkipTable数据存储
  • RBTree数据存储 网络同步与事务序列化
  • 序列化与反序列化格式
  • 建立事务与释放事务
  • 线程安全处理 内存管理和性能优化
  • 内存池的使用与LRU(最近最少使用)实现
  • 大块与小块内存分配策略
  • 内存回收机制 数据持久化
  • KV存储的性能测试 网络测试TPS(每秒事务处理量) 吞吐量测试 多语言支持(Go、Lua、Java)

9.2、图床共享云存储(上线项目)

  • Ceph架构分析和配置
  • 快速配置Ceph
  • 上传文件逻辑分析
  • 下载文件逻辑分析
  • 文件传输和接口设计
  • HTTP接口设计 图床数据库设计
  • 文件上传、下载、分享功能实现
  • 业务流程实现
  • 容器化Docker部署
  • Crontab定时清理数据
  • Docker服务器服务
  • gRPC连接池管理

9.3、容器化Docker部署

  • Crontab定时清理数据
  • Docker服务器服 务
  • gRPC连接池管理
  • 产品上云公网发布/测试用例 云服务器的使用分析
  • Fiddler监控HTTP请求
  • 使用Postman模拟请求
  • wrk测试接口吞吐量
  • JMeter压力测试

9.4、微服务即时通讯(上线项目)

  • IM即时通讯项目框架分析和部署
  • 即时通讯应用场景分析
  • 即时通讯自研和使用第三方SDK的优缺点
  • 即时通讯数据库设计
  • 即时通讯项目部署
  • IM消息服务器/文件传输服务器 即时通讯功能实现
  • 用户登录验证密码+混淆码MD5匹对
  • 好友列表与用户信息的全量、增量拉取方式
  • 未读消息机制
  • 单聊和群聊消息推拉机制
  • 路由转发机制

9.5、魔兽世界后端TrinityCore(上线项目)

  • 网络模块实现
  • 地图模块实现
  • A0I核心算法实现
  • 战斗模块实现
  • TrinityCore玩法实现
  • 用户玩法实现-任务系统
  • 数据配置以及数据库设计
  • 多人玩法实现-工会设计

适宜的成为后端工程师人群可分为以下8大群体:

  1. 从事业务开发多年,底层原理理解不够深入的在职工程师
  2. 从事嵌入式开发,有意转向互联网开发的在职工程师
  3. 从事桌面开发(如Qt/MFC),薪资涨幅不高的在职工程师
  4. 从事非开发岗位(如算法、运维、测试),希望转向后台开发的在职工程师
  5. 工作中缺乏技术挑战,接触不到新技术的在职工程师
  6. 自学速度较慢,难以系统构建知识体系的开发人员
  7. 熟悉许多技术名词,但深入探究时却难以理解的工程师
  8. 计算机相关专业,希望进入大型公司的在校生(本科及以上学历,具备C/C++基础)

如果是想在c/c++开发方向得到有效的快速提升(不是所谓的速成),这份学习体系是大家绕不过的具有参考意义的提升路线。从学习路线中可以对c/c++后端开发方向的技术栈有一个清晰的认识。