任何说自己很懂C++的人可能都是在夸大其词。
我想你可能已经注意到了,是的,今天的大多数程序员都在使用Python、Rust、Go或是其他新的编程语言。大部分人已经不再需要掌握C、C++等古老的编程语言了,甚至很多程序员已经从手动编码开始向AI编码转型。
但即便如此,还是有很多人认为自己足够了解并熟练掌握C++这门古老的编程语言,但他们之中绝大部分人其实都在夸大其词。这个说法来自 Louis Brandy此前发布的一篇博客——《永远不要相信自称懂C++的程序员》。
1、C++的“双峰”特性
在博客中,Brandy提到,自己在长期面试C++程序员的过程中开始意识到C++非常重要的一个特性,C++是一种“双峰”语言。也就是说刚刚接触C++的开发者会觉得它很简单,但随着了解深入,他们的自信会被这种语言庞大的复杂性慢慢摧毁,直到他们犯下了足够的错误,就像下面这张图所展示的一样。
程序员,尤其是那些曾经学习过C语言的程序员,通常能够非常快速地掌握C++并感觉对这门语言非常熟练。这些程序员会高速你他们精通C++,然而其实这并不是真实的。
随着他们继续学习C++,他们会经历这个沮丧的低谷,在这里他们会完全了解到这门语言的全部复杂性。但好消息是,程序员很容易意识到自己处于谷前和谷后的区别。只要你和他们提起C++的复杂性,处于谷后位置的人会为你描述上百种他们写C++的挫败经历。而处于谷前的人则会说,C++不过是有类的C而已。
2、没人能真正精通C++
当然,很多程序员把这种说法当做一个玩笑,但也有很多人在争论这种理论的正确性。在Reddit上,程序员们分享了对该说法的观点,一位技术管理者提到,面试时他会让程序员以1—10分为标准描述自己的C++水平,如果答案高于6,那就需要详细谈谈关于这门语言的细节了。
此外,这位面试官还提到,建议程序员在面试时,尽量不要直接说自己对哪门语言的掌握程度很好,而是要与面试官交流你具体擅长处理哪类业务或哪类问题,否则当你遇到一位技术狂热者时,你将很容易在面试过程中暴露自己的无知。
在当前以AI为主导的世界中,C++这门古老的语言好像更多变成了帮助人们建立知识体系和卖书的工具,而不是实际被用于生产的语言。一些Reddit用户分享了他们将精通C++写在简历上,但当被问到智能指针和右值引用等问题时却回答不出来的窘迫经历。
事实上,很多开发者在使用C++进行工作时,其实并不了解它的细节,使用C++几十年的人大多也不敢说非常熟悉这种语言。甚至连C++之父Bjarne Stroustrup也曾表示自己并非100%精通C++,他提到:“C++存在一些错综复杂的陷阱,大多数人甚至没法写出一个简单的没有漏洞或错误的类。”
3、世界仍然需要C++
当前编程世界中的真相是,你可以选择任何适合你得编程语言。如果有人反驳这个观点,那便会被贴上“语言霸凌”的标签,编程语言只是一个程序员需要学习和使用的工具。如果Python能够帮助你很好的完成工作,为什么还要使用C++呢?
目前很多开发者已经认为C++是一种濒临死亡的语言,但事实上并不是这样。如果开发人员需要从头开始构建一些东西,例如操作系统、游戏或其他基础软件,C++目前仍被认为是实现这些目标的首选语言,当然在面对很多现代应用开发时使用复杂性过高的C++会变得很痛苦。
C++为了不限制程序员的想法,包含了太多的范式,包括面向对象(灵活应用virtual继承+shared_ptr)、模块化(type rich programming和meta programming)、函数式编程(lambda,配合文件),以及面向过程编程。然而当前世界上的大多数需求,只需要用到面向对象或函数式编程。
显然,无论是对于C++还是其他语言,几乎没有人能够做到对它们百分百了解,尤其是当语言复杂性和特性随着版本更新而不断变化的情况下。C++只是在这种情况下会变得更甚,并且由于这种经典语言的名气效应,人们会给C++程序员设定更高的标准。
大多数C++程序员都存在着这样一种心态——“如果我能遵守这些规则,避免炫技、避免犯错,我就可以避免把枪口对准自己的脚。”一个很明显的道理是,当你被问及是否了解C++时,最好的答案是:我对C++的了解足够多,所以我认为我并不足够了解这种语言。
4、最后,分享一个完整的c/c++后端知识体系
这个知识体系总结基于零声教育的c/c++Linux服务器开发架构教程,经过数万名学员学习的反馈,不断迭代技术知识图谱,贴合市场实际岗位就业需求,以项目为核心,通过30+的大小项目学习理解c/c++后端开发技术。目前已更新至第13版,需要的朋友,可以点击领取
部分往期视频
高并发场景3种锁方案:自旋锁、互斥锁、原子操作的优缺点
后端开发必学4种层式结构:B+/B-树、时间轮、跳表、LSM-Tree
5种内存泄漏检测方式,让你重新理解C++内存管理
手把手实现线程池(120行),实现异步操作,解决项目性能问题
需要获取更多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部署
-
产品上云公网发布/公网测试上线
项目这一个板块是由零声的讲师所总结的,自己在学习的课程中可以结合上述的详细技术细节点与自己过往工作的项目经验相结合学习提升。