软件架构的复杂性和涌现

作者: 补天遗石 | 来源:发表于2017-07-28 21:07 被阅读200次
题图:香樟,浙江大学之江校区

计算机科学参与了复杂性学科的创立,并把复杂性引申为计算机科学的内涵。个人认为复杂性在软件架构领域引起重视有两个原因,其一是单体架构的承诺已经无效;其二是软件的使用者,即用户,开始深度参与到软件的架构设计中来。

随着单体架构的日渐式微,分布式架构的兴盛,微服务运动如火如荼,复杂性因此受到关注:目前,几乎所有的微服务文章开宗明义都会指出微服务架构是为了应对软件架构复杂性的挑战。

随着互联网的发展,特别是互联网+和移动互联网的发展,行业和用户开始深刻影响软件的架构和设计:软件架构设计再也不是架构师独立思考的产物,而是在和用户的互动中完成的。

复杂系统一般具有以下属性:具有大量组成成分的系统,成分互动关系的重要性大于成分本身;组成成分构成自我相似的多层级结构,高层级向下的因果关系,低层级向上的因果关系以及组成成分间的多重因果关系;系统是动态的,不停止的,具有突现,不可预测、不可化约、非线性;系统具有适应性,无中央控制,自我组织,正回馈或报酬递增等。

《Think Complexity》给出的定义是:复杂性科学是物理,数学和计算机科学交叉的跨学科领域,专注于具有许多组件相互作用的系统。如果想从更广泛意义上了解复杂性与进化、人工智能、计算、遗传、信息处理等领域的关系,可以参考梅拉妮·米歇尔(Melanie Mitchell) 的《复杂》一书。

在软件架构的领域研究复杂性,并不是要推翻还原论(比如模块化),而是探讨还原论在软件工业广泛应用之后,始终无法解决软件工程的组织效能问题,比如人月神话提出的挑战。复杂性更强调组件或者服务之间的关系,以及软件和用户之间的关系,用整体性思维观察软件开发的全过程。在企业中,架构的复杂属性往往对标系统架构师——那些在组织中缺位的一批人(很多国内架构师刚达到这个层级,就转向管理了)。系统架构师需要找到那些能够实现1+1>2的解决方案,实现整体最优。以飞机运输为例,乘客想要的是最快到达目的地,直接的方案是提高飞机的速度,但不能超过音速,以避免超过音速后引发的各种问题。从系统架构师的角度来看,这里要解决的问题并不是怎样飞的更快,而是如何缩短乘客从家中到机场,办理登机手续,过安检,上飞机,飞行,落地后取行李并达到最终目的地所需的总时间。

复杂性思考的本质就是从已知的未知向未知的未知延伸。这里的复杂(complex)并不是难懂的(complicated),难懂是已知的未知,复杂是未知的未知。传统软件开发是以实体为交付目标,逐层breakdown,整体等于部分之和。要做到这一点,软件各个实体从架构到实现都是需要提前study(已知的),需要探索的只是实现细节。所以传统软件开发特别强调需求的澄清,因为需求是可以澄清并且不会改变的。客户和开发者关注的都是成果本身,而不是成果的涌现物。而对于互联网软件来说,用整体性思维来看,需求变更本来就是常态。

涌现是系统运行过程中所表现,呈现和浮现的东西。涌现是我们构建系统的目标,是系统价值所在,也是系统思维的意义所在。功能是系统的第一层涌现,这里的功能包含基本功能和新的功能。性能是系统的第二层涌现,它是系统功能的对应。系统的第三层涌现是质量属性,包括可靠性,可维护性,可操作性,安全性,健壮性等。第三层涌现并不是立刻创造出价值,而是要通过系统在整个生命周期中的运作情况来体现。我觉得还存在系统的第四层涌现,就是软件设计者和开发者不能单独决定软件的功能和形态,而是和用户协同进化。

复杂性在软件架构领域的应用,首推《系统架构:复杂系统的产品设计与开发》一书。该书给出了一套具体的系统思考框架,供参考如下:

1,确定系统及其形式和功能

2,确定系统中的实体及其形式与功能,以及系统的边界及所处的环境

3,确定系统中各个实体之间的关系以及位于边界的关系,并确定这些关系的形式与功能

4,根据实体的功能及功能性的互动来确定系统的涌现属性

系统是由一组实体和这些实体之间的关系所构成的集合,其功能要大于这些实体各自的功能之和。在软件开发中,系统不能直接和产品简单对应。以微信为例,用户安装的产品是微信APP,但是在微信构建的系统中,包含了用户,数据,电商,公众号,小程序等实体。这些实体的功能要远大于各自功能之和,其架构也不能简单用APP+Cloud来描述。系统的架构原则就是对系统中的实体以及实体之间的关系进行抽象描述。

复杂性如何度量?复杂性守恒还是复杂性必然增长?在软件设计与开发的过程中如何去做?请关注我的后续文章。

相关文章

  • 软件架构的复杂性和涌现

    计算机科学参与了复杂性学科的创立,并把复杂性引申为计算机科学的内涵。个人认为复杂性在软件架构领域引起重视有两个原因...

  • DDD & CQRS & Event Sourcing

    一、 DDD分层架构 Evans在它的《领域驱动设计:软件核心复杂性应对之道》书中推荐采用分层架构去实现领域驱动设...

  • 036:复杂性科学思维

    复杂性科学 混沌与涌现 物理学 复杂性科学就是采用跨学科的手段, 研究这些不同复杂系统中共有的涌现行为 和统一性规...

  • 微服务与领域驱动设计,架构实践总结

    怎样的架构才能配得上造到飞起的变化? 一、软件复杂性 1、复杂原因 如果软件系统存在持续的迭代周期,那么其中业务、...

  • 直击架构本质:优秀架构师必须掌握的几种架构思维

    介绍 架构的本质是管理复杂性,抽象、分层、分治和演化思维是我们工程师/架构师应对和管理复杂性的四种最基本武器。 最...

  • <领域驱动设计>读书心得

    概述 《领域驱动设计》软件核心复杂性应对之道。读完之后几个感受: 架构设计的从混乱到模式和方法论,后面会说 复杂问...

  • 识别复杂度

    架构设计由需求所驱动,本质目的是为了解决软件系统的复杂性;为此,我们在进行架构设计时,需要以理解需求为前提,首要进...

  • restful是什么

    本质:一种软件架构风格核心:面向资源解决的问题:降低开发的复杂性、提高系统的可伸缩性设计概念和准则:网络上的所有事...

  • restful与webservice

    restful 本质:一种软件架构风格 核心:面向资源 解决问题: 降低开发的复杂性 提高系统的可伸缩性 ...

  • 软件架构的位置

    软件架构的位置: 1.上承业务目标 2.下接技术决策 3.控制复杂性 4.组织开发 5.利于迭代开发和增量交付 6...

网友评论

    本文标题:软件架构的复杂性和涌现

    本文链接:https://www.haomeiwen.com/subject/qjgflxtx.html