💓博主CSDN主页:杭电码农-NEO💓
⏩专栏分类:C++从入门到精通⏪
🚚代码仓库:NEO的学习日记🚚
🌹关注我🫵带你学习C++
🔝🔝
C++拓展
- [1. 前言](#1. 前言)
- [2. 语言层面](#2. 语言层面)
- [3. 设计模式层面](#3. 设计模式层面)
- [4. 开源组件层面](#4. 开源组件层面)
-
- [4.1 RPC框架](#4.1 RPC框架)
- [4.2 web应用框架](#4.2 web应用框架)
- [4.3 缓存组件](#4.3 缓存组件)
- [4.4 任务队列](#4.4 任务队列)
- [4.5 搜索组件](#4.5 搜索组件)
- [5. 开源数据库层面](#5. 开源数据库层面)
- [6. 开源存储系统层面](#6. 开源存储系统层面)
- [7. 高性能服务器层面](#7. 高性能服务器层面)
- [8. 总结以及拓展](#8. 总结以及拓展)
1. 前言
前端时间一直在忙秋招, 没有时间写博客, 这篇文章将从语言, 设计模式, 开源组件, 开源数据库, 开源存储系统, 以及高性能服务器的角度, 带大家剖析一下, 校招生的拓展知识应该从哪些方面去学习
注: 本篇文章仅是个人观点, 文章中没有提到的技术不代表他不常用(可能是我太菜了没听过). 且本篇文章主要针对互联网的后端开发岗位而言,如果你学完了基础的知识,并且不知道如何继续学习什么东西, 希望这篇文章能对你有所帮助
2. 语言层面
我是学C++出生的, 据我所知, 现在的很多公司的后端技术栈中, 用到C++的并不多, 只有涉及到推广搜, 高性能服务器, 智能驾驶这一类对性能有极高要求的场景, 会使用到C++. 大部分场景用Java, GO, python就能解决问题
以下是我对语言层面的理解:
个人拙见,C++比较适合作为计算机初学者学习整个计算机体系内容的母语, 由于C++涉及到很多底层的优化和知识, 并且和服务器紧密联系, 对于我们的整个大厦的地基建造是大有好处的. 如果一上来就学习GO或python, 有一些底层的知识是空缺的, 对未来的发展不太友好. 其次, 掌握好C++后, 去学习Java或GO我认为是有必要的(毕竟语言转换成本不高). 真正到了公司后, 什么场景下适合用什么语言就使用什么语言, 而不是看你会什么语言
综上所述:
对于后端开发而言, 语言并不是最大的问题, 只要掌握好一门语言, 懂得底层原理, 对于校招生来说就很厉害了
3. 设计模式层面
现在市面上你会看见许多的设计模式, 什么工厂模式, 观察者模式...设计模式这么多, 这些我们都需要完全掌握吗?设计模式这么多, 应该怎样使用?怎样学习?
以下是我对设计模式的理解:
个人拙见, 设计模式不用都去学习一遍, 其实我们要做的是, 真正的理解设计模式的精髓: 对拓展开发, 对修改关闭这句话. 并且在我们使用设计模式时, 不应该看我们的项目场景能不能照搬某个设计模式的思路, 我认为正确的思考方式是: 先思考我们的项目有哪些地方可以被抽象出来, 再结合设计模式的精髓, 设计出自己的一个代码框架, 最后再根据此框架去查看它属于哪个设计模式. 这样对我们的技术能力会有很大的帮助
综上所述:
对于设计模式而言, 要摸透它的精髓, 并且经过实战不断的积累经验
4. 开源组件层面
4.1 RPC框架
RPC调用由于其超高的性能, 在公司内网, 或微服务架构中被广泛使用, 对于RPC的内容, 我推荐大家去了解一下以下几个知识点:
- RPC是什么?
- 为什么有了HTTP还要有RPC?
- 什么场景下用RPC,什么场景下用HTTP?
- protobuf是什么?
- 为什么PB比json和xml快?
- 有哪些常用的RPC框架?(实操RPC调用)
4.2 web应用框架
web应用框架, 诸如spring boot,node.js,可以快速用于搭建项目的结构, 以及配置项目的环境等等, 使用一些应用框架能极大的提高后端的研发效率,有兴趣可以下来细究
4.3 缓存组件
公司比较常用的缓存组件: redis,memcached. 它们常用于数据库查询优化和系统性能优化(如存储热点数据),对于缓存组件问题, 比较热门的是与redis相关的, 可以了解以下几个知识点:
- redis是什么? 为什么要有它?
- redis常用于什么场景?
- redis集群架构通常是如何设计的?
- redis是如何解决, 缓存击穿,缓存穿透,缓存雪崩等问题的?
4.4 任务队列
在公司内面对高并发场景时, 常常会使用任务队列, 也就是消息队列, 消息队列通过用于异步解耦, 削峰填谷的场景. 比较常用的消息队列有: Kafka,RockMQ,RabbitMQ. 对于消息队列, 可以了解以下几个知识点:
- 消息队列是什么? 为什么要有它?
- Kafka通过什么策略来实现: 高性能, 高可用, 高拓展的?
- 为什么RockMQ抄袭了Kafka的设计, 吞吐量却没有Kafka高?
4.5 搜索组件
在面对大量数据的海量查询或海量数据的实时分析时, 经常会用到搜索组件Elasticsearch(ES)或solr, 如电商平台搜索商品, 社交平台搜索博主. 对于搜索组件, 你可以了解一下以下的问题:
- ES是什么? 什么场景下会使用到?
- ES是通过哪些策略来保证它搜索效率的?
- 什么时候用ES,什么时候用数据库?
5. 开源数据库层面
首先, 先对数据库进行一个分类: 关系式数据库, 非关系式数据库, 行式存储数据库, 列式存储数据库. 比较常见的数据库有: MySQL, 行式存储的关系式数据库, postgresql,行式存储的关系式数据库, mongodb, 行式存储的非关系式数据库, click house, 列式存储的关系式数据库
对于数据库, 可以了解以下知识点:
- 关系式数据库和非关系式数据库有什么区别?
- 行式存储和列式存储有什么区别?
- 怎样根据业务选择不同的数据库?
- postgresql对比MySQL有哪些优势?
- 为什么postgresql的查询效率比MySQL高?
- mongodb在什么场景下使用的较多?
- click house是如何保证查询效率的?
- LSM tree是什么? 有什么用?
- MySQL的索引底层是什么?
- MySQL的事务是什么?
- MySQL的事务的不同隔离级别的实现原理?
- MVCC是什么? 使用场景有哪些?
其实还有很多优秀的数据库, 但是对于数据库而言, 并不是让我们学习所有的数据库种类, 旨在让大家了解这些优秀的数据库的底层是如何设计的才能做到如此优秀的性能, 才会这么多人去用
6. 开源存储系统层面
存储组件有许多使用场景, 比如: 文件存储场景: 企业文档管理, 静态资源管理等. 对象存储场景: 云存储服务, 大数据存储, 音视频图片存储等. 对于存储系统, 可以了解一下以下几个知识点:
- 为什么要有存储组件? 直接使用数据库不行吗?
- 业内有哪些常用的存储组件?(分种类)
- 什么场景下应该选择什么类型的存储组件?
- 阿里巴巴和百度都有大规模的Hadoop集群,它们的用处是什么?为什么要选择Hadoop?
- 一些常用的存储组件, 如Amazon,Hadoop,它们是怎样做到高拓展, 高可用的?
7. 高性能服务器层面
后端开发往往是和服务器打交道, 所以对于服务器的技术栈也要过硬! 对于服务器而言, 老生常谈的问题无非就是: 怎样做高并发?怎样做低延迟? 这里我抛出几个问题留给同学们思考一下:
- 高性能服务器的设计需要考虑哪些点?
- Reactor模式是什么? 有几种实现方式? 哪种方式并发量最高?
- 什么场景下用epoll实现高并发? 什么场景下用AIO实现高并发?
- 当一台机器扛不住压力时, 应该怎么办?(负载均衡)
- 怎样设计项目的架构, 使得项目既能处理大量请求, 又能做好容灾处理?
- 怎样优化服务器性能?(从算法层面, 并发层面, 网络层面, 数据库层面)
- 最后推荐大家阅读: <<高性能服务器的设计>>一书,后端程序员的宝典
8. 总结以及拓展
当然, 对于校招的后端技术栈学习远远不止于此, 像C++中的一些开源组件, 如TCmalloc,ABseil-CPP,Folly. 以及C++中关于编译的组件: cmake, bazel. 当然还有容器化技术: docker, k8s等, 都值得我们去探讨, 去学习.
最后我想告诉大家的是, 学习以上所有的内容并不是为了应付面试的, 而是在你学习这些优秀思想的的同时, 你的认知, 你的技术能力会得到质的提升, 当你下次再遇见相似的问题, 曾经学过的知识会浮现在你的脑海, 助你度过难关. 所以, 加油吧少年, 做后端程序员一定要对技术保持热爱, 这才是我们工作,学习的动力.
希望我的文章能对你有所帮助
- 最后在此特别鸣谢我在实习期间的一位同事davia,davia让我学到了后端中很多常用且优秀的知识,对我个人能力的提升有很大帮助!