Making software is like: designing a video game (abstraction and intuitiveness edition)
I am at a bit of a block lately. My earlier revelation has brought a weight to this blog that I can’t possibly maintain, leading me to far too many self-referential comments like this one. So I am just going to get back to what made me what I am today and just talk out my bum about a metaphor for software.
I’m a real old-schooler when it comes to games. I generally prefer board games to video games, and if I am going to play a video game, I prefer older games to modern ones. If forced to choose between my Playstation 2 and the arcade emulator on my laptop, I’d take the latter every time. In many ways, those things that I dislike about modern video games are those things that I dislike about making software.
Older video games were, by necessity of the limited hardware available to them, pretty simple. Unable to smother you in graphical propaganda, they had to make precision strikes into the core of your brain, triggering the necessary imagination and impulses to create the illusion of an experience beyond button-pressing. While it was largely employed out of necessity and not artistic vision, the abstraction found in these games is very appealing to me.
And older games are simply easier to play. Many such games were originally arcade games, and in such a setting the player needs to be able to walk up and get a satisfying experience almost immediately. Plus, most such games were two dimensional, which I generally find vastly preferable to newer, 3d games. The fact is, 99% of games are played with 2d controllers such as joysticks and mice, or vaguely one-dimensional controllers such as buttons. In a 2d game, up can mean up, and right can be right, and you can accomplish the onscreen actions you desire almost subconsciously. But when using a 2d controller to play a 3d game, real-world actions often must undergo some sort of transformation, relative to the game world, to determine the onscreen result. In driving games, or even first-person games, this transformation is often fairly simple, but in a 3d platformer I find the equation “right = move perpendicular to the direction the camera is pointing” to be too cumbersome to perform hundreds of times a minute while I try to enjoy myself.
This is soft of a recap of my early board game post, but making a document to be used within a software process is sort of like making a game. You are setting up a certain situation in which another person is going to roam around. You can’t control what a programmer using your design is going to do, but you can set the stage in a way that is as optimal as possible. But how intuitive is that experience going to be? When they use your design, are they going to be able to translate their needs into results intuitively, or is it going to be relative to some internal actors, rules and constructs that you have established?
And what about abstraction? I don’t mean abstraction in the “dealing with complexity” sense, but rather the “allowing for imagination” sense (discussion of what the hell I mean by these senses, and whether they are truly different, needs to be put off for now). Are you creating enough structure so that the interpretations fall within an acceptable range, while still allowing them to create the vision of the project that they need to in order to understand things?
If you were creating Space Invaders (note the talk of achieving a zen-like rhythm in the tricks section here), you would want to provide enough information and imagery so that players will get certain things right. You need to be specific enough so that the player understands where the bad guys are, where their bullets are, and what sort of progress you are making in defeating them. But I don’t think you need to show them exactly what the invaders look like down to the last drooling detail. I don’t think you need to create a realistic starfield, a soundly engineered ship or even a third dimension. Even though all of these things would likely exists in an actual battle for the earth against trans-galactic forces, I think that trying to include them is only going to be distracting. Let the player fill in all the details he or she needs to make the game fun, just provide them with enough framework so that you can tap into their basic perception and let their survival instincts and stress receptors do the rest. Or at least, that’s my philosophy.
And I think that it applies to the creation of software artifacts. You need to make sure that your player understands the basic goals, actions and means of achieving them, but you don’t need to breathe down their neck with rendered details. Just get enough to make sure they know how to play the game.
This goes back to my post I mentioned about constraints vs. freedom in board game design. There I made an argument that was sort of mechanical, in terms of a stodgy sense of usability and constraining decision trees. Here, I am looking more at the emotional side of this tradeoff. In a board game, every rule has a very real cost in terms of the players’ ability to keep the rules in mind and the gameplay moving forward. With video games, the computer can handle these rules, and the assumption seems to be that we should then just pile them on as we see fit. After all, the player doesn’t need to know the rules.
I don’t think this is really the case. Maybe the player doesn’t need, truly need, to keep every rule in mind when playing a video game as they do in a board game, they need to know how to do what they want to do. If the nitty gritty rules that handle this are being hidden away, the player better have a damn good metaphor for how they are working so that they can forge their plan. This is especially true given the real-time nature of most games, there’s no time to dig through the rulebook, and I don’t think there’s even really time to think. No, players in a video game don’t need to know the rules; it’s worse. They need to have so thoroughly embraced the rules that they no longer know them in a knowledge sense, they need to know them like instincts, and be guided by them.
Such a powerful understanding is often going to rely heavily on leveraging instincts they already have about the way the world works.
I think that software documentation would, ideally, work the same way. Ideally, making software artifacts wouldn’t be like making board games at all, they’d be like making really good, intuitive, action-packed, old-school video games. A really good requirements document will be just abstract enough (in that vaguely creative sense) and provide a set of rules just intuitive enough, that after reading it a designer simply understands, and can proceed in a way that their instincts tell them is right. Its not that they think to themselves, requirement 25a indicates that I should do things this way, they just have a sense for how the world works, and how to proceed to make it work for them.
Now, I’m off in the land of elves and fairies again, since I think that wholeheartedly embracing such an approach would be exceptionally difficult and prone to ambiguity and misunderstanding. What if the intuition wasn’t quite right, which it likely wouldn’t be? This could be really bad in a situation that demands precise understanding of specific constraints. But supposing that the intuitive guidance you receive was magically infallible, it sounds like a pretty nice way to go. Is working within a given document fraught with hundreds of tiny calculations a second, or is it invisibly shaping your decisions while you, as far as you can tell in the moment, are just “doing what you want”. That latter case, while a largely unattainable ideal, seems like something to strive for.
