1 简介
敏捷开发方法论日益流行,然而大多数“敏捷”专家和分析师都在孤立地讨论敏捷,也就是说忽视了系统“结构”(Kirk Knoernschild是一个例外,他编写了一本名为《Java Application Architecture》的图书阐述这一理念)。考虑到“敏捷”是基础实体的一个重要特性或属性,那么,这种疏忽令人感到很惊讶。一个实体要具有“敏捷”的特性,它必须具有高度的结构性模块化(structural modularity)特征(参见Scott Page的《Diversity & Complexity》)。
也许正因为这种疏忽,许多组织在敏捷开发流程方面进行投入但忽略了应用程序的结构。除了“如何实现一个敏捷的系统?”这个问题以外, 有人肯定还会问, “如何构建一个在结构上具备高度模块化的系统?”
这个系列的文章将从探讨结构性模块化和敏捷之间的关系开始。
2 结构、模块化与敏捷
业务主管和应用开发人员经常面临相同的挑战。无论是商业领域还是服务于商业的软件,它都必须在成本范围内构建和维护。如果要保持实体的持续运营,就必须能够以低成本的方式快速响应难以预料的变化。
如果我们希望高效地管理一个系统,就必须先理解该系统。只有理解了系统,可控制的变更和定向升级才能成为可能。
当然,我们并不需要理解系统的每个组成部分的详细情况和特性,只需要理解所负责的系统的相关参数以及相应等级层次的行为即可。
隐藏服务实现
从外部角度来看,我们仅仅关心系统暴露的行为、提供的服务类型以及该服务的属性。例如,服务可靠吗?与替代方案相比有竞争力吗?
图1:服务的使用者
作为服务的使用者,我们并不关心服务的特性是如何实现的,我们只关心所提供的功能(Capability)是否可以满足我们的需求(Requirement)。
理解结构以便管理
不同于使用者,服务的实现方式对于服务的提供者而言,是极为重要的。为了更好的理解,我们为负责提供服务的系统建立概念模型,这是通过将系统分解成一组更小的相互关联的单元实现的。如果这个实体是某个公司,这张组件图就代表了“组织结构图(Organization Chart’)”;如果这个实体是软件应用程序,那么这张图就是模块间依赖关系的映射图。
尝试理解抽象系统的第一步如下图所示。
图2: 服务提供者和系统维护者