C/C++ 发展方向甚广,包括不限于以下方向, 以下列举一些大厂校招岗位要求。
做C/C++开发的话,找工作必须要有项目开发经验,不然很难找到好的工作。
后台/服务器
【后台开发】
- 编程基本功扎实,掌握 C/C++/JAVA 等开发语言、常用算法和数据结构;
- 熟悉 TCP/UDP 网络协议及相关编程、进程间通讯编程;
- 了解 Python、Shell、Perl 等脚本语言;
- 了解 MYSQL 及 SQL 语言、编程,了解 NoSQL, key-value 存储原理;
- 全面、扎实的软件知识结构,掌握操作系统、软件工程、设计模式、数据结构、数据库系统、网络安全等专业知识;
- 了解分布式系统设计与开发、负载均衡技术,系统容灾设计,高可用系统等知识。
桌面客户端
【PC 客户端开发】
- 计算机软件相关专业本科或以上学历,热爱编程,基础扎实,理解算法和数据结构相关知识;
- 熟悉 windows 操作系统的内存管理、文件系统、进程线程调度;
- 熟悉 MFC/windows 界面实现机制,熟练使用 VC,精通 C/C++,熟练使用 STL,以及 Windows 下网络编程经验;
- 熟练掌握 Windows 客户端开发、调试,有 Windows 应用软件开发经验优先;
- 对于创新及解决具有挑战性的问题充满激情,具有良好的算法基础及系统分析能力。
图形学/游戏/VR/AR
【游戏客户端开发】
- 计算机科学/工程相关专业本科或以上学历,热爱编程,基础扎实,理解算法、数据结构、软件设计相关知识;
- 至少掌握一种游戏开发常用的编程语言,具 C++/C# 编程经验优先;
- 具游戏引擎(如 Unity、Unreal)使用经验者优先;
- 了解某方面的游戏客户端技术(如图形、音频、动画、物理、人工智能、网络同步)者优先考虑;
- 对于创新及解决具有挑战性的问题充满激情,有较强的学习能力、分析及解决问题能力,具备良好的团队合作意识;
- 具阅读英文技术文档能力;
- 热爱游戏。
测试开发
【测试开发】
- 计算机或相关专业本科及以上学历;
- 一至两年的 C/C++/Python 或其他计算机语言的编程经验;
- 具备撰写测试计划、测试用例、以及实现性能和安全等测试的能力;
- 具备实现自动化系统的能力;
- 具备定位调查产品缺陷能力、以及代码级别调试缺陷的能力;
- 工作主动积极,有责任心,具有良好的团队合作精神。
网络安全/逆向
【安全技术】
- 热爱互联网,对操作系统和网络安全有狂热的追求,专业不限;
- 熟悉漏洞挖掘、网络安全攻防技术,了解常见黑客攻击手法;
- 掌握基本开发能力,熟练使用 C/C++ 语言;
- 对数据库、操作系统、网络原理有较好掌握;
- 具有软件逆向,网络安全攻防或安全系统开发经验者优先。
嵌入式/物联网
【嵌入式应用开发】
- 有良好的编程基础,熟练掌握 C/C++ 语言;
- 掌握操作系统、数据结构等软件开发必备知识;
- 具备较强的沟通理解能力及良好的团队合作意识;
- 有 Linux/Android 系统平台的开发经验者优先。
音视频/流媒体/SDK
【音视频编解码】
- 硕士及以上学历,计算机、信号处理、数学、信息类及相关专业和方向;
- 视频编解码基础扎实,熟常用的 HEVC 或 H264,有较好的数字信号处理基础;
- 掌握 C/C++,代码能力强, 熟悉一种汇编语言尤佳;
- 较强的英文文献阅读能力;
- 学习能力强,具有团队协作精神,有较强的抗压能力。
计算机视觉/机器学习
【计算机视觉研究】
- 计算机、应用数学、模式识别、人工智能、自控、统计学、运筹学、生物信息、物理学/量子计算、神经科学、社会学/心理学等专业,图像处理、模式识别、机器学习相关研究方向,本科及以上,博士优先;
- 熟练掌握计算机视觉和图像处理相关的基本算法及应用;
- 较强的算法实现能力,熟练掌握 C/C++ 编程,熟悉 Shell/Python/Matlab 至少一种编程语言;
- 在计算机视觉、模式识别等学术会议或者期刊上发表论文、相关国际比赛获奖、及有相关专利者优先。
专注于服务器后台开发,包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等 学习地址:https://ke.qq.com/course/417774?
反正别做界面,现在的热门前端要么是HTML/CSS/JS,要么是iOS的Swift,要么是Android的Java/Kotlin。再退一步还有跨平台的Xamarin(C#)或者ReactNative(JS)。用不太上C++的。前端的工作大多比较繁琐,又对性能要求不高,会更倾向于使用更加高级的语言。C++不大合适做前端了。
嵌入式和服务器后端还是用的上C++的。你没说到的还有图形(比如游戏引擎)。
c++语法基础
首先是入门阶段,除了基本的循环、变量、判断以外,至少需要掌握这些:
- 指针、引用、数组、内存
- 引用与指针区别
- 虚机制:虚函数、虚函数表、纯虚函数
- C 和 C++ 的一些区别,比如 new、delete 和 malloc、free 的区别
- 一些关键字的作用:static、const、volatile、extern
- 四种类型转换:static_cast, dynamic_cast, const_cast, reinterpret_cast
- STL部分容器的实现原理,如 vector、deque、map、hashmap
- 类的封装,构造和析构、静态成员、对象管理;
- 类的构造(有参构造函数、无参构造、拷贝构造、默认构造函数)和析构;
- 对象动态管理、友元函数、友元类、操作符重载;
- C++编译器对象管理模型分析;
- 运算符重载(一元运算符、二元运算符、运算符重载难点、项目开发中的运算符重载);
- 模板特化、偏特化,萃取 traits 技巧
- 继承、虚继承、菱形继承等
- 多态: 动态绑定,静态多态
- 重写、重载
- 智能指针原理:引用计数、RAII(资源获取即初始化)思想
- 智能指针使用:shared_ptr、weak_ptr、unique_ptr等
- 编译链接机制、内存布局(memory layout)、对象模型
- C++11 部分新特性,比如右值引用、完美转发等
一、精进基石
1.数据结构与算法
- 随处可见的红黑树
- 磁盘存储链式的B树与B+树
- 海量数据去重的Hash与BloomFilter,bitmap
2.设计模式
- 创建型设计模式
- 结构型设计模式
3.c++新特性
- stl容器,智能指针,正则表达式
- 新特性的线程,协程,原子操作,lamda表达式
4.Linux工程管理
- Makefile/cmake/configure
- 分布式版本控制git
- Linux系统运行时参数命令
二、高性能网络设计
1.网络编程
- 网络IO与select,poll,epoll
- reactor的原理与实现
- http/https服务器的实现
- websocket协议与服务器实现
2.网络原理
- 服务器百万并发实现
- redis,memcached,nginx网络组件
- Posix API与网络协议栈
- UDP的可靠传输协议QUIC
3.协程框架NtyCo的实现
- 协程设计原理与汇编实现
- 协程调度器实现与性能测试
4.用户态协议栈NtyTcp的实现
- 用户态协议栈设计实现
- tcp/ip定时器与滑动窗口
- 手把手设计实现epoll
5.高性能异步io机制io_uring
- 与epoll媲美的io_uring
- io_uring的使用场景
三、基础组件设计
1.池式组件
- 手写线程池与性能分析
- 内存池的实现与场景分析
- 异步请求池的实现
- mysql连接池的实现
2.高性能组件
- 原子操作CAS与锁实现
- 无锁消息队列实现RingBuffer
- 定时器方案红黑树,时间轮,最小堆
- 手写死锁检测组件
- 手写内存泄漏检测组件
- 手把手实现分布式锁
3.开源组件
- Libevent/Libev框架实战的那些坑
- 异步日志方案log4cpp
- 应用层协议设计ProtoBuf/Thrift
四、中间件开发
1.redis
- redis相关命令详解及其原理
- redis协议与异步方式
- 存储原理与数据模型
- 主从同步与对象模型
2.MySQL
- SQL语句,索引,视图,存储过程,触发器
- MySQL索引原理以及SQL优化
- MySQL事务原理分析
- MySQL缓存策略
3.Kafka
- Kafka使用场景与设计原理
- Kafka存储机制
4.gRPC
- gRPC的内部组件关联
- 基于http2的gRPC通信协议
5.nginx
- nginx反向代理与系统参数配置conf原理
- nginx过滤器模块实现
- nginx Handler模块实现
五、开源框架
1.skynet
- skynet设计原理
- sky net网络层封装以及lua/c接口编程
- sky net重要组件以及手撕游戏项目
2.分布式API网关
- 高性能web网关Openresty
- Kong动态负载均衡与服务发现
3.DPDK
- DPDK环境与testpmd/I3fwd/skeletion
- DPDK的用户态协议栈
- 千万级流量并发的dns处理
- 高性能数据处理框架vpp
- DPDK的虚拟交换机框架OVS
4.高性能计算CUDA
- gpu并行计算cuda的开发流程
- 音视频编解码中的并行计算
六、云原生
1.Docker
- Docker风光下的内核功能
- Docker容器管理与镜像操作
- Docker网络管理
- Docker云与容器编排
2.Kubernetes
- K8S环境搭建
- Pod与Service的用法
- K8S集群管理
- K8S二次开发与K8S API
七、性能分析
1.性能与测试工具
- 测试框架gtest以及内存泄漏检测
- 性能工具与性能分析
- 火焰图的生成原理与构建方式
2.观测技术bpf与ebpf
- 内核bpf的实现原理
- bpf对内核功能的观测
3.内核源码机制
- 进程调度机制
- 内核内存管理运行机制
- 网卡nic与网络协议栈的关系
- 文件系统组件
八、分布式架构
1.RocksDB
- 不一样的kv存储RocksDB的使用场景
- RocksDB的特殊操作
2.云原生分布式数据库TiDB
- TiDB存储引擎的原理
- TiDB集群方案与Replication的原理
3.分布式服务
- 内核级支持的分布式存储Ceph
- 注册服务中心Etcd
九、项目实战
1.图床共享云存储
- fastdfs架构分析和配置
- fastdfs存储原理
- 分布式fastdfs存储集群部署
- 高负载nginx/fastcgi
- 文件传输和接口设计
- 产品上云公网发布/测试用例
2.微服务即时通讯
- IM即时通讯项目框架分析和部署
- IM消息服务器/文件传输服务器
- 消息服务器/路由服务器
- 数据库代理服务器设计
- 文件服务器和docker部署
- 产品上云公网发布/公网测试上线
最后是推荐的一些学习书籍,大家可以自行购买实体书学习,想要电子版的也可以点击链接加入群聊【后端开发技术交流群】:https://jq.qq.com/?_wv=1027&k=m8lqD8Zb
1. MySQL:《高性能MySQL 第3版》
2.Nginx: 《深入理解Nginx:模块开发与架构分析(第2版)》(陶辉)
3.Redis:Redis设计与实现 (黄健宏)
4.Linux内核:《深入理解Linux内核架构》 (郭旭 译)
5.数据结构与算法:《算法导论》(第3版)
6. 性能分析:《性能之巅 洞悉系统、企业与云计算》 8
7.MongoDB:《MongoDB权威指南》
8.Ceph:《Ceph分布式存储学习指南》(Ceph中国社区)
9.Docker:《Docker容器与容器云(第2版)》。
10.TCP/IP:《Tcp/1p详解卷一卷二卷三》 8
11.Linux系统编程:《Unix环境高级编程》
12.计算机:《深入理解计算机系统》
13. DPDK:《深入浅出DPDK》 8
14.k8s:《Kubernates权威指南》龚正等编著
15.bpf:《BPF之巅 洞悉Linux系统和应用性能》
我相信很多人接触编程都是源于大学期间的那堂C++
语言程序编程,但是这门课却只告诉了你编程语言是什么,却没告诉你要怎么去熟练掌握编程。
所以,不可避免的是许多人在毕业前夕才发现虽然学会了C++
,但是好像却不知道能干什么,能找什么样的工作,能去什么样的公司。所以呢本文就从C++
的角度出发,谈谈我对C++
这门语言的理解。
咱这回不去谈什么复杂的应用场景,也不去聊语言底层的优化特性,就说说在大学里学了C++
出来到底能干啥。当然了,由于C语言跟C++
亲密的关系,咱就混淆一并讲了,道理是差不多的。
1 实验室开发
不敢说C++
是世界上最好的语言,但敢说C++
绝对是工科生中的第一大语言。暂且不说计算机专业,很多工科专业,比如电信、电气、通信等专业,基本上正常的学习中都会使用到C++
。
甚至是我像我这个学生医的,本科硕士几年基本都是在写C++
,最后校招也是靠C++
拿到的大厂offer。可以说,我对C++
还是有很深的感情的。
都说C++
兼具面向过程以及面向对象的特性,既拥有比较优秀的运行速度,又有良好的大型项目开发能力,那简直可以制霸高校实验室了。当然我们知道,另外一门同样在高校实验室里与C++
不相上下的语言,就是Matlab
了。
像我研究生期间就是左手Matlab
试探,右手C++
优化。论文专利什么的就靠这两种语言双管齐下。还记得在实验室里,基本所有的算法都是用C/C++
写的,包括各种图像处理、信号处理以及数据分析的算法。
最开始就学C++
的基本都是老理工男了。就算指针再怎么难理解,虚函数表再怎么无情,也磨不灭我们这些工科生对编程的热情。
2 后端开发
不过等到真正要找工作的时候,就不是那么回事了。
而主流的后端开发语言就那么几种,以Java
、C++
领衔,Python
和Go
紧跟其后。作为写了这么多年的老C++ coder
了,哪能不去凑个热闹。
所以呀,学了C++
之后,第一选择当然就是去面试后台开发的岗位啦。只不过我们都常说一句话,语言都不是最重要的。那对于学了C++
想找后端开发的同学而言,什么最重要呢?
其实软件开发工程需要掌握的技能不外乎那么几点,各种经验分享和面经都已经说烂了。但是那些只是大的方向,具体涉及到的概念和技术点非常多,在这里也没办法全部罗列。总的来说,想通过C++
找一份合适的后端开发工作,我建议可以从以下几个方面来提升自己:
一是扎实的编程基础。
这个基础扎实首先意味着你比较熟悉C++
这门语言了,知道不同版本的语言特性(比如C++11
以及新出的C++20
的区别),对常见的语言机制(比如多态、虚函数表、模板等)的底层有自己理解。
虽然说不看重你用什么语言,但是最起码你得比较熟练的使用一门语言吧。怎么才算熟练呢,大概C++
底层机制、多线程编程、跨平台编程这些你都需要有所了解吧。
除此之外,编程能力的素养还体现在算法思想和数据结构的理解上。毕竟程序的基础就是算法和数据结构嘛。所以一些基本的数据结构,比如链表、数组、二叉树、队列之类的,还有一些基本的算法思想,比如贪心、分治、动态规划等都最好需要好好掌握一下。
二是系统的理论知识。
这个就是科班与非科班比较明显的差距所在了。很多非科班的同学其实编程能力很强,但是由于没有接受过系统的理论学习,所以在理论学习上会比较吃亏。而后端开发涉及的东西比较多,从网络到性能再到架构,都需要系统的计算机理论来支撑的。
所以如果连计算机网络、操作系统、计算机组成原理、编译原理这些书都没见过的同学,需要赶紧买几本回来压压惊了。
三是后端基础。
想去做后端开发,起码得知道后端是什么吧。这就意味着你得知道一些基本的软件工程、软件架构、设计模式等知识。同时,搞个后端哪能不懂数据库呢,那你不得再学些诸如MySQL
、Redis
等数据库的基本操作吗?
当然到这,可能也就算是个入门水平。真正上手后端开发的时候,像微服务、中间件(Kafka
/Zookeeper
/Hadoop
等)等相关概念与技术的学习不也得提上日程了嘛。
当然对于校招生来说,由于的确是缺少大型的上线项目经验,所以对后端基础的要求不会太高,更多的是看编程能力和计算机理论基础。不过倘若是已经工作想转行的同学来说,后端基础还是会比较看重的。
这三点是在我看来目前互联网公司比较看重的地方,大家可以对照着反思自己是否具备这样的能力了。如果还没有,可以抓紧时间好好准备准备。
【腾讯文档】LinuxC++后台开发文档视频+代码资料学习路线免费领取
LinuxC++后台开发文档视频+代码资料学习路线免费领取docs.qq.com/doc/DYU5FYm50dnltV0RG
3 客户端开发
毕竟C++
已经是一个很成熟的语言了,所以除了后端开发其实它还有很多其它的开发岗位可以选择。自然而然的,就是客户端开发了。
相信大多数学C++
的同学都用过C++
写桌面软件吧。那时候估计还是用MFC,照着代码书上敲一遍就能写一个比较简单的界面了。所以如果不想做后端,完全可以靠C++
找一份客户端开发的工作。
只不过,客户端也并不容易呀。做客户端同样也需要扎实的编程基础和计算机理论基础,同时可能还要熟悉Windows
/C++
编译链接机制、QT
客户端开发技术体系、Windows
消息机制等技术。
所以,假如你学的是C++
,同时也不在乎业内莫名其名的岗位歧视链的话,找一个客户端开发的工作也是非常不错的。只不过相较于后端开发,你可能需要重新审视客户端这个角色。
在我看来,客户端与后端在职业发展上的区别主要有以下几点:
一、技术天花板
这就是岗位歧视链中最经常拿来讨论的一个点。普遍认为客户端的天花板较低,长期在市场上的竞争力不高。甚至还有人拿CTO
基本全是后端开发出身的例子来验证这个歧视链。
怎么说呢,我觉得对于大多数人来说,客户端的天花板的确比后端要低。因为客户端是一个两级分化比较严重的技术,厉害的人天花板可以突破天际,而一般的人真的就很一般。而后端相较之下,的确职业高度的分布稍微均匀一些。
但是,当客户端开发达到一定深度后,难度绝对不比后端开发难度低。反而有时候为了获得更好的端上体验以及更快的用户响应,涉及到的技术会更加底层,更加硬核。 记住一点,客户端开发绝不是改改UI
,改改文案这么简单。
所以我特别不喜欢这种歧视链,从非常片面的角度去论证某个职业或者技术的好与坏,甚至还上升到歧视的层面。我比较认同的是兴趣爱好论,而不是这种天花板论。
二、发展方向
客户端客户端,很显然是面向用户的。这就意味着客户端的开发是直接接触到用户,这也是与后端开发最主要的区别。
说简单一点,客户端开发就是为用户服务,优化用户体验,让产品变得更好用。所以客户端有一个天然的优势,就是离用户很近,知道用户想要的是什么。
问问自己,你觉得自己干技术能干几年,写代码还能写到多少岁。身体熬得住吗,头发还剩多少?干技术这行,还是需要天赋和意识的,特别是真正顶尖的技术大牛。 不是所有人能够在技术这条道上一直走下去。
那走不下去怎么办?转型。
所以客户端的发展从来都不只是技术,而是业务技术两手抓,当然会有所侧重。业务能力意味着产品思维,放大点说就是互联网思维。这就是客户端的一大优势。
三、就业选择
这的确是目前客户端发展的一个痛点。放开到二三四线城市,后端的需求的确要比客户端要大。因为在小公司里,往往不需要那么复杂的客户端支撑。
很多时候都是把后端开发程序员当作全栈来用。很多人都会考虑说,假如干了客户端,之后跳回老家就找不到合适的公司了。虽然这的确很有可能,但也没这么夸张。
只要你的基础扎实,并且善于学习,其实到哪儿都能找到差不多的工作的。不过在一线城市,后端和客户端并没有明显的差别,互联网大厂对这两种岗位的需求都是很大的。
4 音视频开发/多媒体开发
我们知道现在基本各个大平台都在做短视频,同时也不断接入各种直播模式。在这个趋势中,对于音视频/多媒体方向的开发需求越来越广。
比较成熟的互联网大厂通常会把音视频/多媒体技术方向独立出来,作为为全公司所有产品线提供中台的支撑。然后相关的处理算法会封装成SDK给各个业务中调用。
这说明音视频/多媒体开发是很重要的一份工作,而在对音视频或流媒体进行处理的时候,算法效率就是很重要的评价标准。这不就是C++
所擅长的场景嘛。
所以呢,学了C++
还可以选择去做音视频开发的方向。这个方向更偏向于具体的场景,比如播放器,比如直播平台,比如音视频特效等。当然了,C++
更多的还是偏算法实现的方向,许多多媒体开发本身还是立足于平台,比如基于Android
、iOS
或者Windows
,来进行满足平台特性的开发。
不过想要找这个方向的岗位,基本的音视频开发的理论知识得掌握吧。这里同样也包括了很多理论层面的知识,比如图像、音频、视频的采集、渲染、处理、传输等方面的问题,图像和音视频的加工、裁剪、编解码等处理。
一些基本的处理库,用于图像处理的像OpenGL
、OpenCV
等,用于视频编解码的x264
、OpenH264
、[ffmpeg](https://www.zhihu.com/search?q=ffmpeg&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A2657237820%7D)
,用于音视频处理的speexdsp
、[libfaac](https://www.zhihu.com/search?q=libfaac&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A2657237820%7D)
、opus
等库不也得熟悉熟悉吧。
还有音视频传输的协议、直播推/拉流的协议,如RTMP
、RTSP
等也可以掌握掌握。哈哈不要被吓到,毕竟会C++
只是基本的编程能力,但是具体的岗位肯定有业务能力上的要求。
音视频开发免费文档视频资料+学习路线免费领取!docs.qq.com/doc/DYUNJZHF0WWtKQnhL
5 游戏开发
游戏开发也是C++
的可以进军领域之一,像很多游戏引擎都是基于C++
开发的。只不过游戏开发真的需要兴趣和热情。如果不是因为喜欢游戏,建议还是不要选择游戏开发的岗位。
不是说游戏开发前景不好,而是说这件事如果没有足够的热情很难走得很远,并且因为方向不是很大众,到时候想换方向了,可选择性就不是很多。
国内比较出名的游戏厂商就那么几家,但是投递的人却很多。这也导致这个行业的竞争很大,所以在招聘的时候会更看中你的游戏开发经历。
如果是校招生,很少会有比较多的游戏开发经验,但是可以通过许多途径去弥补这一缺陷,比如参加游戏开发比赛,比如自己开发demo
。起码也得了解过或者用过一些游戏引擎,这样简历也会更加饱满一点。
对于游戏开发的业务能力要求刚刚也提到过一点,大概包括游戏引擎的使用和了解,比如常见的Cocosa2d
、Unity3D
等,游戏引擎的实现原理和机制,还有面试时候基本都会问到的计算机图形学理论。计算图形学是游戏开发领域及其重要的理论基础,毕竟游戏离不开各种图像模型的渲染和处理。
所以呢,如果你在大学期间有基础过一些图像学的工作,比如一些模型绘制、三维渲染的工作就可以去尝试一下游戏开发的岗位。我之前有个师兄在研究生阶段是做医学图像处理的,主要的工作就是对人体脏器和血管进行三维显示的,然后就去做了游戏开发。美滋滋。
6 嵌入式开发
上面几种岗位选择都是偏软件方向想的,而C/C++
还有一类非常大的就业方向,就是去做嵌入式。嵌入式本身可能是偏硬件一点,但是现在做个什么事,都是软硬不分家的。
嵌入式的开发同样也会涉及到网络编程、并发编程等方面。通俗点解释可能就是,嵌入式代码是运行在别的小系统上,而不是传统意义的计算机上。
所以嵌入式开发更适合原来专业是电信、微电子之类的专业,毕竟这个方向除了需要编程能力,还需要基本的电路理论素养。
一般招聘嵌入式开发岗的公司大多是以硬件产品为主的互联网+公司,比如小米、华为等。进去公司很多都是在做物联网相关的工作,毕竟这是热点。当然也会有其它的业务方向,例如芯片、机器人等。
7 总结
说了这么多,有没有发现好像只会C++
是找不到工作的。不管是哪个岗位,在对C++
基础的要求上,还会有额外的东西。这其实很好理解,毕竟C++
只是一门语言,只是一个工具。
就好比你光有一把弓箭,是没办法射大雕的。你还需要许多额外的能力和知识储备,甚至还需要一点预判的意识,才能够在合适的时机以合适的力度射出那一箭。
而C++
,只是那支射出的箭罢了。你越熟悉它,箭头便愈发锃亮,破坏力也就越强。并且同时,空中盘旋的也不只有一只大雕,你还需要选择机会最大的那一只。
一般来说作为C++开发工程师,想要获得长久发展,提升专业技能是一方面,另一方面需要确定好发展方向。那么C++技术开发的发展方向有哪些呢?
C++技术开发的发展方向有哪些?
一、服务器开发,开发大型高并发服务器,熟悉多线程,网络编程,熟悉服务器的架构模型;
二、应用开发,开发各种实用的界面工具,使用界面库做各种炫酷的软件应用,偏向于前端;
三、图像处理,图像算法,人脸识别等各种图像数据后期处理,偏向于算法,需要拥有良好的基础;
四、流媒体开发,专注于各种音视频解码转码,媒体复用,负载均衡,熟悉各种开源播放库解码库;
C++技术开发的发展方向有哪些?
五、嵌入式开发,和硬件打交道,需要熟悉各种底层编译知识,了解硬件知识;
六、网络安全,接触各种攻防知识,进行逆向开发,了解各种安全机制;
七、游戏开发,熟悉网络编程,了解游戏的服务器和客户端架构;
八、数据分析,做各种数据处理相关的后台,了解大数据处理方法,熟悉常用的大数据分析工具;
九、人工智能,偏向于算法的研究,了解机器学习;
C++开发工程师的职业发展方向有很多,但如果在刚开始的时候,就选择一个好的方向,那么对于后期的发展也是非常有利的。
**1、服务器端开发:**很多游戏或者互联网公司的后台服务器程序都是基于C++开发的,而且大部分是linux,unix等类似操作系统,所以说,你如果想做这样的工作,你需要熟悉linux操作系统及其在上面的开发,熟悉数据库开发,精通网络编程。
**2、游戏:**目前很多游戏客户端都是基于C++开发的,除了一些网页游戏可能不是,这个领域需要学习的东西就比较多,个人不太了解就不多说。
**3 、虚拟现实仿真:**这个也是发展很快的计算机领域,目前各种数字地球,数字城市,虚拟地理环境什么的,出现了这方面的大量应用,不过也不限于这些方面,比如科学计算可视化也是其中一个方向。这个方向重点需要学习的是图形学。
**4 、数字图像处理:**现在市面上有很多VC++图像处理的书籍,可见在这个领域的应用软件开发也是占了很大比重,需要深入学习数字图像处理和模式识别等课程。
岗位分析
了解一下岗位,知道以后能做什么,这个也有利于自己树立学习目标。
C语言和C++属于“造轮子”语言,几乎什么都能做。不过一般来说,C语言和C++主要还是做后台(服务端)开发比较多,包括:
- 通信公司后台开发
- 互联网公司后台开发
- 游戏公司后台开发
- ……
当然这个后台开发具体职责又有很多细分,比如:
- 有做数据处理和分析的
- 有做基础协议和通信的
- 有做服务端底层应用优化的
- 甚至还有做后台系统驱动和内核的
- ……
不管怎样,下面即将要介绍的这些学习路线和内容适用于以上所有情况。所以呢,下面就来讲讲具体的学习路线。
语言本身的学习
C语言:
- 除了最最基础的语法:变量、条件、循环、字符串、数组、函数、结构体等之外
- C语言最最最最最重要的那就是:指针、内存管理,以后企业里开发就靠它俩吃饭,这也是检验C语言掌握情况的两大标准
推荐书籍:《C Primer Plus》、《C和指针》、《C专家编程》
C++:
- C++和C语言确实是不同的语言,但是C++确实是对C语言的延伸,可以理解为在C语言里加入了面向对象的特性。因为只有面向对象特性的加持,代码才能更好的复用、扩展和工程化,这是大型项目的必备要素
- 除了C语言所有的底子之外,还需要学习C++的面向对象(封装、继承与多态)特性、泛型、模板、STL等等
推荐书籍(有先后顺序):《C++ Primer》、《Effective C++》、《C++ 标准程序库》、《STL源码剖析》《深度探索C++对象模型》
最后一个小建议是:语言部分的学习建议不要拖太久,一定要规划好时间,一鼓作气,高强度给它压下来,否则容易把自己搞泄气。
编程基础四大件
基础四大件包括:数据结构和算法、计算机网络、操作系统、设计模式
这跟学什么编程语言、后续从事什么编程方向均无关,只要做编程开发,这四个计算机基础就无法避开。可以这么说,这基础四大件真的比编程语言重要!!!
1、数据结构和算法
可以说这个直接决定了面试的成败!几种基础数据结构类型得烂熟于心,比如:字符串、链表、二叉树、堆、栈、队列、哈希等;基本的几大算法也要了如指掌,比如查找、排序、动态规划、分治等等。
建议LeetCode多刷题。
参考资料: 《大话数据结构》、《算法》、《剑指offer》《LeetCode刷题》
2、计算机网络
此处的计算机网络指的就是TCP/IP协议栈,可以说它是当下互联网通信的基石,无论如何一定要对TCP/IP的协议栈了如指掌,主要就是学习和掌握原理,包括:ARP协议、IP协议、ICMP协议、TCP和UDP协议、DNS协议、HTTP协议、HTTPS协议。
推荐书籍: 《TCP/IP详解》
3、操作系统
该部分重点包括:进程和线程的相关原理(原子性、并发、锁)、内存相关原理(内存分布、内存调度)
推荐书籍:《深入理解计算机系统》
4、设计模式
倒不需要23种设计模式全部记住,常见的几个如:单例模式、工厂模式、代理模式、策略模式、模板方法模式建议熟练于心。
推荐书籍:《大话设计模式》、《设计模式之禅》
应用实践编程
这部分会涉及到一些工具、编程环境、和具体编程实践,应该说这一部分学完,自己应该能做点东西出来、或者说能看懂一些实际项目的代码。
实践这部分,我也是结合我之前在通信公司的实际工作经历和所听所见,来聊一聊。
1、Linux操作系统的使用
很多人初学C语言、C++(包括我)都是在Windows环境上进行的,而实际企业级开发几乎不可能,所以Linux系统必须要会,我们别无选择。先谈使用。
包括:常见的Linux操作命令、基本的Shell编程。
推荐书籍:《鸟哥的Linux私房菜》
2、编译/调试工具
首先是跟编译相关的:编译工具!
我们知道很多人学C语言、C++都在类似Visual Studio这种集成IDE里进行代码编译,这个其实也用了编译器,只不过是微软自家的MS编译器,而且所有操作均可视化。而企业里开发很少会基于Windows系统,所以Linux平台上的编译器更为重要,最典型的当属GCC
,甚至有些公司有自己定制过的交叉编译工具,但没关系,只要GCC
熟悉,其他问题都不大。
其次,大家自学C语言、C++,都借助类似VS这种IDE,点按钮即可对源文件编译。而企业里实际项目的编译动作叫make
,编译的实际动作和过程都是写在[makefile](https://www.zhihu.com/search?q=makefile&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A1050796549%7D)
文件里,所以makefile的书写规则建议学习!
最后说到调试,Linux平台上的GDB
调试工具要熟练使用,会借助于它进行调试。
推荐资料: 这部分没有书可推荐,英文好的同学可以直接看GNU
官网关于GCC
和GDB
的文档,中文材料可以看:《debuging with gdb》(中文版)和陈皓先生的《跟我一起写makefile》
3、Linux环境编程
还是那句话,企业里C语言和C++几乎都是基于Linux平台的,这一部分我们没办法避开
(1)Linux系统编程
众所周知,Windows系统编程里有各种各样的Windows API,同理Linux系统API的使用就更加重要。
(2)多线程编程
此处指的是多线程编程实践相关的东西,一般包括:线程、资源、信号、同步、互斥、锁等等一些具体的编程方法。
(3)网络编程
此处的网络编程主要指的是具体Linux系统上的网络编程API
和IO
函数的编程实践。
推荐书籍:这三部分综合在一起,推荐必看书籍包括《Unix环境高级编程》、《Linux高性能服务器编程》、《POSIX多线程程序设计》
每天进步一点点,Peace!
1 c++ 发展方向
- 实验室开发
C++绝对是工科生中的第一大语言,C++兼具面向过程以及面向对象的特性,既拥有比较优秀的运行速度,又有良好的大型项目开发能力,那简直可以制霸高校实验室了。
- 后端开发
学了C++之后,第一选择当然就是去面试后台开发的岗位。
需要扎实的编程基础和计算机理论基础,同时可能还要熟悉Windows/C++编译链接机制、QT客户端开发技术体系、Windows消息机制等技术。
- 音视频开发/多媒体开发
大平台都在做短视频,同时也不断接入各种直播模式。在这个趋势中,对于音视频/多媒体方向的开发需求越来越广。这个方向更偏向于具体的场景,比如播放器,比如直播平台,比如音视频特效等。
- 游戏开发 掌握了C++基本语法之后,开发游戏也依然是一个不错的选择,目前工业级别的3D游戏引擎仍然是用C或C++编写的。
虽然以个人能力无法去完成一个庞大的网络游戏,但是从简单开始,编写一些小游戏,然后逐渐深入,循序渐进并最终加入大型游戏开发团队还是非常好的一个选择。与之相应的就业岗位主要有游戏开发工程师、游戏引擎架构工程师等。
- 嵌入式开发 C/C++还有一类非常大的就业方向,就是去做嵌入式。嵌入式本身可能是偏硬件一点,但是现在做个什么事,都是软硬不分家的。
嵌入式的开发同样也会涉及到网络编程、并发编程等方面。通俗点解释可能就是,嵌入式代码是运行在别的小系统上,而不是传统意义的计算机上。这个方向除了需要编程能力,还需要基本的电路理论素养。
- 人工智能
人工智能、机器学习等方向也少不了C或C++语言的身影。需要强调的是虽然C++语言可以从事的方向非常广泛,但是仅仅掌握C++语法是远远不够的,上述的应用领域C++语言是基础,进入这些领域还需要进一步深入系统学习相关领域的知识以及去接触真实企业项目的内容。
注:访问不了,可以复制链接打开 ,没有安全问题
2 、c++语法基础
首先是入门阶段,除了基本的循环、变量、判断以外,至少需要掌握这些:
- 指针、引用、数组、内存
- 引用与指针区别
- 虚机制:虚函数、虚函数表、纯虚函数
- C 和 C++ 的一些区别,比如 new、delete 和 malloc、free 的区别
- 一些关键字的作用:static、const、volatile、extern
- 四种类型转换:static_cast, dynamic_cast, const_cast, reinterpret_cast
- STL部分容器的实现原理,如 vector、deque、map、hashmap
- 类的封装,构造和析构、静态成员、对象管理;
- 类的构造(有参构造函数、无参构造、拷贝构造、默认构造函数)和析构;
- 对象动态管理、友元函数、友元类、操作符重载;
- C++编译器对象管理模型分析;
- 运算符重载(一元运算符、二元运算符、运算符重载难点、项目开发中的运算符重载);
- 模板特化、偏特化,萃取 traits 技巧
- 继承、虚继承、菱形继承等
- 多态: 动态绑定,静态多态
- 重写、重载
- 智能指针原理:引用计数、RAII(资源获取即初始化)思想
- 智能指针使用:shared_ptr、weak_ptr、unique_ptr等
- 编译链接机制、内存布局(memory layout)、对象模型
- C++11 部分新特性,比如右值引用、完美转发等
书籍推荐
《C++ Primer中文版》本书面向 C++ 语言的初学者,是一本很友好的自学教材。作者把 C 语言的基础概念和需要注意的编程细节说得很清楚,并且例程和习题丰富,相信认真读过之后,可以完成 C 语言入门这个目标。
《高质量程序设计指南》,墙裂推荐,这本书看得比较过瘾,书里面有一些编程规范的东西,对于写程序的人来说,还是不错的,可以培养好的编码习惯,加深了一些知识的巩固。比较实用,也适合面试前看看。
《Essential C++中文版》是一本内容不多但很实用的 C++ 入门书籍,强调快速上手与理解 C++ 编程。本书主要围绕一系列逐渐复杂的程序问题,以及用以解决这些问题的语言特性展开讲解。你不只学到 C++ 的函数和结构,也会学习到它们的设计目的和基本原理。
《More Effective C++(中文版)》,该书围绕55条准则,每一条都介绍了一个可让你写出更好的C++程序代码的方法,并以特别设计过的例子详加讨论。
《提高C++性能的编程技术》,本书认为 20% 的性能缺陷将会占用我们 80% 的时间。因此我们把精力集中在最有价值的地方。本书详细讨论了临时对象、内存管理、继承、虚函数、内联、引用计数以及 STL 等一切有可能提升 C++ 效率的细节内容。无论你是相关领域的从业人员,还是 C++ 程序设计爱好者,或者是渴望突破编程瓶颈、大幅提升自我修为的程序设计爱好者,本书都必将使你获益良多。
《从缺陷中学习C/C++》从本质上来说,这就是一个 C/C++ 的错题集。全书中包括 63 个问题引发的错误,即书名中的缺陷。也是避坑指南。
《C++ Templates中文版》,深入了解现代 c++ 模板的实用书籍。本书不仅是对 C++ 模板的权威解释,而且本书还深入地介绍了其他一般的 C++ 思想。
《STL源码剖析》详细地了解 STL 的底层实现机制,同时也可以对常用数据结构,C++ 内存管理拥有更深的理解。
其实还有《C++标准库(第2版)》、《C++并发编程实战》、《C++编程思想(两卷合订本)》等,介绍的这些书我都买了,不过说实话,后面的几本都是泛泛的看了下,当作工具书。
- 第二套、侯捷老师全系列八部曲 - 手把手教你进阶系列 提取码:rb16
- 00 - 侯捷系列-全部课件 提取码:poo3
- 01、C++面向对象高级编程(上) 提取码:51rd
- 01、C++面向对象高级编程(下) 提取码:0869
- 00 - 侯捷系列-全部课件 提取码:poo3
- 03 - 侯捷-C++设计模式 提取码:zn8n
- 04 - 侯捷-C++新标准C++11&14 提取码:5jl1
- 05 - 侯捷-C++内存管理机制_60_侯捷 提取码:b8b3
- 06 - 侯捷-C++ Startup 揭密:C++ 程序的生前和死后 提取码:adro
- 07、算法原理与实践(选修) 提取码:7548
- 08、系统设计与实践(选修) 提取码:697b
- 第三套、Linux CC++网络编程实践-陈硕 提取码:wv79
- 陈硕 - C++实践工程学 提取码:blou
- 易学C++ 提取码:yiwo
- 提高C++性能的编程技术.左飞 提取码:anft
- 深入理解C++11 提取码:py26
- 深度探索C++对象模型 提取码:0v2p
- 侯捷STL课件 提取码:fuuh
- 跟我一起写makefile 提取码:k090
- 大话设计模式C++ 提取码:r1wi
- 陈硕 - C++实践工程学 提取码:dgy4
- STL源码剖析+源码 提取码:nkcl
- Modern C++ Design 提取码:t1kk
- Effective-C++-第二版 提取码:vy1b
- Effective STL中文版 提取码:t3gy
- Effective C++ 第三版 高清PDF 提取码:bd36
- C++设计新思维-泛型编程与设计之应用 提取码:7gew
- C++工程实践经验课 提取码:o5v4
- C++对象模型 提取码:azv9
- C++大学教程 提取码:012g
- C++程序设计语言 提取码:abu1
- C++沉思录中文第2版 提取码:o88v
- C++并发编程实战 提取码:fuj8
- C++标准程序库 提取码:318m
- C++编程调试秘笈 提取码:8ool
- C++编程思想(两卷合订本) 提取码:ekkz
- C++编程规范-101条规则准则与最佳实践 提取码:0o6k
- C++Primer 5th 英文版 提取码:cxmu
- C++ Primer习题集 提取码:lvmx
- C++ Primer-第4版 提取码:8gyu
- C++ Primer(第5版)_带书签_高清完整版 提取码:x6rl
- C++ Primer Plus 提取码:i0p7
视频
- 清华大学-郑莉-C++语言程序设计(基础篇)
- 侯捷老师的八部曲:
- 侯捷C++ 标准 11 -14
- 侯捷STL 和 泛型编程
- 侯捷C++ 内存管理
- 侯捷C++面向对象高级开发
- 侯捷STL与泛型编程
- 侯捷 C++ Startup 揭密:C++ 程序的生前和死后
- 陈硕第三套、Linux CC++网络编程实践-陈硕
侯捷C++视频全集与网络编程mp.weixin.qq.com/s/302poB-agGUSepqNlmi9sQ
- QT视频教程:
数据结构与算法
书
比较系统地学习数据结构的话,推荐看《大话数据结构》、《算法(第4版)》和《数据结构与算法分析》。
如果刚接触数据结构的话,可以从《算法图解》、《我的第一本算法书》入手。
计算机专业必读书籍汇总!(含下载)mp.weixin.qq.com/s/201WKazlNsIudQiUFdnsgA
视频
- 郝斌数据结构
虽然比较老,但是讲的比较详细,容易理解,对初学者非常友好。
https://www.bilibili.com/video/BV1Ut411a7rN?from=search&seid=14411767501116137153
- 数据结构-浙江大学
课程是由陈越与何钦铭共同录制,b站与慕课网都有,慕课网比较清晰一些
https://www.icourse163.org/course/ZJU-93001?from=searchPage#/info
- 数据结构与算法基础
课程由青岛大学王卓老师录制,非常适合考研,讲的题比较多。
多动手
动手去做,动手去做,动手去做。重要的话说三遍。
动手包括撸码,还包括"多画"
要边学习边画图。因为对于数据结构中的存储结构来说,尤其是树结构和图结构,存储结构确实比较复杂,仅靠空间想象难免会有披露,而通过亲手画图往往能避免很多“坑”,后面关于数据结构与算法的文章中,我也会加入一些动图。
把数据结构图形化,视觉化。在直觉上感受一个数据结构是什么样子的。使用它是什么感觉,抽象上和具体实现上是什么样子的。这就是最重要的事情。并且无论是对于简单的队列、栈还是平衡树都很重要而且有效。把数据结构画出来,在你的脑袋瓜里面就能想象出来,总之,你需要做的就是,直观的去了解这些数据结构。
在学习某些算法时,也可以借助画图来加深自己的理解。可以边阅读代码边画图,这样可以更快理清代码的实现逻辑。
在通过“多画”实现理解存储结构和实现逻辑的基础上,初学者还要“多撸码”编写实现代码。对于某一种存储结构或者算法,没有 3 遍以上自己独立的实现过程,是很难做到融会贯通的。
另外,可以在leetcode和牛客网多刷题。
秉着好东西不藏私的原则分享出来!我把自己学习计算机八九年以来的书籍分享出来了,最后汇总开源成为一个计算机经典编程书籍仓库了。
我学习计算机以来自己收藏的计算机电子书
如果对你有用可以点赞支持一下我!后续会继续分享一些计算机学习的编程资源!
其中包括经典大黑书、编程电子书、电子书、编程书籍,包括计算机基础、C/C++、Java、Python、面试题、架构设计、算法系列等经典电子书。
目前已经开源在了github上,如果你因为网络等原因无法访问github,我在码云也放了一份,同样可以供你学习编程!
github开源地址:https://github.com/GrindGold/pdf
码云开源地址:https://gitee.com/grindgold/pdf
计算机网络
书
堪称 TCP/IP 领域的圣经。作者 W. Richard Stevens,他从使用者(程序员)的角度,以 tcpdump 为工具,对 TCP 协议抽丝剥茧娓娓道来,让人叹服。恐怕 TCP 协议的设计者也难以讲解得如此出色,至少不会像他这么耐心细致地画几百幅收发 package 的时序图。
经典书籍,着重看TCP/UDP部分。
视频
- 计算机网络微课堂
- 韩立刚计算机网络 谢希仁 第7版
数据库
书
入门书籍,书中从介绍简单的数据检索开始,逐步深入一些复杂的内容,包括联结的使用、子查询、正则表达式和基于全文本的搜索、存储过程、游标、触发器、表约束等等。
进阶书籍,mysql 领域的经典之作。不但适合数据库管理员(dba)阅读,也适合开发人员参考学习。不管是数据库新手还是专家,相信都能从本书有所收获。
升华书籍,详细讲解了 InnoDB 存储引擎内部的各个功能模块的实现原理,对大家阅读和理解 InnoDB 的源代码有重要的指导意义。适合所有希望构建和管理高性能、高可用性的 MySQL 数据库系统的开发者和 DBA 阅读。
其他书籍:
《数据库系统实现》、《Redis设计与实现》。
视频
MySQL_基础+高级篇- 数据库 -sql -mysql教程_mysql视频_mysql入门_尚硅谷
https://www.bilibili.com/video/BV12b411K7Zu?from=search&seid=2779357081480449466
计算机组成原理
书
这是一本很深入和方向性的书,每个 CS 学子都应该去读,它会告诉你,要想成为一个优秀的程序员,你应当重点理解哪些计算机底层原理。
其他书籍:
《计算机组成原理与设计》。
视频
- 计算机组成原理 清华大学刘卫东 全58讲 国家精品课程
- 计算机组成原理(哈工大刘宏伟)135讲(全)高清
操作系统
书
本书是操作系统领域的经典之作,讲的全面详细,包括进程、线程、存储管理、文件系统、I/O、死锁、接口设计、多媒体、性能权衡,以及有关操作系统设计的最新趋势。不仅涵盖了现代操作系统的原理和实践,而且特别关注了Linux操作系统、Windows Vista操作系统、嵌入式操作系统、实时操作系统以及多媒体操作系统。所以也是面试笔试操作系统的宝典。
其他书籍:
《操作系统真象还原》、《30天自制操作系统》。
视频
- 操作系统(哈工大李治军老师)32讲(全)超清
- 2020 南京大学 “操作系统:设计与实现” (蒋炎岩)
网络编程
刚工作的时候第一个项目就是物联网后台服务器软件,网络上也有类似的网络服务程序,比如即时聊天软件的后台服务器,网游服务器,金融交易系统,互联网企业用的分布式海量存储,微博发帖的内部广播通知等等。当然在嵌入式系统上也有移植或维护 TCP/IP 协议栈等等。
- 熟悉掌握一些网络模型,例如 WINDOWS 系统下使用的 IOCP。Linux系统下使用的 Epoll、select、poll模型。
- 熟悉一些通用库例如 ocket Server,RPC Framework
- 内存管理。重载new/delete,内存池,对象池的处理。
- 内存泄露检测,内存访问越界警惕,内存碎片的回收。
- 预分配池减少切换和调度,预处理的线程池和连接池,例如数据库连接池等。
- 多进程编程、多线程编程
- 五大 IO 模型:同步、异步、阻塞、非阻塞、信号驱动
- 进程间通信方式: 信号量、管道、共享内存、socket 等
- 线程安全问题,锁处理、临界资源
- 负载均衡理念,数据的提前准备和即时计算,如果有耗时的业务可以考虑微服务,负载均衡。
- 定时器、心跳、定时检查死链接等等
书
有网络和操作系统的基础很重要。
非常适合初学者学习的,对网络编程的讲解清晰直白,完全适合新手入门,写出了网络编程的每一个步骤。
学习Unix必备的经典书籍,重要章节看看,可以当工具书使用。
进程控制 ,线程控制,进程环境,进程通信 讲得尤为精彩,网络部分讲得比较浅,但也够用。整本书可以说涵盖了Linux的方方面面,面面俱到,甚至很细。
本书是 Linux 服务器编程领域的经典著作,从网络协议 TCP/IP、服务器编程核心要素,Linux 网络编程 API、高级 I/O 函数、Linux 服务器程序规范、高性能服务器程序框架、I/O 复用、信号、定时器、高性能 I/O 框架库 Libevent、多进程编程、多线程编程、进程池和线程池等内容等多角度全面阐释了编写高性能 Linux 服务器应用的方法、技巧和思想。还包含两个综合性案例,从实战的角度讲解了高性能服务器的优化、系统监测工具的使用等内容。
本书是陈硕大佬的作品,重点讲解一种适应性较强的多线程服务器的编程模型,即 one loop per thread。这是在 Linux 下以 native 语言编写用户态高性能网络程序最成熟的模式,掌握之后可顺利地开发各类常见的服务端网络应用程序。本书以 muduo 网络库为例,讲解这种编程模型的使用方法及注意事项。
视频&源码
推荐陈硕大佬的《Linux CC++网络编程实践》以及开源的库 muduo
侯捷C++视频全集与网络编程mp.weixin.qq.com/s/302poB-agGUSepqNlmi9sQ
https://github.com/tangtangcoding/C-C- https://github.com/chenshuo/muduo
libevent 是一个轻量级的基于 event 回调机制的网络编程库,可以支持 Linux、Solaris、Windows 等系统,它本身是用 C 语言写的,比较适合入门级的阅读。
Asio 是 boost 里的网络编程库,是用 C++ 语言写的。里面用了很多 boost 的数据结构和技巧,包括大量模板的使用,有一定的语言难度。
https://www.boost.org/doc/libs/1_75_0/doc/html/boost_asio.html
一、工具的选择
工欲善其事,必先利其器。我们先看下开发工具的选择
IDE:
我这里列出了JetBrains系列和VS Code的IDE。对于C++er而言,我们可以使用CLion,也可以使用微软开发的Visual Studio Code(简称VS Code)。
CLion :跨平台的C/C++ IDE 开发工具,支持C++11 、C++14、libc++以及Boost。
Visual Studio Code(简称VS Code):是一个由微软开发,同时支持Windows 、 Linux和macOS等操作系统的免费代码编辑器,它支持测试,并内置了Git 版本控制功能,同时也具有开发环境功能,例如代码补全(类似于 IntelliSense)、代码片段和代码重构等。该编辑器支持用户个性化配置,例如改变主题颜色、键盘快捷方式等各种属性和参数,同时还在编辑器中内置了扩展程序管理的功能。
在2019年的 Stack Overflow 组织的开发者调研中,VS Code被认为是最受开发者欢迎的开发环境。
编辑器:
在 Linux 下开发肯定离不开 Vim 或者 Emacs,这两个都是常用的编辑器,已经形成了两大爱好者阵营。特别是 Vim 编辑器,学习成本有点高,配合上各种插件和配置,有些 Vim 爱好者已经把它当成 IDE 来用了,一旦掌握可以大幅提升工作效率,值得你去学习。
当然除了 Vim 如果是文字编辑工作,比如写 README 文档或者写技术博客,那么强烈推荐学习下 Markdown 语法,这是一种种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,注重内容本身不用过多的调整排版。Markdown 编辑器推荐 Typora 、有道云笔记 Markdown 编辑器、VSCode Markdown插件。
版本控制:
大型软件项目的代码量巨大,如何有效组织和管理源码和版本,于是产生了版本控制系统。版本控制系统就是我们常说的SVN 或 Git,用来追踪、维护源码、文件以及配置文件等等的改动,并且提供控制这些改动控制权的程序。
常见的版本控制系统分为两大类:集中式版本控制和分布式版本控制。作为后端开发工程师,版本控制系统的使用也是必须掌握的基础技能,不过这些系统一般都是边使用边熟悉,刚开始熟悉一些常用操作就好
- 常见的有集中式版本控制系统,代表是SVN;
- 分布式版本控制系统,代表是Git
二、第一阶段:C++入门
很多同学问我,学C++要先学C语言吗?当然不需要!
C++和C语言本来就是两种不同的编程语言,但C++确实是对C语言的扩充和延伸,并且对C语言提供后向兼容的能力。
所以,如果你本身就要学C++,反而从C语言开始,把C语言学完以后,还需要重新学习和适应C++的区别和特性,浪费时间。
当然,如果你原来就会C语言,那你学C++会更快。毕竟,他们之间的区别并不像跟其它语言一样那么大。
第一阶段,大家只需要了解C++的语言基础、一些基础的linux命令和常用的几个数据结构即可。
我们只需要能够在linux上面简单跑起来代码,或者直接在IDE中跑出来,也是可以的。
在这个阶段,我们需要的是快速入门,最后我们可以做一个电子词曲人小项目,以使用C++的基础知识。(电子词典的源码将和推荐的书籍、技术路图一同提供)
强烈大家刚开始要跟着视频学,C++本身就难,如果自己看书的话,会非常吃力。在看视频的同时,把书做为辅助,有奇效。
视频强推侯捷老师的C++面向对象程序设计,我当前入门C++就是跟着侯老师学的,讲的非常仔细,现在候老师在B站上开源他的讲课视频,大家可以去看:
候捷-C++面向对象高级开发(上)_哔哩哔哩_bilibiliwww.bilibili.com/video/BV13X4y1w7zp
候捷-C++面向对象高级开发(下)_哔哩哔哩_bilibiliwww.bilibili.com/video/BV1Q64y197wP
但候老师的课,一如即往的每节都非常长,短的也要三十分钟……着实很难坚持。
对于定不住的同学,可以看小甲鱼的《C++快速入门》,每个视频十分钟左右,共49集,看完以后,再看候老师的课会轻松很多。
【C++语法】《C++快速入门》_哔哩哔哩_bilibiliwww.bilibili.com/video/BV1Ps411w73m
配置书籍首推**《C++ Primer》**
本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。
(后面会提供下载地址)
《Effective C++:改善程序与设计的55个具体做法》(中文版)
一共组织55个准则,每一条准则描述一个编写出更好的C++的方式。每一个条款的背后都有具体范例支撑,教你怎样才能写出优雅的C++代码。这里也是很多关于C++方面面试问题的出处。
(后面会提供下载地址)
三、第二阶段:C++进阶
这个阶段主要了解STL的使用,学会应用一些常用的设计,并且能够开发一个贪吃蛇项目,以学习类和设计模式的使用。
有关STL标准库的使用是比较难的,同样推荐大家以视频入手。
再次感谢侯捷老师,他录制了46集的系列视频讲解了《C++ STL标准库和 C++ 泛型编程》
【高清完整版】侯捷-C++ STL标准库和 C++ 泛型编程_哔哩哔哩_bilibiliwww.bilibili.com/video/BV1xy4y1g71j
配置书籍推荐《C++ 标准程序库》
这本书给我感觉就是既适合初期入门,又适合当字典用,因为里面的内容比较多,好多第一次记不住。
所以也可以大致看一遍,以后用时再具体记,这样根据实际去学习我个人觉得效果会更好。
(后面会提供下载地址)
《STL源码剖析》
学习编程的人都知道,阅读、剖析名家代码乃是提高水平的捷径。源码之前,了无秘密。大师们的缜密思维、经验结晶、技术思路、独到风格,都原原本本体现在源码之中。在你仔细推敲之中,迷惑不解之时,恍然大悟之际,你的经验、思维、视野、知识乃至技术品位都会获得快速的成长。
(后面会提供下载地址)
四、第三阶段:征服Linux
到了这部分,就真正开始涉及linux开发了
首先,我们需要熟悉Linux的常用基本指令
书籍首推《鸟哥的linux私房菜》:
(后面会提供下载地址)
内容讲的很好,比较简单易懂,当然,如果你还是觉得困难的话,可以跟着视频一块学,在B站有一些up主录制了《鸟哥的linux私房菜》的教学视频,可以一起参考:
鸟哥的私房菜linux_哔哩哔哩_bilibiliwww.bilibili.com/video/BV184411z7q5
然后,我们需要学习各种基于linux的编程API,分别学会系统编程、网络编程、数据库编程。这些内容学完,已经能够自行实现软件开发了,找个工作问题不大。
1、系统编程
众所周知,Windows系统编程里有各种各样的Windows API,同理Linux系统API的使用就更加重要。
2、网络编程
后台开发是离不开网络编程的,甚至简单来说,后台开发就是用厉害点的电脑去处理大规模的网络请求。所以作为一名合格的后端开发人员,对Linux网络编程的熟悉是必不可少的。
3、数据库编程
如果只是会MySQL基础可能是远远不够的,像是Redis,MongoDB等非关系型数据库也是当前的热门。分布式数据库,分布式存储是当前每个大公司都会非常重视的核心,所以数据库基础非常的重要。
(后面会提供下载地址)
一般而言,Linux/Unix的书籍会一齐覆盖系统、网络、数据库这三个方面的知识。所以,这里的书籍做一次统一推荐。
首推Linux编程经典书籍:《UNIX环境高级编程》,本书是被誉为UNIX编程“圣经”,这本书大而全,但也比较难啃,可以挑着看
(后面会提供下载地址)
如果觉得上面那本书看不懂,那推荐《Linux高性能服务器编程》,这本书对菜鸡比较友好,内容很庞大,而且基础讲解的比较详细。
(后面会提供下载地址)
如果只是会MySQL基础可能是远远不够的,像是Redis,MongoDB等非关系型数据库也是当前的热门。
分布式数据库,分布式存储是当前每个大公司都会非常重视的核心,所以数据库基础非常的重要。
MySQL入门建议可以看《MySQL必知必会》。原理比较少,基本都是语法和使用细节,适合先过一遍。
(后面会提供下载地址)
Redis入门可以看《Redis设计与实现》这本书。非常详细的讲了Redis的底层数据结构,包括其集群部分也做了很好的解释。除此之外可以再去理解一下分布式的Raft算法,Gossip协议等等。
(后面会提供下载地址)
很多同学在学习的同时,想要做些实战项目,我也把Github的优秀开源项目进行了整理,这里也分享给大家。
(下载地址见下文)
这些内容学完以后,基本上具有了工作两年的水平,别说校招,就是社招找工作都是非常简单的
为了方便大家,我把以上推荐的所有书籍、工程文件、开源工程地址,都已经整理好了,需要的同学可以去下载。
linux C++技术路图及推荐学习资料下载mp.weixin.qq.com/s/ntCoAKFz6dAQNKzsg1_0VA
第四阶段:高级进阶
在划分时,我也是非常纠结的,因为编程的学习并不是完全线性的,并不一定要先学A才能学到B。比如,这里列到的监控的统计,大家在学习前面的编程书籍时,一般也都会涉及。
但我仍把它列到了高级进阶部分,因为我是基于对就业的必要性来划分的。很多同学看这个路线图的主要目的就是为了找份工作,所以,我为了减轻大家负担,把就业时可有可无的项放在了高级进阶,而把必会的编程能力放在了第三阶段:征服Linux。
高级进阶部分主要考察的点在于中间件的使用、监控与统计、测试、性能调优和云原生。
1、中间件
后端开发中你可能经常听说到「中间件」这个词,那什么是中间件?看下Wiki上的定义:
中间件(英语:Middleware),又译中间件、中介层,是一类提供系统软件和应用软件之间连接、便于软件各部件之间的沟通的软件,应用软件可以借助中间件在不同的技术架构之间共享信息与资源。中间件位于客户机服务器的操作系统之上,管理着计算资源和网络通信。 – 维基百科
中间件能够为上层应用软件的开发提供便捷的、开箱即用的服务交互和计算的能力,缩短开发周期;屏蔽底层runtime的差异;节省应用本身的系统资源,减少运行成本。
中间件部分主要的学习内容有:
这里需要说明的是,同一个中间件,有多种技术选型,大家不必全部都会,根据当前自己公司在使用的中间件类型学习即可。
比如RPC框架这里就列出来了四个Tars、Dubbo、gRPC、Thrift,这四个都是RPC框架,都各有优劣势,大家只学习一款即可。
由于中间件内容众多,且每个中间件都会有对应的书籍,我们就不再一一推荐了
2、云原生
随着云时代的到来,大量公司的业务向云上迁移;
为了云上客户能够便捷的使用稳定高效的中间件能力,云厂商开始将自身沉淀的基础中间件能力云化,用于支撑各个云上客户和自身业务的快速生长。
比如阿里的一系列中间件产品,EDAS(用于帮助企业级客户轻松构建并托管分布式应用服务)、用于加密安全的对象存储 OSS、阿里云商用的专业消息中间件 [ONS]、阿里巴巴自主研发的分布式数据库产品 [DRDS]等
如果你们公司有上云服务,那云上面的各种中间件产品和部署、使用方法是需要了解的。
3、性能调优
当看到性能指标时,我相信“高并发”和“响应快”一定是你最先想到的。而它们也正对应着性能优化的两个核心指标——“吞吐”和“延时”。这两个指标是从应用负载的角度来考察性能,并直接影响了产品终端用户的体验。性能分析,其实就是找出应用或系统的瓶颈,并设法去避免或者缓解它们,从而更高效地利用系统资源处理更多的请求。
性能调优,包括:
**linux本身的调优方法:**大家都知道Linux不同的发行版本和不同的内核对各项参数及设置均做了改动,从而使得系统能够获得更好的性能。
**MySQL调优:**MYSQL 如此方便和稳定,以至于我们在开发 WEB 程序的时候很少想到它。即使想到优化也是程序级别的,比如,不要写过于消耗资源的 SQL 语句。但是除此之外,在整个系统上仍然有很多可以优化的地方。
**GCC调优:**代码优化可以说是一个非常复杂而又非常重要的问题,以笔者多年的linux c开发经验来说优化通常分为两个方面,一是人为优化,也就是基于编程经验采用更简易的数据结构函数等来降低编译器负担,二是采用系统自带的优化模式,也就是gcc - o系列
4、测试
做为服务端开发,为了保证代码的正确以及能够应对一定的流量压力,会一些测试技巧是必不可少的。常见的有压力测试、单元测试、全链路测试、A/B、灰度测试和蓝绿测试。
5、监控与统计
后台服务运行我们如何了解其运行状态和健康度?如果只是开发小玩具监控和统计大可不必,只需记录本地日志即可,对于成熟的大型后台服务系统,监控、统计、追踪必不可少,无监控,不运营
这里列出来了业界常用的几个监控和追踪管理的开源软件,大家可以根据需要自行选择学习其中一种。
第五阶段:架构师阶段
到了架构师阶段,就不再是简单的会用中间件和一些开源框架,而是要求有分布式架构、集群、源码分析的能力。
1、分布式架构
如何设计一套分布式系统?
说白了就是: 如何合理将一个系统拆分成多个子系统部署到不同机器上。
将系统拆分成多个子系统,这就意味着拆分后的系统必然需要通过网络进行互相通信联系。所以通信中的稳定和安全也显得尤为重要。随着业务慢慢的增长,扩展性、可靠性、数据一致性都需要进行考虑。
2、集群
分布式是指将不同的业务分布在不同的地方。 而集群指的是将几台服务器集中在一起,实现同一业务。
分布式中的每一个节点,都可以做集群。 而集群并不一定就是分布式的。
举例:就比如新浪网,访问的人多了,他可以做一个群集,前面放一个响应服务器,后面几台服务器完成同一业务,如果有业务访问的时候,响应服务器看哪台服务器的负载不是很重,就将给哪一台去完成。
而分布式,从窄意上理解,也跟集群差不多, 但是它的组织比较松散,不像集群,有一个组织性,一台服务器垮了,其它的服务器可以顶上来。
分布式的每一个节点,都完成不同的业务,一个节点垮了,哪这个业务就不可访问了。
3、安全
本质上后台服务在网络上运行,需要和各种网络环境交互,在正常情况下能够工作,但互联网中有很多针对后台服务的恶意攻击,因此网络安全也是后台开发工程师需要学习的内容。
网络攻防并不只是公司网络安全工程师的责任,做为技术架构师,我们需要了解一些常见的网络攻击方法,当出现网络攻击时,不至于抓瞎。
4、源码分析
知其然,知其所以然
做为架构师,我们需要清楚地知道我们所用的Linux内核和各种框架的内部具体是怎么实现的,以至于在出现各种疑难杂症的时候,能够从根本上分析并解决问题。
好了,整个linux C++的学习路线和学习资料都推荐给大家了,正如我文中所说,技术的学习并不是线性的,有时候,我们会发现一本书中在学着A同时讲解着B的知识,而你会发现我居然没把B跟A列在一个等级。
这是因为我分割技术时,是以是否以找工作必备为前提进行划分的,对于找工作必备的知识点我尽量靠前,对于不那么必需的技能,一般往后放,以减少大家初入门时的学习压力。
总结了一个月,希望能帮到你,大家帮我点个赞吧
另外,我把我这些年的所知所得,整理成了一本书,开源到github上了。相信会对大家很有帮助,大家可以去看.
目前还在持续更新,欢迎大家star。
地址:https://github.com/harvic/Fight
不得不承认,敢学 C++ 的不是勇士就是学习能力非常强 的同学!必须得恭喜你,是个有雄心壮志的人。
下面是给你们一张C/C++工程师必备知识的思维导图(图片来源于网络):
如果您觉得看视频很累的话,喜欢看书,推荐一份书籍类C/C++的进阶学习路线,以及书籍推荐,包括标准文档,入门阅读,进阶阅读,深入理解3个步骤,里面都是经典的书。
C语言入门:
《C Primer plus》
这是目前市场上,最适合自学的C语言书籍。你可以在书中找到所有C语言编程概念的详细解释。这本书为每一个单独的概念提供了简短的例子,帮助读者更好理解。比如,指针这一章节就体现了这个特点。指针章节是本书编写最出色的章节之一。指针用来标识内存中的具体位置并且存放相应内存地址。书中参照了最新的ANSI标准C99。对于初级程序员来说,本书对学习基本概念大有帮助。这些概念在其他语言(比如:PHP和JAVA中)也有所应用。
C语言进阶之路:
《C专家编程》
你是准备进一步提高编程技巧的C语言专家吗?《C专家编程》就是为你准备的,它可以帮助程序员理解高级的C语言概念,强调程序员常用的一些最佳C语言技巧。这本书写得十分有趣,展现了作者在SUN系统(SUN SYSTEM)中的丰富经验。还定义了一些传统的编程方式,比如使用不同的声明方式。同时,还提供了很多实用的编程实践提示,比如,指针和数组之间的差别。
《C和指针》
本书通过对指针的基础知识和高级特性的探讨,帮助程序员把指针的强大功能融入到自己的程序中去。全书共18章,覆盖了数据、语句、操作符和表达式、指针、函数、数组、字符串、结构和联合等几乎所有重要的C编程话题。 适合C语言初学者和初级c程序员阅读,也可作为计算机专业学生学习C语言的参考。
《你必须知道的495个C语言问题》
本书以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并分别给出了解答,而且结合代码示例阐明要点。
本书结构清晰,讲解透彻,是各高校相关专业C语言课程很好的教学参考书,也是各层次C程序员的优秀实践指南。
C++入门:
《Essential C++》 这是一本内容不多但很实用的C++入门书籍,强调快速上手与理解C++编程。本书主要围绕一系列逐渐复杂的程序问题,以及用以解决这些问题的语言特性展开讲解。你不只学到C++的函数和结构,也会学习到它们的设计目的和基本原理。
《C++ Primer》 本书对C++基本概念、技术、以及现代C++编程风格进行了全面而且权威的阐述,是C++初学者的最佳指南;本书可以帮助你编写实用的程序,而无需首先精通每个语言细节。对于中高级程序员,本书也是不可或缺的参考书。
C++进阶:
《Effective C++》和《More effective C++》
作者Scott Meyers。你应该熟读它们,并清楚地理解每个项目。该书围绕55条准则,每一条都介绍了一个可让你写出更好的C++程序代码的方法,并以特别设计过的例子详加讨论。
《Exceptional C++(C++编程剖析)》和《More exceptional C++》
这两本书中都包含了40个C++编程问题,这些问题会让你磨练自己的技能,最终成为优秀的C++程序员。这些问题是Herb Sutter精心挑选,与ISO/ANSI C++官方标准相一致,帮助程序员在设计、架构和编码过程中保持良好的风格,从而使编写的C++软件更健壮、更高效。
《The C++ standard library(C++标准程序库)》
这是标准模板库字典,你可以在本书中找到STL相关的一切知识。本书焦点放在标准模板库、检查容器、迭代器、函数对象和STL算法上。每一个元素都有深刻的呈现,包括其介绍、设计、运用实例、细节解说、陷阱、意想不到的危险,以及相关类别和函数等。
《Effective STL》
这是Scott Meyers的第三本C++专著,也是学习STL最权威的书籍。作者对书中的50个指导方针都作了详尽的分析,并配以示例。通过这些规则,C++开发者可以最大限度地使用STL。
《Generic programming and the STL(泛型编程与STL)》
本书阐述了泛型程序设计的核心理念:concepts(概念)、modeling(模型)和refinement(改善),并为你展示这些观念如何导出STL的基础概念:iterators(迭代器)、containers(容器)和function objects(函数对象)。按照本书所述,你可以把STL想象成一个由concepts组成的library,你将学习到STL正式结构并理解其强大的优势。
深入C++:
《Modern C++ design(现代C++设计)》
作者Andrei Alexandrescu为C++程序员打开了一个新的局面。本书提供了一些针对软件设计的前沿方法,如联合设计模式、泛型编程,使程序员可以编写有表现力的、灵活的、高度可重用的代码。
《Inside the C++ object model(深度探索C++对象模型)》
本书专注于C++面向对象程序设计的底层机制,包括结构式语意、临时性对象的生成、封装、继承,以及虚拟——虚拟函数和虚拟继承,帮助你理解程序的底层实现,以便写出更高效的代码。
最后,一开始借助书本学习C、C++语言可能有些困难。但是,这些书用最好的方式介绍了C语言中的基本概念。借助这些书,你可以从学习基本的C语言开始,一直深入到学习C、C++语言编程中的高级技巧。完成书中的练习很重要。在实现这些习题的过程中,你可以高效理解和学习有关概念。这些书,也为你继续学习其他高级语言,比如C++、JAVA,提供了基础。
楼主分享下80%的人被C++摧残的经历。
C++就像生活一样,没有一件事情是简单的。
下面可以说是80% C++ 程序员的成长经历。
- 完整的学一遍 C++ 所有语言特性,典型书籍 “The C++ Programming Language” Part1, Part2, “C++ Primer”
感觉 C++ 像大杂烩(多编程范型),各种精妙的语法特性 (friend, virtual/RTTI, const/mutable, exception, template),太多精妙的东西容易导致记忆琐碎化,学了又忘了,尤其是那些很少用的部分
实践:编写一些带 class 和 virtual 字眼的所谓的 C++ 程序
- 树立 C++ 的规则,明确在 C++ 世界“合法的并不一定是合理的”,典型书籍 Effective C++ 系列
有些东西可用 C++ 写,但一般情况下并不合理,如 protected 成员数据, 覆盖 non-virtual 成员
实践:发现 C++ 有强烈的语义约束,和次语言 (sub-language) 范畴,开始写一些规矩的代码
3.1 为了使上述的约束更加形式化,开始使用 设计模式,典型书籍 “The C++ Programming Language” Part4, “Design Patterns”
实践:教条的套模式,与人协作,编写真实规模的程序
开始想:有时传统的设计模式对 C++ 很难看 (OO),有没有一种原生化的 C++ 模式实现思路(以便利用 C++ 的高效性),开始对静态类型系统和模板推导着迷 (GP)
3.2 为了开发快捷,开始使用 标准库,典型书籍 “The C++ Programming Language” Part3, “The C++ Standard Library”, “Effective STL”
光用标准库是不能满足真正的 C++ 程序员的好奇心:auto_ptr, iostream 这些精妙的东西是怎样实现的?string 的开销究竟有多大?functional/alogrithm, iterator, container 这三者是怎样分离的?
于是开始阅读某个标准库实现(典型的是 HP-SGI 的实现,但建议 Windows coder 读 MSVC 的),并尝试自己的等价实现,虽然可能只是标准库的一部分功能。这里一个很大的驱动力是重视 C++ 的高效性
至此,已经知道如何在 raw/smart pointer, char*/string, static/dynamic bind, array/STL container 之间抉择
实践:编写可稳定工作的程序,重视模块的复用性和扩展性,并理解将书本模式(学院派)实化为优质的 C++ 代码之间的鸿沟
- 插曲:3.1 和 3.2 过程会交替重叠进行,并导致 重学 template C++ 这个次语言,典型书籍 “C++ Templates: The Complete Guide”
5.1 玩转 template C++ 和 GP,发现它是超强的代码生成器,和模式塑型器,典型书籍 “Modern C++ Design”
开始进入一种偏执狂式的 GP 和模式应用状态:
-
把所有的实体都对象化, wrapper hell
-
把所有的概念都抽象化, abstract class/factory
-
把所有的行为都策略化, 动态的: strategy, 静态的: traits, policy
-
把所有的实现都向标准库靠拢, Think in STL: every IO is iostream, every algorithm uses iterator, every container is type-safed and nonintrusive with specialization for optimization
成也萧何败萧何:炫技和实用只在一念之间
至此,几乎每个 C++ 程序员手上都有自己的一个 semi-STL 的私人库,那是多年的积累
实践:编写工业强度的 C++ 程序,你的一部分代码(库)可能以开源或闭源的形式供他人使用
5.2 开始使用 一个 Think in STL 的叫做 Boost 的东西,于是你对 Boost 做了和上面 STL 同样的事,典型书籍 “Beyond the C++ Standard Library”, “Boost Docs”, “Boost 程序库完全开发指南”
也许还对 C++11 感兴趣,现在可用即 TR1,典型书籍 “The C++ Standard Library Extensions”
实践:以较高的效率编写工业强度的 C++ 程序
5.1 和 5.2 过程会交替重叠进行
- 过度的玩 template C++ 将会导致 元编程,典型书籍 “C++ Template Metaprogramming”
尽管它很炫耀,但生产环境中却很少用
补充:既然认为 TMP 是 turing-complete 的,并且秉持 handy coding 和 compiling is running 的理念,实际上你是需要一个动态语言(把 C++ 编译器当解释器用,而且还不能调试)。再将范围缩小:从目前 C++ 社区工作来看结合最成熟的 interop 语言是 Python
实践:地球很危险,回火星去吧
- 一个高质量的 C++ 程序所在的商业项目失败了,导致你 陷入沉思
考察失败的可能原因:
-
商业决策,和 C++ 无关
-
其实是部分高质量 C++ 程序,高质量的模块由优秀程序员编写,其它人的很烂
办法 1. 你很喜欢现在的团队:循循善诱那些新手,让他们经历你的至少 2-3 阶段,短时间领悟是不可能的,你很清楚
办法 2. 离开去找和你水平相当的人,记住:C++ 是真正懂它之人的利器,而是一知半解者的绞绳,还不如完全不会用 C++
- 过度的个人炫技,导致代码复杂度过高
不易理解、难维护、开发时间长
-
需要一个度
-
实现复用性和扩展性的难度不宜超过团队的平均水平
-
团队的平均水平不宜低于同类产品开发的市场竞争者的平均水平
-
需要一个目标和态度
-
以制作可交付使用,可工作的产品为终极目的
-
做最好产品,而不一定用最好的技术
-
返璞归真(你懂的)
作者:午夜逛街的黛玛 链接https://zhuanlan.zhihu.com/p/58567627/ 来源:知乎
说下个人被C++摧残仍旧积极向上学习分享的建议。
坚持学习c++,不要半途而废。
不要放弃c++,就算你学了java也不要放弃c++的继续提升。
从广义上来说,你只要精通c++,学其他语言都是事半功倍的效果。
从工作来说,现在的java程序员许多都是大批量在各种培训机构复制出来的,更有甚者一个公司里全是java的,会其他语言的几乎没有,在这种情况下,如果需要用到c++,这就是你出彩的机会。
学C++本身是教不会你编程的。你需要主动的、不断的扩展自己的知识领域。
写一个学生管理系统是一个很好的开端;但接下来,你还需要学习更多。
举例来说,“图形界面”究竟是怎么一回事呢? 我们知道,计算机屏幕实际上是一个“色点”组成的“点阵”;高清屏1920X1080@24bit,意思就是:它一共有1080行,每行1920个点;每个点又可表示2^24种不同颜色(以RGB格式表示;其中RGB的意思是红绿蓝三原色,每种原色8bit,256种取值,即有效取值为0~255)。
这个知识,就是计算机屏幕显示的根本;一切的一切,最终都要变成这样一个1920X1080的彩色点构成的点阵——我们的眼睛无法区分这么多点,看起来就是一整幅图片了。
我们的程序,想要显示出“图形界面”,就得管理好这个巨大的、彩色点构成的点阵;不仅如此,操作系统还可以同时运行一大堆程序、显示一大堆窗口……
那么,这么程序的这么多窗口,又是如何有条不紊的显示在屏幕上的呢?它们不会相互干扰吗?如何处理它们彼此之间的遮挡关系?那些压根看不见的窗口,也要每秒60帧的更新它的显示内容吗?那些一直没有改变过的窗口,是否每帧都必须从头生成内容?可不可以想办法节约掉这些不必要的计算动作?
你看,这是不是一个“学生管理系统”的超级放大版、复杂版?
为了管理这样一个复杂的东西,人们不得不搞出复杂的数据结构和针对性的各种算法;这样还不够,业界从MFC那复杂的消息循环、复杂的对话框数据交换开始,发展了许多年,这才找到Qt/GTK/WPF这样精炼高效、界面与逻辑分开的、方便易用的新架构——而这些东西,就需要面向对象之类东西的帮助了。
你可以算一算,如果每秒刷新60次,1920X1080的屏幕需要多大的计算量。 这么大的计算量,这么复杂的交互逻辑,只有C/C++系语言才hold得住。让其他语言来做它,就很容易浪费太多的性能。
不仅如此。 对于游戏之类应用,人们经常不得不用几十上百万个三角形拼凑出栩栩如生的3d模型;然后通过实时计算更新它们的位置,再模拟出几个光源去照它、处理它们在不同光照下的颜色/反射等等细节——经过各种复杂的处理流程之后,通过一个虚拟的摄像机,计算这个摄像机应该看到什么样的数据……最终,我们才能把这些数据投射到屏幕上,让用户看到一个逼真的3D世界。 CPU处理这样巨大的“阵列数据”显得非常笨拙,因为它只能一个顶点一个顶点的处理它;后来就加入了MMX/SSE/3D NOW之类SIMD指令集。但这东西的性能还是不太够…… 再后来,就有了显卡;显卡后来又发展成了GPU。GPU支持的特性又越来越多,直到现在的实时光线追踪……
你看,仅仅一块屏幕,这后面都有多少东西。
其中,Qt/GTK/WPF之类,是别人写出来、帮我们管理常规应用的窗口的;而OpenGL、DX9/10/11/12之类,则是替我们和显卡打交道、帮我们写3D应用的——如果你要写程序,那就是A3D/unity之类引擎的天下了:它们不仅帮我们打包了图形图像以及音频动画模型等等方面的支持,还集成了游戏需要用到的其他许多基础功能,比如状态机、地图导航、碰撞检测等等东西。
学C++的好处是,这类贴近底层、贴近硬件或者性能要求严格的程序,往往只能用C/C++系语言才写的出来——用其他语言倒也不是不能写,但多少都差点意思。
总之,就好像学生管理系统一样,屏幕上的点阵同样需要一套又一套的管理系统;这些系统是写给我们程序员用的。 想要用好它,你最好搞明白它的基本原理;你要知道如此庞大复杂的东西,是如何管理的井井有条的——算法和数据结构只是入门,后面还有专门讲软件组织结构设计一般原则的软件工程。
写一个Qt很难,但知道它的设计思路并不难。除了C/C++,极少有哪种语言可以给你提供这个视野。 有了这些知识,那么Qt/GTK之类东西你用起来,就会感觉它非常简单,随便哪种抓起来就能用。这就叫知其然又知其所以然。
正因此,其实我是不太建议学C++时着急用各种框架的。因为学框架,你用任何一种语言,从C#到python,全都能学;但写一个Qt/GTK,写一个MySQL,写一个GCC……这类把计算机体系结构挖到根子的有趣挑战,只有C/C++系才鼓励你去做、而且也只有C/C++系语言才能提供无穷无尽的开源优质资源供你参考。
换句话说,当别人忙着追随Qt之类框架的新版本、看着它的新特性抓耳挠腮、不知这些新API该如何调用时,你可以借着C/C++这根拐杖,自豪的说“这个新特性,其实我都知道它是怎么实现的”!
别人学用数据库,你写玩具数据库;别人学用hive,你学着写自己的big-table/map-reduce——这类东西的原理性代码往往没多少,但难度往往会高一些。
但这个投入是值得的。 一旦理解了这些酷炫技术背后的原理,你就不会说“哎呀上学时我们居然还学老掉牙的MFC,现在看着Qt两眼一抹黑”,而是“Qt的抽象果然比MFC好,简单,清晰,易用。MVC模式果然是个天才的设计,你看GTK/WPF等等,它们也都是在这个模式的基础上发展起来的”…… 换句话说,掌握一门新库,对于彻底理解了原理的你来说,就和吃饭喝水一样简单。因为在已经对它的五脏六腑有了清晰理解的你看来,它们本就该这样设计、它们这个设计是如此精典以至于只是看了它们的接口就让你有茅塞顿开之感。
总之,如果你想学着做一些面向用户的东西,其实并不建议你用C++。因为用它实现这类东西往往会比较繁琐。但如果你想挖到各种技术的根子,那么C/C++就是最最犀利的武器——没有之一。
内容部分引用来源:invalid s 链接:https://www.zhihu.com/question/328171823/answer/727835037
C++学习建议
其实,计算机基础和C++学习是可以并行执行的,不一定非要学完计算机基础才开始学习C++,我把计算机排在第一位,是因为计算机基础是所有编程语言学习的基础。
计算机基础
计算机科学技术代号 CS(Computer Science)作为一门大学专业,和大学其他专业课一样有自己的核心课程,最好的当然是在学校按着学校的课程培养计划从头到尾学一遍,但不是每个人都是计算机专业的,很多人因为工作需要才来学习计算机,或者是转行上完培训班想再更深入理解计算机,那我觉得大可不必从头走一遍本科的课程,挑核心课程来学习即可。我这有一份中中科大的计算机技术本科主要课程结构安排。
考过 CS(Computer Science)或者软件工程研究生的同学,应该知道专业课代号 408 的「计算机基础综合」,很多一流院校的计算机或软件学院,都用这门专业课来考察考生的计算机基础水平,这门课曾经被认为是跨考生的噩梦,知识点庞大且复杂,涵盖了一个本科计算机毕业生该会的基础知识,我那年有下面这些 985 院校用了408 来作为初试专业课。
浙江大学 上海交通大学 复旦大学 中国科学技术大学 中山大学 同济大学 华南理工大学 华东师范大学 武汉大学 南开大学…
说这么多,就是想说计算机基础非常重要,是软件开发的基本功,计算机基础课程包括:
- 计算机组成原理
这门课按构成模块来分析计算机组成和工作原理,计算机组成分为下面 5 大模块:存储系统、指令系统、中央处理器、总线、IO系统。
计算机网络就是围绕着,怎么通过网络把不同计算机连接起来展开说明,不同计算机要能通信需要商量一套大家都认可的语言,这个语言就是「网络协议」,整个计算机网络的学习都是围绕着不同网络分层的协议展开。
- 计算机操作系统
操作系统也是一种软件。你熟悉的微软 Windos 操作系统,后台开发熟悉的各种发行版的 Linux 系统,都是通过软件的形式安装在计算机上。
数据结构大家最熟悉,即使毫无计算机基础或是想转行计算机,第一个遇到的就是数据结构,因为面试刷的算法题本质上就是对各种数据结构的运用。所以单纯对面试功利的角度来说,数据结构也是必须要掌握的计算机基础。
计算机基础的学习,理论知识会比较枯燥,建议结合视频公开课,我在下面这个回答有整理过计算机专业不错的公开课资源:https://www.zhihu.com/question/38335108/answer/1636173535
这里给大家推荐一份硬核书籍资源:读大学跟工作期间,我买了很多书,大部分是一些技术书籍,也收集了这些书籍的电子版,都在这里,现在免费share给大家,包括了计算机类常用电子书,包括C,C++,Java,Python,Java,Linux,Go等,希望大家能认真阅读。点击下方链接直达获取:
C++基础
C++和C语法基础
**语法是一门语言的基础,**C++的基础语句和语法和C是很像的,最大的不同在class和异常处理机制,还有模板的应用,所以有C基础语法学起来是很快,没有C基础也没关系,啃完下面推荐的书也差不多,当然光看也是不行的,编程就是一门手艺活,孰能生巧,看完之后趁热把课后习题敲一遍,即使没有思路,对着答案敲一遍代码,比只看不动手强一百倍。
STL提供了丰富的算法库支持和各种容器。C++标准库提供了包括最基础的标准输入输出[iostrem](https://www.zhihu.com/search?q=iostrem&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A1647876930%7D)
、各种容器vector、set、string
,熟练掌握标准库,不用重复造轮子(练手学习目的的造轮子除外),能让你写出更 C++ 的代码。
站在巨人的肩膀上写出更健壮高效的代码,你没踩过的坑前人已经踩过一遍,关于一些语言细节和更好的编码习惯,有很多优秀的书籍可以学习。
推荐书:
- 《C++ Primer 》豆瓣9.4
入门无脑推荐C++ Primer,是C++入门必看的经典书籍,这本书我看了不下 3 遍,每个阶段重看都有不一样的收获,平常也可用作工具书放在手头翻阅。本书是久负盛名的C++经典教程,本书是C++大师Stanley B. Lippman丰富的实践经验和 C++ 标准委员会原负责人Josée Lajoie 对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++,书中对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南。
- 《Effective C++》豆瓣9.5
这本书我最初在网上找的 PDF 看,看完非常过瘾,最后买了正版图书收藏和翻阅。和一般书的组织形式有点不同,全书用条款的形式呈现,作者用风趣的行文风格,阐述了改善 C++ 程序与设计的 55 个具体做法,有人说C++程序员可以分为两类,读过Effective C++的和没读过的,我不能同意更多!强烈建议大家都应该去读一遍,非常值得一看,这本书能让你少走弯路,提前知道C++的坑,以后编码之路更加顺畅。
- 《More Effective C++》 豆瓣9.2
看完上面那本之后可以趁热来看这本,35个改善编程与设计的有效方法,这本书和上一本 Effect C++ 是同一个作者,Scott Meyers,世界顶级的C++软件开发技术权威之一,这次的条款虽然只有 35 条,变得比较少,页数倒是多了一些,原因是这次选更高阶,Effective 多从反面阐述使用 C++ 时应注意的陷阱、误区和戒律 ,而 More 着重从正面建设性地告诉你如何优雅地建立 C++ 构造单元。
C++进阶
书不在多,贵在精。多的我也不推荐,看完上面的这些书,加上动手写了一些习题,你的C++基本上算是入门了。
学无止境,下面这些书推荐你在进阶时候看,能让你更深入的理解 C++ 这门语言
推荐书
- 《STL源码剖析》 豆瓣 8.7
如果说《Effective C++》让我第一次感受到C++的博大精深,那么这本书则带我走入C++的大门。这本书所呈现的源码,使读者看到vector的实现、list的实现、heap的实现、deque的实现、Red Black tree的实现、hash table的实现、set/map的实现;看到各种算法(排序、查找、排列组合、数据移动与复制技术)的实现;甚至还能够看到底层的memory pool和高阶抽象的traits机制的实现。
- 《Inside the C++ Object Model》 这本书中文版《深度探索C++对象模型》翻译质量也很高, 豆瓣9.1
这本书的是比较深入的 C++ 内容,相信我,看完这本书能回答大部分 C++ 面试官的刁钻问题。讲解了 C++ 的对象模型和内存布局,第一代 C++ 编译器开发主管所写,如果你想成为真正的 C++ 高手,看这本书,他为你讲述了编译器在处理各种语法时在「后台」所做的事。对C++有较深入了解的读者会在读后有恍然大悟之感,中文版由候捷翻译,质量相当不错。
- 《C++编程思想》
总共有 2 卷,Thinking 系列第一卷绝对是一本好书,它给你解释了怎么从 C 到 C++ 的转变, 接着慢慢的给你介绍 C++ 的各种东西,先从数据抽象入手、再到类、再到各种特性,,如访问保护、命名空间、重载操作符、继承、多态、模板(初级介绍)等等以及为什么要这样。第 2 卷介绍了 C++ 实用的编程技术和最佳的实践方法,深入探究了异常处理方法和异常安全设计;介绍C++的字符串、输入输出流的现代用法;解释多重继承问题的难点,描述了典型的设计模式及其实现,特别介绍了多线程处理编程技术。
现代C++
C++ 作为一门相对古老的语言,已经经历这么多年的发展。目前很多岗位都是要求会使用现在 C++ 新特性,是时候学习现代C++ 新特性了,咱们C++程序员拥抱 C++1X 甚至 C++20 新变化。 学完上面推荐的书籍,算是已经有 C++ 基础的同学,如何快速上手现代 C++?这里我看的是开源电子书:
- 《现代C++教程:高速上手C++11/14/17/20》
本书号称『高速上手』,从内容上对二十一世纪二十年代之前产生 C++ 的相关特性做了非常相对全面的介绍,读者可以自行根据下面的目录选取感兴趣的内容进行学习,快速熟悉需要了解的内容。这些特性并不需要全部掌握,只需针对自己的使用需求和特定的应用场景,学习、查阅最适合自己的新特性即可。
这本书已在Github开源,离线版本 PDF 可以在 https://github.com/imcoderlemon/CodeClass 直接下载,考虑到国内访问 Github 不方便,评论区也有同学给出了下载地址。
C++就业方向
学完这些还不够,C++ 能做的东西和方向比较多,你可以用C++来做下面这些事情:
- 客户端开发
- 音视频处理
- 游戏开发
- web后端服务开发
- 嵌入式开发
我本身从事C++后端开发工作,这里就说下 C++ 后端开发,除了学习上面的知识以外,还需要学习哪些技术。
更多技术
其实 C++ 语言学习在 C++ 后端开发中,只占了非常非常小一的部分,要知道语言只是一个工具,你要做开发,工具使用是最低的要求,还需要学习以下内容才能符合岗位要求。
在招聘网站找了一个腾讯的 C++ 研发工程师招聘要求,可以看到除了对 C++ 语言的要求外,对面试者的其他要求也不少。
归纳起来,还要学习以下后端技术:
- Linux
- 数据库
- 设计模式
- 中间件
- 分布式
- 高并发
- 高可用
- 高性能(统称互联网三高)
- 搜索引擎
- 测试技术
- 监控运营
- 虚拟化
- 安全技术
- 大数据
怎么学这些技术?可以看我下面这篇文章,下面是我耗时半个月整理的 1 万 5 千字后端开发完全学习指南,对各个知识点的学习已经讲得明明白白,只要你能按着学习路线图坚持下来,问题不大,因为大方向不会错。
好了,这条C++路线我已经给你讲完,学无止境,C++的学习也是一条漫长的道路。
还是那句话,如果感觉学习C++比较吃力,初学者推荐课本+视频的方式学习。这里推荐,B站上面侯捷 C++ 视频课程一直都被看过的同学广为推荐,最近发现 B 站关于侯捷老师的 C++ 视频课程几乎全部被下架了,于是自己搜集了一套非常全的视频,大家赶紧去下载保存备用:
学好C++才是入职大厂的敲门砖! 当年要是有这课,我的C++也不至于这样 已失效 .大家只知道程序员工资高,同样的,选择了程序员这条路也要做好付出更多努力的准备,未来的路很长,我们终身学习,共勉。
最后,计算机基础很重要,如果能参考国内一流大学的教材来学,更能是事半功倍,包含了浙大计算机专业 4 年所学内容:教材+课件+试卷+PPT等等::
今年秋招已经开始了,很多同学问我大厂面试的核心知识点,东哥熬夜整理出来了9大核心知识点,需要的自取:
另外,我当初在准备各大公司技术笔试的时候刷了大量的算法题,其中就是参考了一本谷歌大神的LeetCode刷题笔记,帮我整理了解题思路,归纳了出刷题方法,非常不出错,转给需要的同学:
查漏补缺】晋升 Linux C/C++后端服务器架构开发 岗位,你还需要掌握哪些?
计算机
- 计算机概论
- 计算机系统基础
- 计算机组成与系统结构
- 计算机组成原理
- 计算机网络
- 计算机网络 第一章
- 计算机网络 第二章
- 计算机网络 第三章
- 计算机网络 第四章
- 计算机网络 第五章
- 网络编程(Socket)
- 数据链路层
- 物理层
- 传输层
- TCP/IP
- IPC
C/C++ 服务器高级架构
- C++从入门到精通
- C++面向对象
- 数据结构与算法内容梳理
- 数据结构概述
- 调度与死锁
- 面向对象编程
- 线程
- 线程同步
- 分布式事务
- 分布式协议与算法
- 分布式锁实现方式
- socket编程
- 传输层协议之TCP
- 多路IO复用
Golang
数据库
- SQL基础
- SQL数据库基础知识(SQL Server)
- 数据库系统
- MySQL知识点归纳
- MySQL索引
- Mysql性能调优思路
- MySQL全面优化思路
- Innodb的整体架构图
- Redis基础
- Redis知识点归纳
- Redis数据类型归纳
- Redis知识点
- Redis高性能分布式缓存
中间件
DPDK
Linux
音视频开发
云原生
-
** 1、**嵌入式开发
嵌入式相关的岗位需求比较多,主要是硬件产品的驱动开发,很多大公司,比如华为、小米、vivo和一些芯片公司都在大量的招聘嵌入式开发工程师,而且薪资也不低。
要求熟练操作Linux系统,C/C++语言以及相关的编译和调试技术,精通Linux平台相关驱动开发技术,精通bootloader移植、内核剪裁等技术。
- 2、客户端开发
一般是开发Windows上的桌面软件,比如WPS之类的,技术栈的话一般是C++和QT,Qt 是一个跨平台的 C++ 开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序,当然也可以开发不带界面的命令行(Command User Interface,CUI)程序,C++客户端开发岗位也比较多。
- 3、游戏开发
游戏开发是C++的一个就业方向,很多游戏引擎就都是使用C++开发的,做游戏的大公司比如腾讯、网易、哈游、莉莉丝、暴雪都招聘C++岗位,薪资也是非常可观,比如王者荣耀传闻年终奖几十个月。
游戏开发要掌握C++基础和数据结构,学习图形学知识,掌握游戏引擎和框架,了解引擎实现,引擎源代码可以学习Orge,UE4等开源引擎实现。
- **4、**音视频图形处理
短视频和直播是如今大火的赛道,人人都能参与直播,直播短视频未来肯定还会大放异彩,而音视频处理也是C++的专长,这两年短视频特别火爆,抖音、快手、B站都发展的特别快,很多公司也有音视频方向人才招聘需求,感兴趣的同学可以尝试这个方向的C++学习。
常见的音视频开源库和方案有FFmpeg、WebRTC、Mediasoup、ijkplayer ,音视频开发最主要的技术栈就是C++。
- 5、服务端开发
C++服务端开发,也就是我们常说的后端开发,如今互联网后台开发主力语言是:C++、Java、Golang,C++的主要优势是性能十分优异,极致压榨CPU,Java和Golang更适合写业务代码,对性能有严格要求的后台会优先采用C++开发,百度、腾讯等大公司有很多用C++语言开发的后台服务,博主本人也曾在鹅厂担任C++后台开发。在高频交易领域比如量化私募企业、证券公司也在使用C++做服务端后台开发。
后台开发要求精通C++、STL、Linux网络编程等,熟悉设计模式、熟悉常用数据结构和算法,以及各种后端中间件。
- 6、人工智能
深度学习工程化开发,深度学习只是一项技术,它终归需要落地,想落地就需要工程化,人工智能目前可以落地的主要领域,个人认为主要还是安防和自动驾驶,这块都会使用C++开发,包括深度学习算法SDK,深度学习框架开发等。
相信很多同学的第一门编程语言是 C 语言,大多数高校都是选择 C 语言作为工科和计算机专业的公共基础课程, C 语言由于本身的灵活性和对硬件强大的操控能力,对学习计算机体系结构和原理也非常有帮助,同样的,为学习C++这样的面向对象高级编程语言打下良好的基础。
很多同学会问,C语言和C++到底有啥区别呢?学了C语言对学习C++有帮助吗?答案是肯定的。
C语言和C++有什么区别
- 两种语言的设计思想不一样,C语言面向过程编程,C++面向对象编程
- C++有更加丰富的 STL 标准库,包含各种容器、适配器、算法库,方便直接使用
- C++中内存分配的运算符是new和delete,包含了类型构造和析构;而在C语言中是malloc和free
- C++中类class的成员默认是私有的,而C语言中struct结构体成员默认是公有的
- C++引入了异常处理机制try和catch,可以捕获和处理异常
- C++函数可以重载,C语言不允许。在C++中允许有相同的函数名,不同参数类型的函数,分别实现不同功能,而这在C语言中是不允许
- C++和C语言都有指针,但C++还有引用,引用是变量的一个别名,甚至引用还区分左右值引用
- C++中用iostream类库做输入输出控制,C语言则用标准库的stdio函数库
下面我会推荐一些我学习 C++ 主要的途径是看经典教材、看视频公开课。
看的书包括计算机基础,也就是我们常说的计算机科班四件套:数据结构与算法、计算机组成原理、操作系统、计算机网络,这四门专业课程学完,就能够对计算机专业有基本的认识,不管你是科班还是非科班,自学还是跟着学校老师学,基础打牢就都具备计算机专业基本素养,以后学习任何一门编程语言都是水到渠成的事情。
之后要看 C++ 经典图书,C++ 是一门庞大且复杂的编程语言,包含 C++入门、C++进阶、现代C++这三个学习阶段。
工欲善其事必先利其器,好的书籍能让学习事半功倍。
计算机基础
考过CS或者软件工程研究生的同学可能对这个标题不陌生,是的,我说的就是专业课代号408的计算机基础综合。这门专业课包含:数据结构、计算机组成原理、计算机网路、操作系统。
为什么提起这门课程呢,因为基础知识太重要了!这是科班区别于培训班的最大不同,理论知识不一定马上能用于项目上,但当与人讨论起某个技术问题时你能够知道它深层次的原因,看问题的角度会更加全面和系统。
打个比方,你可能听过堆栈的名词,但知道它的具体结构和不同吗?学完数据结构就明白了;你知道计算机会算加减乘除,但具体是如何实现的呢?组成原理会告诉你;知道程序执行的时候怎么区分指令地址和数据地址的吗?操作系统会告诉你答案。
所以如果你大学不是计算机相关专业,或者是本专业但是没有完全吃透基础的话,强烈建议你务必抽时间好好学习这几门课程。
推荐书
计算机基础综合推荐看大学的计算机专业教材就可以:数据结构、计算机组成原理、计算机网路、操作系统。
- 数据结构
1.教材:《数据结构》严蔚敏 清华大学出版社 2.辅导书:《算法与数据结构考研试题精析(第二版)》机械工业出版社
- 计算机组成原理
教材:《计算机组成原理》唐朔飞 高等教育出版社 辅导书: 《计算机组成原理考研指导》徐爱萍 清华大学出版社 《计算机组成原理–学习指导与习题解答》唐朔飞 高等教育出版社
- 操作系统
教材:《计算机操作系统(修订版)》汤子瀛 西安电子科技大学出版社 辅导书:《操作系统考研辅导教程(计算机专业研究生入学考试全真题解) 》电子科技大学出版社 《操作系统考研指导》清华大学出版社
- 计算机网络
教材:《计算机网络(第五版)》谢希仁 电子工业出版社 辅导书:《计算机网络知识要点与习题解析》哈尔滨工程大学出版社
计算机基础视频教材
看上面的课本教程估计非常枯燥,下面是我觉得讲的不错的国内大学公开课,讲的都是计算机专业的基础内容,如果你没有系统的学过或者学的不好,非常建议刷一遍视频课的,国内大学的计算机公开课可以在慕课网和B站上学习,都是免费的,只要你想学习,大把的优质公开课资源。
这一小节写的有点多,因为基础实在是太重要了!科班和非科班的差距不是谁学的编程语言多,也不是谁框架用的溜,本质区别是理论知识储备差别和用CS思维独立思考分析解决问题的能力。
下面推荐的C++入门+进阶书,都是我在学习过程中收集和整理,直接分享给大家:
C++基础
《C++ Primer 》
豆瓣评分:9.4
这本书如果有 C 语言基础的话,一个寒假看完应该是可以的,我当初看的时候是有 C 语言基础的,所以看的比较快,大概花了一个月时间看完。
**初学者看的时候有很多不太理解的地方,很正常,跳过去没关系。**先快速过一遍,第一遍的目的就是熟悉概念,不求甚解。
虽然我花了半个月看完这本书,但是这本书一直放在我书桌上,每次遇到问题就会去翻阅来找答案,这样翻了将近 3 年,每次看都有不一样的体会,有时以前不理解的内容,在一次次遇到问题来查找的时候豁然开朗!
现在这本书还在手头,只是翻的次数变少了,封面已被我翻烂了。
我当初买的 《C++ Primer》 是第四版,现在你可以直接用第五版,本书所有示例均全部采用 C++11 标准改写,包含了最新 C++11 的语法特性说明,这些新特性现在很多开源项目、公司都有成熟的项目在使用了,初学的时候就一起学了没坏处。
《Effective C++》
豆瓣评分:9.5
在国际上,本书所引起的反响,波及整个计算机技术的出版领域,余音至今未绝。几乎在所有C++书籍的推荐名单上,这本书都会位于前三名。
非常经典的C++书籍,基本上学C++的人没有不知道这本书的。书中介绍了55个准则,每一条准则描述一个编写出更好的C++的方式。
作者高超的技术把握力、独特的视角、诙谐轻松的写作风格、独具匠心的内容组织,都受到极大的推崇和仿效。这本书不是读完一遍就可以束之高阁的快餐读物,也不是用以解决手边问题的参考手册,而是需要你去反复阅读体会的,C++ 是真正程序员的语言,背后有着精深的思想与无以伦比的表达能力,这使得它具有类似宗教般的魅力。
《More Effective C++》
豆瓣评分: 9.2
本书是Scott Meyers大师Effective三部曲之一。继Effective C++之后,Scott Meyers于1996推出这本书。虽然出版年代稍嫌久远,但《More Effective C++》并没有第2版,原因是当其出版之时(1996),C++ Standard已经几乎定案,本书即依当时的标准草案而写,其与现今的C++标准规范几乎相同。而且可能变化的几个弹性之处,Meyers也都有所说明与提示。
两者相比,《Effectiv C++》应该算是基础篇,《More Effectiv C++》这本则更注重工程实践方面,介绍C++的高级技术。里面提到的Reference Count,Virtual Construstor, Smart Pointer 这些技术在大型的C++项目都很常见。
C++进阶
《Inside the C++ Object Model》
豆瓣评分:9.1
这本书中文版《深度探索C++对象模型》翻译质量也很高,我是直接看的中文版深度探索C++对象模型。对于C++底层机制感兴趣的读者,这必然是一本让你大呼过瘾的绝妙好书。
本书专注于C++面向对象程序设计的底层机制,包括结构式语意、临时性对象的生成、封装、继承,以及虚拟——虚拟函数和虚拟继承。这本书让你知道:一旦你能够了解底层实现模型,你的程序代码将获得多么大的效率。
作者澄清了那些关于 C++ 额外负荷与复杂度的各种错误信息和迷思,但也指出其中某些成本和利益交换确实存在。他阐述了各式各样的实现模型,指出它们的进化之道及其本质因素。书中涵盖了C++对象模型的语意暗示,并指出这个模型是如何影响你的程序的。
《STL源码剖析》
豆瓣评分: 8.7
学习编程的人都知道,阅读、剖析名家代码乃是提高水平的捷径。源码之前,了无秘密。大师们的缜密思维、经验结晶、技术思路、独到风格,都原原本本体现在源码之中。
STL源代码并不算特别庞大,但如果初涉其中,一定会被各种形形色色的模板技巧、效率优化、看似杂乱的组织给迷乱了双眼。但作者于万军从中取上将首级,提干契领,很快便让读者抓住了主要脉落,但大刀阔斧之下又不丢失细节。尤其是在所有组件展开之前,优先介绍了空间配置器这一贯穿始终之物,为读者进入STL大门荡平了一大障碍,然后随着其对其它组件一一展开,酣畅淋漓。
这本书所呈现的源码,使读者看到vector的实现、list的实现、heap的实现、deque的实现、Red Black tree的实现、hash table的实现、set/map的实现;看到各种算法(排序、查找、排列组合、数据移动与复制技术)的实现;甚至还能够看到底层的memory pool和高阶抽象的traits机制的实现。
《C++编程思想》
豆瓣评分:8.6
本书是《C++编程思想》两卷的汇总。第1卷是在第1版的基础上进行了更加深入分析和修改后的第2版,其内容、讲授方法、选用实例以及配套的练习别具特色,可以供不同程度的读者选择阅读。第2卷介绍了C++实用的编程技术和最佳的实践方法,深入探究了异常处理方法和异常安全设计;介绍C++的字符串、输入输出流的现代用法;解释多重继承问题的难点,描述了典型的设计模式及其实现,特别介绍了多线程处理编程技术。
现代C++
《Effective Modern C++》
豆瓣评分:8.8
想要彻底理解 C++11 和 C++14,不可止步于熟悉它们引入的语言特性(例如,auto型别推导、移动语义、lambda表达式以及并发支持)。
挑战在于高效地运用这些特性——从而使你的软件具备正确性、高效率、可维护性和可移植性。这正是这本实用的图书意欲达成的定位。它描述的正是使用C++11和C++14——现代C++来撰写真正卓越的软件之道。
《现代C++教程:高速上手C++11/14/17/20》
这是一本开源电子书。
本书号称『高速上手』,从内容上对二十一世纪二十年代之前产生 C++ 的相关特性做了非常相对全面的介绍,读者可以自行根据下面的目录选取感兴趣的内容进行学习,快速熟悉需要了解的内容。
这些特性并不需要全部掌握,只需针对自己的使用需求和特定的应用场景,学习、查阅最适合自己的新特性。同时,本书在介绍这些特性的过程中,尽可能简单明了的介绍了这些特性产生的历史背景和技术需求,这为理解这些特性、运用这些特性提供了很大的帮助。
现代 C++ 指的是 C++11、C++14、C++17 甚至 C++20 引入的新特性,为传统 C++ 注入的大量特性使得整个 C++ 变得更加像一门现代化的语言。如何快速上手现代 C++ 特性,入门我推荐这本开源电子书:
推荐的书大家可以在下面获取,都是我在学习过程中收集和整理,分享给大家:
C++视频教程
侯捷 C++ 视频课程一直都被看过的同学广为推荐,最近发现 B 站关于侯捷老师的 C++ 视频课程几乎全部被下架了。
所以在网上找了下资源,找到了一套还算比较齐全的。包含了 :
- 侯捷C++ 标准 11 -14
- 侯捷STL 和 泛型编程
- 侯捷C++ 内存管理
- 侯捷C++面向对象高级开发
- 侯捷STL与泛型编程
- C++ 程序的生前和死后
- ….
Linux系统基础和shell script
**如今几乎所有的互联网服务都是跑在linux系统上面的。**对Linux系统一无所知那更加谈不上后台开发了,所以要先学习linux系统操作,不如文件管理,系统命令,文件系统,权限管理,系统服务等。
至于shell script 就类似win的批处理脚本,相信我,你在linux下干活早晚会需要它,所以趁早系统学起来。
推荐书:
《鸟哥的Linux私房菜基础学习篇》 这个系列还有一个服务器架设篇,前期学习个人感觉没必要看
Linux环境高级编程
**普通用户只需懂系统操作,软件开发人员还要懂编程接口。**上一阶段你已经能够完成熟练操作Linux系统,知道一些常规的系统命令和服务,并且能够利用shell script写一些小工具提高日常开发效率。
我们的目标是星辰大海,作为软件工程师,还需要更加深入的掌握linux系统编程技巧,学习系统编程接口、系统调用API、内存管理、进程间通信(IPC),这是本阶段的学习目的。
推荐书:
《UNIX环境高级编程》 这本是linux编程必看的APUE,强烈推荐通读一遍,后续值得反复翻阅。
《Linux/UNIX系统编程手册》 这本书和APUE有点重复,我看完APUE这本就跳着看了,平常可以看目录查阅。
TCP/IP协议
目前网络通信中应用最广泛的协议就是IP TCP协议,后面Unix提供的TCP套接字也是基于协议实现,所以很有必要系统的学习 TCP/IP 协议。
推荐书:
大学的计算机网络教程
《TCP/IP详解 卷3:TCP事务协议、HTTP、NNTP和UNIX域协议》
这几本书很厚,可以先看卷1、卷3
Linux网络编程
在同一台机器上进程间的通信(IPC)有多种方式,可以是通过消息队列、FIFO、共享内存等方式。网络编程套接字是指:分布在不同机器上的程序通过系统提供的网络通信接口,跨越网络将不同机器上的进程连接起来,实现跨机器的网络通信。一般有UDP套接字、TCP套接字、Unix Domain,当然,如果你是通信从业者对SCTP套接字肯定也不会陌生。
推荐书:
数据库和存储
**程序运行数据都在易失性的内存中,需要持久化存储时就需要数据库。**一个后台服务系统一般来说都需要考虑数据落地和持久性存储的问题,这时就会涉及到数据库选型和应用,数据库分为关系型数据库和非关系型数据库。
**关系型数据库:**指采用了关系模型来组织数据的数据库,代表是MySql。 关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
**非关系型数据库:**以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,不局限于固定的结构,可以减少一些时间和空间的开销。代表有redis、memcached,腾讯内部组件ckv也是非关系型数据库。
推荐书:
以上推荐的书大家可以在下面获取,都是我在学习过程中收集和整理,分享给大家:
算法基础
计算机算法就是利用编程语言编写出计算机能理解的解决问题的方法。
好的算法能更简洁高效的解决问题,如今不论是校招还是社招,大厂笔试都会考察算法,即使不是为了笔试作为软件从业者也应该经常练习算法,保持手感。学习算法是学习解决问题的通用性方法有助于提高逻辑思维能力。
学习方法
就我个人经验来说,不推荐直接啃书的方式学习算法,建议看书的同时结合刷在线编程算法题的方式。
具体的:边看数据结构或算法导论,同时在牛客或者 leetcode上刷题,因为看书太枯燥很容易失去耐心,在线刷题的好处是你可以每天定目标,享受每个题目通过的快感,有正向反馈更容易坚持下来。
架构能力
**架构能力是利用已有知识来设计整个后台服务系统的能力。**不仅要求掌握技能的维度还要深度,需要能根据不同需求和系统约束,制定不同的设计方案。
这时候考虑的东西会更多,包括服务模型的设计:是多进程还是多线程甚至协程微线程,分布式还是集中式;
存储的选型:考虑数据库选型用哪个?需要根据存储的数据特征和应用场景来区分,如果是社交应用的数据用非关系型数据库来存储可能更好,如果是电商订单类型的数据,那么用关系型数据库来存储可能更好;
当然,还有后台系统的其他方方面面需要考虑,不一一举例了。
更多的练习
**说了这么多,最最重要的还是练习练习练习。**理论知识储备是必要条件,移动互联网时代大家接触到的碎片化信息太杂太乱,我个人经验,高浓度的知识精华还是需要在大师的书本中汲取,所以看书是最正确和快速的学习路径,没有捷径可走。
不过光看书也是不行,编程能力和技术是也是一门现代手艺活,还需要日常不断的打磨手艺,正如一万小时定律:
人们眼中的天才之所以卓越非凡,并非天资超人一等,而是付出了持续不断的努力。1万小时的锤炼是任何人从平凡变成世界级大师的必要条件。要成为某个领域的专家,需要10000小时,按比例计算就是:如果每天工作八个小时,一周工作五天,那么成为一个领域的专家至少需要五年。这就是一万小时定律。
怎么打磨提高编程技术能力呢?找项目,找感兴趣的东西用代码去实现它,兴趣是最好的老师,这点在编程和技术学习上也完全适用。
人们总倾向于去做快速获得的愉悦感的事情,比如打一盘游戏30分钟就能获得快感。相反,技术碎片的提高是一个长期的过程,三分钟热度肯定是难以成功的。
所以要用技术做自己感兴趣的东西和带趣味性的编程,比如写个爬虫小程序抓取网站数据或者写个小游戏,再或者自己造轮子给自己用,并乐此不疲的优化轮子。这样每走一步都能获得一点成就感,激励自己继续走下去,慢慢的一定会有质的飞跃。
C++练手项目
既然要多练习,最快的方式就是找到一些练手项目,因此,柠檬哥这里也推荐一些练基础的C++开源项目,有小型的也有大型成熟的,项目涉及后台开发组件包括:网络库、RPC框架、数据库、配置文件处理、消息队列、序列化等等。
下面这个项目,我想最先推荐。
Google开源代码规范
我们学习开源项目源码,但是自己写代码的时候,良好的代码规范也必不可少,这方面可以参考Google 开源代码规范。
C++ 是 Google 大部分开源项目的主要编程语言,正如每个 C++ 程序员都知道的, C++ 有很多强大的特性, 但这种强大不可避免的导致它走向复杂,使代码更容易产生 bug,难以阅读和维护。
本指南的目的是通过详细阐述 C++ 注意事项来驾驭其复杂性. 这些规则在保证代码易于管理的同时, 也能高效使用 C++ 的语言特性.
这个代码规范的PDF文档可以在下面下载:
项目主页:https://github.com/zh-google-styleguide/zh-google-styleguide
数据库
cpp_redis
项目主页:https://github.com/Cylix/cpp_redis/
C++11 Lightweight Redis client: async, thread-safe, no dependency, pipelining, multi-platform
这是一个 C++11编写的轻量级 Redis 客户端,具有异步、线程安全、无依赖、pipelining、跨平台等特性。代码量不大,可以学习如何编写一个简洁高效的网络通信客户端程序,另外项目采用了C++11编写,通过这个开源项目,你还可以学习如何使用这些语言新特性。
LevelDb
项目主页:https://github.com/google/leveldb
由 Google 的两位工程师 Sanjay Ghemawat 和 Jeff Dean 开发的键/值对(Key/Value Pair)嵌入式数据库,具有很高的随机写,顺序读/写性能,采用 LSM树 (Log Structured-Merge Tree)实现,LSM树的核心思想就是放弃部分读的性能,换取最大的写入能力.
关于LevelDb 详细内容学习可参考教程:
https://kevins.pro/leveldb_chinese_doc.html
https://leveldb-handbook.readthedocs.io/zh/latest/basic.html
文件解析器
在后台项目中需要经常处理配置文件解析工作,这些配置文件可以是XML、JSON或者是YAML等格式的标记语言文件,下面这几个项目就是几个不错的文件解析器,代码可读性好。
C++ JSON 解析器
JSON++ is a light-weight JSON parser, writer and reader written in C++. JSON++ can also convert JSON documents into lossless XML documents.
用C++写的轻量级 JSON 解析器,同时还可以将 jSON 文档转换成 XML 文档
项目主页:https://github.com/hjiang/jsonxx
迷你的C++11 JSON库
json11 is a tiny JSON library for C++11, providing JSON parsing and serialization.
同样是是个mini JSON 库,仅 1个 CPP 文件和一个头文件,方便的嵌入到自己的项目中
项目主页:https://github.com/dropbox/json11
TinyXML
我们经常需要在项目中处理 XML 配置文件,有没有想过自己编写一个简单通过的XML解析器,这里就是一个用C++ 编写的,非常简单小巧的 XML 解析器,可以很容易地集成到其它项目中,出于C++学习目的的话,你也可以把代码下载下来学习练手。
项目主页: http://sourceforge.net/projects/tinyxml/
yaml-cpp
YAML 也是一种类似XML和JSON一样的配置文件语言,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言),是专门用来写配置文件的语言,相比 JSON 更加简洁和方便阅读。
这个项目就是一个用cpp写的yaml文件解析器,项目代码量也不大,结构清晰,可以用作学习参考。
项目主页:https://github.com/jbeder/yaml-cpp
如果说前面的是练手,那下面介绍的项目会高级一些。
下面会介绍几个 C++ 后台开发中,具有代表性的项目和开源框架,做后台开发,这些项目你或多或少会使用到,了解一些项目源码自然更好。
网络库
Muduo
https://github.com/chenshuo/muduo
说到开源网络库,就不得不提 muduo ,它是一个基于 Reactor 模式的现代 C++ 网络库,采用非阻塞 IO 模型,基于事件驱动和回调,原生支持多核多线程,适合编写 Linux 服务端多线程网络应用程序。
muduo 是知乎大神陈硕开发,基于 Reactor 模式,Redis和Java的Netty库也是采用这种模式实现,具有如下特点:采用非阻塞 IO 模型、基于事件驱动和回调,原生支持多核多线程。
学习 moduo 源码可以配合陈硕的《Linux多线程服务器端编程》,这本书以muduo 网络库为例,讲解这种编程模型的使用方法及注意事项,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。
消息队列
后端开发常用到消息队列,消息队列是分布式系统中重要的组件,主要解决了应用耦合、异步处理、流量削锋等问题。
消息队列在实际应用中包括如下四个场景:
- 应用耦合:多应用间通过消息队列对同一消息进行处理,避免调用接口失败导致整个过程失败;
- 异步处理:多应用对消息队列中同一消息进行处理,应用间并发处理消息,相比串行处理,减少处理时间;
- 限流削峰:广泛应用于秒杀或抢购活动中,避免流量过大导致应用系统挂掉的情况;
- 消息驱动的系统:系统分为消息队列、消息生产者、消息消费者,生产者负责产生消息,消费者(可能有多个)负责对消息进行处理;
消息队列详细介绍参考:https://cloud.tencent.com/developer/article/1006035
业界有名的 zeromq 核心代码也是用 C++ 编写,如果想深入研究消息队列,可以从这入手试试,下面给出项目主页和门户网站。
https://github.com/zeromq/libzmq
序列化
- 序列化: 将数据结构或对象转换成二进制串的过程
- 反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程
数据结构、对象与二进制串
不同的计算机语言中,数据结构,对象以及二进制串的表示方式并不相同。
数据结构和对象:对于类似Java这种完全面向对象的语言,工程师所操作的一切都是对象(Object),来自于类的实例化。在Java语言中最接近数据结构的概念,就是POJO(Plain Old Java Object)或者Javabean--那些只有setter/getter方法的类。而在C++这种半面向对象的语言中,数据结构和struct对应,对象和class对应。
二进制串:序列化所生成的二进制串指的是存储在内存中的一块数据。C++语言具有内存操作符,所以二进制串的概念容易理解,例如,C++语言的字符串可以直接被传输层使用,因为其本质上就是以’\0’结尾的存储在内存中的二进制串。在Java语言里面,二进制串的概念容易和String混淆。实际上String 是Java的一等公民,是一种特殊对象(Object)。对于跨语言间的通讯,序列化后的数据当然不能是某种语言的特殊数据类型。二进制串在Java里面所指的是byte[],byte是Java的8中原生数据类型之一(Primitive data types)。
序列化参考链接: https://tech.meituan.com/2015/02/26/serialization-vs-deserialization.html
Protobuf
Protocol Buffer (简称Protobuf) 是Google 出品的性能优异、跨语言、跨平台的序列化库。
项目主页:https://github.com/protocolbuffers/protobuf
教程参考:Protobuf 终极教程
RPC
RPC (Remote Procedure Call)
远程过程调用是一个计算机通信协议。我们一般的程序调用是本地程序内部的调用,RPC
允许你像调用本地函数一样去调用另一个程序的函数,这中间会涉及网络通信和进程间通信,但你无需知道实现细节,RPC
框架为你屏蔽了底层实现。RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过**「发送请求-接受回应」**进行信息交互的系统。
推荐几个RPC开源项目,供学习研究,先从简单的玩具项目入手:
rest_rpc
https://github.com/qicosmos/rest_rpc
c++11, high performance, cross platform, easy to use rpc framework.
It’s so easy to love RPC.
Modern C++开发的RPC库就是这么简单好用!
rest_rpc是一个高性能、易用、跨平台、header only的c++11 rpc库,它的目标是让tcp通信变得非常简单易用,即使不懂网络通信的人也可以直接使用它。 可以快速上手,使用者只需要关注自己的业务逻辑即可。
再介绍几个业内成熟的后台开发RPC框架:
谷歌gRPC
谷歌开源的高性能远程过程调用系统。
在 gRPC 里_客户端_应用可以像调用本地对象一样直接调用另一台不同的机器上_服务端_应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个_服务_,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个_存根_能够像服务端一样的方法
中文官方文档:https://doc.oschina.net/grpc?t=58008
项目主页:https://github.com/grpc/grpc
百度brpc
百度内最常使用的工业级RPC框架, 有1,000,000+个实例(不包含client)和上千种多种服务。“brpc"的含义是"better RPC”。
你可以使用它:
-
搭建能在一个端口支持多协议的服务, 或访问各种服务
-
restful http/https, h2/gRPC。使用brpc的http实现比libcurl方便多了。从其他语言通过HTTP/h2+json访问基于protobuf的协议.
-
hadoop_rpc(可能开源)
-
支持rdma(即将开源)
-
支持thrift , 线程安全,比官方client更方便
-
各种百度内使用的协议: baidu_std, streaming_rpc, hulu_pbrpc, sofa_pbrpc, nova_pbrpc, public_pbrpc, ubrpc和使用nshead的各种协议.
-
Client支持同步、异步、半同步,或使用组合channels简化复杂的分库或并发访问。
-
通过http界面调试服务, 使用cpu, heap, contention profilers.
-
获得更好的延时和吞吐.
-
把你组织中使用的协议快速地加入brpc,或定制各类组件, 包括命名服务 (dns, zk, etcd), 负载均衡 (rr, random, consistent hashing)
腾讯tars
腾讯开源的RPC框架
TARS是Linux基金会的开源项目,它是基于名字服务使用TARS协议的高性能RPC开发框架,配套一体化的运营管理平台,并通过伸缩调度,实现运维半托管服务。
TARS是腾讯从2008年到今天一直在使用的后台逻辑层的统一应用框架,覆盖腾讯100多个产品。目前支持C++,Java,PHP,Nodejs,Go语言。该框架为用户提供了涉及到开发、运维、以及测试的一整套解决方案,帮助一个产品或者服务快速开发、部署、测试、上线。 它集可扩展协议编解码、高性能RPC通信框架、名字路由与发现、发布监控、日志统计、配置管理等于一体,通过它可以快速用微服务的方式构建自己的稳定可靠的分布式应用,并实现完整有效的服务治理。
目前该框架在腾讯内部,各大核心业务都在使用,颇受欢迎,基于该框架部署运行的服务节点规模达到上万个。
TARS-CPP项目主页: https://github.com/TarsCloud/TarsCpp
搜狗srpc
这是搜狗自研的RPC系统,主要功能和特点:
-
这是一个基于Sogou C++ Workflow的项目,兼具:
-
高性能
-
低开发和接入门槛
-
完美兼容workflow的串并联任务流
-
对于已有pb/thrift描述文件的项目,可以做到一键迁移
-
支持多种IDL格式,包括:
-
Protobuf
-
Thrift
-
支持多种数据布局,使用上完全透明,包括:
-
Protobuffer serialize
-
Thrift Binary serialize
-
json serialize
-
支持多种压缩,使用上完全透明,包括:
-
gzip
-
zlib
-
snappy
-
lz4
-
支持多种通信协议,使用上完全透明,包括:
-
tcp
-
http
-
sctp
-
ssl
-
https
-
用户可以通过http+json实现跨语言:
-
如果自己是server提供方,用任何语言的http server接受post请求,解析若干http header即可
-
如果自己是client调用方,用任何语言的http client发送post请求,添加若干http header即可
-
内置了可以与其他RPC框架的server/client无缝互通的client/server,包括:
-
BPRC
-
Thrift Framed Binary
-
Thrift Http Binary
-
兼容workflow的使用方式:
-
提供创建任务的接口来创建一个rpc任务
-
可以把rpc任务放到任务流图中,回调函数里也可以拿到当前的任务流
-
workflow所支持的其他功能,包括upstream、计算调度、异步文件IO等
项目主页:sogou/srpc
单元测试
Google Test
程序写的好,单元测试少不了。现在流行的软件开发模式「测试驱动开发」,学习使用单元测试保证代码健壮性,Google 的开源 C++ 单元测试框架 Google Test 也称为 gtest ,提供了丰富的断言和各类比较操作。
断言
gtest 使用一系列断言的宏来检查值是否符合预期,主要分为两类:ASSERT 和 EXPECT。区别在于 ASSERT 不通过的时候会认为是一个 fatal 的错误,退出当前函数(只是函数)。而 EXPECT 失败的话会继续运行当前函数,所以对于函数内几个失败可以同时报告出来。通常我们用 EXPECT 级别的断言就好,除非你认为当前检查点失败后函数的后续检查没有意义。
项目主页: https://github.com/google/googl
C++工具网站
学习 C++ 不能死记硬背,我当初在看完C++ Primer第一遍的时候,很多概念似懂非懂,后面再项目中遇到问题再回头查找书本的知识点,一般人很难看一遍书就学会技术,除非你天赋过人。但是对于一些函数和接口的参数说明,再经典的书也没有官方文档和库函数手册清晰明了。
随着学习的深入,我积累了一些非常实用的 C++ 工具网站,这些网站有些是语言参考类的手册比如cplusplus、有些列举C++学习中常见的问题,有些是 C++ 学习资源合计,比如Awesome C++ 就是这样一个综合类资源项目。
下面,柠檬哥把这些实用的宝藏网站介绍给大家。
cplusplus
https://www.cplusplus.com/reference/algorithm/
这个网站柠檬哥平常用的最多,网站对c++的知识点做了非常全面的总结,你可以把它作为c++编程参考手册,参考手册划分为这么几个主要模块:C库、标准库容器、输入输出IO、多线程,每个头文件和函数用法都做了非常详细的解释说明,并且这些代码都是可以直接在网站在线运行的,可以在线查看代码执行情况,对学习使用非常有帮助!
cppreference
https://en.cppreference.com/w/ 英文首页
https://zh.cppreference.com/w/ 中文首页
cppreference 即 C++ 参考手册,这个网站始终也是我的首选,因为它非常简洁,可读性也很强,不但更新及时(已经到 C++20 了),还提供了很好的示例。
网站支持多种语言,对于英文不好的同学可以选择中文阅读,但我建议直接阅读英文版本,学习编程语言最好直接看英文手册说明,技术名词翻译过程中难免会有疏漏。
learncpp
http://LearnCpp.com 是一个免费网站,致力于教您如何使用 C++ 编程。无论您之前是否有过任何编程经验,本网站上的教程都将引导您完成编写、编译和调试 C++ 程序的所有步骤,并附有大量示例。 成为专家不会一蹴而就,但只要有一点耐心,你就会到达那里。 http://LearnCpp.com 将为您指明方向。
Tutorialspoint
Tutorialspoint 是一个编程技术学习网站,网站不仅提供C++语言学习,还有你想学的任何技术或编程语言学习指南,比如Java、Python、HTML、Scala等等,当然包括C++,更重要的是都提供了非常详细的教程,收藏就对了!
https://www.tutorialspoint.com/cplusplus/index.htm
Awesome C++
https://github.com/fffaraz/awesome-cpp
https://github.com/jobbole/awesome-cpp-cn 中文版
Awesome-C++是Github上一个关于C++资源和学习资料的开源项目,内容包括:标准库、Web 应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等内容,有中文版也有英文版,可以说几乎涵盖所有C++方向和资源,绝对的硬核干货。
C++ FAQ
这是一个收集C++ 常见问题的网站,在学习或者实际项目工程中遇到的很多问题都能找到答案,而且更新也很及时,可以找到C++14和C++11这样的现代 C++高级主题。
总结
作为个人目前觉得对于对c/c++后台开发体系总结完善程度最为详细的学习路线,来自于零声教育的这份学习提升路线:
主要从七大模块提升:
- 精进基石(数据结构于算法、设计模式等等)
- 高性能网络设计(网络编程、网络原理等等)
- 基础组件设计(池式组件、高性能组件等等)
- 中间件开发(MySQL、redis等等)
- 开源框架(skynet、dpdk等等)
- 性能分析
- 分布式架构(消息队列、分布式服务、API网关等等)
LinuxC++后台开发文档视频+代码资料学习路线免费领取docs.qq.com/doc/DYU5FYm50dnltV0RG
如果是想在c/c++后台开发方向得到有效的快速提升(不是所谓的速成),他们的课程体系是大家绕不过的具有参考意义的提升路线。从学习路线中可以对c/c++后台开发方向的技术栈体系有一个清晰的认识。
从他们的高概率的大厂学员offer反馈可以对c++后台开发这个岗位在目前市场上的需求和薪资有一个更加深层次的了解。
所以不管学习与否,对于这样一个完善详细的提升技术路线,是值得大家去获取参考的。
LinuxC++后台开发文档视频+代码资料学习路线免费领取docs.qq.com/doc/DYU5FYm50dnltV0RG
七、配套推荐给大家学习的参考书籍
- MySQL:《高性能MySQL第3版》
- Nginx:《深入理解Nginx:模块开发与架构分析(第2版)》(陶辉)
- Redis: Redis设计与实现(黄健宏)
- Linux内核:《深入理解Linux内核架构》(郭旭译)
- 数据结构与算法:《算法导论》(第3版)
- 性能分析:《性能之巅洞悉系统、企业与云计算》
- MongoDB:《MongoDB权威指南》
- Ceph:《Ceph分布式存储学习指南》(Ceph中国社区)
- Docker:《Docker容器与容器云(第2版)》
- TCP/IP:《Tcp/lp详解卷一卷二卷三》
- Linux系统编程:《Unix环境高级编程》
- 计算机:《深入理解计算机系统》
- DPDK:《深入浅出DPDK》
兴趣其实就是你会很乐意去做并且即使很累也不会叫苦的事
方向
- 后台开发
- 桌面客户端
- 网络安全/逆向
- 音视频/流媒体/SDK
- 自动驾驶/机器学习/人工智能
- 图形学/计算机视觉/数字图像处理
- 数据分析
- 虚拟现实仿真/VR/AR
- 游戏开发
- 嵌入式/物联网
- 测试开发
后台学习路线
- 编程基本功扎实,掌握 C/C++/JAVA 等开发语言、常用算法和数据结构;
- 熟悉 TCP/UDP 网络协议及相关编程、进程间通讯编程;
- 了解 Python、Shell、Perl 等脚本语言;
- 了解 MYSQL 及 SQL 语言、编程,了解 NoSQL, key-value 存储原理;
- 全面、扎实的软件知识结构,掌握操作系统、软件工程、设计模式、数据结构、数据库系统、网络安全等专业知识;
- 了解分布式系统设计与开发、负载均衡技术,系统容灾设计,高可用系统等知识。 包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK
2025/2/23
MSYS2 MinGW (Minimalist GNU for Windows)是一个适用于 Windows 平台的编译工具链,提供了 GNU 工具集, GCC (GNU Compiler Collection)编译器 LLVM (Low Level Virtual Machine)开源的编译器框架 Clang 是LLVM最著名的 C/C++ 编译器前端,不仅是一个编译器,还包含许多工具(如调试器、静态分析工具等)来帮助开发者优化和调试代码
参考资料
现代 C++ 教程:高速上手 C++ 11/14/17/20 现代 C++ 教程:高速上手 C++ 11/14/17/20 C++ reference C++ reference
碎碎念
参考资料以上的都是复制粘贴的,我还没有整理。以下也是碎片化的知识点。
在 cstdlib 中,有 EXIT_SUCCESS 和 EXIT_FAILURE 宏。
#pragma once
和 宏定义控制 同时使用,后者就相当于保障。
- Google C++ Style Guide:推荐使用前缀 _ 来表示私有成员变量。这种方法常见于很多公司和开源项目中。
- LLVM Coding Standards:倾向于使用 m_ 前缀来标识类的成员变量。例如 m_history。这种方法相比前缀 _ 更具描述性。
- C++ Core Guidelines:也推荐使用类似 m_ 或其他前缀来区分成员变量,虽然它并不强制要求某种方式。
栈
g++ / MinGW:默认 2MB Clang (MSYS2):默认 1MB MSVC (cl.exe):默认 1MB
linux 用 ulimit 查看 shell 配置的栈空间大小,windows用 vs 的 dumpbin
1D:\env\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.40.33807\bin\Hostx64\x64>dumpbin.exe /HEADERS E:/work/doit/solve/test.exe | findstr stack
2 100000 size of stack reserve
3 1000 size of stack commit
1# linux
2g++ -Wl,--stack,8388608 -o my_program my_program.cpp # 8MB 栈
3clang++ -Wl,--stack,8388608 -o my_program my_program.cpp
4
5# windows
6g++ -Wl,--stack,8388608 -o my_program my_program.cpp
7clang++ -Wl,--stack,8388608 -o my_program my_program.cpp
8
9# linux
10ulimit -s 65536 # 临时设置 64MB 栈
11
12# windows vs
13editbin /STACK:8388608 my_program.exe