Overview
A rewrite in computer programming is the act or result of re-implementing a large portion of existing functionality without re-use of its source code. When the rewrite uses no existing code at all, it is common to speak of a rewrite from scratch.
Motivations
A piece of software is typically rewritten when one or more of the following apply:
its source code is not available or is only available under an incompatible license
its code cannot be adapted to a new target platform
its existing code has become too difficult to handle and extend
the task of debugging it seems too complicated
the programmer finds it difficult to understand its source code
developers learn new techniques or wish to do a big feature overhaul which requires much change
the programming language of the source code has to be changed
Risks
Several software engineers, such as Joel Spolsky have warned against total rewrites, especially under schedule constraints or competitive pressures. While developers may initially welcome the chance to correct historical design mistakes, a rewrite also discards those parts of the design that work as required. A rewrite commits the development team to deliver not just new features, but all those that exist in the previous code, while potentially introducing new bugs or regressions of previously fixed bugs. A rewrite also interferes with the tracking of unfixed bugs in the old version.
The incremental rewrite is an alternative approach, in which developers gradually replace the existing code with calls into a new implementation, expanding that implementation until it fully replaces the old one. This approach avoids a broad loss of functionality during the rewrite. Cleanroom software engineering is another approach, which requires the team to work from an exhaustive written specification of the software's functionality, without access to its code.
From Wikipedia (CC BY-SA 4.0).