设计耐力假说
2007年6月20日
好的软件设计值得付出努力吗?
我时常间接地听到一些关于好的软件设计是否值得的讨论。我说这些对话是间接的,因为我从未见过有人说软件设计毫无意义。通常,它们以这样的形式表达:“为了在明年实现我们的目标,我们真的需要快速行动,所以我们正在减少<一些设计活动>”。
这里面有一种观念,即设计是可以为了速度而牺牲的东西。事实上,我曾多次遇到过这样的印象,即容忍设计工作是为了让程序员高兴,即使这会降低速度。
如果在设计上投入精力会降低编程效率,那我就会反对它。事实上,我认为如果真是这样的话,大多数软件开发人员都会反对设计。开发人员可能对什么是好的设计有不同的看法,但他们都赞成他们所认为的好的设计,因为他们相信这会提高生产力。(这里所说的“设计”是指前期设计或敏捷方法,即计划性设计或演进式设计。)
设计活动当然需要花费时间和精力,但它们是有回报的,因为它们使软件更容易在未来进行演进。你可以通过忽略设计来节省短期时间,但这会积累技术债务,这将在以后降低你的生产力。在软件设计上投入精力可以提高项目的耐力,让你在更长时间内跑得更快。
一种可视化的方法是下面的伪图。
该伪图绘制了两个假想的典型项目的已交付功能(累积)与时间的关系:一个设计良好,一个没有设计。没有设计的项目在设计活动上没有花费任何精力,无论是前期设计还是敏捷技术。因为没有在这些活动上花费精力,所以这个项目最初产生功能的速度更快。
没有设计的问题在于,由于没有在设计上投入精力,代码库会恶化,变得更难修改,从而降低了生产力,也就是线的梯度。好的设计使其生产力保持更稳定的状态,因此在某个时间点(设计回报线),它会超过没有设计的项目的累积功能,并将继续做得更好。
我称之为假说,因为它是一个猜想,没有客观证据证明这种现象 tatsächlich 发生。从科学的角度来说,这不是一个很好的假说,因为它很难检验。我们无法衡量生产力,也无法衡量设计质量。
但是,尽管它只是一个假说,但它也是许多人(包括我自己)的公理。我们可能没有客观证据证明这种效应 tatsächlich 发生,但我们中的许多人都觉得这解释了我们在该领域定性地看到的东西。对我来说,这是一个公理,因为这是我作为软件设计作者的整个职业生涯的基础。如果设计不能以某种方式 tatsächlich 提高生产力,那么我的大部分作品都是毫无价值的。
我相信,对许多人来说,把一个假说当作公理听起来很奇怪,但这是一种常见的事情。我认为我用自己的判断来评估这个假说是否正确,但这样做并没有忽视这个假说的客观弱点。我很想找到一种方法来证明它,也几乎同样想反驳它。
这个假说有一个推论,它来自于设计回报线。如果你的初始版本的预期功能低于设计回报线,那么用设计质量来换取速度可能是值得的;但如果它高于这条线,那么这种交换就是一种错觉。当你的交付高于设计回报线时,忽略设计总是会让你延迟交付。用技术债务的术语来说,这就像借了一笔贷款,但长期没有使用本金,以至于当你使用它时,你已经支付了更多的利息。
这就提出了一个问题,这条线在哪里。即使是接受设计耐力假说的人,在回报线的位置上也存在着巨大的、重要的差异。我认为它比大多数人想象的要低得多:通常是几周而不是几个月。但这又一次只能是一个判断。
这导致了技术债务的结果。技术债务是一个很好的比喻,我经常使用它。但设计回报线提醒我们,借技术债务只在一定程度上是值得的。我们不仅要考虑交付的价值是否大于利息支付,还要判断交付是否首先高于回报线。