系统设计中的复杂性控制

在长期维护企业级中后台系统或信息化平台的过程中,我们经常会发现系统随着时间的推移变得越来越难以理解和修改。这种“软件熵”的增加,本质上是由于复杂性失去了控制。

1. 定义“必要的复杂性”

我们需要区分两种复杂性:本质复杂性(Essential Complexity)和偶然复杂性(Accidental Complexity)。前者是由业务逻辑本身决定的,无法通过技术手段消除;而后者往往源于过度设计、过时的依赖库或不一致的接口定义。

Architecture Note 控制复杂性的第一步,不是增加抽象层,而是剪枝。问自己:这个 AbstractFactoryBean 真的解决了问题,还是仅仅增加了一个我需要维护的概念?

2. 模块化的颗粒度

在 Java 技术栈(如 Spring Cloud)的环境下,微服务的拆分往往容易走入极端。过细的拆分会带来沉重的分布式事务成本和网络延迟。我倾向于在单体内部先通过良好的 Domain-Driven Design (DDD) 边界进行逻辑隔离,当某个领域的迭代频率远超其他领域时,再考虑物理剥离。

3. 状态管理与副作用

复杂的 bug 往往源于共享状态的混乱。通过引入不可变对象、明确的 Service 层边界,以及在数据库层面合理使用事务隔离级别(如 PostgreSQL 的一致性特性),可以极大地降低心智负担。

记住:可预测性比灵活性更重要。 一个容易预测的系统,才是好维护的系统。