I would say the most important thing I learnt during the time I spent studying the Engineering degree was the “divide et impera” principle. I strongly believe this is one of the most important skills a developer must have.
Always when I am struggling with a problem it turns out that it hides more than one problem. And this is something I usually see, many bad designs, disfunctional teams, micromanagement, etc. All these are faces of the same coin: the inability to divide problems. When you try to solve a complex problem that in reality you are not applying the best solution and you come out with a partial solution that in the end is going to bring you more problems.
It is very common to mix problems of very different natures. This way we have problems that hide a mix between technical, management and client relationship difficulties. Sometimes you are able to divide these problems but don’t have the courage to face them and you try to solve a disagreement with the client by offering a technical solution. You can do it but sooner or later it will just end up biting you.
Always you say we don’t have time to do this or that, you are adding a new and different problem to the current one. Time is not a technical problem, time has nothing to do with finding the best solution to a problem, time is a management problem and you should solve it negotiating with the client, reducing scope, etc. You shouldn’t look for a worst technical solution to save some time. Don’t get me wrong, sometimes you have to acquire some technical debt but you must be aware of that decision and pay it as soon as possible.
In my experience, breaking down problems and selecting the best solution for each one ends up being the best and straightforward solution.