This idea comes up in painting. The rule of thumb is that it's done when there's nothing left to add; when adding the next thing does not provide much more value value than it costs in terms complexity.
With coding, it seems like it's much more difficult question to answer.
With coding, I often find Antoine de Saint-Exupéry helping me to limit myself: "Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away."
Or maybe more to do with users buying more of a particular brand of Bluetooth headphones and not having an arbitrary and universal input (you can do a lot of crazy stuff with an audio jack see square).
I suppose that might be one reading, though IMO the battery, jack, and card slot have just been replaced by more bells and whistles like more/fancier cameras, biometric sensors, NFC, and other gobbledygook that was more important to someone than being able to plug into the cassette adapter in my car. Not exactly what I think of when I hear "nothing left to take away."
With coding, it seems like it's much more difficult question to answer.