Every OOP developer's journey: First you discover inheritance and polymorphism and suddenly you're an architectural genius, creating elegant hierarchies where a ChessPiece extends MovableGameEntity which implements IPositionable . You're writing beautiful recursive algorithms, feeling like a wizard. Then reality hits. You've abstracted so hard that your chess pieces are now just pure data with zero behavior, floating in a sea of interfaces seven layers deep. Your bishop doesn't know how to move anymore—some MovementStrategyFactory three folders away does. You need a PhD and a map to figure out where the actual logic lives. The duality of OOP: powerful enough to model the entire universe, confusing enough to make you question if your knight should even exist as an object or just be a JSON blob processed by a ThingDoer class.