One thing that we know for certain is that codebases grow with time. We add code to them continually. When we think about this, it's easy to become bleak. Each of the classes in a codebase is something that we need to understand. At a certain point a team can no longer "keep the system in their heads" and they have to do a bit of spelunking to figure out what they have and where they should put their changes. Changes may end up in the wrong areas, simply because we are not sure of the right place. We start to introduce errors because we are not aware of other relevant code.