关注“脚本之家”,与百万开发者在一起
来源|后端技术学院(ID:)
作者 |
想了想,了解方向和路线很重要。 与具体的技术细节相比,可复制的经验和清晰的学习路线才是大多数人更需要的。
废话不多说,我们直接进入后端技术学习路线思维导图框架:
我对图中的各个节点进行了细分,并将在后面的章节中一一介绍。
01
计算机基础知识
无论是后端开发还是前端开发,归根结底我们所有的软件开发都是为了计算而写程序。 虽然对于大多数人来说,当你真正开始编写代码时,很少会被要求解决计算机的底层问题。 但没有联系并不代表不重要。 计算机基础是最重要的。
Java、C++、Java在后端开发工作中经常使用。 这些语言被称为高级编程语言。 它们之所以被称为高层,是因为它们接近我们日常交流中使用的自然语言,而远离计算机底层。 但所有的高级语言最终都会被转换成汇编->计算机指令->控制流来控制计算机硬件。 因此,学习计算机结构和工作原理、操作系统等基础知识,可以加深我们对高级语言的理解。
计算机科学与技术CS()作为一门专业课程,和其他工科课程一样,有自己的理论体系。 为了节省时间,方便大家观看,我把计算机基础的范围缩小到以下四门专业课:计算机组成原理、计算机网络、操作系统、数据结构。
计算机组成原理
本课程让您了解计算机的组成和工作原理。 需要学习的内容包括:
计算机网络
世界上第一台通用计算机“ENIAC”于1946年发明,顾名思义,它仅用于计算。 后来电脑越来越多。 如果没有网络,每台计算机都会成为一座孤岛,也不会有今天的情况。 随着互联网的繁荣,《计算机网络》课程的学习路线非常清晰,围绕着如何将不同地理位置的计算机连接起来,高效可靠地交换数据和信息,让人们在家门口就能做事。知道世界上的一切。
计算机网络分为多个层。 根据各层的属性和特点,分为:
这种层次划分,从上到下就是网络数据包的接收路径,反之就是发送路径。 既然我们想要交换信息,我们就必须协商一个通用协议。 就像我们和外国人交流的时候,要么他们学中文,要么我们学英语。 无论如何,标准语言必须是统一的。 这在计算机网络中称为“通信协议”。 。 正如上述网络分层中,每一层都有自己适配的协议,因此计算机网络的研究基本上都是围绕分层协议的研究展开的。
操作系统 操作系统也是一种软件。 你熟悉的微软操作系统,后台开发熟悉的各种发行版的Linux系统,都是以软件的形式安装在计算机上的。
只不过这个软件与我们平时接触到的应用软件不同。 它比较特殊,因为它向下处理计算机硬件(即我们在计算机组成原理中学到的硬件),向上为其他应用程序和用户提供通用软件。 交互界面,说白了,操作系统扮演的是中介和管家的角色。 它帮助我们做以下事情:
数据结构
数据结构是大家最熟悉的。 即使你没有计算机基础或者想转行计算机,首先遇到的也是数据结构,因为面试中问的算法问题本质上就是各种数据结构的使用。 因此,从面试中纯粹功利的角度来看,数据结构也是必须掌握的计算机基础。 数据结构必学:
如果你想真正理解计算机科学这门学科,你可以等到学完这四门基础课程之后,再花一些时间学习更系统的理论学习,成为一名知识体系完整的计算机软件后端开发工程师。
02
Linux
在后端开发领域,我不能说你能100%获得后端服务。 其中至少90%运行在Linux系统上。 因为它开源、方便、功能强大,所以需要学习以下技术点:
Linux系统使用
所以如果你想走后端开发路线,我建议你尽快使用Linux,越早越好。 您可以在个人PC上安装Linux虚拟机,或者安装双系统。 这就是我在大学时所做的。 那时候云服务器还没有现在这么流行。 现在我觉得买Linux云服务器最方便。 如果您是学生,也可以安装。 教育折扣。
高级Linux编程
Linux“高级编程”意味着比上面的基本Linux操作更深层次。
懂得如何使用 Linux 还不是一个真正的开发者。 使用系统是成为开发者最基本的要求。 能够操作Linux就像使用系统一样。 这只是学习成本的问题。 如果这个世界上没有系统,你女朋友需要一些时间才能掌握Linux系统的基本操作。
如果你想进阶成为一名后端开发人员,你必须知道如何使用Linux系统提供的各种系统API(系统调用接口)进行编程开发。 程序员使用你编写的代码来控制系统,而普通用户只能使用鼠标来操纵它。 。 这个阶段你需要学习:
总之,这个阶段需要学习的是Linux环境下的高级编程技能。 通过学习这些内容,你还可以更深入地了解Linux系统是如何工作和运行的,真正步入Linux系统编程的大门。 。
网络编程
网络编程是通过网络套接字实现的通信,因此也属于进程间通信IPC(Inter-)。
由于目前的后端服务都是基于服务器/客户端模型,而两者又是基于网络通信,所以当你在家用手机点外卖服务请求时,也会发送到某个团体的后端服务器通过网络通信,所以后端服务开发说到底还是网络编程,而应用层开发是基于网络编程的数据。
网络编程需要学习什么:
学完上面的内容,你大概可以写一个类似QQ的在线聊天小工具了。
不过,在工作中,有成熟的网络框架或者网络通信库。 像鹅厂这样的大公司大多开发自研的网络通信框架,而小公司则使用开源项目。 这使得很多后端开发者不需要关心底层的网络通信细节。 除了部分基础设施开发的同学外,大部分后端开发的同学都从事业务系统开发。
然而,了解底层网络编程原理是后端开发人员的核心能力。 这对于C/C++后端开发程序员来说尤其重要。 它可以在不了解底层原理的情况下提升你对问题的看法,就像在黑匣子中编程一样。 如果出现问题,是没有办法解决的。
学完上面的内容,你基本上已经具备了从事后端开发的基本能力,也可以开发一个简单的后端服务器了。
03
数据库
除非是简单的转发路由后台服务,一般来说,后台开发的Web服务器后台程序说白了就是一个死循环:
接收客户端数据包->处理数据包->业务逻辑处理->保存必要数据->回复响应数据给客户端
这将伴随着各种数据的处理。 比如电商系统会处理订单数据和用户数据,游戏后台会处理角色数据和装备数据等,如果有数据就会涉及到存储系统,数据一般存储在数据库。 。
主要学习2大类数据库:
关系数据库是指使用关系模型来组织数据的数据库。 简单理解就是二维表格模型。
非关系型数据库一般是指以键值形式存储数据的NoSQL数据库。 数据和键值是一种简单的映射关系。
关系型数据库 非关系型数据库
后端开发服务也需要学会解决三高问题:高并发、高可用、高性能。
04
高并发
运用目前所学到的知识,我们开发的后端服务器应对一些小型并发场景是绰绰有余的。 但随着互联网应用业务量的增加,对后端服务器的请求数量急剧增加,高并发要求也随之而来。 高并发指的是高TPS和高QPS
对于高并发的服务,必须改变传统的单进程模型才能处理如此大量的请求。
多进度
对于高并发的服务请求,后台服务一般都是IO密集型应用。 IO 密集型应用程序将大部分 CPU 时间花费在网络 IO 上。 相比之下,CPU密集型应用程序将大部分时间花费在数据计算上。
大多数后台服务程序都是IO密集型应用程序。 在网络IO过程中,CPU徒劳等待。 这告诉我们,CPU的潜力还没有被充分发挥出来,所以当一个进程的处理能力达到上限时,我们可以创建更多的进程,这就是多进程模型。
多线程
多线程与多处理类似。 事实上,Linux系统中的线程是由轻量级进程LWP(Light-)实现的。 多线程实现的后台服务比多处理更轻量,因为多线程是在同一个进程中。 内部实施。
但多线程也会带来新的问题,比如全局数据竞争和同步问题。 线程锁的引入也可以防止死锁的发生。
协程
那么什么是协程呢? 协程是比线程更轻量级的微线程。 以此类推,一个进程可以有多个线程,一个线程也可以有多个协程,因此协程也称为微线程、纤程。 协程可以粗略地理解为子程序调用,每个子程序可以在单独的协程中执行。
异步回调
所谓异步回调是指在服务器端发起IO请求的线程不等待网络IO线程操作完成才继续执行后续代码。 一般情况下,请求线程需要先注册一个回调函数。 当IO完成后,网络IO线程调用之前注册的回调。 函数通知发起IO请求的线程,这样发起请求的线程就不会被阻塞等待结果,提高了业务处理性能。
05
高性能
根据上述服务模型,可以提高服务本身的处理能力。 高性能后台服务往往采用多种技术从多个维度优化和提升性能。 例如,利用CDN(CDN)内容分发网络,存储和分发可以让用户就近获取内容,缩短响应时间; 使用池化技术,避免频繁的资源分配和回收; 利用服务集群横向扩展服务能力; 利用缓存技术减少热点数据 添加缓存以减少数据库访问。
06
高可用性
高可用性意味着确保服务的稳定性,不会出现重大问题或停机。 高可用性的常见解决方案是冗余和负载平衡。 冗余意味着部署更多的服务器,以便当其中一台服务器出现故障时,另一台服务器可以接管。 通过负载均衡技术实现流量的动态分配,避免大量流量冲击某台机器而出现请求不均匀的情况。 软件负载均衡技术可以通过DNS、Nginx、LVS等技术来实现。 这里学到的主要技术有:
07
设计模式
设计模式代表了软件开发的最佳实践。 经过长时间的开发,它们为软件开发过程中面临的常见问题提供了最佳解决方案。 学习这些模式可以帮助经验不足的开发人员以简单快速的方式学习软件设计。 在设计大型软件时,遵循必要的设计模式可以使编写的代码更加健壮和可扩展。
设计模式的6大原则:
常见设计模式的分类
08
分散式
为什么会发生分布? 随着业务量不断增长,当单个节点的处理能力无法满足不断增长的计算和存储任务时,当硬件改进(增加内存、增加磁盘、使用更好的CPU)成本过高而得不偿失时、应用程序只有在程序无法进一步优化的情况下才需要考虑分布式系统。
分布式系统是由一组计算机节点组成的系统,这些计算机节点通过网络进行通信并协调工作来完成共同的任务。 分布式系统的出现就是利用廉价的普通机器来完成单台计算机无法完成的计算和存储任务。 目的是利用更多的机器并处理更多的数据。
分布式系统需要解决的问题和单机系统是一样的。 但由于分布式系统多节点、网络通信的拓扑结构,会引入很多单机系统不存在的问题。 为了解决这些问题,将会引入更多的机制。 ,协议。 在这里你需要学习的内容包括:
09
安全
本质上,后台服务运行在网络上,需要与各种网络环境进行交互。 他们可以在正常情况下工作。 然而,互联网上针对后台服务的恶意攻击现象非常多,因此网络安全也是后台开发工程师需要学习的。 这里主要包括:
10
监控与统计
我们如何知道后台服务的运行状态和健康状况? 如果你只是开发小玩具监控和统计,那就没有必要了。 您只需要记录本地日志即可。 对于成熟的大型后台服务系统来说,监控、统计、跟踪是必不可少的。 没有监控就没有操作。
开源监控软件包括:、、Open-。
跟踪系统也非常重要,尤其是在当前微服务时代。 一个服务请求需要经过多个不同的微服务,这给分布式跟踪带来了新的挑战,主要包括以下三个方面:
业界也有一些成熟的开源软件用于监控和跟踪:、、CAT大众点评开源。 但大公司一般都有自己开发的监控跟踪系统。 例如,腾讯拥有多个自研的监控和调用链追踪系统。
11
搜索引擎
我们正在谈论全文搜索引擎。 什么是全文搜索引擎?
全文搜索引擎是目前广泛使用的主流搜索引擎。 其工作原理是计算机索引程序扫描文章中的每个单词,为每个单词建立索引,并标明该单词在文章中的编号和位置。 当用户查询时,检索程序使用预先建立的索引搜索方法,将搜索结果反馈给用户。 这个过程类似于通过字典中的搜索词列表查找单词的过程。
数据分为结构化数据和非结构化数据
像数据库表这样的数据都是结构化数据; HTML、XML、文档等长度可变、无固定格式的数据称为非结构化数据。 非结构化数据也称为全文数据。 搜索非结构化数据可以使用全文检索。
目前两大主流全文搜索引擎“Solr”和“Solr”都是基于. 搜索引擎需要学习什么:
12
大数据
大数据,也称为大数据,是一个术语,用于指传统数据处理应用程序不足以处理的大型或复杂的数据集。 随着后端服务用户数量的增加和数据的积累,产生大量需要挖掘的数据。 对这些数据的分析和利用可以反馈在线决策、优化运营策略、产生数据价值。
大数据还可以定义为来自各种来源的大量非结构化或结构化数据。
软件开发领域的大数据概念始于 20 世纪 90 年代的数据仓库。 大数据的处理也带动了各种海量数据统计和处理技术的发展。
主要包括以下几个技术点需要学习:数据存储、离线分析、流式计算。
13
虚拟化
虚拟化是指通过虚拟化技术将一台计算机虚拟成多台逻辑计算机。
虚拟化的好处
常见虚拟化技术:KVM、Xen、、
虽然对于大多数后台服务程序来说,很多服务都部署在容器中,但它们共享底层系统,所有容器共享部分运行时库。 因此隔离性比KVM等虚拟化技术稍差。 KVM 两者都有各自的使用场景,并且在未来很长一段时间内会共存。
管理VM()虚拟机的工具; K8s简称K8s,是一种管理容器的工具。
14
中间件
在后端开发中你可能经常听到“中间件”这个词。 那么什么是中间件呢? 看看Wiki上的定义:
中间件技术是在应用软件一些通用功能的抽象上创建的,集成了常用和重要的功能调用、分布式组件、消息队列、事务、安全、链接器、业务流程、网络并发、HTTP服务器、Web等功能。 在一个体内或分别在不同品牌的不同产品中。
中国科学院软件研究所研究员钟翠浩将中间件定义为“平台+通信”。 这个定义限定了只有分布式系统中使用的软件才能称为中间件。 同时,这个定义也将中间件与实际的应用软件区分开来。
用通俗的语言来说,中间件是一类软件的总称,它抽象了分布式系统中的一些通用功能来提供服务。 它屏蔽了底层操作系统的复杂性,提供了统一的开发环境,降低了软件系统开发的复杂性。 因为中间件是介于操作系统和应用软件之间、为应用软件提供服务功能的软件。 ,因为它介于两种软件之间,所以称为中间件。
常见的开源中间件包括以下类型,可以组合起来构建完整的分布式后端服务系统:
15
版本控制
大型软件项目的代码量是巨大的。 如何有效地组织和管理源代码和版本导致了版本控制系统的创建。 版本控制系统就是我们常说的SVN或者Git。 它用于跟踪和维护源代码、文件、配置文件等的更改,并提供程序来控制这些更改。
常见的版本控制系统分为两类:集中式版本控制和分布式版本控制。 作为后端开发工程师,版本控制系统的使用也是必须掌握的基本技能。 然而,这些系统在使用时通常是熟悉的。 一开始熟悉一些常用操作是有好处的。
16
工具
推荐一些与后端开发或者软件开发相关的工具,主要是编辑器和IDE。
17 号
编辑
Linux下开发肯定离不开Vim或者Emacs。 这两个都是常用的编辑器,形成了两个爱好者阵营。 尤其是Vim编辑器,学习成本有点高。 凭借各种插件和配置,一些 Vim 爱好者已将其用作 IDE。 一旦掌握,可以大大提高工作效率,值得学习。
当然,除了Vim之外,如果你是做文本编辑工作,比如写文档或者写技术博客,那么强烈建议学习语法。 这是一种轻量级标记语言,允许人们以易于阅读和编写的纯文本格式编写文档。 注意内容本身不需要调整太多。 编辑推荐,有道云笔记编辑器,插件。
18
集成开发环境
编辑处理小型项目还是有能力的,但后端开发工作通常是大型软件工程项目,不太可能由编辑来管理。 这时候就需要学会使用专业的集成开发工具。
集成开发环境(IDE)是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。
砍柴之前先磨刀,选择一把方便的武器,在编程的世界里遨游。 每种语言都有各种 IDE,包括推荐系列和 VS Code。 产品包括一系列各语言开发的IDE,尤其是IDEA for Java,有着非常好的口碑。 部分对应的产品系列如下。
Code(简称VS Code)是微软开发的一款免费代码编辑器,支持Linux、macOS等操作系统。 它支持测试并内置Git版本控制功能。 它还具有开发环境功能,例如代码完成。 (类似)、代码片段、代码重构等。编辑器支持用户个性化配置,例如更改主题颜色、键盘快捷键等属性和参数。 它还在编辑器中内置了扩展管理功能。
在 Stack 组织的 2019 年开发者调查中,VS Code 被认为是最受开发者欢迎的开发环境。
19
测试
软件工程师不仅要写代码,还要做测试。 软件测试和软件开发齐头并进。 测试可以确保我们编写的代码更加健壮和可维护。
TDD是测试驱动开发(Test-)的英文缩写。 它是敏捷开发的核心实践和技术,是一种设计方法论。 TDD的原理是在开发功能代码之前编写单元测试用例代码,并根据测试代码确定需要编写哪些产品代码。 需要掌握和了解以下测试技术和方法。
学习顺序
综上所述,后端技术需要学习的东西还有很多,不可能一蹴而就。
根据我个人的学习经历以及我所认识的大厂前辈P们给出的建议,我给大家一个以上技术路线的学习优先顺序的排名。 你只要跟着他们就可以了。
(超过)