绞杀榕应用
2004年6月29日
辛迪和我到澳大利亚旅行时,在昆士兰海岸的热带雨林里待了一段时间。这个地区的一个自然奇观是巨大的绞杀榕。它们在树木的顶端枝条上播种,逐渐向下生长,直到扎根于土壤中。经过多年的生长,它们形成了奇特而美丽的形状,同时绞杀并杀死它们的寄主树。
这个比喻让我想到了一种重写重要系统的方法。我的职业生涯中大部分时间都花在了重写关键系统上。你可能会认为这样的事情很简单——只需要让新系统做旧系统做的事情就行了。然而,它们总是比看起来复杂得多,而且充满了风险。巨大的截止日期迫在眉睫,压力很大。虽然新功能(总会有新功能)很受欢迎,但旧的功能必须保留。甚至旧的错误也经常需要添加到重写的系统中。
另一种方法是逐渐在旧系统的边缘创建一个新系统,让它在几年内慢慢发展,直到旧系统被绞杀。这样做听起来很难,但我越来越觉得这是那些没有被充分尝试的事情之一。我特别注意到了一些行之有效的基本策略。基本策略是事件拦截,它可以用来逐渐将功能迁移到绞杀榕,并实现资产捕获。
我的同事克里斯·史蒂文森最近参与了一个项目,他们用这种方法取得了巨大的成功。他们在XP 2004上发表了关于此项目的第一篇论文,我希望能够看到更多描述该项目更多方面的论文。他们还没有达到绞杀旧应用程序的阶段——但他们已经向企业交付了有价值的功能,这使团队获得了进一步发展的信誉。即使他们现在停止,他们也获得了巨大的投资回报——这比许多切换重写所能实现的要多得多。
与切换重写相比,考虑绞杀榕应用程序的最重要原因是降低风险。绞杀榕可以稳定地提供价值,频繁的发布可以让你更仔细地监控它的进展。许多人仍然不考虑绞杀榕,因为他们认为它会花费更多——我不相信这一点。由于你可以使用更短的发布周期来构建绞杀榕,你可以避免切换重写经常产生的许多不必要的功能。
这里还有一个重要的想法——在设计一个新应用程序时,你应该以一种使其更容易在将来被绞杀的方式来设计它。让我们面对现实吧,我们所做的只是在今天编写明天的遗留软件。通过使将来添加绞杀榕变得容易,你将使今天工作的优雅消亡成为可能。
进一步阅读
保罗·哈曼特有一个使用这种方法的案例研究的良好总结。
修订
2019年4月29日将 URL 和名称更改为绞杀榕应用程序
我认为这篇文章是一个很好的比喻,但没有想到它会如此受欢迎(最近几个月,它每月有超过 3000 次页面浏览量)。受欢迎是件好事,但有一个问题。最初的文章标题为“绞杀应用程序”,使用时,这种模式通常被称为“绞杀”。但它的使用通常与它的比喻根源分离,并带有一种令人不快的暴力意味。
因此,有些人主张避免或更改名称。我对此没有太大的异议,自从最初发表那篇文章以来,我在自己的写作中就没有使用过这个名字。但试图改名的问题在于,一旦一个名字在社区的脑海中扎根,就很难将其驱逐出去。
最近,我想到了一个可能对事情有所帮助的小调整。如果我把这篇文章改名为“绞杀榕应用程序”,并尽可能多地使用“绞杀榕”这个词,那么希望通过加强这个名字的全部意义所在——比喻联系——来减少暴力意味。因为这是一个很小的改变,也许它会传播得足够多,值得一试,而且它并不费力,所以值得一试。