DesignStaminaHypothesis

2007年6月20

把软件设计好值得吗?

我有时会间接地讨论好的软件设计是否值得。我说这些对话是间接的,因为我不认为我遇到过有人说软件设计是毫无意义的。通常它的形式是“我们真的需要快速行动,以实现我们明年的目标,所以我们要减少一些设计活动。”

在这里有一个概念,设计是你可以用更快的速度来换取的东西。事实上,我曾多次遇到这样的印象:即使降低了速度,为了让程序员开心,设计工作是可以容忍的。

如果在设计上投入精力会降低编程的效率,我会反对这种做法。事实上,我认为如果是这样的话,大多数软件开发人员都会反对设计。开发人员可能不同意什么是好的设计,但是他们会支持他们喜欢的任何品牌的好设计,因为他们相信它能提高生产力。(这里的“设计”指的是预先设计或敏捷的方法计划或进化设计.)

设计活动当然会花费时间和精力,但它们是有回报的,因为它们使软件更容易发展到未来。您可以通过忽略设计来节省短期时间,但这是累积的TechnicalDebt这会降低你以后的工作效率。将精力投入到软件设计中可以提高项目的耐力,使您能够更快、更长久地完成项目。

一种可视化的方法是下面的伪图。

伪图图为两个假想的原型项目交付了功能(累积)和时间:一个有良好的设计,另一个没有设计。不做设计的项目不会在设计活动上花费任何精力,无论这些活动是预先设计还是敏捷技术。因为不需要在这些活动上花费任何精力,所以该项目最初会更快地产生功能。

“无设计”的问题在于,如果不投入设计的精力,代码库就会恶化并变得更难修改,从而降低了生产率,这是一条线的坡度。优秀的设计能够保持其生产力更稳定,因此在某种程度上(设计收益线),它将超越无设计项目的累积功能,并将继续做得更好。

我称其为假设,因为它是一个猜想,没有客观证据证明这种现象确实发生。从科学的角度来说,这不是一个很好的假设,因为它很难验证。我们CannotMeasureProductivity我们也不能衡量设计质量。

尽管这只是一个假设,但对很多人来说,这也是一个公理,包括我自己。我们可能没有客观的证据证明这种效应的发生,但我们中的许多人认为这解释了我们所看到的,我们所看到的定性的领域。这对我来说是一个公理,因为这是支撑我作为软件设计作家的整个职业生涯的假设。如果设计在某种程度上不能提高生产力,那么我的大部分作品都是毫无价值的。

我敢肯定,对很多人来说,把假设当作公理听起来很奇怪,但这是很常见的事情。我看着它,我用我的判断来评估假设是正确的,但可以这样做,而不忽视假设的客观弱点。我很想找到一种方法来证明它,也想找到一种方法来反驳它。

这个假设有一个推论,这个推论来自于设计收益线。如果你的最初版本的功能低于设计回报线,那么它五月以设计质量换取速度是值得的;但如果它高于这条线,那么交换就是虚幻的。当你的交付超出了设计回报线时,忽视设计总是会让你延迟交付。从技术债务的角度来说,这就像贷款,但没有使用本金太久,以至于当你使用它的时候,你已经支付了更多的利息支付。

这就提出了界限在哪里的问题。即使是那些接受设计耐力假设的人,他们在收益线的位置上也存在着实质性且重要的差异。我的观点是,它比大多数人认为的要低得多:通常是几周,而不是几个月。但这只能是一个判断。

这导致了TechnicalDebt.技术债务是一个很好的类比,我经常使用它。但是设计回报线提醒我们,只有在特定的情况下才值得进行技术债务。我们不仅要考虑交付的价值是否大于支付的利息,我们还必须首先判断交付的价值是否高于支付线。