复杂系统是由大量相互作用的部分组成的系统。与整个系统比起来,这些组成部分相对简单,没有中央控制,组成部分之间也没有全局性的通信,并且组成部分的相互作用导致了复杂行为。
在软件系统中,函数、类、模块、组件和服务等都可以视为组成部分,他们之间的相互作用最终导致了软件系统的复杂行为。
下面通过如下示例来更直观的感受下理解能力和预测能力两个维度对复杂度的描述:
软件系统属于“复杂难解”+“复杂难测”,跟城市建设属于同一复杂度。下面从理解能力和预测能力两方面对软件系统的复杂度进行分析。
系统规模的扩张,不仅取决于需求的数量,还取决于需求功能点之间的关系,评估软件系统规模的元素包括但不限于以下几个
开发过程中有很多的问题会导致软件系统规模的无序扩张,比较典型的有下面几个,资深程序员应该都遇到过
结构之所以变得复杂,多数情况下是由系统的质量属性决定的。软件系统从最初的单体系统到现在的分布式微服务体系,整个发展历程一直是不断拆分的微型化过程。软件系统的复杂同时也会加剧人员组织结构的复杂度。康威定律指出,任何组织在设计一套系统(广义概念上的系统)时,所交付的设计方案在结构上都与该组织的沟通结构保持一致。
无论是优雅的设计还是拙劣的设计都会给系统带来复杂度的增加,不同的是,优雅的设计是主动控制结构的复杂度,拙劣的设计带来的复杂度是偶发的,无序的,是技术债。
无序设计的几个典型表现:
影响预测能力的关键要素在于变化,而我们无法预知未来,也就无法预测未来可能发生的变化,这就带来了软件系统的不可预测性。对变化的应对不妥,就会导致软件系统的过度设计或设计不足。
领域驱动设计对软件复杂度的控制之道就是竭力改变设计的质量,然后在解空间中通过“分而治之”的方法将庞大的系统拆分为一个个小的软件元素来解决问题空间中的一个个细粒度的问题。拆分手段就是限界上下文和上下文映射,它们是战略设计阶段的核心。
为避免业务逻辑的复杂度与技术实现的复杂度混杂在一起,就需要确定业务逻辑与技术实现的边界,从而隔离各自的复杂度。这种隔离也符合关注点分离的设计原则。为此,领域驱动设计引入了分层架构,分层架构将业务逻辑封装到领域层,支撑业务逻辑的技术实现放到基础设施层,应用层既扮演了领域层的外观,又解决了业务逻辑跟技术实现的协作问题。
领域驱动设计通过限界上下文隔离了业务能力的边界,通过分层架构隔离了业务逻辑与技术实现,如此,保证了整个系统具有了清晰的结构,实现了有序设计。
应对变化最好的方式就是将变化锁进笼子里,通过模式等抽象方法将不同维度、不同粒度的变化限定在一个可控的范围内,当变化来临时能及时感知,并作出最小的适应性改动。
通过领域建模可以将看似分散的事务抽象成一个统一的领域模型,将复杂的业务通过可视化的方式表达出来。当需求发生变化时,通过比对抽象出来的业务模型,即可敏锐的发现增量变化的部分,从而以最小的代价响应新增的需求。
本文内容为《解构领域驱动设计》(张逸 著)相关章节的读书摘要,略加修饰和解读,旨在加深理解,与君共勉
领取专属 10元无门槛券
私享最新 技术干货