C++服务器研发精进

2023-05-16

一袭青衫闯帝都,回首已然四春秋。
壮志未酬心未老,抚膺身衰发已疏。

转眼间已经工作四年有余,回想刚毕业的懵懂无知,仿佛就在昨日,成长乎?徒增岁月矣。理想中的职业生涯应该是目标明确,按部就班的成长,一步一个脚印,就像游戏打怪升级一样,然而生活毕竟不是游戏,从来没有指导教程。多数时候都是盲人摸象,困苦迷茫自不待言。

因为生活中无师可询,我也曾多次求助于网络,然而多数文章都在推荐一些绝对正确的书籍来看,至于为什么看,怎么看,却罕有言语。今天写文记录下自己的技术感悟,斗胆以进阶做名,也是希望对同样迷茫的同行有所启发或共鸣。

C++的应用领域不胜枚举,我目前主要从事的是Linux 服务器的开发工作,要习得这块儿的开发技能,我以为主要有以下几个模块的知识:

1、计算机语言。

2、计算机网络。

3、操作系统。

4、数据库。

计算机语言

首先要明确一个观点,语言只是工具,没有高低贵贱之分。虽然到处都有计算机语言鄙视链的说辞,权当一笑,谁认真谁就输了。套在武侠世界里,语言算是拳脚功夫,真正重要的是内功,何为内功?窃以为编程思想是为内功。人的行为行事,无不是以思想作为指导,程序编程盖莫如是。只会拳脚而不修内功,犹如作文徒有修辞而缺乏内涵,花哨有余,嚼劲不足。熟练掌握编程思想的人,草木竹石皆可为剑,再论语言之高低,何其谬也。

因为我自己主要使用的语言是C++,所以在这里归纳总结下C++的进阶之路:

第一阶段是语法阶段:任何一门语言都有这个入门阶段,要做到一般代码都能看懂的程度。学语法的过程要了解软件的基本执行流程,你敲进去的东西,为什么会这样。往下走,是计算机操作系统,到最终的CPU指令,感兴趣的读者可以看一下《穿过计算机的迷雾》,详细解释了各种计算机硬件的工作原理,入门科普的不二之选。往上走,则是抽象封装等思想,面向对象编程,这属于编程思想的范畴。入门书籍执牛耳非《C++ primer puls》莫属,若要说其有缺点的话,那实在是太厚了。入门阶段,选书不宜太厚,《C++ primer plus》虽然细节住够仔细,内容足够全面,但是非有大毅力者不能读也。学习的过程中不要给自己设置太高的期许,入门阶段选择任意一部评分不差的大学教材即可。入门一是会写会用,二是培养兴趣。

第二阶段就要做熟练掌握C++的语法技巧,会用STL,知道每种容器的特性,什么情况下用哪种容器,STL都提供了哪些算法?熟练掌握指针的使用。会用boost更好,还需要掌握一些平台相关的接口,操作文件,简单的网络访问等等。因为C++的语言特性,不访问一些操作系统的接口基本做不出看得到的成果。C++语言语法庞杂,这个阶段可以说是漫长,《efective C++》第一条即说可以将C++看作是一个语言联邦,不要强求自己全面掌握。前文所述,语言只是工具,我们只要在需要的领域会用即可,不是非要把豆腐切成丝才可以在厨房做菜。

第三阶段要做到知其然,知其所以然。不仅要知道STL,还要知道STL容器实现的数据结构,最好能自己将这些数据结构实现一遍,毕竟纸上得来终觉浅,实践中得到的知识最为深刻。大家知道std::vector,不用操心其数据容量,可以随心所欲的添加和删除元素,但是你如果知道其底层实现是连续内存的动态数组的话,就可以对整个std::vector占据的内存做整体性的操作,在序列化时可以将整个std::vector的数据全部一次取出而不用遍历。要知道C++继承派生实现的原理,通过向实例中添加指向虚函数表指针来实现运行时多态,要知道构造函数,复制构造函数等都背着你干了些什么,知道什么时候memcpy能行的通,什么时候memcpy会奔溃。如此种种,不甚枚举。这个阶段推荐一本书《深度探索C++对象模型》,读完之后会对C++有一种全新的认识。

第四阶段就要锤炼自己的编程思想。这个阶段是建立在大量实践的基础之上的,非有一定的代码上,上来就硬啃的话,味同嚼蜡。过程式编程,面向对象编程,函数式编程,二十一种设计模式,设计的六大原则等等都是前人趟过无数坑,精心总结的内功宝典,这个阶段可看的书非常多,推荐我比较喜欢的几本《C++沉思录》,《架构整洁之道》,《设计模式》,《大话设计模式》。我目前大概也就处于这个水品,再向上会是什么阶段,在下就不敢妄言了。

计算机网络

计算机网络在后端开发中占据着相当重要的角色,因为网络于后端看来相当于前端用户的角色,是所有逻辑执行的起点,网络性能优化也是重中之重的事情,这就需要对计算机网络有非常深刻的理解。呐,接下来还是给计算机网络归纳几个学习阶段。

第一阶段还是入门阶段,熟悉各个网络接口的使用和调用,最好还能知道调用网络接口之后操作系统都为我们做了哪些事情。socket的接口不多而且比较简单,这里就不再赘述。

第二阶段要深入的理解协议的实现过程,尤其是TCP的很多实现细节,包括滑动窗体是怎么控制数据发送的,什么是快速启动,如何做的拥塞控制,还有面试很喜欢问的三次握手,四次握手。这里的很多控制算法非常值得学习,都是前人无数实践测试下得来的宝贵成果,想想在没有计算机网络之前,写带网络通信的程序还要自己控制如何往网口上写数据,控制传输的可靠性,顿时就能感觉到计算机网络的伟大。这方面可以看的书首推《TCP/IP协议详解》三册,啃完之后就可以掌握TCP/IP的方方面面。但是学习的时候不要要求完美,否则坚持会变得格外吃力,我觉得把自己感兴趣的几章看懂就行,可以点到为止,其他知识需要的时候再回来查阅即可。

第三阶段其实和第二阶段并没有明显的前后关系,这里展示了和第二阶段不同的方面,即操作系统提供的很多多路复用IO接口。为提高网络和操作系统资源的利用率,操作系统都提供了不同的网络IO复用的接口和机制,比较典型的有Linux的epoll,windows的IOCP,这就衍生出了很多知识点,epoll的两种触发模型的区别?epoll底层的实现等等。如何利用这些机制将网络IO的过程封装起来?这就是网络库所干的事情。这里最好能自己封装实现一个网络库,或者找个现场的网络库学习一番,比如libevent, Nginx等,还可以看下我写的CppNet(打个小广告)。推荐下可看的书,包括《深入刨析Nginx》,《Linux高性能服务器编程》,《Linux多线程服务器端编程》。

第四阶段那就是可以自己实现协议的水平了,此等境界自是万中无一,一般人也没有施展的机会,不过倒是可以封装一个RUDP,可靠UDP传输的库,来提高自己对计算机网络的认识。

操作系统

我们所有的开发工作都是操作系统之上的,当然也有人是做操作系统开发的,并不在此列。我们所有的代码,都要向操作系统申请资源,请求接口调用,其扮演了代码的土壤的角色。那么你真的了解这片土地吗?

操作系统为我们提供了内存访问,IPC通信,线程,进程创建的机制,我们通过操作系统提供的接口来调用这些机制,那就有两层的知识需要掌握,一是接口的使用方式,二是这些机制的优点缺点,实现原理。实话讲,我目前处于操作系统的最初级阶段,上学时候的操作系统原理早已忘完,手中的《UNIX环境高级编程》又没有啃完,在此不敢多言,以免贻笑大方。这块儿可以推荐本书《深入理解Linux内核》,我之前囫囵吞枣的过了几章,十分功力里未得一分。

数据库

所有的网络程序,无外乎前端,后端,数据库。天下三分,数据库就占一席,足以见其地位。既然地位如此之高,那知识范畴也是小孩儿没娘,说来话长。往深了说,是数据库设计,往浅了说,是SQL使用优化,往大了说,是分布式数据存储,往快了说,是NoSQL。要展开说那可是三天三夜也说不详尽,这里就对这几个方面做下简单得介绍,各个方面没有前后递进得关系。

关系性数据库,历史最悠久的磁盘数据库存储系统,在工作中接触也非常多,这块儿的知识包括SQL的优化,Schema与数据类型优化,范式,索引实现的原理,B+树B-树等等等,要记住ACID的特点。推荐学习《高性能的MySQL》。

NoSQL不像是关系性数据库,目前也没有什么实践标准,都是各玩个的章法,各有各的特点。我的建议是找一个自己感兴趣的开源数据库,深入的阅读下源码,学学大师们的编程技艺,内存型推荐Redis,可以边看《Redis设计与实现》遍对着源码来理解。持久型的推荐LevelDB,这个也是我下阶段准备学习的一个目标。

分布式存储归到这里主要是因为沾了一个存储的边儿,其实和数据库已经渐行渐远了,首先应该看下分布式存储的起源,google的《Google-File-System》论文,还有分布式里的CAP理论,一致性算法等等,这里的重头戏是分布式架构,这方面也没什么标准可以参考,可以看下《分布式服务架构》。

数据库方向很多,感觉每个点都是走马观花,未能细说。功力未到,想写的深也是有些力不从心。暂且说这些,以后有机会再拓展,记个TODO。

最后

虽然以进阶为名,写到这里感觉多少有点标题党,只是罗列了下各个模块的知识点和可以学习的书籍,也没有明确指出该怎么学习才算是进阶之路。奈何才浅笔拙,也只能到此为止了。

与诸君共勉。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++服务器研发精进 的相关文章

  • Android驱动程序开发实例精讲-0_Android系统HAL驱动开发经典案例详解(基于Android4.0)

    Android系统HAL驱动开发经典案例详解 xff08 基于Android4 0 xff09 目的 xff1a 通过学习一个LED点灯的简单功能 xff0c 掌握Linux驱动程序与HAL硬件抽象层之间的调用方法 xff0c 同时掌握JN
  • 使用putty连接到虚拟机centos被拒绝解决方法

    今天用putty去ssh本地的虚拟机中的centos系统 xff0c 发现连接被拒 xff0c 跳出了这个错误 因为是第一次用putty连接到自己电脑上的虚拟机 xff0c 碰到这个错误 xff0c 我首先想到是不是centos中的防火墙没
  • libvlc 使用mediaplayer 播放rtsp

    环境 ubuntu18 04 vlc3 0 6源码 从 github上下载的vlc 源码 xff0c 默认配置 xff0c 默认编译 xff0c 用命令 vlc rtsp 192 168 43 129 10086 stream 竟然无法播放
  • c语言下,关闭socket的两种方式

    c语言关闭socket的两种方式 一 shutdown include lt sys socket h gt int shutdown int sockfd int how how的方式有三种分别是 SHUT RD xff08 0 xff0
  • 文件系统(七)—图解进程文件操作

    学习文件系统 xff0c 我们的目标是如何实现一个简单的文件系统 xff1f 磁盘上需要什么结构 xff1f 它们需要记录什么 xff1f 如何访问 xff1f 对于这些问题 xff0c 我们就需要理解文件系统的基本工作原理 xff0c 可
  • 解决Docker ADD/COPY 报ADD failed: stat /var/lib/docker/tmp/docker-builder****: no such file or director

    意思就是说 ADD source target 命令找不到source的文件 搜了大致有以下情况 xff1a 没有source文件 xff0c 或者source文件跟Dockerfile不在同一目录 xff0c 或者命令docker bui
  • Qt各个版本和插件的下载方法

    Qt及其插件的下载 网址 xff1a http master qt io 1 输入网址 后 2 点开archive后 3 打开qt后 xff0c 出来的是qt的版本 4 下载5 2版本为例 xff0c 打开5 2 后 5 里面有两个版本5
  • Centos7 安装Docker以及图形管理界面

    Docker的安装 1 确保系统中没有旧版本 如果安装过的话 xff0c 没有安装则忽略此步 yum span class token operator span y remove docker docker common docker s
  • Android汽车服务篇(三) CarPropertyService下篇

    一 简介 上篇文章介绍了Android汽车服务篇 二 CarPropertyService上篇 我们继续看一看看CarPropertyService 这个服务也是很重要的 绝大部分与车辆硬件功能相关联的属性 如空调 车舱功能 车辆传感器等都
  • PPTV面试算法思考-最长对称子字符串

    题目 最近在微信公众号里看看到了一个PPTV的面试算法题 xff0c 感觉难度适中 xff0c 想试下 题目的内容为求一个字符串的最长对称子字符串 如 xff1a 输入 输出 abba 4 abad 3 acccbaa 3 我的算法1 自己
  • mardown语法详解

    这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题 xff0c 有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中 居左 居右SmartyP
  • C++

    由于见到论坛上不少找书的 xff0c 于是就稍稍汇总总结了一下 xff0c 作为本人即将推出的 C 43 43 资源大汇 系列文章的引子 本文只是初稿 xff0c 其中有不少的纰漏 笔误 打误 xff08 打字错误 xff09 希望各位纠正
  • Tx2 设置静态IP的两种方法

    Tx2设置静态ip的两种方法 Tx2静态ip设置可通过桌面右上角的有线连接配置中的ipv4的配置来设置 xff1b Tx2静态ip设置的第二种方法是通过间接修改ipv4的配置来设置 xff1b 用ifconfig来查看你使用的是哪个网络设备
  • 七 Gazebo学习总结之传感器的添加

    本文展示的是使用者怎么直接通过Gazebo其他模型来创建复杂的模型 xff0c 以及使用 lt include gt 和 lt joint gt 标签来连接一个复杂模型的不同部分 1 增加一个激光器 a 进入先前教程的模型目录中 cd ga
  • STM32、FreeRTOS—— SVC 和 PendSV

    问 I went through the xTaskStartSechudler function which ends up triggering the SVC instruction and i came to know that i
  • MYNTEYE-SDK-ROS-Kinetic-VINS-Mono环境搭建到运行(Ubuntu 16.04)非常详细

    一 首先安装ROS环境 1 确保系统软件处于最新版 xff1a sudo apt get update 2 打开终端 xff0c 输入命令 wget https raw githubusercontent com oroca oroca r
  • win7关机一直卡在正在关机

    win7关机一直卡在正在关机 尝试用win7系统准备工具 xff08 sysprep xff09 来恢复到系统的初始状态 步骤 xff1a 1 win 43 R打开运行窗口 xff1b 2 在窗口中输入 xff1a sysprep xff0
  • Jetson TX2学习笔记(一):软硬件基础环境配置

    拿到了Jetson TX2套件 xff0c 在给套件安装开发环境时踩了很多坑 上网查阅的资料也都没能解决问题 xff0c 这里把成功安装步骤一一记录下来 xff0c 同时将所遇到且网上未提及的问题也进行一下分析 先说一下 xff0c Jet
  • 启动Docker,出现“Got permission denied while trying to connect to the Docker daemon socket“的情况

    启动docker时 xff0c 出现 Got permission denied while trying to connect to the Docker daemon socket 的情况 解决方法 xff1a docker守护进程启动

随机推荐

  • 【matlab调用m文件方法】

    matlab如何调用m文件 matlab调用m文件方法
  • kubernetes(k8s)介绍安装和部署实战

    kubernetes 基本介绍 kubernetes xff0c 简称 K8s xff0c 是用 8 代替 8 个字符 ubernete 而成的缩写 是一个开源 的 xff0c 用于管理云平台中多个主机上的容器化的应用 xff0c Kube
  • latex与mathtype的对应

    在latex中一些特殊的字体在用mathtype实现的时候需要找到相应的字体 xff0c 就是说latex实现的所有特殊的字体 xff0c 实现 xff0c 在mathtype中都能找到相应的对应 例如下面的文本对应 R E u
  • 深度学习 优化算法

    深度学习优化算法 优化算法概念动量框架 SGDMomentumNAGAdaGradRMSProp AdaDeltaAdamNdam参考 优化算法 概念 优化算法的功能是通过改善训练方式来最大化或者最小化损失函数 模型内部有些参数 xff0c
  • AVStream AVCodecContext AVCodec

    AVStream 表示成一个流媒体 xff0c 每个AVStream对应一个AVCodecContext xff0c 存储该音视频流使用解码器的相关数据 xff0c 每个AVCodecContext中对应一个AVCodec 包含该音视频的解
  • 2022 年 GIS 就业状况

    2022 年 GIS 就业状况 我们生活在数字时代 xff0c 通过进行在线研究选择我们的道路 xff0c 比如选择假期 选择大学或追求职业 如果您正在考虑进入 GIS 领域或在 GIS 领域进一步发展 xff0c 那么这份报告一定会有所帮
  • Eigen使用方法

    看了这边博客之后总结一下https blog csdn net augusdi article details 12907341 xff0c 感谢原作 xff01 看了之后学到了好多 xff01 1 矩阵定义 不管是向量还是矩阵 xff0c
  • Linux C 书籍推荐

    建议学习路径 xff1a 首先先学学编辑器 xff0c vim emacs什么的都行 然后学make file文件 xff0c 只要知道一点就行 xff0c 这样就可以准备编程序了 然后看看 C程序设计语言 K amp R xff0c 这样
  • Lidar与imu外参标定

    目录 网上资料 方案1 方案2 Lidar与IMU的相对旋转 实现 总结 附录 xff1a 最近由于工作需要 xff0c 花了几天时间了解激光与imu的标定方法 xff1b 因为项目需要 xff0c 且这里是个人认识的一个整理 xff0c
  • ROS的tf包中坐标变换的方法

    1 setRotation函数的参数 在坐标变换的时候常有这样的写法 xff1a tfTutorialsAdding a frame C 43 43 transform setOrigin tf Vector3 0 0 2 0 0 0 tr
  • 转载-自定义ros消息 vector

    原创 xff1a https blog csdn net m zhangjingdong article details 79617966 1 我在ros程序包中新建一个msg文件夹 xff0c 用于存储msg消息相关定义 xff0c 之后
  • 学神的“诞生”-2014清华大学本科生特等奖学金答辩观后感

    清华的特奖与交大的竢实扬华 偶然间在学堂在线上留意到有这样的一场现场答辩 xff0c 很想知道最高学府的最高荣誉花落谁家 xff0c 得此殊荣的又是些怎样的 学神 xff0c 几点感受记录之 1 经历 gt gt 证书 清华的学生更注重大学
  • qt中 美化 问题列表

    1 QTabWidget 中tab xff0c tab bar xff0c pane属性分布 2 使用qss美化时 xff0c tab标签上和pane中都能美化成功 xff0c 但tab最右侧的tab bar却始终没有成功 设置控件的背景
  • AttributeError: module 'cv2.cv2' has no attribute 'createLBPHFaceRecognizer'

    AttributeError module cv2 cv2 has no attribute createLBPHFaceRecognizer 在某一次做人脸识别的小demo的过程中遇到了这个问题 下面直接上产生问题的源代码 span cl
  • CAN总线ACK响应问题

    CAN总线的应答位 xff08 ACK xff09 用来表示节点已经收到有效的帧 任何节点如果准确无误地接收到帧 xff0c 则要向总线上发送显性位 xff0c 该显性位将掩盖发送节点输出的隐性位 xff0c 使总线上表现为显性 如果发送节
  • 嵌入式书籍推荐

    嵌入式书籍推荐 Linux基础 1 Linux与Unix Shell 编程指南 C语言基础 1 C Primer Plus xff0c 5th Edition 美 Stephen Prata着 2 The C Programming Lan
  • 调试中关于__FILE__, __LINE__ 及 __FUNCTION__ 用法

    在C语言中 FILE xff1a 打印相应的文件名 LINE xff1a 打印语句在源代码中相应的行 FUNCTION xff1a 打印语句在源代码中相应的函数名
  • 看技术书籍坚持不下来的,看这里,记录增量学习法

    今天 xff0c 在阅读 软技能 代码之外的生存指南 这本书的过程中 xff0c 学习到了番茄工作法 定额工作法 xff0c 受此启发 xff0c 突然脑海里冒出了一个方法论 xff0c 这是我独创的一个学习方法论 xff0c 我把它称作
  • ubuntu16.04安装realsense2环境与SDK(D435)

    关于realsense2环境的安装以及SDK的使用现在的文档还不是很多 xff0c 就分享下我的过程 xff0c 希望对大家有帮助 我安装是从源码构建的 xff0c 以下是我参考的资料链接 第一个链接是官网 xff0c 我是以它为主 xff
  • C++服务器研发精进

    一袭青衫闯帝都 xff0c 回首已然四春秋 壮志未酬心未老 xff0c 抚膺身衰发已疏 转眼间已经工作四年有余 xff0c 回想刚毕业的懵懂无知 xff0c 仿佛就在昨日 xff0c 成长乎 xff1f 徒增岁月矣 理想中的职业生涯应该是目