In my experience, a good team lead can mitigate a lot of the problems you talk about. A team lead who can inspire the team and communicate with management in a way they understand can go a long way. Unfortunately, because of the way most developers are wired and the way most promotions happen, these kinds of team leads are extremely rare. Given time, training and patience, a good manager can help a good developer become a good team lead. Unfortunately, this takes time and often "expectations" are not met. So the team is disbanded and new teams are thrown at the same old problems. It is a vicious cycle. I guess if I had an answer, I would be making good money helping giant corporations with this problem. 😂