简要梳理后端开发计算机知识的框架、关联性

1、前言

工作中,程序开发跟在学校可是天壤之别,在公司写的程序如果带着潜在问题上线,一旦出问题,损失是不可估量的。

越来越发现要想对程序开发、系统架构有较深的掌握的话,语言的重要性应该在第二位,理解系统 API 的使用与差别、协议的原理及源码级的理解作为基石,其重要性应该摆在第一位,这个学习过程比较痛苦且漫长,其修远兮。

那么,写好一个服务端程序,需要具备哪些基石呢:耐心、勤劳、专业能力强。
前两个太空泛,靠各自发挥了。本文聚焦在专业储备方面的简单总结,也是为自己的开发心得做一个梳理,结构如下:

  • 数据结构
  • 算法
  • 系统环境
  • 通信协议
  • 开发语言
  • 代码管理
  • 编译、部署

2、数据结构

一个服务端程序不可能只有一个文件,同时也不可能只有一个模块,于是,不同文件、不同模块之间必然会有数据交互,这些数据的存储、传递就需要靠设计良好的结构来提高程序的性能、可维护性。
基本数据结构:数组、栈、队列、链表、树、图、堆、散列表。

3、算法

为了解决一些通用的问题,熟悉常用的算法也是必要的。
基本算法:递推、递归、穷举、贪心算法、分治、动态规划、迭代、回溯、分支界限法。
算法优劣的衡量标准有:时间复杂度和空间复杂度。

搜索算法:深度优先、广度优先、启发式、遗传算法;
排序算法:*其中稳定排序有:*冒泡、插入、桶排序、归并排序、二叉树排序、计数排序、基数排序、块排序;*不稳定排序有:*快速排序、堆排序、选择排序、希尔排序;
检索(查找)算法:顺序查找、二分查找、树表查找(二叉树、红黑树、B/B+树)、分块查找、哈希查找;

4、系统环境

系统环境相比来说复杂的多,有不同的标准、不同的实现。标准有:Posix、XSI、Single UNIX specification。其中 XSI 是 Posix 的子集,Single UNIX specification 是 Posix 的超集;

简单说下为什么要指定标准:我们开发的程序一般会经常使用到系统提供 API,而假如这些 API 在不同的系统上的定义方式完全不同以至于无法兼容的话,那么你写好的程序只能运行在特定的系统上,如果要在其他系统上运行,需要另外开发一套,极大的降低了效率、提高了开发成本。

Posix 就是为了解决这类问题。它指可移植操作系统接口,即为了能让在某种类型的系统上开发的程序能在各种 UNIX 系统上运行,制定出了各个 API 的统计标准。比如 write,必须是:

ssize_t write(int fd, const void *buf, size_t count);

UNIX、Linux 等就是这些标准的具体实现。其中 UNIX 有自己的规范,只有符合它的规范才可以成为 UNIX 系统,否则只能称为 UNIX-like。常见的 UNIX 系统有 SVR 4; UNIX-like 系统有:FreeBSD、OpenBSD。

另外一个问题是数据的存储位置,要考虑是磁盘(MySQL、NoSQL)还是内存(Redis)、单机还是多机、单机房还是多机房。

5、通信协议

通信协议最好都能够达到源码级别的熟悉度,同时也要熟悉不同协议层的数据包封装格式、字段的作用,比如网际互联层 IP 包的结构如下:

简要梳理后端开发计算机知识的框架、关联性_第1张图片

通信协议往往都是为了协调统一两个进程之间的通信方式,这两个进程可以在同一台主机上,也可以在互联网上的两台主机上。假如通信两端的进程分别为 A、B,不能 A 进程使用 HTTP 协议而 B 进程使用 RTMP 协议,尽管他们底层都是使用 TCP 协议。

同时我们需要了解数据在网络通信协议栈中的流动过程,一直到硬件层面的流动,即物理层,协议栈有分为多种模型,比如 OSI 模型、TCP/IP 模型,一般后者比较常见,如下图:
简要梳理后端开发计算机知识的框架、关联性_第2张图片

通信协议中另外需要关注的一块重点内容就是通信安全的保证,目前有专门的协议,比如 TLS、SSL,通信安全设计的方面比较广泛,涉及到数据的加密、密钥共享等问题。

在 TCP/IP 模型中,不同从有丰富的协议,比如应用从有 RTMP、HTTP、SMTP、FTP、SIP、DHCP等,传输层有 TCP、UDP 等;网际互联层有 IP、ICMP、IGMP 等;网络接入层有 ARP等。

6、开发语言

开发语言主要考虑开发周期、成本、熟练度等,常见的开发语言就比较多了,C、C++、Java、golang、lua等等。不同语言的标准库往往实现了简单的数据结构、算法等,可以直接拿来用,当然是否符合你的程序性能要求,还需要认真阅读这些库函数的文档说明,注意使用方式、条件等。

7、代码管理

大型程序周期比较长,经常修修补补,且往往是团队协作,因此需要借用代码管理工具来完成代码的迭代开发,一般用 git ,需要关注常用的 git 命令的作用,如果出问题了如何处理等,开源用 github,企业内部用 gitlab。

8、编译、部署

写好了程序,如果编译成可执行文件是一个大问题。一般使用 CMake,简单易上手,且可以在不同类型的平台对程序进行编译,而 Makefile 的规则复杂,平台兼容性差,往往 Linux、Windows、Mac 都需要写一份。

编译的难点就在于编译参数、链接参数的取舍,以及区分 Debug、Release 等。不过这一块的内容孰能生巧,多用就是了。

你可能感兴趣的:(高性能,高可用,服务端程序,计算机,开发,后台)