突破架构瓶颈:克服软件系统中的漂移和侵蚀

一种常见但不完美的比喻是将软件系统中的架构漂移和侵蚀与物理建筑的架构相比。虽然这个比喻很直观,但它存在一个根本性的误解,这也常常引发软件开发中的架构问题。

试想一下,一个设计良好的摩天大楼或房屋建成后,我们期望它基本保持不变,顶多因为偶尔的现代化或扩建而发生变化。

令人惊讶的是,如今许多工程师(甚至可能是无意识地)将同样的逻辑套用到软件架构上:认为一旦系统架构设计完成,如果设计得当,它就不需要进一步修改,直到需求变化和遗留代码迫使进行大规模重写。

这是一个关键的误解。与物理结构不同,软件本质上是动态的,不断变化,需要定期更新以保持活力。一旦软件停止演变,就会开始衰亡。

此外,这种比喻通常强调软件系统的结构和行为,但忽略了同样重要的决策、权衡和妥协,这些因素共同塑造了架构。理解架构决策背后的原因对于未来的修改以及管理和演变软件架构至关重要。

本文旨在加深你对架构技术债务的理解,并强调有效管理架构漂移和侵蚀的关键因素。

架构技术债务概述

“在软件密集型系统中,技术债务指的是那些在短期内权宜的设计或实现,这些构造设置了一个技术背景,使得未来的变更更为昂贵甚至不可能。技术债务是一种或有负债,其影响主要限于系统内部质量,特别是可维护性和可演化性。” ——Avgeriou等人,2016年

技术债务总结了软件开发中过去决策和捷径累积的后果,包括低质量代码、缺失的文档和严重耦合等问题。这些问题可能源自多种原因,如战略性权衡或需求的意外变化等。

尽管许多工程团队记录了他们管理技术债务的策略——如谷歌和 ThoughtWorks 的做法——但关于特定类型的技术债务,即架构技术债(ADT),讨论较少。

ADT 源于系统设计过程中的有意或无意决策,导致维护性降低、复杂性增加、性能下降和可扩展性受限等问题。由于软件架构定义了系统的关键属性和约束,ADT 对系统演变及组织实现目标的能力构成重大风险。

ADT 是不可避免的,特别是在目标是快速交付和后续迭代时,有时甚至是必要的。因此,团队必须识别 ADT 并实施有效管理策略,以防止架构退化——即逐渐变得过时、不可靠,无法适应不断变化的业务需求或技术进步。

首先,关键的是在 ADT 的广泛范围内区分两个独特的现象:系统架构漂移和系统架构侵蚀。

架构漂移与架构侵蚀

架构漂移指的是在系统中引入不在原始架构计划中的设计决策,但这些决策并不一定会违反基础架构原则。架构侵蚀是指引入的新设计直接与系统的预期架构相冲突,破坏了系统的指导原则。

以建筑架构为比喻,架构漂移就像是建造一栋地中海风格的房子,然后添加一个哥特式的塔楼和一个后现代的扩建。这虽然导致了风格混杂(可能并不美观),但不会破坏结构的完整性。

在软件工程中,一个系统可能以干净的架构开始,但由于架构漂移,最终演变成包含多种架构范式、不一致编码实践、冗余组件和依赖项的复杂结构。

深入探讨架构漂移  by Vladi Stevanovic

另一方面,架构侵蚀类似于进行改造时破坏了房屋的结构完整性。例如,为了创建开放式布局而拆除承重墙却没有适当的支撑,或者在没有考虑原始墙体承重能力的情况下加建一层楼。

在软件架构中,架构侵蚀引入了违反系统基础原则和预期设计模式的行为,使系统变得脆弱,最终导致劣质架构,未来出现问题。

这些违规行为可能表现为紧密耦合的模块、绕过安全协议、忽略性能约束,或在无状态系统中引入有状态组件等。

DALL-E 对架构侵蚀的诠释

应对架构技术债务的策略

架构技术债务积累过多会导致架构全面退化。团队通常会采取两种策略之一:不断调整代码以应对突发问题,或者进行大规模重构。不幸的是,这两种策略常常失败,甚至可能加剧现有的技术债务。

调整代码通常只是表面解决方案。如果团队缺乏对系统架构的全面了解或对问题根源的理解,他们只能被动应对,这难以解决根本问题。

另一方面,即使是有意的重构——无论是渐进式还是一次性重构——如果不解决导致债务的根本原因,仍可能失败,技术债务也会再次出现。

最有效的方式是摒弃这些被动措施,转向整体的、主动的方法。在开发过程中整合持续的、前置的系统设计审查,使团队能够更持续地管理技术债务。例如,与其通过快速修复强行将新需求加到现有系统架构中,或不断替换遗留系统,不如采取更有效的方法,使系统设计始终包含新特性,然后无缝集成实际特性。

正如敏捷宣言的签署者之一、极限编程创始人 Kent Beck 所言:“对于每一个期望的变更,先让变更变得容易(警告:这可能很难),然后再进行容易的变更。”

架构恢复的可持续策略

许多团队误以为采用敏捷方法就能确保持续的系统设计审查,并防止架构技术债务的积累。然而,现实情况往往与这种期望存在差距。

敏捷团队注重频繁交付功能增量,可能无意中忽视了长期的架构完整性。快速交付模式还可能导致文档和设计不够清晰,使开发人员难以理解系统的整体架构及其组件的交互方式。这种疏忽会使系统维护和扩展越来越困难,最终导致技术债务的积累。

应对已累积的架构技术债务(ADT)并防止其进一步增加,需要采取以下关键步骤:

  1. 实施架构可观测性。首先,对现有架构进行彻底检查,了解应用程序在生产环境中的行为,并列出其最关键的问题。这一步对于评估系统设计的架构漂移程度至关重要。
  2. 现代化开发流程。架构漂移和侵蚀往往源于缺乏有效的流程,而不是缺乏技能。随着业务环境和软件需求的演变,缺乏系统化的方法来引入新变化以及处理团队成员的入职和离职,会使软件架构偏离其预期设计。制定系统设计、管理和文档的最佳实践,对于长期维护架构完整性至关重要。
最后的思考

在技术变革加速和竞争加剧的背景下,适应性是现代技术世界的关键。拥有一个积累了大量技术债务的复杂系统,就像是背负沉重的枷锁。在依赖关系和错误的迷宫中穿梭,使得适应变化的世界变得越来越困难,机会也因此流失。

从财务角度来看,修改负担沉重的架构债务系统的成本,总是高于那些经过深思熟虑的前期设计的系统。

虽然适量的技术债务是可管理的,并且可以通过战略性方法解决,但过度积累往往会导致系统瘫痪,带来重大挑战。

驾驭架构技术债务的复杂性,必须采取有意识且主动的策略。团队必须优先进行持续的架构评估,并整合强大的可观测性工具,以准确监控系统演变。此外,通过严格的设计、管理和文档实践来现代化开发流程,这对于维护系统的完整性和可扩展性至关重要。

管理技术债务的最有效方法是将软件变更和演化置于开发过程的核心。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/744261.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

本地电脑配置不足,对工业仿真计算有哪些影响?

工业仿真计算对电脑的要求相对较高,这主要是因为仿真过程涉及到大量的数据处理和复杂的计算任务。一个高效的工业仿真系统需要强大的计算能力和稳定的运行环境,以确保仿真的准确性和实时性。 工业仿真对电脑配置有哪些要求 首先,工业仿真计算…

Prompt 提示词工程:翻译提示

近期在对计算机学习时,许多内容需要看原始的英文论文,对于我这种学渣来说特别不友好,🤷🏻‍♀️无奈只能一边看翻译,一边学习。 之前有搜到过专门的翻译工具,无奈都是按照字数算费用的&#xf…

都2024年了,现在互联网行情怎样?

都2024年了,互联网行情是怎样的? 很直白的说,依旧是差得很,怎么说? 我刚在掘金上看到一个掘友写的文章,他是四月领了大礼包,据他的描述如下: 互联网行情依旧是差得很,很…

自编码器笔记

编码器解码器自编码器 先压缩特征,再通过特征还原。 判断还原的和原来的是否相等 encode data 在一个“潜在空间”里。它的用途是“深度学习”的核心-学习数据的特征并简化数据表示形式以寻找模式。 变分自编码器: 1. 首先、假设输入数据是符合正态分布…

DDL-表操作-数据类型

一.DDL-表操作-数据类型 MySQL中的数据类型有很多,主要分为三类:数值类型,字符串类型,日期类型。 二.关系表 注意: 无符号和有符号的取值范围不是一样的,无符号需要加上UNSIGNED范围。 BLOB:用来描述二进制数据 TEXT:用来描述字符串 三.定长字符串和变长字符串 c…

【UE5.3】笔记1

内容浏览器:存放项目中所有的资源:关卡、蓝图类...... 关卡--Map 至少有一个关卡,可以有多个关卡 -漫游 视野漫游:鼠标右键WASD QE 鼠标滑轮控制摄像机速度 运行,ESC退出运行,快捷键F8不停止运行单独弹出功能 -创…

2024年第十五届蓝桥杯青少组大赛8月24日开启

据蓝桥杯青少组官网显示,2024年第十五届蓝桥杯青少组大赛8月24日开启。 蓝桥杯青少组历届题库地址:http://www.6547.cn/question/cat/2 蓝桥杯青少组历届真题下载:http://www.6547.cn/wenku/list/10

统一视频接入平台LntonCVS视频共享交换平台智慧景区运用方案

随着夏季的到来,各地景区迎来了大量游客,而景区管理面临的挑战也愈加严峻,尤其是安全问题显得格外突出。 视频监控在预防各类安全事故方面发挥着重要作用,不论是自然景区还是人文景区,都潜藏着诸多安全隐患&#xff0…

第三十篇——等价性:如何从等价信息里找答案?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 知道了等价性的逻辑,通过等价性去衡量事物,像是给…

H5、Vue3、UniApp实现抖音短视频功能

H5、Vue3、UniApp实现抖音短视频功能 ml-swiper https://ext.dcloud.net.cn/plugin?id18973 可 0 配置,高性能、低代码、全端兼容 APP端效果图 微信小程序端效果图 Vue网页端效果图 ml-swiper 可 0 配置,高性能、低代码、全端兼容 APP端效果图 …

mybatis-plus 实体中空字段更新不上

FieldStrategy 是一个枚举类型,它定义了字段的几种策略: IGNORED:忽略判断,所有字段都进行更新操作 NOT_NULL:非 NULL 判断(默认策略),字段非 NULL 才进行更新 NOT_EMPTY&#xff…

【ai】tx2 nx: trition client安装nvidia-pyindex 一直失败

系统版本的pip和python虚拟环境的pipyolov4-triton-tensorrt的master分支 官方client jetson:pip3 install --user nvidia-pyindex 不成功啊 这个是让nvidia-pyindex 拉取nvidia@tx2-nx:~$ pip3 install --user nvidia-pyindex Collecting nvidia-pyindexDownloading https://…

聚星文社ai工具下载

您可以在聚星文社官方网站上下载他们的AI工具。请访问他们的官方网站, 然后找到下载页面,从中选择并下载所需的AI工具。下载 如果您对下载过程有任何问题,建议您直接联系聚星文社的客服人员寻求帮助。

小程序的基本使用

【 0 】前言 【 0 】 这个就是js代码的存放地方 app.json // pages/banner/banner.js Page({/*** 页面的初始数据*/data: {},/*** 生命周期函数--监听页面加载*/onLoad(options) {},/*** 生命周期函数--监听页面初次渲染完成*/onReady() {},/*** 生命周期函数--监听页面显示…

等差数列和等比数列的介绍及在Java编程中的实现

等差数列 (Arithmetic Sequence) 定义:等差数列是指相邻两项的差相等的数列,这个差值叫做“公差” d。 公式: 第 n 项的公式: 前 n 项和的公式: 示例: 假设第一项 ( a1 ) 为 2,公差 ( d …

浮点数原理与`BigDecimal`实践应用

浮点数原理与BigDecimal实践应用 问题引入: 浮点数 浮点数如何表示数字? 浮点数采用科学计数法表示一个数字,具体格式为: V ( − 1 ) S ∗ M ∗ R E V (-1)^S * M * R^E V(−1)S∗M∗RE S:符号位,取…

第一百二十六节 Java面向对象设计 - Java枚举类

Java面向对象设计 - Java枚举类 枚举类型的超类 编译枚举类型时,编译器会创建一个类。 枚举类型可以具有构造函数,字段和方法。枚举类型仅在编译器生成的代码中实例化。 每个枚举类型都隐式地扩展java.lang.Enum类。 Enum类中定义的所有方法都可以与…

网络爬虫中Xpath的使用方法

正则表达式虽然可以处理包含了诸如 HTML 或 XML 内容的字符串,但只能根据文本的 特征匹配字符串,而忽略字符串所包含的内容的真实格式。为了解决这个问题,Python 引入 XPath 以及支持 XPath 的第三方库 lxml,专门对 XML 或 HTML 格…

基于python的随机森林多分类模型

1.随机森林多分类模型 1.1 基本原理 随机森林(Random Forest)是一种基于决策树的集成学习方法,它通过将多个决策树进行组合,以投票或平均的方式得到最终的预测结果。在多分类问题中,随机森林通过构建多个决策树&#…

Gartner发布开发敏捷网络安全计划指南:安全计划是一个在快速变化的环境中运作的复杂生态系统

随着企业数字化程度的提高,它们面临的网络安全风险和威胁只会增加。这项研究有助于高管领导了解敏捷网络安全计划的重要性,以及如何与安全和风险利益相关者合作,为下一次重大破坏做好准备。 主要发现 新冠肺炎疫情、地区冲突、全球政治紧张局…