乐于分享
好东西不私藏

软件复杂性如何理解

软件复杂性如何理解
早晨看到一个讨论一个关于AI的流行观点,其实是错误的,很多人不认同文中定义的复杂性。这里要区分一个东西,就是蛋白质构造分析和预测本身不复杂,以前手工实验做是效率问题。而发明alphafold是一个复杂问题,这个从哈斯比斯自传可以看出来,他们研究了很多种方法和实验。
关于软件复杂性我一直在思考,总结了不少东西,很多都在知乎上。复杂性应该是我写的文章中非常高频的词语,但是解释这个词本身就是非常复杂的一个东西。复杂性定义通过阅读书籍和文章,也收集了不少定义观点:
* 来源《A Philosophy of Software Design》
Complexity is anything related to the structure of a software system that makes it hard to understand and modify the system:

* 西蒙(Herbert Simon)发表了一篇著名的文章——《复杂性的结构》

文中西蒙提出一个系统的复杂性可以用层次度(degree of hierarchy)来刻画:“复杂系统由子系统组成,子系统下面又有子系统,不断往下。 西蒙认为,复杂系统最重要的共性就是层次性和不可分解性。软件也是不同层次的结构一步步组合而成。

*热力学深度复杂性-来源梅拉妮·米歇尔《复杂》

首先是确定“产生出这个事物最科学合理的确定事件序列”,然后测量“物理构造过程所需的热力源和信息源的总量”。我们要能列出事物产生过程中的所有事件。软件目前有GIT提交历史,也许可以看到复杂性

John Gall, Systemantics (1975):

A complex system that works is invariably found to have evolved from a simple system that works. The inverse proposition also appears to be true: A complex system designed from scratch never works and cannot be made to work.

黑天鹅书中的一个定义

什么是复杂性?相对于更完整的定义,在这里我会简单地采用复杂性的功能性定义。复杂领域具有下列特征:其组成因素之间具有高度的相互依赖性,包括时间依赖性(一个变量依赖于其过去的变化)、水平依赖性(不同变量之间相互依赖)和对顶依赖性(变量A依赖于变量B的历史)。这种相互依赖性的结果是,方法取决于正面的增强反馈回路,从而引起肥尾。这就是说,其会阻止我们在第十五章中看到的中央极限定理起作用,其会在要素总和和集合情况下建立平均斯坦瘦尾,并引发高斯收敛。用通俗的话来讲,发展随着时间推移而加剧,而不会被平衡力所压制。最终,我们可以通过非线性来强化肥尾

Tesler's Law (Conservation of Complexity)(特斯勒定律 / 复杂度守恒定律

拉里·泰斯勒于1984年提出。该定律指出:任何应用程序或系统都包含一定量的无法被简化的固有复杂性。问题的关键不在于能否消除这个复杂性,而在于由谁来处理它——是让系统开发者(以及背后的硬件、算法)去承担,还是让用户去忍受和理解。

Bill Gurley中关于复杂性的定义:

I would describe complex systems as multivariable nonlinear systems. And multivariable nonlinear systems are very hard to predict. They can behave one way for a long time, and then one variable can switch and they can behave another way—the weather, stock markets, all these things. There are consequences that can be first, second, or third-order. You can't just think with a linear model or just think about one variable because things can go way off the path. You need to be aware that if you make a change here, it could change something here, which could change something there, and it has to be the whole system. You've got to be really conscious of the consequence and not get too deterministic about a single metric or a single variable.

Wolfram定义复杂系统:

“计算不可约性”(ComputationalIrreducibility),即无法通过更简化的计算步骤或公式来准确预测系统的最终结果,只能像系统本身一样一步步进行实际计算。这种不可约性决定了复杂系统的不可预测性,也是复杂性的重要体现。

软件复杂性三个维度:结构,行为,演化。理解一个复杂软件,可以根据三种方式进行理解软件复杂性分别是:结构维度(静态)、行为维度(动态)、演化维度(进化)。结构维度的核心在于从代码中发现实现各种功能和非功能需求的结构(如并发,通信,内存,存储,冗余等)。行为维度在于从运行的角度挖掘组件之间的实际交互,干扰等,目前主要手段是可观测技术。演化维度,核心在于挖掘软件为什么是进化成现在这个样子。理解演化就要从设计决策开始。
结构复杂性:《A Philosophy of Software Design》,(Herbert Simon)层次度(degree of hierarchy)度量
行为复杂性:正面的增强反馈回路,multivariable nonlinear systems
演化复杂性:计算不可约性度量,热力学深度复杂性-来源梅拉妮·米歇尔《复杂》,John Gall, Systemantics,
相关知乎文章:
  •  软件复杂性探索:
https://zhuanlan.zhihu.com/p/2053415788212757476
  • 软件复杂性表征研究

https://zhuanlan.zhihu.com/p/2022027444639605773

软件复杂性表征:结构复杂性
  • 复杂而迷人的软件复杂性

https://zhuanlan.zhihu.com/p/1988319366853464841

  • 谈软件的复杂性

https://zhuanlan.zhihu.com/p/621379049