Kiss Principle vs Yagni
KISS and YAGNI both fight complexity, but from opposite ends: one polices the code you write today, the other polices the code you're tempted to write for tomorrow. KISS wins because it's the broader discipline that survives every codebase.
The short answer
Kiss Principle over Yagni for most cases. KISS is the parent principle.
- Pick Kiss Principle if want one principle to govern naming, structure, control flow, and architecture — the all-purpose 'is this harder than it needs to be?' gut check
- Pick Yagni if specifically catch yourself gold-plating: building config systems, plugin architectures, and abstraction layers for users and requirements that don't exist yet
- Also consider: Pair them with DRY, but only after KISS — premature DRY is one of the biggest sources of accidental complexity, and three duplicated lines beat one wrong abstraction.
— Nice Pick, opinionated tool recommendations
What they actually are
KISS — Keep It Simple, Stupid — is a US Navy design maxim from the 1960s that escaped into software: prefer the simplest thing that works, because complexity is where bugs, onboarding pain, and 2am pages live. YAGNI — You Aren't Gonna Need It — is an Extreme Programming slogan from Kent Beck and Ron Jeffries: don't add capability until an actual requirement demands it. The distinction people miss: KISS is about the form of what you build right now, YAGNI is about the timing of when you build it at all. KISS asks 'is this the simplest expression of the thing?' YAGNI asks 'should this thing exist yet?' They overlap constantly — speculative generality is both un-simple and unneeded — but they are not synonyms, and treating them as interchangeable is how you end up quoting slogans instead of making decisions.
Where each one bites
YAGNI has a sharper, narrower blade. It kills the configurable thresholds nobody configures, the strategy pattern with one strategy, the multi-tenant abstraction for your single tenant, the event bus for two callers. It's devastatingly effective against architects who design for the company they wish they worked at. But YAGNI is silent on code that's needed yet still awful — a 200-line function that does exactly one required job badly passes YAGNI clean. That's KISS's territory. KISS bites the needlessly clever one-liner, the inheritance tower, the regex that should've been three string checks, the framework pulled in for a 10-line task. KISS is harder to apply because 'simple' is contested — what's simple to the author is often a private joke to everyone else. YAGNI at least gives you a falsifiable test: does a real requirement demand it? Yes or no.
The failure modes
Each principle has a way of being weaponized by people who half-understand it. YAGNI gets cited to justify shortsighted hacks — 'we won't need extensibility' becomes a load-bearing excuse for hardcoding things that visibly change every quarter. Used by a junior, YAGNI becomes 'I didn't think ahead and I'm calling it discipline.' KISS gets abused too: 'simple' is the favorite cover for under-engineered, no-error-handling, no-tests code that's simple for the author and a minefield for the maintainer. Worse, KISS is so vague it rarely loses an argument — everyone agrees their own code is simple. The honest version of both: YAGNI is a bet that change is cheaper later than speculation is now, which is usually but not always true. KISS is a constraint, not a free pass to skip the hard parts that genuinely are necessary.
The verdict, plainly
Pick KISS as your north star and keep YAGNI as a sharp tool on the belt. Here's the reasoning: simplicity is the goal; not-building-it-yet is one of the most reliable routes to that goal, but not the only one. You can satisfy YAGNI perfectly and still ship a tangled, simplicity-hostile codebase. You cannot satisfy KISS while shipping speculative cruft, because the cruft makes it not-simple. So KISS strictly contains the value YAGNI provides, plus more. In practice: invoke YAGNI in design reviews when someone's building for ghosts — it's concrete and wins arguments. Invoke KISS everywhere else, every day, as the question you ask before merging anything. If you only get to internalize one, internalize KISS — it's the principle that keeps paying out long after you've stopped consciously thinking about which abstractions you skipped.
Quick Comparison
| Factor | Kiss Principle | Yagni |
|---|---|---|
| Scope | Broad — governs all code form, structure, and architecture | Narrow — only about deferring unneeded capability |
| Testability of the rule | 'Simple' is contested and subjective | Falsifiable: is there a real requirement now? Yes/no |
| Most common abuse | Cover for under-engineered, untested code | Excuse for shortsighted hardcoding |
| Daily applicability | Every merge, every function, every name | Mostly design/architecture decisions |
| Relationship | The parent goal that contains the other | One tactic serving the KISS goal |
The Verdict
Use Kiss Principle if: You want one principle to govern naming, structure, control flow, and architecture — the all-purpose 'is this harder than it needs to be?' gut check.
Use Yagni if: You specifically catch yourself gold-plating: building config systems, plugin architectures, and abstraction layers for users and requirements that don't exist yet.
Consider: Pair them with DRY, but only after KISS — premature DRY is one of the biggest sources of accidental complexity, and three duplicated lines beat one wrong abstraction.
Kiss Principle vs Yagni: FAQ
Is Kiss Principle or Yagni better?
Kiss Principle is the Nice Pick. KISS is the parent principle. YAGNI is one specific tactic — "don't build for hypothetical futures" — under the larger goal of keeping things simple. A simple system is almost always a YAGNI-respecting one, but a YAGNI-respecting system can still be a baroque mess of clever simplicity-killers. KISS covers more ground.
When should you use Kiss Principle?
You want one principle to govern naming, structure, control flow, and architecture — the all-purpose 'is this harder than it needs to be?' gut check.
When should you use Yagni?
You specifically catch yourself gold-plating: building config systems, plugin architectures, and abstraction layers for users and requirements that don't exist yet.
What's the main difference between Kiss Principle and Yagni?
KISS and YAGNI both fight complexity, but from opposite ends: one polices the code you write today, the other polices the code you're tempted to write for tomorrow. KISS wins because it's the broader discipline that survives every codebase.
How do Kiss Principle and Yagni compare on scope?
Kiss Principle: Broad — governs all code form, structure, and architecture. Yagni: Narrow — only about deferring unneeded capability. Kiss Principle wins here.
Are there alternatives to consider beyond Kiss Principle and Yagni?
Pair them with DRY, but only after KISS — premature DRY is one of the biggest sources of accidental complexity, and three duplicated lines beat one wrong abstraction.
KISS is the parent principle. YAGNI is one specific tactic — "don't build for hypothetical futures" — under the larger goal of keeping things simple. A simple system is almost always a YAGNI-respecting one, but a YAGNI-respecting system can still be a baroque mess of clever simplicity-killers. KISS covers more ground.
Related Comparisons
Disagree? nice@nicepick.dev