I think of it sort of like this:
the game/engine is sort of like a pyramid.
at the base, there is all the general-purpose functionality and infrastructure. this may often represent the bulk of the code in the game, and at this level we generally want to keep things general purpose.
but, as one moves up the pyramid, the amounts of code begin to shrink and become much more specialized, first to general architecture, then to game mechanics, then to specific gameplay elements (such as the squirrel and the tree).
so, at the same time we don't want low-level infrastructure sufficiently specialized to constrain subsequent development, we also don't want the high-level game logic to be sufficiently generalized as to hinder getting stuff done.
sometimes it is itself a hard balance though.