[译文]重构失败的五大失败征兆

勿忘初心2018-11-23 11:54

此文已由作者邹永胜授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。
项目重构总有原因,或这或那。也许你作为一家初创公司的CEO正在为目前获得的一些成功感到喜悦时,你底下的工程师们却正在吵着从头开始重构整个技术架构。也许你作为一个CTO正在计算着重构整个结构所带来的开销。也许你作为重构项目的技术负责人但是常常冒出一个疯狂的想法-我为什么要重构?不管你处于那种状态,你都可能已经知道,谈论重建,像谈论税制改革或无政府状态,会存在一定的风险。在你完成重构之前你永远无法预知这过程中会碰到多少困难。

就算一些拥有大智慧的人,也没办法避免重构的事情发生。常常我们做出重构的选择是正确的,但是我们必须明确我们可能会面临重构失败的风险。

既然已经到了必须重构的境地,那就重构吧。下面给出五个警示,一旦符合表明重构很可能失败,不符合则表明你不是一个疯狂的人,你的重构决定是明智的。

警示1:没有明确的重构价值

重构必须带来新的价值。如果你不能在你重构的前半年证实它的价值,那么本次重构可能存在问题。为什么呢?很明显你的这次重构耗时耗力,耗费的成本过于庞大。你不可能幻想着一个30人干一年的系统能被你在半年之内重构完成。除非你做的事情像GoogleX一样,能看到它三年之后的潜在价值,不然本次重构你最好再重新斟酌下。

如果你是一个管理人员,你并不确定重构能为你带来什么,那么建议你放弃本次重构。反之,你十分明确,并为之做了详细的规划,此时你应该详细的去评估本次重构与用户的需求是否一致。

警示2:你将要从头开始重构

推倒一切,从头开始是简单的,但是这仅仅是用于简单的系统。之前有很多工作在研究为什么渐进式的更适合重构,这通常归结为一个事实,从头开始的重构等价于瀑布方法论。

如果你是一名管理人员,你需要时刻警醒你的开发人员,因为他们总是在推动开始大规模的重构。当然,他们不会直接说出口,而是采用一些例如“清理内部状态”或者“重新设计结构”等话语来表达他们的意思,实际上他们是一个意思。而你要做的就是,询问他们什么时候代码上线?如果时间超过三个月,很明显他们正在做一次大规模重构。

警示3:重构意味着完成需求的速度变慢

这十分好理解:一个人的精力有限,相同的工作量的情况下,你耗费了一部分精力在重构系统上,很明显你花在老系统上迭代需求的精力就有限了。如果你有限保证迭代需求的,很明显你的重构永远不会完成。

重构需要有一个熟悉当前系统的技术栈并且能够预估当前遗留系统的复杂性的“超级员工“来引领(就像是Kernighan和Peter定则的混合)。

当然不要试图通过前两三个月的重构速度来判断整个重构工作的速度,因为前期的时候项目复杂度还没有体现出来,此时的速度总是很快的,随着重构工作的推进,重构速度会随之递减:

警示4:不与熟悉待重构系统的专家们共事

任何专家都是有帮助的。老系统的开发人员、会计部门同事,甚至是系统的深度用户都是对你重构有帮助。这些人对于重建来说是必不可少的,因为他们十分了解整个系统。没有这些人,你将成为 Tesler 定律的牺牲品,最终重构出一个价值更低的版本。

把他们当做测试人员,他们往往能快速的发现重构系统中一些潜在的问题。

把他们纳入重构的人员列表中,让他们感受到他们对于重构的重要性(实际上确实很重要)。及时尽早获取他们的反馈。

警示5:由于困难会计划删除部分需求特性

让我们想象一下,你在重构过程中取得了一些阶段性成果,这些成果在积极地为用户提供价值。但是这同时也很容易让你掉入陷阱–以“精简”重构的名义删除部分需求特性。这合理吗?确实,传统的应用系统既缓慢又难用。但是,用户愿意忍受并使用这个系统!一旦你删除用户使用的部分特性,用户会因此而讨厌你。

这是否意味着你应该盲目地复制老系统的特性呢?当然不是!传统技术所必需的一些需求特性已经变得深入人心了。就像现在的OCR,它可以代替页面的表单。这意味着你确实可以发挥你的想象力重新设计、新创、删除部分需求特性,但是无论怎样,你都不能尝试去删除整个需求。

总结

我希望你注意到真正的,重构所带来的真正的价值。这就是为什么每次重构都需要一个完整设计计划来尽可能的覆盖重构所带来的增值。核心方法是通过访谈的方式从终端用户和利益相关者那里获取反馈,以此来确认你的原型。这将确保产品会以你的预期来满足市场需求的同时,能够在基于用户的真实反馈的基础上为你后续的重构留有足够的创新空间。

如果你觉得必须选择通过重构的方式来复制繁琐的旧特性以及添加新特性,那么你有一些解决方案。一种选择是遵循Martin Fowler’s strangler pattern,可以同时且相对无缝地与旧功能衔接,从而保留那些功能而不必重新创建它们。

本文章翻译自 Ken Kantzer 的 5 Red Flags Signaling Your Rebuild Will Fail