And sometimes, architectural drift and erosion gets you so
far away from the point where your software architecture should
be, that your architecture is completely degraded. And at this
point, you have two main options. The first option is
to keep frantically tweaking the code. And this normally leads
to disaster. Why? Because you only make things worse. You
don't know exactly what you are changing and therefore, you're
basically stabbing in the dark, trying to fix your system.
The other possiblity is that you can try to
determine the software system architecture
from its implementation level artifacts,
so you try to derive what the architecture is
and try to fix it, once you have derived the
architecture. And this is what is normally called, architectural
recovery, determining a software architecture from an implementation and fixing
it. And as you can imagine, this is normally
a more recommended way to go than the first solution.