Problems that affect upgradeability
If one problem was king over all difficulties, it’s the strong preference. The preference is powerful and capable. It can change any functionality and fix any bug. In the short term, preferences are fantastic.
In the long run, they are upgrade killers.
So what is a preference? A preference is pointing to Magento to use a different class instead of a core class. This almost always entails copying significant amounts of code. When Magento is upgraded, there is a reasonable chance the original class has been changed. Thus, a preference uses old code instead of new code. You can imagine how this creates significance for strange bugs.
We, at SwiftOtter, have used preferences for this situation, but they are our last resort. Instead, we use Composer patches. When we use a preference, they are small and well-documented.
Preferences are incredibly time-consuming to clean up in preparation for an upgrade. We have to pay special attention to this to ensure you get as accurate of an estimate as possible.