软件架构: 一切皆有代价

news2024/12/28 13:59:59

软件架构必须随着业务发展而演进,否则就会成为业务的阻碍。但架构本身在发展过程中很容易逐渐腐化,堆积大量技术债务,因此在软件发展过程中始终保持架构愿景非常重要。原文: Software architecture — Paying the Price for Neglecting it

alt

在商业世界中,我们通常通过构建软件来解决业务需求。随着时间的推移,软件逐渐发展,在市场上取得了成功,拥有了强大的用户需求、积极并充满活力的开发氛围,取得了优秀的投资回报。事实告诉我们,软件系统是关键业务资产,为了维护资产价值,必须进行更改、更新和管理。

由于业务环境(市场)的动态性,软件系统需要不断发展以匹配系统及其用户不断变化的需求,以保持其竞争力和活力。

没有什么比保持不变的成功更失败的了。

随着软件的发展,规模和复杂性也在增加。最理想的情况是,体系架构会随之扩展以支持需求的变化。如果对变更缺乏适当的管理,体系架构就会恶化、难以维护,并产生架构债务。随着时间推移,堆积了大量技术债的软件系统会越来越难以维护和修改,从而导致系统过时、不可靠,无法跟上不断变化的业务需求或技术进步。

如果在不考虑变更影响的情况下改变体系架构,则软件架构将偏离其原始设计,导致架构漂移。因为所做的变更没有考虑对架构的影响,最终会导致对架构的侵蚀。架构侵蚀通常被定义为一种现象,在这种现象中,应用的初始体系架构被任意修改,以至于无法保持其关键属性。

打个比方,这就像建筑的原始地基是为了容纳一座两层楼而建的,但因为看起来还不错,所以继续在同一个地基上不断搭建更多楼层。

在一系列(n)个版本中,下一个版本(n+1)的体系架构是基于先前被侵蚀的体系架构设计的,从而对下一版本架构的有效性产生质疑。如果无法被纠正,情况只会越来越糟。

软件老化的症状包括性能下降、错误或崩溃增加以及用户体验下降。由于增加了复杂性,可能需要更长时间引入新需求,从而造成发布速度越来越慢、上市时间不断被推迟。

重要的是,这通常不是由于业务或软件的自然复杂性,而是由于其构建和增长的方式与不断增长的业务需求不兼容。

架构设计 vs 架构发现
alt

大多数情况下,项目开始时会开发某种类型的架构文档,但在开发生命周期中没有得到适当维护。我们需要面对这样的事实: 大多数情况下,源代码是唯一可用的最新文档。据此可以推断,软件体系架构不是在架构文档或图表或白板上设计的,而是依赖真正的实现。

这也意味着只有真正完成了构建,才会"发现"架构。架构发现是对系统进行逆向工程,以便了解它是如何工作的,或者确定优化或改进机会。此外,要完全理解系统最初设计者的动机和决策过程并不总是可行的,通常很难准确解释设计并确定优化或改进的机会。

改进架构设计,从而限制或摆脱架构发现

由于发现后很难改变,因此不得不提供不同类型的支持来保持其运行,换句话说,不断对系统缝缝补补。我们也能看到一些在发现架构时记录架构的努力,比如记录一些架构图,但讽刺的是,只要记录完成,就已经过时了。

敏捷对架构的影响
alt

如今大多数软件都基于强调灵活性、协作和快速迭代的敏捷方法构建,这让团队能够快速交付可工作的软件,有助于确保正在开发的软件满足用户需求,并尽可能快速交付。

某些情况下,敏捷方法加速了架构侵蚀过程。

敏捷有时会对软件架构产生负面影响。一个常见问题是,关注于频繁交付小的功能增量可能会导致缺乏对长期体系架构问题的考虑,导致软件系统难以维护和扩展,并且容易产生技术债务。

另一个潜在问题是,强调快速交付可能导致缺乏文档和设计,使开发人员难以理解系统整体架构以及组合在一起的各种组件。

在这种情况下,通常更多关注业务,团队长期面临高交付压力,并且团队由非技术成员领导。在这种环境中,架构通常不是一个重要的、受欢迎的、容易讨论的话题。

遵循好主意并不能保证成功,根据具体情况和环境进行调整的能力往往会带来很好的结果。

经济价值
alt

商业中的一切都归结为金钱、经济价值、短期利润和长期投资。对架构受损的系统进行更改的成本比设计良好的系统要高得多。

如果软件系统很难维护,通常会根据经济价值来计算,常见问题:"是否值得重写系统?即使需要额外时间来维护和合并新需求,是否还可以维护现有的系统?"

但是,当企业发现软件应用程序中的这些挑战时,就已经晚了,通常需要花费很多的时间、金钱和精力来升级软件。

企业有权知道,为什么会出现这种情况,如何才能在未来避免这种情况,能够吸取什么教训。

在某些情况下,我们还可以看到这个故事的第二部分。在这里,企业同意投资重新构建软件系统,从而基于长期目标和投资精神解决软件老化问题。开发团队从以前的经验中吸取教训,考虑当前和未来的业务需求,选择当时可用的最佳技术,开始构建系统。

大多数情况下,架构的破坏是由于缺乏流程,而不是缺乏技能。

这时,软件应用程序和体系架构得到了很多关注,大多数事情都很顺利,软件和体系架构得到了很好的构建。但随着时间推移、业务和软件不断发展,不断加入新的变更,团队成员在部门或公司之间转移,一段时间后,软件(及其架构)又开始从其原始设计和思想退化。

根据我的经验,当人们谈论架构时,会采取非常高层次或抽象的架构视图,从而可以通过很好、很简单的方式来理解系统是如何构建的,但在大多数情况下,魔鬼隐藏在细节中,通常很难从业务负责人那里获得资金来更新没有提供任何功能输出的体系架构。

作为企业主,很难拿出这么多钱来做没有明确商业价值的事情,尤其是可能只是解决症状,而不是根本问题。

架构工作应该是功能发布的一部分,而不是维护的一部分。团队应该将持续的重构作为开发过程的一部分。我知道这很难,因为敏捷过程主要关注交付,没有任何特定流程让整个组织可以看到和关注架构工作。

解决方案
alt

对于软件老化和架构侵蚀的情况,有许多不同的理论,这里我只是表达自己的想法。

克服软件老化负面影响的最好方法之一是将软件变更和发展置于软件开发过程的中心。对软件系统的任何更改都应该遵循相同的路径。然而,在大多数情况下,无论是软件开发还是演进和维护过程都没有遵循这样的路径。由于业务或技术限制,更改大多直接被引入到实现中。

在我看来,架构愿景是保持软件及其架构处于健康状态的伟大技术之一。甚至更进一步,如果设计一个基于架构愿景的方法或流程,可以帮助团队将愿景作为软件构建和日常工作的一部分,想象一下团队成功交付维护良好的软件时是多么富有成效。

下一篇文章将讨论架构愿景和基于愿景的开发方法。请继续关注。


你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。微信公众号:DeepNoMind

- END -

本文由 mdnice 多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数组的玩法比我以为的要多

数组是最基本的数据结构,关于数组的面试题也屡见不鲜,本文罗列了一些常见的面试题,仅供参考。目前有以下18道题目。 数组求和 求数组的最大值和最小值 求数组的最大值和次大值 求数组中出现次数超过一半的元素 求数组中元素的最短距离 求…

2023.05.28 homework

求三角形最长的边的长度 1)任意两边之和大于第三边; 2)任意两边之差小于第三边; 已知最短边13cm,其他两边肯定都等于大于13cm,两边只差肯定要小于13cm;简单推导就是枚举呗。 13cm 14cm 33cm&a…

web --- javascript(01)-- 介绍、变量和数据类型

JavaScript w3c:三层分离 结构层:HTML 表示层:CSS 行为层:JavaScript 介绍 (1)作用: 数据校验网页特效数据交互服务器端编程(NodeJS) (2)javas…

【PS小贴士】PS项目交货(CNS0/VL02N)-和销售订单交货(VL01N/VL02N)的区别点

目前一家公司在进行企业信息化建设,作为PS顾问有幸参与到其中。真是做的项目越来越多,经历的人越来越多,每个项目的感触也不同。不论是方案,还是项目上一起努力的小组成员、以及项目组顾问。哈哈哈哈哈哈哈哈...... 同样&#xf…

Linux 系统上的库文件生成与使用

1.库文件 库是一组预先编译好的方法的集合。Linux系统存储的库的位置一般在:/lib 和 /usr/lib。 在 64 位的系统上有些库也可能被存储在/usr/lib64 下。库的头文件一般会被存储在 /usr/include 下或其子目录下。 库有两种,一种是静态库,其…

分享几个国内免费可用的ChatGPT镜像【无需梯子】

文章目录 1.什么是ChatGPT2.ChatGPT的基础技术3.ChatGPT工作原理4.ChatGPT应用场景5.ChatGPT局限性6.ChatGPT的未来发展7.国内免费ChatGPT镜像写在最后 ChatGPT国内能用吗:ChatGPT在国内是无法使用的。你肯定要问我怎样才能体验到ChatGPT的神奇魔力呢?文…

【Spring】— 映射文件

映射文件 映射文件是MyBatis框架中十分重要的文件。在映射文件中&#xff0c;<mapper>元素是映射文件的根元素&#xff0c;其他元素都是它的子元素。映射文件中的主要元素如下所示。 <mapper><!--映射查询语句&#xff0c;可自定义参数&#xff0c;返回结果集…

Python日期带时区转换工具类总结

文章目录 1.背景2. 遇到的坑3. 一些小案例3.1 当前日期、日期时间、UTC日期时间3.2 昨天、昨天UTC日期、昨天现在这个时间点的时间戳3.3 日期转时间戳3.4 时间戳转日期3.5 日期加减、小时的加减 4. 总结5. 完整的编码 1.背景 最近项目是国际项目&#xff0c;所以需要经常需要用…

docker 解析DNS失败

问题现象&#xff1a; 我之前在docker里部署的容器&#xff0c;今天突然访问不了了&#xff0c;一开始我以为是容器的问题&#xff0c;将容器restart&#xff0c;销毁重建&#xff0c;都没有解决。 最后准备重启docker service&#xff0c;在重启之前&#xff0c;看了一眼dock…

接口自动化测试,从常规到动态再到全局断言,Postman让你居家必备!

目录 引言&#xff1a; 常规断言 动态参数断言 全局断言 总结 引言&#xff1a; Postman是一款非常流行的API接口测试工具&#xff0c;它以其易用性和强大的功能得到了广泛的应用。其中Postman断言功能是我们进行接口自动化测试时非常关键的一个环节。在接口测试中&#…

【正则入门】

语法 . &#xff08;点&#xff09; 匹配除换行符&#xff08;\n、\r&#xff09;之外的任何单个字符&#xff0c;相等于 [^\n\r]。 [\s\S] 匹配所有。\s 是匹配所有空白符&#xff0c;包括换行&#xff0c;\S 非空白符&#xff0c;不包括换行。 \d [0-9] \D 非数字&#xff1…

CISCN2023-Crypto

CISCN2023-Crypto 基于国密SM2算法的密钥分发可信度量Sign_in_passwdBB84badkey1 基于国密SM2算法的密钥分发 非预期&#xff0c;直接search能找到明文 curl -d "nameha&schoolhznu&phone110" http://123.56.244.196:30817/api/logincurl -d "id984ae…

【线程池】实现多线程并发定时任务

文章目录 一、为什么需要配置多线程定时任务二、单线程定时任务三、多线程定时任务 一、为什么需要配置多线程定时任务 springboot中通过注解 Scheduled 注解的方法都是一个定时执行的任务, 默认都是单线程的,就算是多个定时任务也是在同一个单线程(scheduled-1)中运行, 如果其…

离线版Gerber查看器+PCB/PCBA检测神器新功能!

一、CAM离线版——华秋CAM│专业Gerber查看器 公司电脑不能连接网络&#xff1f;不慌&#xff0c;我们完全离线且无需账号登录&#xff01; 磁盘空间不够拒绝下载&#xff1f;别怕 &#xff0c;我们安装包仅20M可随便分享&#xff01; 不会使用CAM350导入Gerber&#xff1f;没事…

APP开发死亡潮来临 小程序是否会取而代之?

移动互联网的发展&#xff0c; APP开发行业也迎来了它的大时代。据有关数据显示&#xff0c;2017年上半年国内新增的 App数量达到了创纪录的449万款&#xff0c;用户使用时长超过了200亿分钟。移动互联网已成为名副其实的“流量”产业&#xff0c;也因此诞生出一大批 APP开发公…

PostgreSQL 基础(一)-- 新手教程

PostgreSQL 12 官网 github 世界上最先进的开源关系数据库 1、新手入门 1.1 安装 当然&#xff0c;在使用PostgreSQL之前&#xff0c;你需要安装它。PostgreSQL可能已经安装在您的站点上&#xff0c;或者因为它包含在您的操作系统发行版中&#xff0c;或者因为系统管理员已…

【了不起的芯片 - 读书笔记】CPU 的制作流程 ( 晶圆制作 | 光刻机光刻流程 | 蚀刻过程 | 涂层过程 | 重复上述步骤若干次 | 芯片封装 )

文章目录 一、晶圆制作二、光刻机光刻流程三、蚀刻过程四、涂层过程五、重复上述步骤若干次六、芯片封装 一、晶圆制作 晶圆制作是半导体芯片制造的关键过程&#xff0c;它涉及将硅晶片&#xff08;或其他半导体材料&#xff09;转化为可以用于集成电路制造的基础材料。下面是晶…

ERP的需求分析

目录 什么是需求分析? 开发背景 01、系统模块 02、基础资料 供应商信息</

JDK21:Java21的新特性

背景 定于9月推出的Java21计划现在包括一个关键封装机制API和32位Windows端口的弃用。 Java开发工具包&#xff08;JDK&#xff09;21将于9月作为Oracle标准Java实现的下一个长期支持版本&#xff0c;现在有13个功能被正式提出&#xff0c;最近几天又增加了两个功能。 最新的…

ATECLOUD云测试平台新能源电机测试系统:高效、可扩展的测试利器

随着全球对环境保护的日益重视&#xff0c;新能源的发展越来越受到关注。电动汽车作为新能源领域的重要组成部分&#xff0c;其性能和质量对于消费者来说至关重要。为了确保电动汽车的性能和质量&#xff0c;测试系统平台解决方案变得越来越重要。本文将介绍一种基于ATECLOUD智…