抱歉,这会很长,但这是基于作为多个重写项目的架构师和开发人员的个人经验。
以下情况应引起您考虑某种重写。我将在此之后讨论如何决定要做什么。
- 开发人员的准备时间非常长。如果要花更多的时间(根据经验水平)来提升新开发人员,那么就需要重新设计系统。所谓的加速时间,是指新开发者准备进行第一次提交之前的时间(基于一个小功能)
- 大学毕业-1.5个月
- 仍为绿色,但在-1个月前曾从事其他项目
- 中级-2周
- 经验丰富-1周
- 高级-1天
- 由于现有架构的复杂性,部署无法自动化
- 由于现有代码的复杂性,即使是简单的错误修复也花费了太长时间
- 新功能花费的时间太长,并且由于代码库的相互依赖性而导致成本过高(新功能无法隔离,因此会影响现有功能)
- 由于现有代码库的相互依赖性,因此正式的测试周期会花费很长时间。
- 在太少的屏幕上执行了太多用例。这会给用户和开发人员带来培训问题。
- 当前系统所需要的技术
- 具有技术经验的高质量开发人员很难找到
- 已过时(无法升级以支持较新的平台/功能)
- 仅有一种更具表现力的高级技术可用
- 维护旧技术的基础架构的成本太高
这些事情是不言而喻的。何时决定是完全重写还是增量重建是比较主观的,因此更具政治性。我可以坚定地说的是,断然声明这绝不是一个好主意是错误的。
如果可以逐步重新设计系统,并且您完全支持项目赞助,那么您应该这样做。不过,这就是问题所在。许多系统无法进行增量重新设计。这是我遇到的阻止此情况的一些原因(技术上和政治上)。
- 技术
- 组件之间的耦合是如此之高,以至于单个组件的更改无法与其他组件隔离。单个组件的重新设计不仅导致相邻组件的级联更改,而且间接导致所有组件的级联更改。
- 技术栈是如此复杂,以至于未来的状态设计需要对多个基础架构进行更改。在完全重写中,这也是必需的,但如果在增量重新设计中需要它,则您将失去这一优势。
- 无论如何,重新设计组件都会导致对该组件的完全重写,因为现有的设计是如此愚蠢,以至于没有什么值得保存的。同样,在这种情况下,您将失去优势。
- 政治
- 不能使发起人了解渐进式重新设计需要对该项目的长期承诺。不可避免地,大多数组织对渐进式重新设计所造成的持续的预算消耗失去胃口。这种食欲不振对于改写也是不可避免的,但是发起人将更倾向于继续,因为他们不想在一个部分完整的新系统和部分过时的旧系统之间分裂。
- 系统的用户也非常依赖其“当前屏幕”。在这种情况下,您将没有许可证来改善系统的重要部分(前端)。重新设计可以使您避免此问题,因为它们是从新事物开始的。他们仍然坚持要获得“相同的屏幕”,但是您还有更多弹药可以退回。
请记住,重新进行重新设计的总成本总是比进行完全重写的成本高,但是对组织的影响通常较小。我认为,如果您可以证明重写是合理的,并且您拥有超级明星开发人员,那么请这样做。
仅当您可以确定有完整的政治意愿才能这样做。这意味着主管人员和最终用户都可以接受。没有它,您将失败。我以为这就是为什么乔尔说这是个坏主意。对于许多建筑师来说,执行官和最终用户的购买看起来像是两头独角兽。您必须大胆地出售它,并持续不断地对其进行竞选,直到完成为止。这很困难,您正在谈论的是在某些人不希望看到的成功上赢得声誉。
成功的一些策略:
- 但是,如果这样做,请勿尝试转换现有代码。从头开始设计系统。否则,您会浪费时间。我从未见过或听说过没有以惨痛而告终的“转换”项目。
- 一次将一个团队的用户迁移到新系统。确定在现有系统上遇到MOST痛苦的团队,然后首先迁移它们。让他们通过口口相传的好消息。这样,您的新系统将从内部出售。
- 根据需要设计框架。不要以我花了6个月的时间来构建这个从未见过真正代码的框架开始。
- 使您的技术堆栈尽可能小。不要过度设计。您可以根据需要添加技术,但是很难将其淘汰。此外,您拥有的层越多,开发人员要做的事情就越多。从一开始就不要困难。
- 让用户直接参与设计过程,但不要让他们决定如何做。向他们表明,如果您遵循良好的设计原则,便可以给他们更好的东西,从而赢得他们的信任。