首页 > 其他分享 >软件系统的复杂性(译)

软件系统的复杂性(译)

时间:2023-05-17 20:24:04浏览次数:37  
标签:软件系统 附带 代码 复杂性 工具 我们 消除

软件的复杂性: 必要的、意外的和偶然的

随着我们工程领域的发展,软件的复杂性似乎变得越来越难以控制了。为了正确理解如何处理不断增加的复杂性,重要的是要分辨出软件复杂性的三种基本类型:基本的、偶然的和附带的复杂性。
基本的复杂性
这种类型的软件复杂性与我们试图建模的领域的复杂性有关。更具体地说,我们正在处理管理业务流程的业务政策规则。当试图实现和自动处理这些政策规则时,我们会遇到不同程度的复杂性。
无论我们如何努力,这种复杂性都是无法被削减的。例如,如果管理索赔处理的业务政策规则需要15个不连续的步骤,我们不能通过跳过一些步骤来简化规则,将处理过程压缩到只有几个基本步骤。
总之,基本的复杂性是不可避免的,这也是我们作为软件工程师受雇于人的真正原因。
意外的复杂性
虽然基本的复杂性是值得拥有的(为客户提供价值,为企业带来竞争优势,并为工程师提供令人兴奋的职业机会),但意外的复杂性会产生反作用。这种类型的复杂性是由于缺乏适当的理解、教育和培训造成的,也可能是由于业务和软件工程之间沟通不畅造成的。
意外的复杂性表现为不良的架构、不良的设计、不良的代码以及不良的软件工程流程。因为意外的复杂性是由上述一些或所有的因素造成的,所以摆脱它的唯一方法是消除其原因。
消除意外复杂性的原因的最快捷的方法是教育、培训、指导和辅导。总有改进的余地,我们越是把日常活动的重点放在学习上,我们就能越快地把偶然的复杂性降到最低。
偶然的复杂性
这种类型的复杂性是最难处理的一种。而且它绝对是最具有反作用的复杂类型。
当我在大学时,我了解到编写软件包括接收数据,以编程方式操作它,将其存储在本地,然后将其发送到某个地方。在我接受教育的过程中,我从未想过要学习负载均衡器、各种数据存储(SQL、NoSQL、memcached)、容器(Vagrant、Docker Kubernetes)以及其他工具和技术,每一种都只是提供应用程序的一个部分。那时,这些基础设施工具被视为仅仅是恼人的细节。
使这些恼人的细节变得如此突出的根本原因在于Unix哲学: "只做一件事并把它做好"。工具遵循渐进式的进化路径;每个工具开始时都是一个简单的实用程序,旨在挠痒痒。通常,"挠痒痒 "包括解决一些已知的问题。从那时起,这些工具通过改进以前的能力而不断发展。当然,这种改进从来都不是着眼于消除复杂性。
例如,Git是一个比Subversion更好的版本控制工具(Git是Subversion的后续发展),但Subversion比Git简单得多。
如何降低复杂度
降低复杂度的唯一方法是去除事物。与其继续在进化的道路上为现有的东西建立更好的版本,我们必须消除一些东西。
例如(一个非常简化的例子),我们的工具箱里目前可能有两个工具。我们把这两个工具捆绑在一起,形成我们的工作流程,这种安排有助于我们完成工作。
如果我们现在摆脱这两个工具,建立一个工具,做以前每个工具都知道如何做的两件事,我们就消除了附带的复杂性。一个单一的工具不仅消除了界面,还减少了之前我们需要两个工具来处理的两个问题的表面积。
想象一下,如果我们把几十个工具集中到一个单一的工具中,我们会得到怎样的简单性收益。通过这样做,我们消除了一大堆附带的复杂性,因为我们不需要担心工具之间的接口和重叠问题。
目前,在尽可能地消除附带的复杂性方面,最好的技术是.Net。它目前的迭代(C#-Visual Studio-Azure)提出要消除大量的专业工具,这些工具带来了繁重的开销。让我们来看看我们正在努力驯服的附带复杂性的一些方面。
代码即文本的复杂性
我们把代码写成文本,这就带来了引入语法错误的高风险。当我们把一些代码写成文本时,我们要求编译器来阅读它,而很多时候它无法阅读代码(阅读代码的尝试导致了编译器错误)。好的编辑
好的编辑器(例如,Visual Studio和Visual Studio Code)建议使用编程语言,而不仅仅是机械地协助格式化文本。
好的工具(编辑器)通过将各种较小的工具合并到一个大的工具中,使附带的复杂性最小化。Visual Studio理解编程语言,并提供智能提示/自动完成功能。访问控制和协作也被植入这个工具。除此之外,重构也是内建的,还有版本控制、特征标志、函数和类型版本控制。
这样先进的编辑器在减少甚至彻底消除附带的复杂性方面有很大的作用。强烈建议我们充分利用这种先进的工具。
基础设施的复杂性
与运行我们代码的机器有关的一切都被称为计算基础设施。队列、防火墙、网络、负载均衡器、扩展、安全、监控、数据库、分片等等。作为专注于不间断地提供价值的软件工程师,我们只对与数据、业务策略规则处理和客户的工作感兴趣。上述所有的基础设施概念仅仅是烦人的细节,并没有给客户带来任何价值。因此,我们将基础设施视为附带的复杂性(必要的邪恶)。我们的付费客户不可能不关心我们的排队、扩展、监控等政策。
诸如Azure这样的最佳技术在抽象出上述许多基础设施问题方面有很大的作用,使我们从许多附带的复杂性中解脱出来。
部署的复杂性
完成的代码(即候选版本)需要从一台机器同步到另一台机器。从概念上讲,这种操作应该是微不足道的。但在实践中,如何快速、安全地完成这种同步是一个挑战。为什么会这样呢?让我们来数数有哪些方法:
- 打包代码(Docker容器、tarball、webpack、jars、git checkout...)
- 测试代码(代码覆盖率、变异测试、浏览器测试/Selenium)。
- 同步代码(git推送、Docker注册、工件托管、S3、CDN)。
- 启用新代码(Kubernetes、反向代理、Capistrano、交换符号链接)
- 推广代码(功能标志、暗中启动、隔离启动、蓝绿部署、数据库迁移、API版本)。
同样,Azure在尽量减少部署代码时附带的复杂性方面取得了一些进展。
API的复杂性
理想情况下,使用API不应该比调用一个函数更难。然而,情况几乎不是这样的。认证、速率限制、重试、错误等都会使这些调用变得附带复杂。
我们正在试图处理这些挑战的一些方法: SOAP / REST / HTTP+JSON / gRPC / GraphQL / Protobuf。
这类附带的复杂性还有待解决。有一些希望,随着Azure等平台的成熟,它们将提供工具,以减少我们在使用API时面临的选择丛林。
总结
复杂性是运送高质量软件的最大敌人。一种类型的复杂性(即基本复杂性)是可取的,因为它为企业和客户提供了竞争优势。其他类型的复杂性(意外的和偶然的)是不可取的,因为它们对付费客户完全没有增加任何价值。
通过明智地选择我们的技术栈,我们可以避免一些偶然的复杂性。而通过选择我们的培训/教育路径,我们也可以避免几乎所有的意外复杂性。
总而言之,那些设法尽量减少/消除他们运营中的大量意外和偶然的复杂性的企业将保持竞争力并在市场上取得胜利。

标签:软件系统,附带,代码,复杂性,工具,我们,消除
From: https://www.cnblogs.com/kanescodehome/p/17410029.html

相关文章

  • 领域驱动设计-软件核心复杂性应对之道:第六章
    第六章领域对象的声明周期接下来,我们将注意力转移到生命周期的开始阶段,使用factory(工厂)来创建和重建复杂对象,并使用aggregate来封装它们的内部结构。最后,在生命周期的中间和末尾实验repository(存储库)来提供查找和检索持久对象并封装庞大基础设施的手段。使用aggregate进行建模,......
  • 领域驱动设计-软件核心复杂性应对之道:第三章
    三、绑定模型和实现模型种类繁多,目的各有不同,即使是那些仅用于软件开发项目的模型也是如此。领域驱动设计要求模型不仅能够指导早期的分析工作,还应该成为设计的基础。这种设计方法对于代码的编写有着重要的暗示作用。不太明显的一点就是:领域驱动设计要求一种不同的建模方法...........
  • 定制开发软件系统要清楚哪些核心?这些核心要记住
     许多企业商家不知道的是,自己在找开发商定制一个软件系统的时候要清楚一些核心,否则会降低自己开发的成功率。那么定制开发软件系统要清楚哪些核心?今天名锐讯动为大家总结这些核心要记住。 1.功能需求。众所周知,定制开发一个软件系统是需要围绕功能需求而实现的。如果没有具......
  • 领域驱动设计-软件核心复杂性应对之道:第二章
    第二章语言的交流和使用2.1模式​ 由于语言上存在鸿沟,领域专家们只能模糊地描述他们想要的东西。开发人员虽然努力去理解一个自己不熟悉的领域,但也只能形成模糊的认识。有少数的团队成员会学着同时说这两种语言,但由于这样的人太少了,信息流会遭遇瓶颈问题,而且他们的翻译也不准......
  • ERP进销存软件系统 电脑端 手机端 小程序通用(教程)
    ERP(EnterpriseResourcePlanning)即企业资源计划。 可以电脑端 手机端 小程序 数据同步  多账户 使用ERP进销存软件系统网址 https://erp.776KD.com财务管理  仓库管理  商品管理  销售单管理 库存明细 采购管理 支持打印机打印ERP进销存系统的特点......
  • 软件系统设计-2-策略模式
    1.策略模式引入:鸭子1.1.从SimUDuck应用程序开始我们需要添加功能使得鸭子可以飞简单的修改鸭子父类,我们可以发现这样子橡皮鸭也可以飞我们需要意识到不是所有的鸭子都会飞考虑继承我们总是可以像使用quack()方法一样在橡皮鸭中覆盖fly()方法…但是,当我们在程序中添加木制诱饵......
  • 领域驱动设计-软件核心复杂性应对之道:第一章
    第一部分让领域模型发挥作用​ 每个模型都表示人们感兴趣的某方面显示或某种想法。模型是一种简化。它是对现实的解释,并把与解决问题密切相关的方面抽象出来,而忽略无关的细节。​ 每个软件程序的目的都是为了执行某项活动,或是满足用户的某种需求。用户会把软件程序应用于某个主......
  • 计算机系统的组成(2软件系统篇)
    软件系统:系统软件、应用软件系统软件:操作系统、语言处理程序、系统支撑和服务程序、数据库管理系统应用软件:WPSoffice、Photoshop、Microsoftoffice等1)系统软件A.操作系统(OS)是人与计算机进行通信的一个接口,是对计算机硬件资源和软件资源进行控制和管理的各种程序的集合。(......
  • [软件设计] 软件系统总体结构设计 | 软件架构概述 [转载]
    1概述对于程序员而言,开始关注架构就是重大进步。就已经从单纯写代码的层次里跳了出来,至少从“增删改查”中跳了出来,能以更宏观的视角去思考代码、思考软件工程!这是一个......
  • 在Linux系统中运行Classic AUTOSAR软件系统
    “转载自维克多汽车技术(上海)有限公司,作者VectorChina”无论是ADAS/AD软件系统验证的数据回灌训练或并行仿真验证,还是在软件快速迭代中的持续集成与持续测试,都需......