一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。
别人学后端费脑子,我学后端费铁子
跟着博客敲一个简单的后端简单,但是我不喜欢。
我就喜欢问别人,看别人想打死我但是要忍住的样子。
开个玩笑。
作为一个毕业设计用了简单的 nodejs 搭建后端的娃,虽然能够跟着教程很快的复现出一个简单的后端。但是我依然觉得,我对于后端这个宏大的概念,依然非常模糊。
即使我敲完了,我也分不清我是谁,我在哪,我要干什么。就如同我刚开始工作,早早的就用上了组件库、用上了 redux 、 用上了脚手架、git ,一切规范早已搭建完毕,我用起来很容易,但是我也只是会用而已。这让我常常感到迷惑,我总觉得自己处于一种似懂非懂的状态,经常有一种琼瑶式困惑,过往茫茫,前路不见。
我不知道我为什么要这么用、为什么要这么写、这么做有什么好处,我自然就不知道怎么用更好、怎么写更好、怎么做更好。这种迷茫的感觉伴随了我两年多,直到我进了一个自研公司,一年多来,从 0 开始,踩了一个又一个坑,才知道,我才开始知道,为什么会从 jquery 转到 react 、为什么要用状态组件、为什么要开发公共组件,怎么开发才更合适,为什么要做前端工程化,而我进一步的目标在哪里。
至此,我才算拨云见日。
所以当我决定学习后端的时候,我告诉我自己,我不能够仅仅是会用,我要了解它,了解它是啥,了解它在软件开发里占了一个怎样的位置,做后端要考虑的点在哪里、进阶点在哪里。所以,我决定问问我列表里的朋友。尽管语言不一样,然而,后端究竟在软件中担任了一个什么样的角色、要完成哪些功能、重点在哪里,这些是通用的。
以下内容为对话整理。
来自后端同事的基础解说
对话
以下内容来自于我共事一年、甚少联系的第一任同事。问了他以后,我得到了非常认真地解答。
你后端用的是什么语言呢?
java
你们后端主要的工作内容是什么?
最简单的就是给前端提供接口,增删改查, 与数据库交互。
现在前后端交互都是http协议, 比如前段调用http://ip:port/project/xxx接口,
通过ip可以找到服务器,通过port可以找到哪个应用来接受数据, 应用根据/xxx可以找到我们应用中处理该数据的方法
我大概了解这个概念,在一个完整的软件中,界面是前端完成的。后端除了做增删改查,还要做哪些工作呢?
你学习的后端的路径是怎样的呢
我不知道怎样回答你,我给你整理一个我的学习过程吧。
spring boot
| 知识点 | 类别 | 简述 | 备注 |
|---|---|---|---|
java 语言基础 | 编程语言 | ||
maven | 工具 | java 的 jar 包管理工具 | |
java 多线程 | java 基础 | 各种线程池,锁 | |
| JMM | java 内存模型 | 理解 JMM 后,更容易理解线程安全问题,多线程问题 | |
spring | 框架 | 非常重要 | |
| spring boot | 框架 | 升级版 spring | |
| springcloud | 框架 | 微服务,一般是大项目拆解成多个小的 springboot,要考虑服务之前如何调用,分布式事务 | |
mysql | 数据库 | 要了解底层引擎,sql 的执行计划,索引的时效场景 | |
redis | 缓存数据库 | 由于数据存储在内存中,特点就是查询快,可以做数据库的三级缓存,也可以做消息队列 | |
druid | 阿里数据源 | 数据库连接池 | |
| redisson | 分布式锁(基于 redis 的) | 解决分布式事物 | |
| quartz | 框架 | 定时任务框架,根据 cron 规则到了时间点执行对应的代码 | |
| mq | 消息队列 | 类似的中间件还有 redis, 还有 kafka | |
| JVM | java 虚拟机 | 了解底层接口,类加载机制,双亲委派模型 | |
| ELS | 数据库 | 数据检索/缓存三方件 | 上亿条数据查询也是轻轻松松 |
红色的部分是我开发熊头到尾一直接触一直使用的东西。
你要是想自己启动一个简单的项目,可以下载若依源码看看 前端用的vue。http://www.ruoyi.vip/
连接
学长发的东西虽然有些名词我看的一知半解,但是我大概有了一个后端的轮廓。
目前为止,我百度结合自己的理解,我对以上表的理解如下:
它除了要接收到前端的接口并对数据库进行操作外,还要考虑同时接收多个接口问题。(多线程)
线程再多,没有请求多的时候,请求得排队处理。(mq)
由于多线程问题,所以要处理数据查询速度的问题,需要用到缓存数据库。(redis)。
要解决大量的数据查询问题。(ELS)
要处理很多个请求的时候,数据库的占用和释放问题。(druid)
要根据规则,定时的去执行一些代码。比如,前端用户设置,每过四个小时,后端就给所有用户发一条消息。(quartz)
前端虽然也有定时代码,但是那仅限于用户打开当前页。而后端,比如我们微信上收到的定时推送,不需要打开界面也能收到消息。
如果想要一次编译,多次执行,不用分别为 window、linux 各写一套代码,那么就必须有一套自己的适配机制。java 是通过创建虚拟机和内存模型来实现的。(JVM,JMM)
maven ,类似前端的 npm ,用于包管理,能够下载第三方依赖包,及时更新其版本。
分布式概念百度结果如下:
分布式计算是计算机科学中一个研究方向,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给多个计算机进行处理,最后把这些计算结果综合起来得到最终的结果
我个人的理解是,当遇到高并发或者运算量大的场景时,分布式的思想可以让计算从一线处理人员变成一线管理人员,分配人员任务,最终拿到结果,再做进一步反馈。
至此,我们对应上了表中主要的名词及其应用场景,对于后端到底有哪些工作、后端为了应对这些问题衍生了哪些处理机制,有了基本的了解。而如果想要去看一个基于 java 的项目后端究竟是怎么处理的,自己能不能捋清它的项目结构,则可以通过查看项目源码实现。
来自学长的进一步引导
对话
学长,对于抽象的后端概念来说,掌握了基础的增删改查之后,下一步要干什么呢?
提升架构思维。
对于后端的架构设计要有了解。
可以看下你们项目后端的架构图,然后结合代码,了解一下,项目的架构设计
架构是要考虑缓存、负载均衡什么的吗
这些都是最基本的。高级一点的一般会做 JVM 调优,cap(分布式),多线程等。
资深的话就是架构设计能力,能从 0 到 1.
如果系统够复杂,还要有能够结合跨系统能力整合的能力。
那你说的这个架构,大概是一个什么样的架构呢?前端目前我会接触到企业级的脚手架,是类似的概念吗?
后端来说,就是底层数据结构设计(表及结构设计),
业务层(中间层的高性能高可用的保证,数据一致性的保证,各类中间件的使用)
,网关层(负载均衡的、接口协议等)
一个系统的架构大概是这个样子的。
前端后端都会考虑进去,不应该仅仅局限于代码和业务,还要考虑系统的闭环和后期的可拓展性。
噢~大概了解了,架构不是只针对后端的架构,而是将整个系统看作一个整体去设计,对吗?
可以这么说。
中台是什么?
中台,作为平台型组织的一部分,是在前台作战单元和后台资源部门之间的组织模块。这些模块多半是传统组织中所谓的成本中心,它们负责把后台的资源整合成前台打仗所需的“中间件”,方便随需调用。中台分为三类:业务中台、数据中台和组织中台。
但是很多企业已经淘汰中台了。
因为太理想化了,真实业务场景中,想做适用于各种业务场景的通用能力是不太现实的.
因为需求千奇百怪,重口难调,你要兼容所有场景只会迭代的越来越庞大,最后成为“屎山”
可是按照中台的定义,它不是能够减少工作量吗?
简单的系统不需要中台,过于复杂的系统,中台较为鸡肋
连接
学长并没有讲到具体的学习内容,但是他是将软件开发作为一个整体来看待,去考虑一个系统的架构。
而进一步的前后台的划分,只是整体架构的思想实现。如何尽可能地让一个系统用户友好,除了视觉、交互方面的设计,整个系统的架构设计也非常重要。
这关系着,当我们进行数据交互的时候,软件能不能迅速响应;高并发的场景下,我们是否能够正常的使用软件;需要添加新的功能的时候,能否方便的对现有的数据结构进行拓展。
如果表的设计不够完善,以来过多,新的需求出现时,我们不得不增加没必要的表才能满足功能,这样子对于用户来说,会响应变慢,复杂的、涉及多人处理的功能无法实现;对于开发人员来说,开发和维护都非常困难。
如果没有处理好并发、连接池、死锁,那么就会造成软件的崩溃。
如果没有处理好缓存,会造成响应过慢或是数据不一致问题。
如果没有处理好分布式,当我们遇到智能场景的软件,例如语音识别等,那么就会造成响应过慢。
这些都是生活里面实实在在会出现的场景,在前后端的功能划分中,也是需要后端实实在在要解决的问题。
通过和学长的交流,我对于软件开发有了一个更为全面的认知,也了解到后端的进阶方向,受益匪浅。
结语
通过交流,我已经产生了我自己对于后端的一个知识体系。虽然目前我还没有掌握技术,但我已知来路。
如果你是一个后端,发现我有理解的不对的地方,欢迎指教。
如果对你有帮助,记得给我点个赞哦~