Darel Rex Finley in PhotoBooth

The Two Rules of Great Programming

2008.11.07   prev     next

As for what this all means, I’m still trying to figure that out. I abandoned seven long-held principles about business and software engineering, and nothing terrible happened. Have I been too cautious in the past? —Joel Spolsky

Figure out the absolute least you need to do to implement the idea, do just that, and then polish the hell out of the experience. —John Gruber

I’m about to save you a lot of money on books about programming theory. There are really just two rules of good programming:

  1. Bugs are bad — Your app should work correctly as designed and/or as its end-users expect it to.

  2. Occam’s Razor — Simpler solutions are better, provided they still accomplish the same result. So simpler code is better if it does the same thing as more complex code. And a simpler, more intuitive user interface is better than a more complex one that enables the user to do the same things.

That’s it! Those are the only real rules to good programming. That, and of course being smart enough to know what algorithms you need and how to code them.

You can’t fill a thick book with rules about what good programming is all about unless you make up a whole lot more than the quarter-of-a-page taken up by the above rules. And all that made-up filler is utterly arbitrary. It’s what the author(s) of the book prefer to do. Or maybe not even that — it might be merely what the author(s) would like you to do if they were your boss, even if they don’t consistently practice it themselves. It might be stuff that sounds really good in a book, until you actually try to do it and discover it sucks. And of course a whole lot of it is vacuous, fortune-cookie fluff, in the same vein as “buy low, sell high,” or “spend more time exhaustively looking into everything” — or just “do more.” It sounds like good advice, but it really doesn’t help you at all.

And when they conflict, which authors do you follow? Try to figure out who’s right in the following (fictional) conversation:

A: And then the webpage builds a temporary PDF file in this folder on the server, and serves it up to the user. Problem solved!

B: What happens to those PDFs? Will they just accumulate on the server?

A: No, every time it creates a new PDF, it first deletes existing PDFs that are older than 24 hours.

B: Oh. But what if nobody uses the app for days? How will the PDFs older than 24 hours get deleted?

A: They won’t — but if no one is using the app, then PDFs aren’t accumulating.

B: That sounds flaky. I think we need a service that checks every night and deletes these PDFs if they’re older than 24 hours.

A: But what if that service goes down and nobody knows it? Then the PDFs will just accumulate. And do we really want yet another service to maintain?

B: Well, we can’t depend on future user activity to delete temporary files. That’s just a bad idea.

You could write a proper-programming book and in it argue for either A or B — whichever you like better — and present it as if it’s obviously the correct position. Here’s a choice example from a certain programming theory book of which I once was required to read large portions:

What you’re trying to do [by appointing a project librarian, setting up meetings and forums, and frequently reviewing each other’s code] is foster an environment where it’s easier to find and reuse existing stuff than to write it yourself. If it isn’t easy, people won’t do it. And if you fail to reuse, you risk duplicating knowledge.

Bad news, guys: If it isn’t easy to apoint a project librarian, set up meetings and forums, and frequently review other developers’ code, people won’t do that. As I pointed out a little while ago, authors of programming books want you to think that your job is to make things easier for other programmers, because that’s what they (the authors) do. But if you really want to make something that people go “wow” over, then you’re not trying to make things easier for other programmers; you’re trying to make things easier (and better) for the end-users, who typically aren’t programmers — and even when they are, they would probably rather your app kicked ass from an end-user perspective than be easy for them to goof around with in the sourcecode.

My biggest and most appreciated project to date is SWTSG. When I think about how I would have to have written that app to satisfy almost any “good programming” book’s authors, I can only recoil in horror. Among many other things, I would have to have:

  • developed six OS-compatible fonts, then figured out a way to make the required glyph distortions work with fonts in that format (if possible at all)

  • figured out a way to include those six new fonts with my app and make them install on the user’s computer

  • supported Unicode from the get-go, instead of modifying the app later to support it

  • written everything as OO (ObjC) classes, regardless of the effect on speed and/or portability

  • regularly submitted my unfinished code to other developers in internet forums for their review and criticism, which would have made the whole thing into an exasperating exercise in dealing with other persons’ attempts to project themselves as teachers and me as student, and which would have turned the whole project into a group effort with unpredictable outcome

  • scoured the internet and other “official” code sources for pre-existing libraries which I could link into my project and use, instead of “reinventing the wheel,” then found a way to ensure that my project can discover and draw-in any updates to those libraries

  • break down all the necessary complexity of the app into many, small, interdependent pieces, any one of which will not intimidate other developers into washing their hands of trying to understand it, and instead authoritatively declaring that my code is an incomprehensible mess

  • riddled the entire sourcecode with lines that are blank except for a single brace character — a practice which almost everybody thinks an improvement in readability, for no reason that I have been able to discover

  • completely forgone the “wow” factor that results when users see a fantastic finished product that they had no idea was even under development — maybe, if I was very lucky, a limited version of the app (perhaps rendering the crawl only) would be just coming out today, after years of work and general internet awareness that the project was underway. It would have been a big disappointment, and no one would say “wow.”

Grab a couple “proper programming” tomes and you can probably expand the above list to many times its current size. Suffice it to say that the project would have been utterly ruined if I had tried to satisfy these authors’ ideas of how software should be developed.

Sometimes you just have to go with your gut, and know that if you’re so far out there that society is actually threatened by your activity, then society certainly has the power to stop you. If it doesn’t stop you, then the proof of the pudding will be in the eating — and only afterwards can the recipe be subjected to an anal exam.

 

See also: Faster Is Better

 

Update 2009.09.24 — Don’t miss Joel Spolsky’s “The Duct Tape Programmer.”

 

prev     next

 

Hear, hear

prev     next

Favorite links

Starbucks

Apple

RoughlyDrafted

Daring Fireball

Joel on Software

Macalope

Red Meat

Despair, Inc.

Zombie Survival Guide plus Dawn of the Dead (also check out HVZ)

Charlie Superfly Check “The First Time” to hear what she actually sang in the competition. HowardTV ripped it out and spliced in utter crap they had her sing later.

Real Solution #9 (Mambo Mania Mix) over stock nuke tests.

Ernie & Bert In Casino

Great Explanation of Star Wars

Best Superbowl 43 Commercial

Kirk & Spock get Closer

TV: Friday Night Lights; Justified; Wipeout; Cash Cab

My vote for best commercial ever.

Congratulations to Kaiser Tangso for figuring out what the title of my site means!

Previous articles

What You Have To Give Up

The End of Elitism

Good and Evil

Life

How Religion Distorts Science

Laziness and Creativity

Sideloading and the Supersized-Mastodon-In-the-Room That Snell Doesn’t See

Long-Term Self-Delusion

App Store Success Won’t Translate To Books, Movies, and Shows

Silly iPad Spoilsports

I Disagree

Five Rational Counterarguments

Majority Report

Simply Unjust

Zooman Science

Reaganomics — Like A Diet — Works

Free R&D?

Apple’s On the Right Track

Mountains of Evidence

What We Do

Hope Conquers All

Humans Are Special — Just Not That Special

Life = Survival of the Fittest

Excuse Me, We’re Going To Build On Your Property

No Trademark iWorries

Knowing

Twisted Excuses

The Fall of Google

Real Painters

The Meaning of Kicking Ass

How To Really Stop Casual Movie Disc Ripping

The Solitary Path of the High-Talent Programmer

Fixing, Not Preaching

Why Blackmail Is Still Illegal

Designers Cannot Do Anything Imaginable

Wise Dr. Drew

Rats In A Too-Small Cage

Coming To Reason

Everything Isn’t Moving To the Web

Pragmatics, Not Rights

Grey Zone

Methodologically Dogmatic

The Purpose of Language

The Punishment Defines the Crime

Two Many Cooks

Pragmatism

One Last Splurge

Making Money

What Heaven and Hell Are Really About

America — The Last Suburb

Hoarding

What the Cloud Isn’t For

Diminishing Returns

What You’re Seeing

What My Life Needs To Be

Taking An Early Retirement

Office Buildings

A, B, C, D, Pointless Relativity

Stephen Meyer and Michael Medved — Where Is ID Going?

If You Didn’t Vote — Complain Away

iPhone Party-Poopers Redux

What Free Will Is Really About

Spectacularly Well

Pointless Wrappers

PTED — The P Is Silent

Out of Sync

Stupid Stickers

Security Through Normalcy

The Case For Corporate Bonuses

Movie Copyrights Are Forever

Permitted By Whom?

Quantum Cognition and Other Hogwash

The Problem With Message Theory

Bell’s Boring Inequality and the Insanity of the Gaps

Paying the Rent At the 6 Park Avenue Apartments

Primary + Reviewer — An Alternative IT Plan For Corporations

Yes Yes Yes

Feelings

Hey Hey Whine Whine

Microsoft About Microsoft Visual Microsoft Studio Microsoft

Hidden Purple Tiger

Forest Fair Mall and the Second Lamborghini

Intelligent Design — The Straight Dope

Maxwell’s Demon — Two Real-World Examples

Zealots

Entitlement BS

Agenderle

Mutations

Einstein’s Error — The Confusion of Laws With Their Effects

The Museum Is the Art

Polly Sooth the Air Rage

The Truth

The Darkness

Morality = STDs?

Fulfilling the Moral Duty To Disdain

MustWinForSure

Choice

Real Design

The Two Rules of Great Programming

Cynicism

The End of the Nerds

Poverty — Humanity’s Damage Control

Berners-Lee’s Rating System = Google

The Secret Anti-MP3 Trick In “Independent Women” and “You Sang To Me”

ID and the Large Hadron Collider Scare

Not A Bluff

The Fall of Microsoft

Life Sucks When You’re Not Winning

Aware

The Old-Fashioned Way

The Old People Who Pop Into Existence

Theodicy — A Big Stack of Papers

The Designed, Cause-and-Effect Brain

Mosaics

IC Counterarguments

The Capitalist’s Imaginary Line

Education Isn’t Everything

I Don’t Know

Funny iPhone Party-Poopers

Avoiding Conflict At All Costs

Behavior and Free Will, Unconfused

“Reduced To” Absurdum

Suzie and Bubba Redneck — the Carriers of Intelligence

Everything You Need To Know About Haldane’s Dilemma

Darwin + Hitler = Baloney

Meta-ware

Designed For Combat

Speed Racer R Us

Bold — Uh-huh

Conscious of Consciousness

Future Perfect

Where Real and Yahoo Went Wrong

The Purpose of Surface

Eradicating Religion Won’t Eradicate War

Documentation Overkill

A Tale of Two Movies

The Changing Face of Sam Adams

Dinesh D’Souza On ID

Why Quintic (and Higher) Polynomials Have No Algebraic Solution

Translation of Paul Graham’s Footnote To Plain English

What Happened To Moore’s Law?

Goldston On ID

The End of Martial Law

The Two Faces of Evolution

A Fine Recommendation

Free Will and Population Statistics

Dennett/D’Souza Debate — D’Souza

Dennett/D’Souza Debate — Dennett

The Non-Euclidean Geometry That Wasn’t There

Defective Attitude Towards Suburbia

The Twin Deficit Phantoms

Sleep Sync and Vertical Hold

More FUD In Your Eye

The Myth of Rubbernecking

Keeping Intelligent Design Honest

Failure of the Amiga — Not Just Mismanagement

Maxwell’s Honey Do?

End Unsecured Debt

The Digits of Pi Cannot Be Sequentially Generated By A Computer Program

Faster Is Better

Goals Can’t Be Avoided

Propped-Up Products

Ignoring ID Won’t Work

The Crabs and the Bucket

Communism As A Side Effect of the Transition To Capitalism

Google and Wikipedia, Revisited

National Geographic’s Obesity BS

Cavemen

Theodicy Is For Losers

Seattle Redux

Quitting

Living Well

A Memory of Gateway

Is Apple’s Font Rendering Really Non-Pixel-Aware?

Humans Are Complexity, Not Choice

A Subtle Shift

Moralism — The Emperor’s New Success

Code Is Our Friend

The Edge of Religion

The Dark Side of Pixel-Aware Font Rendering

The Futility of DVD Encryption

ID Isn’t About Size or Speed

Blood-Curdling Screams

ID Venn Diagram

Rich and Good-Looking? Why Libertarianism Goes Nowhere

FUV — Fear, Uncertainty, and Vista

Malware Isn’t About Total Control

Howard = Second Coming?

Doomsday? Or Just Another Sunday

The Real Function of Wikipedia In A Google World

Objective-C Philosophy

Clarity From Cisco

2007 Macworld Keynote Prediction

FUZ — Fear, Uncertainty, and Zune

No Fear — The Most Important Thing About Intelligent Design

How About A Rational Theodicy

Napster and the Subscription Model

Intelligent Design — Introduction

The One Feature I Want To See In Apple’s Safari