需求引起的软件复杂度


需求分为业务需求与质量属性需求,因而需求引起的复杂度可以分为两个方面:
1. 技术复杂度
技术复杂度来自需求的质量属性,诸如安全、高性能、高并发、高可用性等需求,为软件设计带来了极大的挑战,让人痛苦的是这些因素彼此之间可能又互相矛盾、互相影响
2. 业务复杂度
业务复杂度对应了客户的业务需求,因而这种复杂度往往会随着需求规模的增大而增加。由于需求不可能做到完全独立,一旦规模扩大到一定程度,不仅产生了功能数量的增加,还会因为功能互相之间的依赖与影响使得这种复杂度产生叠加,进而影响到整个系统的质量属性,比如系统的可维护性与可扩展性。

  1. 技术复杂度与业务复杂度并非完全独立,二者混合在一起产生的化合作用
  2. 更让系统的复杂度变得不可预期,难以掌控。

无序设计带来的复杂度问题

  1. 没有对行为的重用,也没有对业务问题的抽象,每当操作用到业务规则时,都要重复这些业务规则。
  2. 快速的原型建立和迭代很快会达到其极限,因为抽象的缺乏限制了重构的选择。
  3. 复杂的功能很快会让你无所适从,所以程序的扩展只能是增加简单的应用模块,没有很好的办法来
  4. 实现更丰富的功能。

控制复杂度

  1. 分而治之的思想,遵循小即是美。
  2. 清晰直观且易于理解的结构。
  3. 遵循稳定依赖原则,不对变化或易于变化的事物形成依赖。

拥抱变化


可进化性(Evolvability)
可扩展性(Extensibility)
可定制性(Customizability)

隔离业务复杂度与技术复杂度

  1. 要避免业务逻辑的复杂度与技术实现的复杂度混淆在一起,首要任务就是确定业务逻辑与技术实现的边界,
  2. 从而隔离各自的复杂度
  3. 在理想状态下,我们应该保证业务规则与技术实现是正交的。
  4. 领域驱动设计通过【分层架构】与【六边形架构】来确保业务逻辑与技术实现的隔离。