大咖直播-鸿蒙原生开发与智能提效实战!>>> 了解详情
写点什么

为什么需要关注软件架构

作者:Pierre Pureur, Kurt Bittner

  • 2022-06-06
  • 本文字数:4064 字

    阅读完需:约 13 分钟

为什么需要关注软件架构

许多软件开发人员不信任架构实践,他们将这些实践与严格和专横的过程以及重要的前期规划和设计联系在一起。


因此,他们相信,如果他们遵循这些实践,可能需要很长时间才能交付一些甚至可能不是客户想要的东西。


他们更愿意专注于理解客户的需求,并通过小而快速的敏捷迭代过程来交付产品。


他们当中有一些人相信,只要遵循了这些过程,架构自然会“出现”,而不需要有意识地进行计划或架构设计。因为存在这些信念,他们可能不认为软件架构是重要的,甚至可能不关心它。


这种架构方法通常可以交付满足客户所需的产品,这是一个好的开始。


但是,如果不显式考虑产品的可持续性,它就有可能衰退,导致产品在自然退役前无法维护。


通过关注关键的质量属性,如性能、可伸缩性、安全性和弹性,有意识的软件架构方法有助于延长产品的生命周期,使其在更长的时期内可持续。



预先架构和紧急架构对比


如果我们正在做的事情是我们非常了解的,并且已经做过很多次了,那么预先设计方法就很有效。例如,建造摩天大楼、挖运河、生产产品或建造桥梁。我们可以应用“最佳实践”,并依赖过去已经在这些事情上验证过的有效方法。


如果我们正在处理一些东西是全新的,并且我们不太了解,或者变化太快以至于还没有“最佳实践”,那么预先设计就不起作用了。在这种情况下,作为科学革命基础的可控性实验可以帮助我们更深入地理解问题和可能的解决方案。最终的解决方案“出现”了,只是它沿着有意识的实验的路径向我们招手。


这两种方法都是有价值的,但适用的场景非常不同,一种可用于处理大部分已知的事情,而另一种可用于在变化的世界中探索新的机会和可能性。


第二种方法的问题在于,可控性实验可能无法在合理的时间内产生可持续的解决方案,并且可能需要进行可接受的返工。软件架构实践可以通过更早地提出更好的问题来指导实验,以减少交付可持续产品的时间和成本,并仍然可以保留敏捷方法的优势。


架构是如何出现的


正如我们在前一篇文章中所讨论的,架构的本质由一组定义和约束产品技术面的决策组成。无论团队采用哪种方法,无论他们是有意识地还是心照不宣地做出决定,这些决定都是存在的。这些决策专注于产品如何处理质量属性需求(QAR)。


QAR 也可以是显式或隐式的,尽管显式的更容易处理并可以确保产品契合它们。例如,用户通常希望在使用产品时能够得到及时响应,而不管有多少人也在使用该产品。显式地声明“响应性”需求以及产品可以支持多少并发用户而不会变成“无法应式”的,将有助于开发团队对他们的技术方法做出更好的决策,比如“系统的速度必须够快”或“系统必须是可伸缩的”这样的声明并不能帮助团队做出更好的技术决策。


评估质量属性需求和设计一个架构来实现这些需求涉及到一些前期规划,这些也是软件系统取得成功的关键驱动因素,原因如下:


  • 软件架构是由质量属性需求驱动的,如果在最初的迭代中没有考虑到它们,通常会在软件系统被部署到初始试验阶段之后(只有少量的用户)出现问题。因此,当必须满足关键的质量属性需求(如性能、安全性或可伸缩性)时,可能需要进行重要的架构、设计和代码重构,这可能会出现具有高度易变性的软件架构。此外,如果架构设计没有强有力地实现组件的抽象和隔离,重构的成本可能会飙升。

  • 为解决紧急架构的局限性和满足最初的质量属性需求,进行有意识的架构设计是有必要的。例如,除了提供关于系统实际使用情况的有用信息以及关于架构设计的反馈回路之外,在初始架构设计中加入一个简单的监控框架,这对于确保软件系统的弹性和正确性来说是至关重要的。

  • 重构和过度的组件化会导致解决方案的碎片化,以至于没有人能完全理解发生了什么。有可能不知道正在使用的组件是什么版本,也可能没有记录每个组件的服务水平协议(Service Level agreement,SLA)。微服务架构为每个服务使用了单独的数据存储,这可能会导致数据一致性问题。单体系统的可持续性较差,但具有高度的内部一致性。这两种架构各有优缺点。


你的软件系统是可持续的吗?


广义地说,实现“可持续性”是软件产品架构工作的重点。如果软件产品能够满足当前需求(包括 QAR),而不损害满足未来需求的能力,则可以认为该软件产品是可持续的。正如我们在前一节中所述,质量属性需求驱动了架构,满足关键 QAR 对于创建可持续的架构设计来说是至关重要的。不幸的是,随着功能增强的实现和新设计决策的制定,软件系统会随着时间的推移而“磨损”,这可能会延展甚至破坏最初的架构设计。常见的“磨损”原因包括:


  • 由于维护系统的开发人员对系统缺乏理解,最初的设计决策也就过时了。与系统设计相关的决策和假设很少会被准确地记录下来。当人们不再针对系统提出问题或回答问题时,软件系统就开始衰退了。提出问题是评估软件系统健康状况的一种重要技术,如果有知识资源可以回答这些问题的话。

  • 技术债务的累积会导致系统维护不再可行或不再具有成本效益,并且无法实现新的功能。

  • 开发人员试图重用不同组件的代码块,他们认为可以通过对复用代码进行微小的改动来实现新功能。遗憾的是,他们可能无法完全理解原始代码所依赖的架构上下文,也意识不到在不同的组件中重用代码可能会在以后产生不必要的副作用,例如性能、可伸缩性或可用性问题。这些软件变更增加了技术债务,并降低了系统的整体质量,除非技术债务能够迅速得到解决。

  • 技术的发展导致一些软件系统运行在不是为它们设计的技术平台上。一些较老的软件系统经历了“灾难性的成功”,因为它们持续存在的时间比最初计划的要长得多,而且它们的技术债务已经变得非常沉重、难以解决且代价巨大,“偿还”起来非常困难。偿还技术债务的成本可能与完全替换该软件系统的成本类似,甚至有过之而无不及。

  • 失败的假设。逻辑的主体,包括软件系统,最终会因为假设的失败而崩溃,软件开发人员可能没有意识到他们所做的假设。隐藏的假设可以被认为是对系统的约束。关键在于要清楚地阐明所有的假设,并保持信息的更新。质量属性需求本身也是一种需要进行验证的假设,它们的实现需要经过经验的测试和确认,如果可能的话,可以使用自动化。性能、可伸缩性、弹性(例如,使用类似于Netflix猴子军团的框架)和安全性都是很好的例子。质量属性自动化测试的目标是持续对假设(例如,实现 QAR 仍然是现实的吗?)进行测试,并用以指导软件系统的演化。


如果对最初的架构没有很好的理解,即使增加了新特性(我们可以称之为“架构熵定律”),使用紧急架构创建的软件系统最终也会失去架构完整性。因此,它们可能不再是可持续的。


评估软件架构的适用性


如何知道你的软件系统什么时候磨损了,就像知道你的汽车轮胎什么时候磨损了并需要更换一样?就像医生可能使用许多不同种类的工具来评估个体的健康状况(心电图、MRI、CT、血液测试、体格检查)一样,不同的工具可以帮助团队评估软件架构的适用性。旧的系统可能难以理解,因为正如我们前面提到的,它们的设计决策和假设通常没有文档记录,而即使存在文档,也很可能是过时的。理解和评估系统的架构设计通常需要“软件考古”工具和技能。总的来说,有很多工具可以用来评估软件架构的适用性,包括:


  • 架构评审(特别是对等评审)是评估软件系统架构设计适用性的有效工具,特别是如果他们关注的权衡(例如,来自 CMU/SEI 的架构权衡评估方法(pdf))。

  • 自动化的软件质量评估工具(例如CAST),但是人们需要接受它们生成的结果。

  • 代码评审(特别是自动化代码评审)对于确保代码质量来说非常重要。结对编程是实现这一目标的另一种方法。

  • 适用性功能实现,例如自动化性能测试。

  • 增强框架实现,包括 Web 服务监控工具,为软件架构提供反馈循环。

  • 技术债务的识别和评估,包括标明会导致技术债务增加的决定。

  • 自动化测试工具(特别是负载/伸缩性/弹性测试)。

  • 缺陷趋势分析(这是技术债务的代理),需要使用一致的方式捕获数据,目标是识别不稳定性。

  • 生产事故趋势分析——与缺陷趋势分析具有相同的要求和目标。

  • 安全测试工具。使用这些工具的目的是找出风险暴露点。


结论


在“前期大设计”和敏捷实践之间长达 20 年的争议中,软件开发人员努力在这两种方法之间找到一个有意义的平衡点,并从有意识的架构活动转向自组织团队的架构设计。因此,他们常常认为软件架构并不是那么重要。更多地意识到架构当中存在的隐式决策,并迫使这些决策变成显式的,这有助于开发团队利用他们从 Sprint 和迭代中获得的经验数据做出更好、更明智的决策。现代架构实践,如持续架构演进架构,提供了可以帮助做出显式架构决策的工具,让开发人员能够交付更可持续的软件产品。


欲了解更多信息,请参考 Murat Erder、Pierre Pureur 和 Eoin Woods 合著的“Continuous Architecture in Practice”,以及 Murat Erder 和 Pierre Pureur 合著的“Continuous Architecture: Sustainable Architecture in an Agile and Cloud-Centric World”。


作者简介:


Pierre Pureur 是一位经验丰富的软件架构师,拥有广泛的创新和应用开发背景,丰富的金融服务行业经验,广泛的咨询经验和全面的技术基础设施知识。他曾担任一家大型金融服务公司的首席企业架构师,领导大型架构团队,管理大型并发应用程序开发项目,指导创新活动,以及制定战略和业务计划。他是“Continuous Architecture in Practice: Scalable Software Architecture in the Age of Agility and DevOps”(2021 年出版)和“Continuous Architecture: Sustainable Architecture in an Agile and Cloud-Centric World”(2015 年出版)的合著者,并发表了许多文章,还在多个软件架构会议上做演讲。


Kurt Bittner 拥有超过 30 年在短反馈驱动周期内开发软件的经验。他帮助许多组织采用敏捷软件交付实践,包括大型银行、保险、制造和零售组织,以及大型政府机构。他曾为包括 Oracle、HP、IBM 和微软在内的大型软件交付组织工作,曾是 Forrester Research 的技术行业分析师。他的工作重心是帮助企业建立强大的、自组织的、高性能的团队,为客户提供他们喜爱的解决方案。他写了四本关于软件开发的书,包括“The Nexus Framework for Scaling Scrum”。他现居科罗拉多州博尔德市,担任 Scrum.org 的企业解决方案副总裁。


原文链接

Why You Should Care About Software Architecture

2022-06-06 20:126253

评论 1 条评论

发布
用户头像
开篇:mvp与架构设计的关系
第一部分:说架构就是为了质量。
第二部分:说架构在开发过程以及上线过程中的作用。
第三部分:照抄的概念,没有实际内容


我只能说infoq的整体质量在下降,在各种商业化。这种凑一凑的文章也能翻译过来看。


有几个基本问题:

1. 演进式架构在架构过程中的作用没有说明?
2. 架构定义的很多流派这里就只说了决策派,决策之间的关系也没有说。
3. 国内大部分都在说架构的意义是:控制复杂度。这篇文章根本就没有类似的明确观点出来。
展开
2022-06-08 15:38
回复
没有更多了
发现更多内容

Claude用不了?火山引擎为开发者上线“搬家”方案

火山引擎开发者社区

火山引擎

恶性疟原虫检测系统基于YOLOv8的高效识别系统分享

申公豹

人工智能

在AI技术快速实现创意的时代,挖掘新需求成为核心竞争力——某知名AI框架需求洞察

qife122

AI开发框架 技术演进

智能体(AI Agent)开发实战之【LangChain】(八)核心模块:代理(Agents),ReAct Agent

我和AI的成长

智能体 langchain AI Agent

基于YOLOv8的电瓶车/电动车识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!

申公豹

人工智能

qKnow 知识平台【开源版】发布 1.0.0 版本,全面落地知识管理与智能抽取能力

千桐科技

知识图谱 大模型 知识库 qKnow Java知识图谱

首个AI教育实训基地落地无锡惠山,摩尔线程携手科大讯飞等合作伙伴赋能未来人才

新消费日报

天猫商品视频API数据解析(附代码)

tbapi

天猫API 天猫商品视频API 天猫商品视频数据采集 天猫视频API 淘宝视频采集

香蕉P图已经 Out 了!纳米 AI “P 视频” 才是王炸,视频生成到剪辑一站式搞定,丝滑出片!

阿星AI工作室

学习 AI 产品经理 大模型 AI工具

征程 6E/M|多 camera 场景示例

地平线开发者

自动驾驶 算法工具链 地平线征程6

设备点检 设备维护经验总结(6)

万里无云万里天

工业 设备维护 工厂运维 设备点检

理想汽车智驾方案介绍 4 | World model + 强化学习重建自动驾驶交互环境

地平线开发者

自动驾驶 端到端 地平线征程6

工业数字化 信息化经验总结(7)

万里无云万里天

数字化转型 信息化 工业 工厂运维

Claude 封禁中国?为啥我觉得是个好消息

Immerse

Genie 3:世界模型的新前沿 - 实时交互环境生成技术突破

qife122

人工智能 实时生成

欢迎马恩岛政府加入Have I Been Pwned数据泄露查询平台

qife122

网络安全 政府合作

Stack Exchange知识开放共享:现已在Snowflake Marketplace提供高质量AI训练数据

qife122

AI训练数据 知识共享

基于YOLOv8的铁轨旁的危险行为识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!

申公豹

人工智能

大数据-89 Spark应用必备:进程通信、序列化机制与RDD执行原理

武子康

Java 大数据 flink spark 分布式

2023年十大最佳游戏引擎指南:从Unity到Bevy全面解析

qife122

编程 游戏开发

Kaggle Grandmaster 的价值:不止于竞赛,更在于引领破局

咕泡科技

人工智能 Kaggle 咕泡ai 咕泡科技

第十四届中国智能产业大会,藏着AI落地的答案

脑极体

AI

智能体(AI Agent)开发实战之【LangChain】(七)核心模块:链(Chains),手把手教你搞定工作流(1)

我和AI的成长

智能体 #LangChain AI Agent

零压力了解 LoRA 微调原理

蛋先生DX

AI LoRa LLM 大模型微调 FineTuning

天猫图片搜索相似商品API开发指南

tbapi

天猫API 天猫图片搜索接口 天猫拍立淘接口 天猫图片搜索API 天猫图片API

大数据-90 Spark RDD容错机制:Checkpoint原理、场景与最佳实践 容错机制详解

武子康

Java 大数据 flink spark 分布式

在AI技术快速实现创意的时代,挖掘专业文档处理新需求成为关键突破点

qife122

AI技术 需求挖掘

人体跌倒识别检测项目|全流程源码+数据集+可视化界面+一键训练部署

申公豹

人工智能

让数据真正用起来:qData 数据中台开放12大模块,赋能业务创新与智能分析

千桐科技

大数据平台 qData 开源数据中台 Java数据中台 千数平台

会议实时转录接口 Recall 完成 3800 万美元融资,深耕对话数据基建;Locally AI 推出本地实时语音交互丨日报

声网

网络信息收集脚本详解

qife122

PowerShell 系统管理

为什么需要关注软件架构_架构_InfoQ精选文章