逐步扩展

2005年1月5日

人们不时会质疑某个特定专业是否可以用增量的方式使用:“你不能用敏捷项目来做(安全 | 用户界面设计 | 数据库 | 国际化 | *),因为这个方面必须在前期完成。”

当有人向我提出这样的问题时,我立刻就陷入了困境,因为我对那个专业并不了解。我认为我可以谈论应用程序设计,但安全(例如)不行——而且我的提问者很可能是在那个领域备受尊重的领导者。

尽管我承认自己在那个领域有局限性,但我不会说你只能在那个领域使用计划设计。我能说的是,我们并不知道你是否可以在那个领域进行增量设计。我见过很多案例,人们都说“你不能对 x 使用增量设计”,结果发现是可以的。应用程序设计就是一个例子,数据库设计是另一个例子。所以,在人们认真尝试增量设计之前,我非常不愿意排除这种可能性。

评估这个问题的难点之一是,增量设计很容易做得很糟糕。如果你以不受控的方式进行增量设计,你很可能会得到一个混乱的设计——为了让增量设计起作用,你需要一些东西让设计收敛到有序状态。在设计已死中,我将这些称为使能实践。对于软件设计,我将测试、持续集成和重构标记为使软件设计收敛并避免软件熵的关键使能实践。当我们谈论其他事情,比如 UI 设计时,问题在于找到那些使能实践是什么。它们可能与软件设计中的类似或受其启发,也可能完全不同。例如,在数据库设计中,增量数据迁移是一个关键的使能实践。在找到一套好的使能实践之前,增量设计就像走在薄冰上。

尽管如此,我认为增量方法非常值得尝试,值得尝试找到正确的方法。分阶段的前期设计方法失败的频率太高了——而且,在需求变化的情况下,它们的表现也很差——我认为这至少在企业软件开发中是一个不可避免的因素。

然而,我最赞成增量主义的最大原因是最古老的一个——风险管理。如果你不尝试你的设计,你就太容易受到设计与你预期不符的影响,太容易受到开发后期进度延误的影响。这些风险足以让我们寻找将增量主义引入软件开发更多方面的方法。