I did a fair amount of customer research and noticed almost all successful migrations have in common:
- they tested end-to-end migration, even on production data, early on
- very familiar with blue/green deployments or shadow testing
- gradual and have a good in-between story
- pragmatic (e.g. they moved 98%+ of data from SQL database to Cassandra but left some)
- very good revert story
- either simplified current system or split monolith into more manageable pieces
Many painful ones shared:
- wrote a next-gen system by a team that does not understand or has never worked on the current system
- big release day, after X quarters
- try to change too many things at once (e.g. database technology, schema, protocols)
- declared legacy system too early on, and everybody moved out of that development
- end up discovering flaws very late in the process