软件设计的系统思维

来自通约智库
跳转至: 导航搜索

作者:少个分号 [1]

专注软件设计和建模。公众号:DDD和微服务

系统科学方法是指用系统的观点来认识和处理问题的各种方法的总称。

其中,系统科学方法中模型方法是最重要的方法。研究系统具体来说就是通过它的模型来研究,模型是对系统原型的某一个方面的抽象,是科学认识的基础和决定性环节。

模型和实现是认识与实践的一种具体体现,充分反应了抽象、理论和设计的三个过程中的基本内容系统设计就是各种模型的转换,例如对象模型和数据表模型的转换。

少个分号.jpg

但是另外一方面,模型都是失真的,没有一个全能的模型能反映出系统的方方面面,否则这就是这个系统本身。系统本身要素过多,人脑的处理能力是有限的,难以对系统的逻辑全面的分析。

系统科学的意义

提高对复杂系统的理解能力

人的能力是有限的,对于一个复杂问题无法整体装入大脑完成处理。人的智力水平虽然有差距,但是没有数量级的差距,为什么人类在认知和改造客观世界中表现出巨大的差异呢?

答案取决于是否善于利用工具,和充分利用工具进行分析和实践。数学是一种工具,乘法可以对重复的加法进行化简,对数可以对重复的乘法运算进行化简。

系统科学应对软件的复杂性

《人月神话》一书对软件系统的复杂性做了说明。包含复杂度、一致性、可变性、不可见性等方面。

复杂度。软件开发面对的是客观世界模型的构建问题,相对于物理学等自然科学,可以忽略大量无关的元素和性质,软件工程师却不能简单地这样操作。构成软件复杂度的实体和关系对学习和理解造成负担,从而是软件开发逐渐的演变的难以控制。软件设计的关键在于能否控制和降低软件系统而复杂度。

一致性。大型软件开发过程中,为了保持各个子系统之间的逻辑一致性,软件必须随着时间的推移而修改,如果其中没有及时被抽象,软件的复杂性会随着时间的增加而增加。

可变性。软件相比硬件会持续面对变更的压力,这种变更又会造成一致性的破坏,这是软件开发面临的最大困难。

不可见性。软件即使通过图表来描述其结构也无法反应其复杂度和细节,除非深入查看代码。不可见性让软件开发的沟通成本增大。另外,往往图表、设计模型没有随着软件的更新而同步更新。未持续维护和更新的模型,是软件开发变成混沌系统的主要原因。

软件设计是结构化的,描述的是系统如何组成的问题。这种系统很难形式化的描述,只能通过结构化的方式描述。

系统科学的有用概念

系统科学中有一些概念对研究系统非常有帮助,可以为系统分析本身”统一语言“。

系统和子系统

系统是指由相互联系、相互作用的若干元素构成的、具有特定功能的统一整体。一个大的系统往往是复杂的,它通常可以划分为一系列较小的系统,这些系统称为子系统。

结构和结构分析

结构是指系统内各个组成部分(元素和子系统)之间相互联系、相互作用的框架。结构分析的重要内容就是划分子系统,并研究各个子系统的结构和联系。

层次和层次分析

层次是划分系统结构的一个重要工具,也是结构分析的主要方式。在系统分析中,明确层次关系可以避免对话时出现不对等,明确研究的问题在哪一个层次上可以避免因层次混淆而造成的概念混乱。

环境、行为、功能

系统的环境是指系统存在的背景,以及一个系统之外的额一切与它有联系的事物组成的集合。系统要发挥她应用的作用,一定要适应环境的要求。

系统的行为是指系统相对于它的环境所表现出来的一切变化,行为属于系统自身的变化,同时反映环境对系统的影响和作用。

系统的功能是指系统行为所引起的、有利于环境中某些事物的作用。

状态、演化和过程

状态是指系统有哪些可以观察和是别的形态特征,状态可以通过系统的一些定量特征来分析。

演化是指系统的结构、状态、特征、行为等随着时间的推移而发生的变化。系统的演化性是系统的基本特征。

过程是指系统的演化所经过的发展阶段,它由若干子过程组成。过程的基本元素是动作,动作不能再分。

系统科学的原则

整体性

量变引起质变。在分析系统时,一个显著的特征是整体的复杂性远远地大于局部。100 个子系统组成的系统,远远复杂于 3 个子系统组成的系统。

根据集合论的思想,多个子系统构成的系统复杂性为子系统的笛卡尔积。亚里士多德提到过,”整体大于部分之和“。同时有一些子系统的特性在大系统中会丢失,某些特殊情况下,当部分构成整体时,出现了部分所不具有的某些性质,同时也可能丢失了组成部分单独存在时具备的某些性质。

这个规律叫做 ”整体不等于部分之和“ 原理,也称为 ”贝塔朗菲定律“。系统的整体功能是否大于或者小于部分功能之和,关键是系统内部元素的相互联系和组合方式。

例如微服务系统的服务组织方式决定了系统的实际能力。

动态原则

动态原则是指系统总是动态的,永远处于运动变化之中。人们在科学研究中经常采用理想的 ”孤立系统“ 或者 ”闭合系统“ 的抽象。但是在实际中,需要考虑系统与系统之间,系统与外部环境之间的信息流动。

考虑系统与系统之间存在互相影响的关系就是动态原则。

最优化原则

系统的运行应该处于一种稳定状态,这种状态由一些正反馈或者负反馈调节。

人体这个系统的 PH 往往受到多种调节渠道完成调节,让 PH 最优,并保持稳定。在运行良好的 IT 系统中,系统的容量应该由某种反馈机制调节,例如系统用户激增会触发限流机制,让系统持续运行。

最优化原则也是系统的平衡原则。

模型化原则

模型化方法是系统科学的基本方法。模型可以通过符号、图表或者形式化的语言描述,用模型代替真实系统进行模拟实验,达到认识真实系统特征和规律的方法。

便于模型的分析和使用一般模型又分为以下几类:

概念模型。概念模型指系统中元素的关系,一般以静态实体呈现,并具有层次化特征。可以通过概念图来表达概念的层次关系。

逻辑模型。逻辑模型代表这个系统中,各个概念模型具有的行为和相互影响。可以通过影响图、因果图来表达元素的逻辑关系。

数学模型。数学模型是更为抽象、定量的描述系统的根本规律,例如分布式系统中两军问题的证明。一般通过形式化的语言进行描述,例如布尔代数、形式逻辑等。

模型分析的基本原则

抽象第一的原则。抽象,就是要对实际事物进行人为处理,抽取所关心的、共同的、本质特征的属性。抽象模型时候应该注意单一维度的抽象,例如软件逻辑的模型不需要关心界面如何展示, UI 的模型可以有设计系统、样式规则承担。

层次划分的原则。在子系统划分时,应该先按照层次结构请进行初步的拆分(水平划分),并在相同的层次进行划分(垂直划分)。系统划分需要满足等价关系的三个条件(自反性、对称性和传递性)。通过水平和垂直的划分可以逐步降低复杂性。

模型分析的操作方法

模型分析包括了建模、表达、验证和实现 4 个方面的内容。

建模。建立模型的过程实际上是清洗、简化、抽象的过程。通过清洗这个系统无关紧要的分支,并加以简化,再通过抽象得到一个只具备核心特征的模型。这个过程就是建模的过程,抽象的过程就是找规律的过程。

表达。模型需要以一种特定的形式表达出来,软件行业使用的工具非常多,UML图、 ER图等各种可视化的图表都是模型的表达,但注意,这些不是模型本身。

验证。一个模型要有用,需要和系统中的场景进行拟合,如果不能拟合这个模型则无法被使用。同时模型也需要能做到对未来场景在一定场景做出预测。在物理学上,相对论模型是通过红移现象验证的,另外也预测了新的天体存在。

实现。和物理、数学模型不同。计算机系统模型,还需要进行实现,变成可工作的软件。模型的建立是认识的部分,模型的实现这是实践的部分。

模型分析方法的挑战

分布式软件系统的模型分析缺少标准的描述语言,UML 比较困难表达分布式系统中的模型

软件系统中代码、模型和文档之间的维护关系比较困难,往往处于割裂状态,容易造成误解。解决这个问题的关键在于,模型应该内置到代码中,而非单独使用图表工具进行描述。

编辑于 2020-07-30