When I first started developing software professionally I remember occasionally finding older code and thinking "how could someone design something so poorly?"
I've been writing software for the same company now for more than a decade. A few years back I first came across a piece of code I'd personally written years before and realized that someone looking at that code right then would probably think the same thing. I knew the code in question was not badly designed. At the time of its writing it was well thought out and fully met all requirements. The "problems" arose over the following years as the landscape in which that code lived changed dramatically. In those years the company grew several times larger, the application increased in complexity by orders of magnitude, multiple new technologies had to be integrated and industry trends and requirements changed continually.
At that moment I suddenly realized that the appearance of "poor design" in older code often has less to do with the poor design of the original developer than the limited perspective of the future viewer. I came to understand that every long term software developer has a legacy of legacy.