您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

三层软件架构导致程序员负担翻倍?

时间:2023-08-17 13:08:47  来源:CSDN  作者:

【CSDN 编者按】本文作者从工程师、技术领导者和开发人员角度,在发现自己身陷应用程序“管道”复杂性的困境之中,如何巧妙解决困境!

原文链接:https://yrashk.medium.com/repeating-yourself-thrice-doesnt-turn-you-into-a-3x-developer-a778495229c0

作者 | Yurii Rashkovskii译者| 弯月

责编 | 夏萌

出品 | CSDN(ID:CSDNnews)

3是一个神奇的数字。我们可在脑海中集中精力思考的事情不能超过3个。因此,从逻辑上讲,三层软件架构(数据库、后端和前端)是一个很好的模型。

既然如此,为什么构建一个功能需要花费这么多时间呢?

作为工程师、技术领导者和开发人员,我们经常发现自己身陷应用程序“管道”复杂性的困境之中。

三层模型给开发人员带来了一系列耗时的琐事。三层之间无数字节被打乱、重复定义三遍数据结构,我们苦苦挣扎于解决不同代码库之间的同步,同时还要努力优化性能、管理数据库模式变化,并保持数据的一致性。

因此,我们十分渴望能拥有更多的时间来创新,并为用户构建酷炫的新功能。

我们忘记了即使在清晰的三层架构中,需要考虑的事情也不止三个。作为一个单独的开发者小团队,我们必须留出一部分空间思考非技术问题,例如用户、他们的需求和沟通。即使在技术领域,三层架构中每一层之间的完全分离也迫使我们必须考虑另外两件事:相邻层之间的通信和同步。

三层架构以及每一层的集成让我们疲于忙碌。假设你有一个小型博客应用程序,你想为每篇博客文章添加一个“类别”。听起来是一件很简单的事情。但是,如果遵循现代 Web 开发的所有良好实践,则需要完成下列所有操作:

  • 编写一个数据库架构迁移,在数据库中创建“类别”的结构。另外,还需要编写一个“向下”迁移来删除新建的“类别”,以便能够在必要时快速回滚。
  • 修改 Go 结构定义、JAVA 类或者你选用的特定于后端语言的结构定义,而且还需要保持与新旧数据库架构的兼容性。最后,再为处理这个新数据结构的函数编写后端单元测试。
  • 编写新的数据库查询,并编写文档记录 API 响应的变化。
  • 更新前端的 Type 类型,添加新字段,同时确保无论是否有这个新字段都可以解析后端响应。最后,再针对这段逻辑编写单元测试。
  • 更新 React 组件,显示帖子的“类别”。
  • 确保所有层中“类别”的数据验证保持一致。
  • 编写集成测试,确保每一层的新代码都能与系统的其余部分正常工作。
  • 同步数据库架构、后端和前端之间的更新推出。如果项目是多个团队协同工作,则需要通知他们何时以及如何推出此次更新。

最终,在用户看来,不过是博客文章顶部多了一小行文本。但对于开发人员来说,这是一项艰巨的任务,需要数十小时的工作才能实现。

这种低效也会影响到最终用户。在各层之间移动字节是有代价的:网络延迟、数据的序列化以及反序列化等。我们很难让用户相信加载一篇有用信息不超过几个字节的帖子实际上需要通过 3G 网络传输几十秒的时间。我们很难向用户解释为什么看似一件很简单的功能,我们却无法实现,因为会占用太多资源。

我们如何走到了这一步?

三层架构是一个巧妙的构造,凝结了寻求优化劳动分工的数字工匠的聪明才智。

三层结构的出现不是为了成为 Web 开发人员的桎梏,而是为了应对 Web 应用程序日益加剧的复杂性。人类摆脱原始社会的狩猎与采集,文明高度发展正是依托于劳动的专业化。三层模型能够让各个专业职能追求卓越。虽然这种模型可以很好地服务于拥有专业团队的大型组织,但严格应用到小企业则会适得其反。另外,同步和通信的开销,专业化与分工会导致交付周期加长,这个问题也不容忽视。你见过多少这样的团队能够快速交付成果?

如果你的工作是流水线式的,也就是说,你只需提供稳定的、可预测的输入和输出,而且时间安排是固定的,那么专业化能够大放异彩。然而,小型组织和个人开发者没有这样奢侈的环境。相反,更快地反应和适应更适合他们。也就是说,交付周期越短越好。

前进之路

值得庆幸的是,除了我们之外,还有很多人都意识到了这些挑战。新一代工具正在出现,以弥合差距,并实现快速开发应用程序的目标。

如何解决这个问题

开发人员采用了多种解决方法来缓解三层模型的问题,其中包括:

  • 无代码工具:Budibase之类的工具可以大幅缩短开发时间,帮助半技术人员快速构建完整的应用程序。但这类工具缺乏灵活性,而且很难维护,因此往往会限制应用程序长期发展。如果你希望应用程序能够不断成长和发展而不必重写,那么就不可以使用无代码工具编写应用程序。也无法借助现代版本管理软件,向同事发送电子邮件警告他们不要碰这段代码,感觉像回到了中世纪。此外,无代码工具大多无法脱离平台。
  • 后端即服务(BaaS):Firebase 等服务提供了预制的、通用后端,消除了大量后端和数据库的重复工作,并大大加快了应用程序的开发速度。然而,这些服务会束缚用户,很难在本地开发,而且还会导致应用程序的独立性降低,托管、部署和维护的成本升高。许多 BaaS 最终都被放弃或者被收购,导致每个人不得不紧急重写代码。最后,即便提供商不出问题,你仍然需要处理前端和 BaaS 之间的同步。
  • Database-over-HTTP Web 服务器:PostgREST 和 Hasura GraphQL 等工具通过 HTTP 公开数据库。这类数据库极大地减少了开发人员需要完成的后端工作,同时仍然保持轻量级、易于部署且成本低廉。但它们只解决了一部分问题。它们的目标并不是成为构建应用程序的标准方法,而且你还要花时间同步前端代码和数据库结构。此外,除了以 JSON 的形式原样表示未处理的数据库内容之外,你无法执行更多操作来响应 Web 请求。

上述所有解决方案都是朝着正确方向迈出的一步,但我们仍然不满意快速开发应用程序工具的现状。我们相信,在不久的将来,构建一个可投入生产的应用程序所需工作量将比现在少十倍。我们不只是默默等待新工具的到来,而是正在编写这些工具,努力将这一愿景变为现实。虽然我们还没有找到方法来消除三重工作,但如今我们的项目从一个想法到可运行的 Web 应用程序所需的时间已大幅削减,而且无需牺牲协作开发的便利性和部署的速度。

  • 例如,Ophir 正在开发 SQLPage,这是一个基于 SQL 的快速应用程序开发框架,能够让构建图形 Web 应用程序像编写数据库查询一样简单。SQLPage 提供了一个不依赖于数据库的解决方案,没有任何依赖性。以 SQL 为基础,只需一天即可构建完整的 Web 应用程序。
  • 与之类似,Yurii 正在开发 Omnigres:这是一款大型应用程序设计的工具,可简化直接在 Postgres 数据库内运行复杂后端逻辑的开发。它将 Postgres 转变为一个完整的后端应用程序平台。

避免下一个项目承担三重工作

三层模型有其缺点,特别是对于独立开发人员和小型团队来说,它会导致开发人员在重复性的任务上花费过多时间,影响应用程序的性能和开发速度。



Tags:软件架构   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
现代软件架构:事件驱动设计遇上事件溯源
在当今的软件领域中,做出正确的架构决策对于确保性能、可扩展性、可维护性和整体成功至关重要。在众多模式中,事件驱动架构(EDA)和事件溯源(ES)作为复杂软件系统最受欢迎的两种选...【详细内容】
2023-12-13  Search: 软件架构  点击:(109)  评论:(0)  加入收藏
2023软件架构和设计的趋势
2023年即将结束,值得回顾一下过去一年的软件架构和设计流行话题。在本文中,我们将讨论一些常见的软件架构和设计,根据InfoQ的报告,这些架构和设计被广泛采纳。我们主要关注创新...【详细内容】
2023-12-04  Search: 软件架构  点击:(131)  评论:(0)  加入收藏
CSaaS架构:数字孪生软件架构的革命性突破
BS(Browser/Server)和CS(Client/Server)是两种不同的软件架构模式,具有不同的特点和优缺点。BS(Browser/Server)架构BS架构指的是基于浏览器和服务器的软件架构,客户端通常是一个Web...【详细内容】
2023-10-20  Search: 软件架构  点击:(222)  评论:(0)  加入收藏
定义软件架构的四个维度是什么?
软件架构可以从以下四个维度进行定义:1. 结构维度:软件架构包括系统的结构,即系统中各个组件之间的关系和交互方式。这些组件可以是模块、服务、库或其他软件单元。结构维度关...【详细内容】
2023-10-18  Search: 软件架构  点击:(295)  评论:(0)  加入收藏
Linux NFSD软件架构与代码解析
在Linux操作系统发行版有一个NFS服务端,该服务端由内核态的模块和用户态的守护进程构成。其中内核态模块负责数据处理,而用户态守护进程则负责内核态的配置管理等功能。由于核...【详细内容】
2023-08-21  Search: 软件架构  点击:(206)  评论:(0)  加入收藏
三层软件架构导致程序员负担翻倍?
【CSDN 编者按】本文作者从工程师、技术领导者和开发人员角度,在发现自己身陷应用程序“管道”复杂性的困境之中,如何巧妙解决困境!原文链接:https://yrashk.medium.com/repeati...【详细内容】
2023-08-17  Search: 软件架构  点击:(325)  评论:(0)  加入收藏
聊聊【软件架构模式】—微内核架构
概述: 内核模式也被称为插件架构模式。 将附加应用程序功能作为插件添加到核心应用程序,以提供可扩展性以及功能分离和隔离。 这种模式由两种类型的架构组件组成:一个核心系统...【详细内容】
2023-06-20  Search: 软件架构  点击:(292)  评论:(0)  加入收藏
软件架构设计之构件与中间件技术
中间件的定义其实中间件是属于构件的一种。是一种独立的系统软件或服务程序,可以帮助分布式应用软件在不同技术之间共享资源。我们把它定性为一类系统软件,比如我们常说的消息...【详细内容】
2023-04-28  Search: 软件架构  点击:(411)  评论:(0)  加入收藏
软件架构设计之模型驱动架构MDA
概念模型驱动架构MDA, 全称叫做Model Driven Architecture。 Model:表示客观事物的抽象表示 Architecture:表示构成系统的部件,连接件及其约束的规约 Model Driven: 使用模型完...【详细内容】
2023-04-13  Search: 软件架构  点击:(288)  评论:(0)  加入收藏
软件架构设计:B/S层次架构之MVC/MVP/MVVM
层次架构风格从之前的两层C/S到三层C/S,然后演化为三层B/S架构,三层B/S架构之后仍然在往后面演化,我们来看一下层次架构演化过程中都有了哪些演化的架构风格呢?而我们先简单了解...【详细内容】
2023-04-11  Search: 软件架构  点击:(311)  评论:(0)  加入收藏
▌简易百科推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  步步运维步步坑    Tags:架构   点击:(5)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27    InfoQ  Tags:架构模式   点击:(13)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  哈啰技术  微信公众号  Tags:架构   点击:(10)  评论:(0)  加入收藏
DDD 与 CQRS 才是黄金组合
在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能扛...【详细内容】
2024-03-27  dbaplus社群    Tags:DDD   点击:(11)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13    阿里云开发者  Tags:高并发   点击:(6)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  二进制跳动  微信公众号  Tags:架构设计   点击:(36)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  ijunfu  今日头条  Tags:SpringBoot   点击:(10)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  547蓝色星球    Tags:架构   点击:(115)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11    王建立  Tags:Spring Boot   点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  互联网架构小马哥    Tags:Spring Boot   点击:(115)  评论:(0)  加入收藏
站内最新
站内热门
站内头条