To problem with this projects is that you don't want to change the code without adding unit tests, but you usually can't and unit tests without changing the code.
If your project is like a typical legacy project, than you have large classes with lot of really long functions, without a clear role.
My strategy is the following:
- Try to identify the roles of a huge class (usually there is a dozen).
- Try spliting up the class alongside with these roles. Start with the simplest. Try changing as little code as possible, an mainly just move functions to the new classes.
- Each time a chunk is done, test manually.
- If you managed to split down a smaller class add unit tests, and continue with the next.
This is a really long and tireing process, and there are no silver bulets. I usually revert my changes a lot and try again with a differen approach. And manual testing is really important. The best is if you have someone who used this software a lot and can check if it really works the way it did before.
Good luck with this!