Object-Oriented Reengineering Patterns

Your reengineering project is well underway. You have developed a good understanding of the legacy system, and you have started to Write Tests to Enable Evolution (Pattern 6.1). You have gone through a process of "Setting Direction" (Chapter 2) and have decided to tackle the Most Valuable First (Pattern 2.4).
How can you be sure that the new system will be accepted by users? How do you migrate to the new system while the old system is being used? How can you test and evaluate the new system before it is finished?
The strategies you adopt to migrate from the legacy system to the new solution must resolve the following forces:
Big-bang migration carries a high risk of failure.
Introducing too many changes at once may alienate users.
Constant feedback helps you stay on track, although it may be difficult and costly to achieve.
Users have to get their work done; they don't want to be distracted by incomplete solutions.
Legacy data must survive while the system is being used.
It is not enough to reengineer a legacy system and then deploy it. In fact, if you try this, you will surely fail (for the same reasons that big Waterfall projects in new territories often fail). You must be prepared to introduce the new solution gradually, to gain the confidence and collaboration of the users, and you must adopt a strategy for migrating gradually and painlessly from the existing system, while it is still being deployed, to...