Holy strawmans, Batman! This article sets up a false dichotomy (virtually nobody argues for designing for "future needs", it's more like varying degrees and definitions of "cleanliness"), then gives examples of terrible code at both ends of this dichotomy, and settles it with very mediocre code in the middle. IExternalRuleService? Is that supposed to resemble anything anyone sane would ever do? Do people literally write "Car : Vehicle" out of their 1st year of college anymore?<p>Let's assume we're all past those strawman examples and talk about the proposed "Balanced Approaches" instead.<p>ShoppingCart looks to be re-writing an in-memory collection. Is it actually adding anything beyond "Collection<Item>"? (Substitute with whatever collection type you like in your language). Do you actually need a class at all? There simply isn't enough specified in the article to tell. Therefore there's no lesson here: the code as-is shouldn't exist, and we can't tell what ShoppingCart is actually supposed to be doing. If it's making database calls, you have multiple major problems. The best advice I can give in that situation is: don't <i>do</i>, just <i>plan</i>. RemoveItems should take something that can be interpreted into SQL (or whatever's appropriate for the persistence you're using) and return a <i>plan</i> that can be composed with other plans.<p>IRefuelable, IParkable, IEngineOperable ... these seem to be missing the point that interfaces are defined by their <i>consumers</i>, not by their <i>implementations</i>. You write an interface when you have a need for its methods, <i>not</i> when you happen to have two implementations of them. If you find you're writing classes like RealLifeObject : IFoo, IBar, IBaz, IBing, IBong, then your class is capturing the wrong thing. Most likely, those Foos and Bars are the <i>real</i> domain objects you care about, and Car should never have been a class. Go read Eric Lippert's excellent Wizards and Warriors (all five posts): <a href="https://ericlippert.com/2015/04/27/wizards-and-warriors-part-one/" rel="nofollow">https://ericlippert.com/2015/04/27/wizards-and-warriors-part...</a><p>It's like this any time I see an argument about over-engineering, abstraction, etc. It just feels like everyone is missing the whole point. We argue about abstraction without even agreeing on what abstraction <i>actually is</i>. (Spoiler: it's many different things.) We get bogged down in silly underspecified toy examples. So many articles are "stop smearing shit all over your face! Smear it on your LEGS instead! Much better!" Why are we smearing all this shit in the first place? It's very hard to have an internet conversation about this.