软件的复杂度

作者:程序员罗尼 | 发布:2022-04-02 | 原文:https://mp.weixin.qq.com/s/oFlfpoIk93gs4v4lCXFPgg


软件工程的核心问题就是控制复杂度。

那么,复杂度究竟来自于哪里呢?

复杂度的两个维度

Jurgen Appelo 从以下两个维度分析了复杂度的成因:

  1. 可理解性(结构上):可分为简单、复杂
  2. 可预测性(行为上):可分为有序、复杂、混沌

我们针对这两个维度的组合举一些例子:

  1. 结构简单,行为有序:袜子
  2. 结构复杂,行为有序:手表
  3. 结构简单,行为复杂:3 人团队
  4. 结构复杂,行为复杂:城市
  5. 结构简单,行为混沌:双摆、三体
  6. 结构复杂,行为混沌:股市

对于软件来说,更像是城市,结构复杂,行为也复杂。下面我们分别从可理解性和可预测性两个维度考察一下软件的复杂性。

可理解性

从理解难度上来讲,软件复杂性主要取决于软件的规模和结构

软件的主要驱动力是业务需求和质量需求。业务需求常常导致软件的规模扩张,质量需求常常导致软件结构复杂度上升。不论规模增大或者结构变得复杂,都会使软件变得难以理解,再加上无可避免的技术债务的积累,导致软件越来越难以理解。

可预测性

从预测难度上来讲,业务需求在不断变化,技术需求也在变化。但是由于需求变化难以预测,导致我们也无法准确预测软件之后的发展。

虽然无法预测,但是由于当前的设计决策又会影响后期软件的变更成本,所以软件设计又不得不考虑应对变化。应对变化时,由于变化的难以预测,经常会导致过度设计或者设计不足:

  • 过度设计增加了无谓的设计元素,导致软件更加难以理解,降低了可理解性。
  • 设计不足虽然不会导致可理解性降低,但是又导致在需求发生变化时,修改软件的成本变高。高成本很可能导致我们采取打补丁的方式修改软件,留下技术债,间接降低了可理解性。

总结

由此可见,软件的需求导致了理解难度的加大,需求的变化导致软件难以预测,应对变化的努力又可能进一步增加理解难度,所以软件确实在可理解性和可预测性上都属于复杂系统。

但正因为软件如此的复杂,也才使得软件工程师这个职业变得更有挑战和趣味。为了应对和掌控软件的复杂性,无数聪明的头脑提出了各种理论、原则、模式、实践等等。相信通过学习这些知识,我们会在克服软件复杂度的路上越走越顺畅。

参考资料

  1. 《代码大全》
  2. 《企业应用架构模式》
  3. 《解构领域驱动设计》
END