One can eschew complexity without breaking changes. If the initial abstractions are done well enough, a lot of things can be swapped out with minimal breakage. There are also ways to keep existing apis while adding new ones. Outdated apis also don't need to change every time an underlying dependency changes if the abstraction is good enough.