一文看懂Web后端开发

前言

由于网络上系统地介绍后端开发的文章实在太少,而最近有恰巧有许多同学问我“什么是后端开发?”、“你为什么喜欢后端开发?”、“做后端都需要学什么?”,那么我们就来讲一讲,到底什么才是后端开发。

定义

后端开发Back-End Development,也称服务端开发服务器端开发等)是创建完整可运行的Web应用服务端程序(服务端程序和资源合称为后端,即在服务器上运行的、不涉及用户界面的部分)的过程,是Web应用程序开发的一部分。后端开发者使用JavaGolang等语言及其衍生的各种框架、库和解决方案来实现Web应用程序的核心业务逻辑,并向外提供特定的API,使得Web应用能够高效、安全、稳定地运行。

说人话!

好吧,如果你看了定义仍然很懵,那我就用一些非常易于理解的表达形式来说一说“什么是后端开发”。虽然这些表述可能并不严谨或完全正确,但是我相信这样一定能使你明白什么是后端开发。

这里我们拿前端来类比一下,因为我相信绝大多数看到这篇文章的人都已经对“什么是前端开发”、“什么是前端”有一定了解了:

  1. 前端就相当于我们的肉体,后端就相当于我们的灵魂和思想;
  2. 前端是如何操作游戏,后端是具体的游戏规则;
  3. 前端是用户能看到的,后端是用户看不到的;
  4. 前端是跑在浏览器上的,后端是跑在服务器上的;
  5. 前端采集用户的输入,后端处理用户的输入;
  6. 前端开发是写代码给用户看,后端开发是写代码给服务器看。

是不是这样一讲就明白了?那我们接着往下看。

具体职责

  1. 实现Web应用程序的实际业务逻辑。即:实现Web应用程序的具体功能(如注册、发表和查询信息等)或Web应用程序在服务端执行的具体操作。这是后端开发这项工作的主要内容;
  2. 使用API和创建API。后端需要向前端提供前端所需的数据,也需要使用第三方API来完成业务逻辑(如完成某个功能需要通过API调用其他应用、在使用框架进行开发时需要使用语言和框架的API、操作数据库时需要使用数据库或ORM框架的API等)。因为在后端开发的过程中经常需要与API打交道,所以有人也把后端开发称为“API开发”,就像有些人将前端称为“GUI开发”一样;
  3. 优化。在用户量达到一定程度后,就会出现诸如响应慢等各种问题(不理解的话想想你们大学的选课系统);同时,随着代码行数的增多,许多架构上的缺陷可能也会随之暴露出来,如代码逻辑混乱、模块划分不正确等。此时就需要后端开发人员对Web应用程序进行优化,如重构、分布式部署、优化业务逻辑、单体应用拆分成微服务等;
  4. 架构设计。虽然一般只有高级的后端开发人员和架构师才需要关注架构问题,但是架构设计是后端开发中非常重要的一环,因为它决定了如何组织代码、某个模块负责解决什么样的问题、系统的扩展性和可维护性如何、业务逻辑如何进行组织等,也会一定程度上影响到业务逻辑的具体实现(比如微服务和单体架构这两种架构下,同一种业务逻辑的实现可能完全不同)。

特征

  1. 后端是工作在服务器上的,负责通过API向前端或其他系统提供其所需的信息(如数据等);
  2. 后端开发实际上是开发Web应用中对用户不可见的部分(如核心业务逻辑、数据库等),大多数的后端开发都是不涉及用户界面的(除了在前后端不分离的架构中将前端的静态页面通过模板引擎改造成动态页面时);
  3. 通常情况下,一个Web应用的绝大多数代码都属于后端代码,因为后端承担了Web应用实际的业务逻辑;
  4. 后端开发的压力通常比前端开发要大,因为后端是Web应用的“灵魂”,它影响着Web应用的方方面面,除了业务逻辑之外还需要考虑安全性、稳定性、可维护性、可扩展性、伸缩性等问题。

技术

  1. 程序设计语言。许多语言都可以用于后端开发,比较流行的是JavaGo。例如我所使用的就是Go语言,也曾经使用过Java。此外,由于后端开发中经常需要和数据库打交道,所以作为后端开发者,还需要懂SQL语言(如果使用了NoSQL的话,也需要懂NoSQL数据库的语言);
  2. 数据库。数据库作为一种简单易用的持久化机制,可以让用户的信息不因为断电等故障而丢失,Web应用开发中经常需要用到数据库,甚至许多简单的Web应用本质上都只是“数据库的可视化系统”,也因为绝大多数简单的业务逻辑本质上都只是对数据库的增删改查(即CRUD);
  3. 框架、库和解决方案。想要高效率地开发Web应用,框架、库和解决方案是必不可少的,比如MVC框架、ORM框架、RPC框架、微服务开发框架、云基础设施(如Service Mesh、容器编排工具等)、运行时环境/容器(如Docker)、消息队列(Message Queue,MQ)、日志收集和分析工具等;这部分有一些框架是可以跨语言通用的,比如gRPC(RPC框架)、Istio(Service Mesh),也有一些是某种语言专用的,如Spring Cloud(微服务开发工具,JVM技术栈专用)、Gin(MVC框架,Go语言专用);
  4. 架构和指导思想。架构是后端开发中非常重要的一部分,作为一名后端开发者需要了解常见的架构,如三层架构、SOA、微服务架构、六边形架构等,还需要了解常用于后端开发中的指导思想,如设计模式、MVC模式、DDD、CQRS/ES等;
  5. 包管理工具/项目管理工具。因为后端开发中经常要用到各种框架和库,所以用于管理这些框架和库的管理工具是非常重要的。每一门语言都有自己的包管理工具,如Java的Maven,Go语言的go mod等;
  6. 基础知识。不管是前端开发还是后端开发,都需要对操作系统、计算机网络、数据结构等基础知识有一定了解,还需要了解对应语言的编码规范、重构等知识,这可以帮助你理解框架和库,也能帮助你写出更高质量的代码;
  7. 开发方法。实际上这个也可以说是属于指导思想的一部分,包括CI/CD、敏捷开发、DevOps等;
  8. 版本管理工具。相信我,几乎没有人能离开这玩意。最常用的是Git

误解

有不少人其实对后端开发误解很深,以下是一些常见的误解:

  1. 后端开发就是CRUD/后端开发太简单了;
  2. 不同系统的后端面临的问题高度相似;
  3. 后端开发很枯燥;
  4. 后端的逻辑比前端复杂;
  5. 对于后端开发者来说,设计业务逻辑是一件很简单的事情;
  6. 后端开发的工作太单一了/后端不是一个综合的领域;

这些误解有时候会劝退一些有意从事后端开发的同学,我们现在就来澄清一下这些误解:

  1. 我不否认很多简单的Web应用确实就是CRUD,但是绝大多数的Web应用都不仅仅是CRUD。至于“太简单了”,能说出这话的人一定没做过后端,或者只做过CRUD,或者是超级大牛。如果不是超级大牛的话,请说这话的人写一个能撑住五万并发的秒杀系统出来,并做压力测试,然后再看看这句话;另外,后端开发是一个非常综合的领域,既有非常抽象的架构和指导思想,又有具体的解决方案和业务逻辑,还涉及到许多计算机底层问题(如多线程、网络、I/O等)。并且,虽然后端技术稳定,但也不至于学了点东西就可以到哪里都通吃,例如,如果你没听说过云原生、微服务、Serverless等新技术的话,那说明你已经很久没有跟上后端技术的发展了;以及,如果你现在还在用JSP,那我敢肯定你一定没有意识到诸如前后端分离之类的新问题;
  2. 这个说法也完全不对。不同的系统所面临的具体问题是完全不同的。先不说对一个具体的需求可能有很多种不同的解决方案(如针对单点登录(Single Sign On,SSO)问题就有长连接(虽然我没见过落地案例)、共享Session、JWT等方案),有时候甚至当你拿到一个需求时,可能连要解决什么问题都搞不清楚,这也就是为什么诸如DDD这样的系统分析方法一直备受关注,且重构也经常在各种规模的Web应用中都引起重视,因为用户需求往往不是那么明确,可能会引导我们做出错误的设计;
  3. 记住,枯燥的是CRUD,而不是后端。后端开发的技术含量实际上是非常高的,也非常有意思,充满了未知与挑战。像微服务、云原生、DDD、CQRS/ES、高并发、负载均衡、缓存、消息队列、多线程、微服务监控、Service Mesh等技术,每一项都值得我们去研究,而这些技术中有很多都是在大型Web应用中被频繁使用的,如果你真正了解后端开发的话,是绝无可能说出“后端开发很枯燥”这样的话的。请记住,并不是不涉及界面的工作就一定很枯燥;
  4. 在大多数的系统中是这样的,但是有些Web应用的前端逻辑复杂程度可能不亚于后端,甚至可能还会超过后端,比如像石墨文档这样的多人协作文档系统,还有ProcessOn这样的在线绘图系统,其前端逻辑可能都是非常复杂的;
  5. 参见2。能说出这话的人一定没重构过一个“大泥球”一样的应用,也没设计过一个用户需求非常模糊的系统(比如用户只给了一条需求:做一个CMS(内容管理系统),你觉得简单你可以来试试,然后用它一个月,如果你不是个有经验的后端开发者的话,我相信你一定会被你自己所写的这个系统逼疯,恨不得将它完全重构);
  6. 参见1和2。如果后端开发还不综合的话,那什么才是综合的呢?

我不否认做一个只会CRUD的后端开发者很简单,但既然对后端开发感兴趣,那我们就要有更高的志向,不能把自己框死在CRUD里。

这里送给各位未来的后端开发者一句话:“我等采石之人,当心怀大教堂之愿景”。如果自己一个人完成一个简简单单的CRUD项目,你可以有自己的想法,例如在其中应用DDD和CQRS,或不断地优化它以达到最佳状态;如果迫于工作经验而不得不CRUD,你也可以用业余时间去提升自己的技术,让自己有更光明的未来。

什么样的人适合做后端?

说了这么多,那什么样的人才适合做后端开发这份工作呢?

  1. 讨厌写用户界面或与用户界面打交道的人。有很多人是因为讨厌写界面(尤其是CSS这种反人类的东西)才来做后端开发的。这里没有界面,讨厌与用户界面打交道的人不妨尝试一下后端开发;
  2. 细心的人。后端开发实际上比前端开发更需要细心。就如前文所述,后端是Web应用程序的“灵魂”,后端开发中的许多问题都决定着Web应用的“生死存亡”,尤其是数据校验多线程/多进程异步编程事务/分布式事务与第三方系统的交互等,这些问题有非常非常多的细节,且既复杂又非常重要,一旦在细节上出现问题(如数据校验不完全或加锁解锁的逻辑出现错误),轻则出现错误的数据或业务逻辑不能正常运行,重则直接导致整个Web应用挂掉或出现安全问题(如数据校验不完全导致的文件上传漏洞、函数使用错误导致的远程命令执行漏洞等)。所以如果你想从事后端开发,那足够细心绝对是一个必要的条件;
  3. 喜欢与机器打交道多于与人打交道的人。与前端开发是“写代码给人看”的不同,后端开发是“写代码给服务器看”(或者说给前端/第三方系统看)的。虽然这两个说法都不太严谨,但是后端开发更多的就是与服务器打交道(如降低资源使用率、提高Web应用程序的运行效率等等),而不是与人打交道(如提高页面的美观程度、思考用户的使用逻辑和心理等等);
  4. 想编写实际的业务逻辑的人,或喜欢算法和逻辑的人。前端的逻辑更多的是交互逻辑,如点击某个按钮应该弹出什么窗口、怎么把数据渲染成用户想要看到的页面等,而后端的逻辑更多的是实际的业务逻辑,如完成某个功能需要怎样做、请求某个API应该返回什么样的数据等。如果你和我一样写前端时因为总是接触不到实际的业务逻辑而感到不爽,那么大后端欢迎你;
  5. 好奇心强、自学能力强且有终身学习的觉悟的人,或者喜欢钻研技术的人,或喜欢充满挑战性的工作的人。后端看似简单,实际上技术含量是非常高的。就如前面所说,现在的后端可不仅仅是CRUD,而是随着互联网和云计算技术的发展而不断改变,Web应用程序在需求不断变化的过程中功能变得越来越强,架构变得越来越复杂,对性能的考验也越来越严峻,技术含量自然也就越来越高。作为一名后端开发工程师,需要有不断学习新技术的觉悟,还需要有一定的自学能力,因为不是什么技术都有人教你的,在学习和使用最新技术时对着英文文档啃是常有的事;
  6. 对系统架构感兴趣或想要成为架构师的人。虽然不可否认的是由于前端至今没有“一统天下”的解决方案而使得前端开发人员经常会比后端开发人员更早地接触到架构的部分,但是传统意义上的前端说白了也就是浏览器那“一亩三分地”(前端同学别喷我,这里仅仅说的是传统的Web前端,“大前端”是不算的哈),而后端技术的天花板则是“地球上人类的数量”(接触过高并发的同学看到这句话应该很有感触吧,哈哈),而核心的业务逻辑往往存在于后端,后端的优化压力往往比前端更大,这就使得初级的后端开发者在进行开发时需要对系统的架构有一定了解、高级的后端开发者需要经常思考系统的架构设计的问题,这也使得后端开发者更容易成长为架构师;
  7. 沉得住气的人。除了有第5条中提到的“后端的技术含量实际上是非常高的”这一原因之外,还有一个原因就是后端并不是“所见即所得”的,经常需要你编写几十甚至几百行代码、做无数复杂的配置才能把Web应用运行起来(注意,是运行,写业务逻辑的话需要更多代码),另一个原因是后端开发的门槛比前端要高——你至少得掌握一门语言和这门语言在后端开发方面的一些框架或库才能开始开发。所以,后端开发者必须要沉得住气,不能因为写几行代码看不到任何效果就想放弃;
  8. 对系统的基础设施(如框架、库和解决方案等)感兴趣的人。据我所知,许多在云原生方面有深刻造诣的大佬都是从后端开发者成长起来的,许多框架的作者曾经也是后端开发者。如果你碰巧像我一样对框架、库和解决方案(如Spring BootSpring CloudGinKubernetesIstio等)十分感兴趣,那么可以从成为一名后端开发者开始,在编写业务代码的过程中慢慢体会框架的重要性和所用框架的优缺点,以及如何设计一个好的框架。

虽然你并不需要满足以上每一项才能成为一个后端开发工程师,但是如果你发现你满足上面的某一条或某几条,而且你还没有找到自己的方向,那么不妨来尝试一下后端开发。

我为什么喜欢后端开发

先简单介绍以下我的经历吧。我从2019年1月开始接触前端开发,于2019年8月正式转向后端开发,并一直从事后端开发至今。我喜欢后端开发的原因,其实很简单:

  1. 我反感写界面,痛恨GUI编程,每次一写界面我就想遁地。后端开发不需要考虑界面的问题,这里没有界面,只有API;
  2. 我喜欢写实在的业务逻辑,不想总是隔着个API而“任人摆布”,解决实际问题对我来说简直棒极了;
  3. 我喜欢与机器打交道,可以写一天的代码而不感到无聊,但我不喜欢与人打交道,尤其是面对面交谈非技术问题时总会感到不自然(当然,聊技术我能聊一天都不嫌烦);
  4. 我想要成为一名架构师,想成就优秀的设计,而后端开发能更多地接触到系统的架构和设计;
  5. 接触到后端开发后,我发现我对这一领域内的绝大多数事物都感兴趣,如云原生、DDD、Service Mesh、系统架构等;
  6. 写前端会让我感到痛苦万分,因为我审美诡异、不擅长思考用户的使用逻辑、不擅长编写交互逻辑,写出来的东西又丑又反人类。而当我开始写后端时,我发现我的思考方式经常和真实的业务逻辑出奇地一致,有时候还能在做项目的过程中发现当前所使用的工具的不足,并且思考如何才能设计得更好;
  7. 做后端开发做了一年左右,我越来越感觉到我喜欢这份工作。

如果你也和我有一样的想法,那么你说不定也非常适合从事后端开发的工作。大后端欢迎你的到来。

结语

很多人对后端开发的误解源于缺少一篇系统地介绍后端开发的文章。虽然作为一个仅仅入行一年半(截止到2021年3月)的菜鸟,我对后端开发的理解肯定还有许多不足与偏颇,这篇文章也并不那么“系统”,但我仍希望这篇文章能帮助到其他同学了解后端开发或消除对后端开发的误解,抑或找到自己的方向而走上后端开发这条路。

如果发现文中的错漏之处,欢迎发表评论或联系我进行改正。希望能帮到更多对后端开发感兴趣的同学。

文章来源于互联网:一文看懂Web后端开发

发表评论