It is this way for large projects. You write your function, the interface is tested, but the whole project becomes a big bloated mess.
I don't think there's any better way to write large projects.
Instead consider loosely coupled smaller projects.
Perhaps this only moves the complexity elsewhere and you have a dependency hell, but arguably the same can be said for versioning parts of code.