I had recently two projects that while completely different in underlying technology, their purpose and complexity, tasks that I got were similar in following:
* System are very complex and contain a lot of business rules and knowledge that is not documented
* System or application is monolithic in design
* System is outdated and any change is very hard to implement, brings a lot of further bugs
Essentially we were given dilemma that we have two choices which both are bad.
1. Recreate whole system – really bad as development would have to stop while existing system is redeveloped, plus we don’t really have knowledge of all business rules, so we can’t estimate how much this might take
2. Continue to work with current system – also very bad as any even small change brings numerous bugs that are difficult to track and even when they are discovered it is never clear when they were introduced
Faced with such choice, I found one really good strategy that works pretty well. We would create a new application, apply facade pattern to current app and begin to refactor and slowly extract parts of old app into new one. For users, everything seems the same, they might see new parts as somewhat different as we apply fresh design on them, but generally overall process is seamless and transparent. Also it is easy to test.
In terms of time, it doesn’t require more time and I would even argue that it might in the end take less time then redevelopment. Also, there is never uncertainty over result, results can be seen and used in live environment and if some part turns out not to be that good, we can always work on that. Plus new features and benefits are slowly getting into existing app and can be seen.
For developers, it is less stressful and more fun way to deal with this otherwise difficult problem.