我相信你们都经历过这样的情况,您接手的项目中有一个摇摇欲坠的旧代码库,几乎不适合用途,您必须决定是从头开始重写它还是修复已经存在的代码。

传统观点倾向于建议您永远不应该尝试从头开始重写,因为失败的风险非常高。那么当你遇到这个问题时,你是怎么做的,你是如何做出决定的,结果又如何呢?

有帮助吗?

解决方案

这实际上取决于情况有多糟糕。

如果它是一个小系统,并且你完全理解它,那么重写并不疯狂。

另一方面,如果它是一个巨大的遗留怪物,拥有一千万行未记录的神秘代码,那么你真的很难完全重写。

需要考虑的要点:

  • 如果对用户看起来不错,他们就不会在乎您对您来说是什么样的意大利面条。另一方面,如果对他们有不利的话,那么获得共识(和耐心)就更容易了。
  • 如果您确实重写,请尝试一次进行一部分。一个混乱,混乱的代码库可能会使这一困难(即仅替换一个部分需要重写大型依赖性冰山),但是,如果可能的话,这使得逐渐进行重写并从路上获得用户的反馈变得更加容易。

如果无法一次发布新版本的一部分,我真的会犹豫是否要为大型系统承担一个巨大的重写项目。

其他提示

每次使用代码时只需稍微清理一下代码即可。如果还没有,请设置一个单元测试框架。所有新代码都应该编写测试。您因错误而修复的任何旧代码也请尝试加入测试。

随着清理工作的进行,您将能够将越来越多的令人讨厌的代码清除到封装的垃圾箱中。然后你以后就可以一一挑选了。

像 javadoc 或 doxygen 这样的工具(如果尚未使用)也可以帮助改进代码文档和可理解性。

反对完全重写的论据相当强烈。在原始项目的时间范围内编码的大量“小错误”和行为将再次潜入。

参见乔尔·斯波尔斯基的文章 你绝对不应该做的事情. 。总之,当您重写时,您将失去为使当前代码按其需要的方式工作而学到的所有经验教训。

也可以看看: 大泥球

重写任何复杂的东西很少能成功。这很诱人,但比例很低。

在单元测试下获取遗留代码并重构它,和/或在适当的时候增量地完全替换其中的一小部分。

重构除非它确实非常糟糕。

乔尔对此有很多话要说……

至少,用你面前的旧代码重写代码,而不是从头开始。旧代码可能很糟糕,但它是这样是有原因的,如果你忽略它,你最终会看到旧代码中可能在几年前修复的相同错误。

我在之前的一份工作中进行重写的原因之一是无法找到具有足够经验的开发人员来处理原始代码库。

我们决定首先清理底层数据库结构,然后重写一些内容,以便更容易找到全职员工和/或承包商。

我还没听说效果如何:)

我认为人们倾向于重写,因为表面上看起来更有趣。

我们要从头开始重建!

我们会做对的 这次!

ETC。

有新书要出版了, .NET 中的棕地应用程序开发 贝利和贝尔查姆。第一章是免费的,主要从与平台无关的角度讨论这些问题。

修复,或更重要的是重构。两者都是因为 乔尔这么说 还因为,如果这是您的代码,自从您上次接触此代码以来,您可能已经学到了很多东西。如果您是用.NET 1.1编写的,则可以将其升级到3.5 SP1。您可以进去并清除所有旧的注释掉的代码。作为一名开发人员,您现在比第一次编写此代码时要好 100 倍。

我认为唯一的例外是当代码使用真正过时的技术时 - 在这种情况下,编写新版本可能会更好。如果您正在查看某个 VB6 应用程序,其中包含 10,000 行代码,并且带有 Access 数据库后端,显然是由不太了解数据库工作原理的人(很可能是八年前的您)设置的,那么您可能可以只需一小部分时间和代码即可获得更快的基于 C#/SQL 的解决方案。

事情并不是那么黑白分明...这确实取决于很多因素(更重要的是“付钱给你的人希望你做什么”)

我工作的地方一方面我们重新编写了一个开发框架,另一方面我们不断修改一些无法迁移的旧系统(因为客户的技术和时间限制)。在这种情况下,我们尝试保持编码风格,有时由于其构建方式,您必须实施很多变通办法

根据您的情况,您 可能 还有另一种选择:许可证内的第三方代码。

我曾咨询过几家公司,这将是明智的选择,尽管看似“抛弃知识产权”可能会给管理带来很大障碍。在我现在的公司,我们认真考虑过使用第三方代码来替换我们的核心框架的可行选择,但这个想法最终被拒绝,更多的是出于商业原因而不是技术原因。

为了直接回答您的问题,我们最终选择重写遗留框架 - 我们做出的决定并非轻率!14个月过去了,我们一点也不后悔这个选择。仅考虑修复错误所花费的时间,我们的新框架就几乎收回了成本。不利的一面是,它的功能还不是很完整,因此我们处于并行维护两个独立框架的尴尬境地,直到我们可以移植最后一个“前端”应用程序。

我强烈推荐阅读 Michael Feathers 的《有效处理遗留代码》。这是关于如何重构代码以使其可进行单元测试的指导建议。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top