Crawford’s Laws of Software Design

#1: Always ask, ‘What does the user DO?’ 
The point and purpose of all software is interaction. Software with no interaction is useless. Software with strong interactivity is preferable to software with weak interactivity. Here are a number of essays I have written on the importance of interactivity: Fundamentals of Interactivity, I Told Ya So: Interactivity, The Primacy of Interactivity. Interactivity requires that the user do things. The things that the user does are specified as the verbs in the design. Thus, the verbs define the software. The verb list is the fundamental architectural document for software, comparable to the blueprint for a building or a schematic for an electronic circuit.

#2: When in doubt, shoot the programmer!
This is only partly tongue-in-cheek. Programmers make software come alive, and good programmers accomplish wondrous feats. But not all programmers are competent, and all too often they take shortcuts, especially with respect to user interfaces, that cheat the user. Almost everywhere I look, I see software with mistakes, largely due to poor programming. 

#3: People, not things!
This is specific to games. Games are all about things, not people. You shoot things, things shoot at you. You chase things, things chase you. You pick up things, drop things, move things, blow up things… but it’s always things! There are no people in our games; there are vending machines with faces plastered onto them. You have to figure out the right thing to say, the right gift to offer, the right coin to put into the slot, at which point, the vending machine spits out the vorpal blade, the location of the castle, or the magical spell. But entertainment is about people, not things. Have you ever seen a movie without any people? Can you imagine a novel without any people? Can you imagine reading “The Nobody of the Rings” or watching a movie about BatNobody?

Until we get genuine, dramatically interesting characters into our games, they will remain bloodless exercises in hand-eye coordination and petty cognition.

#4: If you don’t know where you’re going, you probably won’t get there.
Too many people think incrementally. They think in terms of what already exists, and how they might improve upon it. “I’ll make a game like God of War, only bigger, with better weapons, or bigger explosions, or...” These people go through life looking down at their feet, thinking only about where to put their foot next. If you want to actually get somewhere, you have to look up, scan the horizon, find a mountain that you want to climb, and go there. 

#5: It’s always more complicated than you thought
All your knowledge is just an approximation of the truth. You can memorize π to ten decimal places, but it’s longer than that. Even if you memorize π to a hundred decimal places, you’re still not getting it right. You’ll never know the true value of π, because it has an infinite number of decimal places. The same thing goes with everything else. You think you know games? Ha! There’s always something new about games that you didn’t know. Whether it’s cooking or economics or programming or sex or politics, reality is always more complicated than you thought. The best you can do is improve on your current knowledge.

#6: Think numerically, not booleanly.
Most people—hell, almost everybody!—persists in thinking in simple-minded black-and-white terms. The world is not black and white; everything is in shades of gray, and you have to think in numeric terms to perceive those shades of gray. As the second greatest physicist in history, James Clerk Maxwell, put it, ‘The logic of this world is the calculus of probabilities.’ 

#7: You can’t listen well if you don’t give the user the power to speak well.
Good software design requires that your software “listens” well to the user’s input. Have you ever had a conversation (interaction) with somebody who just doesn’t listen to what you’re saying? Isn’t such a conversation a waste of time? It’s the same thing with software. In normal conversation, at least, you use a language that both of you understand. But in software interactions, the user is restricted to expressing himself in the language that YOU define. 

NeoMatrixMouth

How many users feel