让我们想象一下,我把你传送出去,丢到世界上某处一条安静、树木茂密的乡间小道(图1)。你在哪里,如何找到这个问题的答案?你可以大声呼救,但这只在附近有人的时候才管用。或者你可以抬腿就走,直到认出什么东西,或者遇到某些文明后向他们寻求帮助。作为极客,我们可能会打开智能手机上的地图应用程序,用GPS来确定方位(图2)。
从细节到大局
图2的问题是,尽管它可以显示我们的方位,但“放大”得有点多,没有什么意义。如果进一步缩小,最终我们会看到,我把你传送到了泽西的一条乡间小道(图3)。
接下来的问题,卫星图像显示了很多细节,相对于岛上一些显著的特征,如主要的道路和场所,很难看出我们在哪里。为了解决这个问题,我们可以移除卫星图像(图4)。尽管没有那么详细,这种抽象却让我们看到了岛上一些主要的结构元素以及地名,这正是之前被细节掩盖的。有了这张岛的简化视图,我们可以进一步缩小,直到得到一张显示了泽西在欧洲的确切位置的大图(图5、图6和图7)。所有这些图像从不同的抽象层次显示了同一个方位,每一个都可以帮助你回答不同的问题。
如果我打开一个复杂软件系统的代码库,随机突出一行代码,探索会很有趣,但要搞明白你在哪里以及代码如何融入软件系统这个整体,都要花一些时间。大多数集成开发环境都有办法通过命名空间、包或文件夹来浏览代码,但代码库的物理结构和逻辑结构往往是不同的。举个例子,你可以用很多个类组成一个组件,用那些组件再组成一个可部署单元。
图表可以作为地图来帮助人们浏览一个复杂的代码库,这是软件的辅助文档最重要的组成之一。理想情况下,应该有数张简单的图表,各自展示软件系统或抽象层次的不同部分。我的C4方法就总结了软件系统的静态结构,但也有包括应用UML在内的其他方法。