A while back, I visited a C++ team that had found a wonderful use for a spare computer. They set it up to build continuously. Then they did something fascinating. They created a script that went into their code and commented out a single #include. Then it built their project. If the build and the tests passed, the script deleted the include. If it didn't, the script uncommented the include and went on to the next one. Yes, it took quite a while to march through the code, but with that build running continuously in the background, they were able to eliminate a large number of superfluous dependencies. Their build got better.