前言:本人目前研一,导师要求搞算法,但是我还是想搞开发找工作,首先想到的就是学java,但不管是网上还是身边的朋友都说java凉了,都在劝入c++,嵌入式等等,但是c++不是岗位很少吗,而且不同细分领域技术栈还不一样,所以c++值得入吗现在,还是说本来岗位就少,不说很多人,一部分本科生或者研究生涌入就会成为下一个java呢!
一、为什么会有人选择C/C++?
有以下几点原因:
1. C/C++具有高性能。C/C++的编译器可以生成高效的机器码,因此它们在运行速度方面非常快。这使得它们成为开发计算密集型应用程序的理想选择。
2. C/C++可以直接访问硬件。C/C++允许直接使用指针和内存地址,这意味着可以使用底层语言来操作硬件,例如网络卡、图形处理器等。
3. C/C++具有广泛的应用领域。C/C++是开发系统级软件、游戏、嵌入式系统和科学计算等应用程序的首选语言。
4. C/C++具有强大的库支持。C/C++拥有丰富的标准库和第三方库,可以帮助开发人员更快速地完成开发工作。
5. C/C++是一种基础语言。C/C++的语法和概念对其他编程语言也有很大影响,因此掌握C/C++也会有助于学习其他编程语言。
业界很多声音 : C++ 过于复杂?
“过于复杂”指的是加入了冗余的部分,使得本该简单事情变复杂了。
然而啊。。。C++的复杂并不是如你所想。
C++的核心设计哲学是Zero Overhead。啥意思?说人话就是:你没有用到的特性,不应该给你带来任何负担。这个哲学的好处在哪里?当你没有学到/用到一个知识点的时候,你不需要为它付出代价。
当你不明白左9值右值的时候,单纯地传值就可以玩的很Happy,而当你想要榨取性能,避免拷贝复制的时候,你才需要和复杂的左右值,std::move, 标准swap&和对象内建swap等听起来就有点晕的概念搏斗一下。
当你不需要自己设计内存分配机制,就完全不需要理会allocator9这个听起来就不是很简单的东西,放心地使用STL内置的default部分。但是你在嵌入式环境下或者实时操作系统里想要确保内存分配的速度和效率,就可以看看怎么重载- -下operator new之类的方法。
当你不需要使用模板工作时,大可以把C++当成一个列类的C玩得飞起。不需要为各种偏特化,类型萃取,integral, std::tuple等 高阶咒语头疼不已。但是,你需要构建一套 需要非常灵活拓展的framework,又不想受限于复杂的继承体制时,variadic template和concept就是你最好的朋友。
在你不熟悉FP的时候,完全可以不去考虑lambda表达式,不去考虑std::function,不去写那些高阶函数。但是当你觉得想把Lisp和Haskel中有些概念比如闭包、monad等搬到C++时,你会觉得其实这些东西蛮顺手的。
这多么人性化! C++为不同的能力阶段的人提供了不同层次的工具,而且它们几乎完全正交!但是就是有些人要跳出来“太复杂啦!我们需要简单的语言!”
爱因斯坦说过一句话“科学要简单,但不是过于简单。”简单的是概念和概念的层次,却不是概念的数量和概念本身的复杂程度。狭义相对论可以把麦克斯维方程组用一个简单的张量公式表示,却不能避免张量概念本身的复杂性。
经典力学是不是太复杂啦,我们需要简单的!有啊,牛顿力学9。只要你不涉及到速度、质量足够大的场景,就不需要相对论;
流体力学9是不是太复杂啦?我们需要简单的!有啊,简单流体力学。只要你不涉及湍流,就不要考虑数值求解内维尔-斯托克斯方程。
量子力学是不是太复杂啦?我们需要简单的!有啊,普通量子力学。只要你不涉及复杂多体交换关联势,你就不需要学习高量和重化群。
C++是不是太复杂啦?得啦,当你面对的问题还都不涉及到你暂时用不到的内容时,C++够简单啦。。。
你可能会问:C++难在哪?
C++之难不在于其语法的复杂性,也不在于二进制层面上语义的杂乱无章,更不在于玄妙得不食人间烟火的模板推导(模板元编程),这些都只是表象。本质上讲,C++跟任何语言比,它很独特很怪异(废话,任何一种语言那个不特异)。
很多时候,C++给人的感觉就是,好像任何一种语言的特性(这话有点夸张),都可以在C++王国中,通过令人发指的奇技淫巧,罄竹难书的花样作死,最后终于可以在一定程度上模拟出来,但是模拟后的结果,又总是存在这样那样的不足,要么因为内存管理,要么因为反射的原因,总之,就是好像可以做一切事情,但最后终于做得不好。
这个时候,猿猴要么就直接扑上原生带有这种特性的语言,要么干脆就完全舍弃,放弃治疗,啥技巧也不用,返璞归真,就老老实实一行代码一行代码、不厌其烦、不畏枯燥地一再写地重复类似的功能。而C++自身的优秀特性(析构函数、内存管理、模板、多继承等等),没有任何一种语言整的出来,当然,也可以说,这些玩意都是为了解决C++自身制造出来麻烦,other语言s完全不care这些杂碎。难道,这些好东西就没有一丁点价值了。
愿意是自我意识,想学每个人都可以,但是要花时间去学习。
二、什么样背景的更适合去学习或是去转行去做C/C++呢?
适宜的工程师人群(共分为8大群体)
- 1.从事业务开发多年,对底层原理理解不够深入的在职工程师
- 2.从事嵌入式方向开发,想转入互联网开发的在职工程师
- 3. 从事Qt/MFC等桌面开发的,薪资多年涨幅不大的在职工程师
- 4.从事非开发岗位(算法岗,运维岗,测试岗),想转后台开发岗位的在职工程师
- 5.工作中技术没有挑战,工作中接触不到新技术的在职工程师
- 6.自己研究学习速度较慢,不能系统构建知识体系的开发人员
- 7.了解很多技术名词,但是深入细问又不理解的工程师
- 8.计算机相关专业想进入大厂的在校生(本科及以上学历,有c/c++基础)
配套书籍资料
- 1. MySQL: 《高性能MySQL 第3版》
- 2. Nginx: 《深入理解Nginx: 模块开发与架构分析(第2版)》(陶辉)
- 3. Redis: Redis设计与实现 (黄健宏)
- 4. Linux内核: 《深入理解Linux内核架构》 (郭旭 译)
- 5. 数据结构与算法:《算法导论》(第3版)
- 6.性能分析:《性能之巅洞悉系统、企业与云计算》
- 7. MongoDB: 《MongoDB权威指南》
- 8. Ceph: 《Ceph分布式存储学习指南》 (Ceph中国社区)
- 9. Docker: 《Docker容器 与容器云(第2版)》
- 10. TCP/IP: 《Tcp/Ip详解卷一卷二卷三》
- 11. Linux系统编程: 《Unix环境高级编程》
- 12. 计算机: 《深入理解计算机系统》
- 13. DPDK: 《深入浅出DPDK》
- 14. k8s: 《Kubernates权威指南》 龚正等编著
- 15. bpf: 《BPF之巅洞悉Linux系统和应用性能》
问过身边的一些朋友,目前C/C++面试还不像Java、Python、应用开发那样,有一堆的面试八股文需要你去记,核心就是考查一些语言基础,中间件以及技术在项目中的实际用法,还是会以经验为主。所以如果目前你是有一些不错的项目经验,面试这个岗位来说还是相对容易的。
回归题目,作为一个二年左右的C/C++开发工程师,需要具备什么样的技术能力,以及往上再去提高自己的技术能力和薪资的话,应该往哪方面去努力?
三、C/C++后端开发工程师技术能力图
1.精进基石
①数据结构与算法
- 红黑树(应用场景、进程调度cfs、内存管理、左旋与右旋等)
- B树和B+树(定义证明、插入、删除、遍历、查找、指针等)
- Hash与BloomFilter,bitmap(函数实现、应用场景、布隆过滤器等)
②设计模式
- 创建型设计模式(单例、策略、观察者、原型等设计模式)
- 结构型设计模式(适配器、代理、责任链、状态桥接、组合模式)
③c++新特性
- stl容器,智能指针,正则表达式
- 新特性的线程、进程、原子操作、lamda表达式
④Linux工程管理
- Makefile/cmake/configure(工作ipcs原理、文件编译、cmake的写法等)
- 分布式版本控制git(工作流程、分支管理、服务器搭建等)
- Linux系统运行时参数命令(ipcs、uptime、iostat、sar、mpstat等)
2.高性能网络设计
①异步网络库zvnet
- 网络io与io多路复用epoll,kqueue(项目)
- 事件驱动reactor的原理与实现(项目)
- http服务器的实现(项目)
②网络原理
- 服务器百万并发实现(实操)
- redis,memcached,nginx网络组件(理论)
- posix API与网络协议栈(理论)
- UDP的可靠传输协议QUIC(项目)
③协程框架NtyCo的实现
- 协程设计原理与汇编实现(项目)
- 协程调度器实现与性能测试(项目)
④基于dpdk的用户态协议栈的实现
- 用户态协议栈设计实现(项目)
- 应用层posix api的具体实现(项目)
- 手把手设计实现epoll(项目)
⑤高性能异步io机制 io_uring
- 与epoll媲美的io_uring(项目)
- io_uring的使用场景(理论)
3.基础组件设计
①池式组件
- 手写线程池与性能分析(项目)
- 内存池的实现与场景分析(项目)
- MySQL连接池的实现(项目)
②高性能组件
- 原子操作CAS与锁实现(项目)
- 无锁消息队列实现RingBuffer(项目)
- 定时器方案红黑树,时间轮,最小堆(项目)
- 手写死锁检测组件(项目)
- 手写内存泄漏检测组件(项目)
- 手把手实现分布式锁(项目)
③开源组件
- 异步日志方案log4cpp(项目)
- 应用层协议设计ProtoBuf/Thrift(项目)
4.中间件开发
①redis
- redis相关命令详解及其原理
- redis协议与异步方式
- 存储原理与数据模型
- 主从同步与对象模型
②MySQL
- SQL语句,索引,视图,存储过程,触发器
- MySQL索引原理以及SQL优化
- MySQL事务原理分析
- MySQL缓存策略
③Kafka
- Kafka使用场景与设计原理
- Kafka存储机制
④微服务之间通信基石gRPC
- gRPC的内部组件关联
- 基础http2的gRPC通信协议
⑤nginx
- nginx反向代理与系统参数配置conf原理(实操)
- nginx过滤器模块实现(项目)
- nginx handler模块实现(项目)
5.开源框架
①游戏服务器开发skynet
- sky net设计原理
- sky net网络层封装以及lua/c接口编程
- sky net重要组件以及手撕游戏项目
②分布式API网关
- 高性能web网关 Openresty
- Kong动态负载均衡与服务发现
③高性能存储spdk的文件系统实现(项目)
- spdk的工作原理与文件系统架构分析
- 文件系统的posix api实现
- 文件系统的性能测试
④高性能计算CUDA
- gpu并行计算cuda的开发流程
- 音视频编解码中的并行计算
⑤并行计算与异步网络引擎workflow
- workflow的应用场景
- workflow的组件实现
⑥物联网通信协议mqtt的实现框架mosquitto
- mqtt的高效使用场景
- mqtt的broker
6.云原生
①docker
- docker风光下的内核功能
- docker容器管理与镜像操作
- docker网络管理(项目)
- docker云与容器编排(项目)
②kubernetes
- k8s环境搭建
- pod与service的用法
- k8s集群管理(项目)
- k8s二次开发与k8s API(项目)
7.性能分析
①性能与测试工具
- 测试框架gtest以及内存泄漏检测
- 性能工具与性能分析
- 火焰图的生成原理与构建方式
②观测技术bpf与ebpf
- 内核bpf的实现原理
- bpf对内核功能的观测
③内核源码机制
- 进程调度机制
- 内核内存管理运行机制
- 文件系统组件
8.分布式架构
①分布式数据库
- kv存储rocksDB的使用场景
- TIDB存储引擎的原理
- TIDB集群方案与replication原理
②分布式文件系统
- 内核级支持的分布式存储Ceph
- 分布式ceph存储集群部署
③分布式协同
- 注册服务中心Etcd
- 协同时间 用户态文件系统 fuse(项目)
- 快播核心技术揭秘 P2P框架的实现
四、项目实操
1.dkvstore实现
- KV存储的架构设计
- 网络同步与事务序列化
- KV存储的性能测试
2.图床共享云存储
- fastdfs架构分析和配置
- 文件传输和接口设计
- 产品上云公网发布/测试用例
3.微服务即时通讯
- IM即时通讯项目框架分析和部署
- IM消息服务器/文件传输服务器
- 消息服务器/路由服务器
- 数据库代理服务器设计
- 文件服务器和docker部署
- 产品上云公网发布/公网测试上线
项目这一个板块是由零声的讲师所总结的,自己在学习的课程中可以结合上述的详细技术细节点与自己过往工作的项目经验相结合学习提升。