I'm James Hague, a recovering programmer who has been designing video games since the 1980s. Programming Without Being Obsessed With Programming and Organizational Skills Beat Algorithmic Wizardry are good starting points. For the older stuff, try the 2012 Retrospective.

Where are the comments?

twitter / mail / newsfeed


If You Haven't Done It Before, All Bets Are Off

Why Doesn't Creativity Matter in Tech Recruiting?

Reconsidering Functional Programming

The Wrong Kind of Paranoia

Are You Sure?

Life is More Than a Series of Cache Misses

Retiring Python as a Teaching Language

The Software Developer's Sketchbook


Programming Modern Systems Like It Was 1984

Extreme Formatting

Design is Expensive

Lost Lessons from 8-Bit BASIC

You Can't Sit on the Sidelines and Become a Philosopher

Unexpectedly Simple

Programming Without Being Obsessed With Programming

You Don't Read Code, You Explore It

Get Good at Idea Generation

Range-Checks and Recklessness

Popular iOS Games That Could Have Been Designed for 8-Bit Systems

You Don't Want to Think Like a Programmer

A Worst Case for Functional Programming?

Success Beyond the Barrier of Full Understanding


Optimization in the Twenty-First Century

Self-Imposed Complexity

C is Lower Level Than You Think

Three Years in an Alternate Universe

What Are You The World's Foremost Authority Of?

Dynamic Everything Else

Why Do Dedicated Game Consoles Exist?

Purely Functional Photoshop

How much memory does malloc(0) allocate?

Getting Past the Cloning Instinct

Organizational Skills Beat Algorithmic Wizardry

Tips for Writing Functional Programming Tutorials

Getting Comfortable with the Softer Side of Development

Flickr's Redesign is a Series of Evolutionary Changes

Stumbling Into the Cold Expanse of Real Programming

A Short Quiz About Language Design

Remembering a Revolution That Never Happened

Exploring the Lower Depths of Terseness

Expertise, the Death of Fun, and What to Do About It

Don't Be Distracted by Superior Technology

Simplicity is Wonderful, But Not a Requirement

The Highest-Level Feature of C

Sympathy for Students in Beginning Programming Classes

Trapped by Exposure to Pre-Existing Ideas

An Irrational Fear of Files on the Desktop

2012 Retrospective


Documenting the Undocumentable

Dangling by a Trivial Feature

The UNIX Philosophy and a Fear of Pixels

"Not Invented Here" Versus Developer Sanity

An Outrageous Port

OOP Isn't a Fundamental Particle of Computing

The Background Noise Was Louder than I Realized

Do You Really Want to be Doing This When You're 50?

Digging Out from Years of Homogeneous Computing

What's Your Hidden Agenda?

Minimalism in an Age of Tremendous Hardware

The Goal is to be Like a Bad Hacker Movie

Hopefully More Controversial Programming Opinions

All that Stand Between You and a Successful Project are 500 Experiments

One Small, Arbitrary Change and It's a Whole New World

App Store Failure and Personal Responsibility

Things to Optimize Besides Speed and Memory

I Am Not a Corporation

The Silent Majority of Experts

Your Coding Philosophies are Irrelevant

Another Programming Idiom You've Never Heard Of

The Pace of Technology is Slower than You Think

We Who Value Simplicity Have Built Incomprehensible Machines

You, Too, Can Be on the Cutting Edge of Functional Programming Research

The Most Important Decisions are Non-Technical

A Forgotten Principle of Compiler Design

Can You Be Your Own Producer?

Use and Abuse of Garbage Collected Languages

100,000 Lines of Assembly Language

This is Why You Spent All that Time Learning to Program

Turning Your Code Inside Out

Solving the Wrong Problem

A Complete Understanding is No Longer Possible

Don't Fall in Love With Your Technology

A Peek Inside the Erlang Compiler

Four Levels of Idea Theft

Pretend This Optimization Doesn't Exist

Virtual Joysticks and Other Comfortably Poor Solutions

Recovering From a Computer Science Education

Follow-up to "A Programming Idiom You've Never Heard Of"

A Programming Idiom You've Never Heard Of


2011 Retrospective

User Experience Intrusions in iOS 5

Photography as a Non-Technical Hobby

Adventures in Unfiltered Global Publishing

Things That Turbo Pascal is Smaller Than

Starting in the Middle

Papers from the Lost Culture of Array Languages

The Revolution is Personal

Optimization on a Galactic Scale

Greetings from the Bottom of the Benchmarks

Beyond Empty Coding

Boldness and Restraint

Building Beautiful Apps from Ugly Code

It's Like That Because It Has Always Been Like That

"Avoid Premature Optimization" Does Not Mean "Write Dumb Code"

Collapsing Communities

8-Bit Scheme: A Revisionist History

The End is Near for Vertical Tab

The Nostalgia Trap

Living in the Era of Infinite Computing Power

Tough Love for Indies

Constantly Create

Impressed by Slow Code

Follow the Vibrancy

Revisiting "Tricky When You Least Expect It"

Caught-Up with 20 Years of UI Criticism

If You're Not Gonna Use It, Why Are You Building It?

Don't Distract New Programmers with OOP

Exploring Audio Files with Erlang

Accidental Innovation, Part 3

Accidental Innovation, Part 2

Accidental Innovation, Part 1


A Three-Year Retrospective

Write Code Like You Just Learned How to Program


Learning to Ignore Superficially Ugly Code

Good-Bye to the Sprawling Suburbs of Screen Space

Easy to Please

This Isn't Another Quick Dismissal of Visual Programming

A Concurrent Language for Non-Concurrent Software

Advice to Aimless, Excited Programmers

Erlang vs. Unintentionally Purely Functional Python

Common Sense, Part 1

Personal Programming

Stop the Vertical Tab Madness

One Small Step Toward Reducing Programming Language Complexity

Free Your Technical Aesthetic from the 1970s

Explaining Functional Programming to Eight-Year-Olds

What Do People Like?

Tricky When You Least Expect It

A Ramble Through Erlang IO Lists

How to Think Like a Pioneer

How Much Processing Power Does it Take to be Fast?

Rethinking Programming Language Tutorials

Living Inside Your Own Black Box

A Short Story About Verbosity

Eleven Years of Erlang

It Made Sense in 1978

Dehumidifiers, Gravy, and Coding

Optimizing for Fan Noise

What to do About Erlang's Records?

Nothing Like a Little Bit of Magic

Flickr as a Business Simulator

No Comment

The Recovering Programmer


Follow-up to "Functional Programming Doesn't Work"

Functional Programming Doesn't Work (and what to do about it)

How I Learned to Stop Worrying and Love Erlang's Process Dictionary

Slow Languages Battle Across Time

How Did Things Ever Get This Good?

Tales of a Former Disassembly Addict

Micro-Build Systems and the Death of a Prominent DSL

The World's Most Mind-Bending Language Has the Best Development Environment

A Personal History of Compilation Speed, Part 2

The Pure Tech Side is the Dark Side

A Personal History of Compilation Speed, Part 1

Want People to Use Your Language Under Windows? Do This.

How to Crash Erlang

Digging Deeper into Sufficiently Smartness

Let's Take a Trivial Problem and Make it Hard

On Being Sufficiently Smart

How My Brain Kept Me from Co-Founding YouTube

Puzzle Languages

Revisiting "Purely Functional Retrogames"


Accidentally Introducing Side Effects into Purely Functional Code

Timidity Does Not Convince

Macho Programming

Understanding What It's Like to Program in Forth

Kilobyte Constants, a Simple and Beautiful Idea that Hasn't Caught On

Functional Programming Went Mainstream Years Ago

Want to Write a Compiler? Just Read These Two Papers.

A Spellchecker Used to Be a Major Feat of Software Engineering

Coding as Performance

Don't Be Afraid of Special Cases

Purely Functional Retrogames, Part 4

Purely Functional Retrogames, Part 3

Purely Functional Retrogames, Part 2

Purely Functional Retrogames, Part 1

My Road to Erlang

Slumming with BASIC Programmers

In Praise of Non-Alphanumeric Identifiers

Five Memorable Books About Programming

Back to the Basics of Functional Programming

Don't Structure Data All The Way Down

Garbage Collection in Erlang

Why Garbage Collection Paranoia is Still (sometimes) Justified


Functional Programming Archaeology

Would You Bet $100,000,000 on Your Pet Programming Language?

Timings and the Punchline

Revisiting "Programming as if Performance Mattered"

Finally: Data Structure Constants in Erlang

Two Stories of Simplicity

Deriving Forth

Trapped! Inside a Recursive Data Structure

Sending Modern Languages Back to 1980s Game Programmers

Erlang as a Target for Imperative DSLs

Follow-up to "Admitting that Functional Programming Can Be Awkward"

Admitting that Functional Programming Can Be Awkward

On the Perils of Benchmarking Erlang

A Deeper Look at Tail Recursion in Erlang