Worse Is Better

Progress, not perfection

Mike Sherov

Principal Worst Engineer

Core UX @ Skillshare

is often undesirable to go for the right thing first. It is better to get half of the right thing available so that it spreads like a virus. Once people are hooked[...] improve it to 90% of the right thing.

Zen

Overview

  • History: New Jersey vs. MIT
  • Characteristics of Design
  • Why Worse is Better
  • YAGNI - You Ain't Gonna Need It
  • Big Rewrites

History

NJ Approach

MIT Approach

  • C
  • Unix
  • jQuery
  • Javascript
  • Lisp
  • CLOS
  • Dojo
  • Python

Characteristics of Design

Simplicity

New Jersey: must be simple. It is more important for the implementation to be simple than the interface. Simplicity is the most important consideration in a design.

MIT:  must be simple. It is more important for the interface to be simple than the implementation.

Characteristics of Design

Correctness

New Jersey: must be correct in all observable aspects. It is slightly better to be simple than correct.

MIT:  must be correct in all observable aspects. Incorrectness is simply not allowed.

Characteristics of Design

Correctness

New Jersey: must not be overly inconsistent. Consistency can be sacrificed for simplicity in some cases, but it is better to drop those parts of the design that deal with less common circumstances than to introduce either implementational complexity or inconsistency.

MIT: must not be inconsistent. A design is allowed to be slightly less simple and less complete to avoid inconsistency. Consistency is as important as correctness.

Characteristics of Design

Completeness

New Jersey: must cover as many important situations as is practical. All reasonably expected cases should be covered. Completeness can be sacrificed in favor of any other quality. In fact, completeness must be sacrificed whenever implementation simplicity is jeopardized. Consistency can be sacrificed to achieve completeness if simplicity is retained; especially worthless is consistency of interface.

MIT: must cover as many important situations as is practical. All reasonably expected cases must be covered. Simplicity is not allowed to overly reduce completeness.

Characteristics of Design

New Jersey MIT
Simple Implementation Correct
Simple Interface Consistent
Correct Complete
Consistent* Simple Interface
Complete* Simple Implementation

*Consistency can be sacrificed to achieve completeness if simplicity is retained

Why Worse Is Better

The PC Loser-ing Problem

  • MIT: "The Right Thing" is to back out and restore the user program PC to the instruction that invoked the system routine.
  • NJ: Meh. That's too complicated. Throw an error. Programmers will catch it. Let's keep Unix simple.
  • MIT: Unix itself is simple, but catching errors is a complex interface.
  • NJ: Meh. Implementation simplicity over Interface simplicity.

Doing "The Right Thing" was too complex.

Why Worse Is Better

Viruses That Reproduce, Spread

  • Unix was "good enough". People wanted to port it.
  • Unix was simple. It was easier to port than CLOS.
  • C was designed to write Unix, therefore people wrote C and C Compilers to port Unix.

Why Worse Is Better

Distribution Attracts Attention

  • Unix was everywhere. It's about 50% of what's needed though. Lots of folks to get it to 90%
  • Going from 50% to 90% represents huge wins for users with low expectations.

Why Worse Is Better

The Virtuous Cycle

Release

Adopt

Improve

YAGNI

You Ain't Gonna Need It

Always implement things when you actually need them, never when you just foresee that you need them.

Do the simplest thing that could possibly work.

Simplicity - the art of maximizing the amount  of work not done - is essential.

YAGNI

You Ain't Gonna Need It

Must be used with continuous refactoring, continuous automated unit testing, and continuous integration.

YAGNI

You Ain't Gonna Need It

Avoid Premature Abstraction (Rule of Three) and Premature Optimization (Knuth's Root of All Evil)

Big Rewrites

There is a lot of FUD about wholesale rewrites. Many will tell you to simply not do it. But why?

Fear. Uncertainty. Doubt.

Big Rewrites

Chad Fowler lays out the reasons why Big Rewrites may fail, and in doing so gives us hope.

The Light

Big Rewrites

It is hard to discover what the existing system does. Reading code is harder than writing it.

Software as Spec

Big Rewrites

Tempting to "fix a bunch of bugs" or "add a few features" to the rewrite. Tweaks turn into reinvention without normal product dev checks and balances.

The Wish List

Big Rewrites

Should we deliver the Rewrite incrementally or all in one big release? One big release wins the argument. The old system needs patches that don't get forward ported, etc.

The Big Bang

Big Rewrites

Rewriting a working application always has to come with why? "More maintainable", "better dev velocity" are unmeasurable notions. Newer promises are added on: "Better Uptime" "Performance". Everything gets attributed to the new system, regardless of the truth of the statement.

Justifications

Big Rewrites

The domain experts are "stuck" tending to the "old" application, while technology experts implement the "new" system, which will yield missing pieces of the domain, or at least cost more communication than expected!

Who's Tending the Store?

Big Rewrites

So What Can We Do?

What are the lessons from Worse Is Better that can help with a big rewrite? Can you turn a big rewrite into something else?

Big Rewrites

So What Can We Do?

  • Deliver worse slices faster.
  • Spread them wide.
  • Improve them together.

What Questions Do You Have?

Worse Is Better

By mikesherov

Worse Is Better

  • 1,720