2.1 复杂性的定义
出于本书的目的,我以实用的方式定义“复杂性(complexity)”。复杂性是与软件系统的结构有关的任何东西,它使人难以理解和修改系统。复杂性可以有多种形式。例如,可能很难理解一段代码是如何工作的;可能需要花费很多精力来实现一个小的改进,或者不清楚必须修改系统的哪些部分来进行改进;可能很难在修复一个错误的同时不引入另一个错误。如果一个软件系统难以理解和修改,那么它就是复杂的;如果它容易理解和修改,那么它就是简单的。
你也可以从成本和收益的角度来考虑复杂性。在一个复杂的系统中,即使是小的改进也需要大量的工作来实现。在一个简单的系统中,我们可以付出更少的努力,实现更大的改进。
复杂性是开发者在试图实现一个特定的目标时在一个特定的时间点上所经历的事情。它不一定与系统的整体规模或功能有关。人们经常用“复杂(complex)”这个词来描述具有成熟(译注:原文中使用的是sophisticated一词,这里为了不翻译成“复杂”引起歧义故选择译为“成熟”)功能的大型系统,但如果这样的系统很易于操作,那么,就本书的目的而言,它并不复杂。当然,几乎所有的大型的、成熟的软件系统事实上都很难操作,所以它们也符合我对复杂性的定义,但情况不一定如此。一个小而简单的系统也有可能是相当复杂的。
复杂性是由最常见的活动决定的。如果一个系统有几个部分是非常复杂的,但这些部分几乎不需要被触及,那么它们对系统的整体复杂性就没有什么影响。用一个粗略的数学方法来描述这个特点:
一个系统的整体复杂性(C)是由每个部分p的复杂性(cp)按照开发人员花在该部分的时间比例(tp)加权决定的。将复杂性隔离在一个永远不会被看到的地方,几乎和完全消除复杂性一样好。
复杂性对读者来说比作者更明显。如果你写了一段代码,在你看来很简单,但其他人认为它很复杂,那么它就是复杂的。当你发现自己处于这样的情况时,不妨去追问一下其他开发者,弄清楚为什么代码在他们看来很复杂;从你的观点和他们的观点之间的脱节中,可能有一些有趣的教训可以学习。作为一个开发者,你的工作不仅仅是创建你可以轻松使用的代码,而且要创建其他人也可以轻松使用的代码。
Last updated