Invert the Problem

One of the most powerful problem-solving tools I have used across my career is one of the simplest: instead of asking how to solve a problem, ask how to guarantee its failure. The clarity that comes from that inversion is often immediate — and surprising.

The technique is called Inversion. It was popularised by the mathematician Carl Jacobi, who advised: "Invert, always invert." Charlie Munger, the investor and thinker, brought it into mainstream discourse. But as an engineering practice, it is as practical as unit tests and as underused as good documentation.

the technique

What Inversion Actually Means

The idea is deceptively straightforward. Instead of thinking about how to solve a problem or achieve a goal, you think about how to achieve the opposite of that goal — how to make things worse, how to guarantee failure, how to ensure the outcome you do not want.

In practice, the mental shift sounds like this:

Don't ask: "How do I make this system secure?" Ask instead: "How would I make this system as insecure as possible?"

Once you have that list, you simply invert it. The actions that would cause failure become the requirements for success. The obstacles you imagined become the checklist you work from. What makes this powerful is that failure is often far easier to imagine concretely than success — which means your inverted list surfaces risks, gaps, and edge cases that a forward-facing requirements document might never catch.

example one

A Developer's Story: Username Validation

Consider a common task: ensuring that usernames are valid — alphanumeric, between 5 and 15 characters, no special characters or spaces.

Applied forward, this produces a requirements list: validate length, allow only alphanumeric characters, enforce rules at the frontend. A reasonable approach, but also a shallow one. It describes what you want without forcing you to think about where it can go wrong.

Now invert it. Ask: if my task were to allow as many invalid usernames as possible, what would I do?

// inverted — how to allow invalid usernames
Things I would do if I wanted to guarantee failure:
  • Not check the length of the username at the screen or at the API layer — rely on the database to throw an error later.
  • Allow special characters, spaces, and Unicode in any field that accepts user input.
  • Remove frontend validation entirely to "keep the UI clean."
  • Skip backend validation because "the frontend already handles it."
  • Ignore database-level constraints because "we'll add those in v2."

Reading that list, you recognise every item. You have seen these decisions made in production. The inversion did not just produce a checklist — it produced a map of the actual ways this requirement gets broken in practice. The solution writes itself: validate at every layer, independently, with no single layer trusting another.

example two

An Architect's Story: Payment System Security

Now scale the technique. As a Software Architect tasked with enhancing the security of a payment processing system, the scope is wide, the requirements are often vague, and the risk of missing something critical is high.

Apply inversion. Ask: if my goal were to make this payment system as insecure and unreliable as possible, what would I do?

// inverted — how to make a payment system insecure
Things I would do if I wanted to guarantee a breach or failure:
  • Allow all data transmission over unencrypted channels — no TLS, no mutual authentication.
  • Implement vague error handling that leaks internal stack traces and database errors to the client.
  • Skip all input validation — accept any payload, trust the caller, and pass data directly to the database or downstream services.
  • Store sensitive card and payment data in plain text, or with a hardcoded encryption key that never rotates.
  • Implement no authentication or authorisation — let any caller invoke any endpoint.
  • Allow direct database access from the application tier with no prepared statements or ORM sanitisation.
  • Run no security audits, apply no patches, and treat dependency updates as a "low priority" backlog item.

That list is not theoretical. Every item on it is a real vulnerability class — SQL injection, information disclosure, broken access control, missing encryption, insecure direct object reference. The inversion surfaced them all before a single line of security design was written. Each item on the "failure" list becomes a specific, testable, architectural requirement on the "success" list.

when to use it

Four Situations Where Inversion Is Most Valuable

// 01

When Requirements Are Vague

Forward-facing requirements depend on knowing what "success" looks like. When that is unclear, failure is often easier to define. Start there.

// 02

When Scope or Impact Is Unclear

Ask: what would need to go wrong for this change to cause a production incident? The answers define the blast radius — and the testing surface.

// 03

When You Are Missing Edge Cases

Forward thinking optimises for the happy path. Inversion forces you down the unhappy paths — the empty inputs, the concurrent writes, the expired tokens, the malformed payloads.

// 04

When Reviewing Someone Else's Design

Instead of asking "does this design work?", ask "how would I break this design?" It is a more honest — and more useful — question.

closing

The Simplest Thinking Tool in the Box

Inversion does not replace design thinking, architecture review, or threat modelling. It complements all of them. It is fast, requires no special tool or process, and can be applied in a ten-minute whiteboard session or a five-minute thought experiment before a design review.

The technique works because our minds are wired to see risk more vividly than possibility. We are naturally better at imagining what could go wrong than at comprehensively imagining what needs to go right. Inversion exploits that asymmetry — and turns it into a structured engineering advantage.

The next time you face a problem that feels too large, too vague, or too complex to approach directly, try asking the question in reverse. The path forward often becomes clearest from the opposite direction.

You don't need to know every way to succeed. Sometimes it is enough to know every way to fail — and then simply refuse to do any of them.