Over the years one of the most valuable questions I've asked myself as I've worked in long living codebases:
"If I had to delete this feature tomorrow how quickly could I do it?"
If you come back to this question a few times over development it does a wonderful job of really forcing you to consider your coupling and dependencies. In most cases it's been "delete a few dispatch calls and nuke the whole feature namespace" which has held up very well when future changes come down the pike.