Clock gears

In a recent article on creativity and software, I made an argument that software developers need to become more involved in the creative process. One of the problems I discussed was that most programmers and developers have never been taught to think creatively, and many don’t know how to go about it. Whilst there are issues of where developers get brought into the brain-storming process, I thought it might be useful to look at some linear techniques that programmers might find useful given the way most coders think about problems.

There is a myth that creative sparks are something that “just happen” to the “right people”. Innovation is hard work, and there is nothing celestial or gifted about it. There are many methods of being able to get new ideas. Almost all of these have one common theme:

Disrupt your habitual thinking

We all have different perspectives on the World, but we rarely shift those perspectives internally. If you are a liberal, open-source loving, dope-smoking college student you are going to have a very different perspective to that held by a 60-year old CEO of a multinational. Most creative thinking exercises are about trying to shift you out of your skin and to see the World from somebody else’s perspective.

If you’re a programmer, you might be more comfortable stating this as “introducing pseudo-random thinking”. You need to shake up your habits, your processes, and get out of your own skin.

I’m going to go through some linear techniques here that might show you what I’m talking about. These techniques are great for trying to innovate when dealing with software problems (my core audience here), but can also be applied to writers trying to get rid of writer’s block or entrepreneurs trying to come up with new ideas for business plans.

As I go through these, you will see each one is about shaking up your ideas. Try all of them, try one of them, but just try.

Reverse your assumptions

Write down your challenge or problem, and then list all the assumptions you’ve made - e.g. “I must write this in Rails”, “I have one week to do this”, “I can not get any more resources”.

Challenge each of those assumptions by writing down a reversal, i.e. - “I can write this in any language that does the job well”, “I could delay the launch by a week”, “I could post it on an online contractor site”. Some of those opposite viewpoints will stand out a little. Create a list of them and ask yourself how to accomplish each one of those useful reversals, and decide if more research is needed.

This technique is perhaps the simplest, but in some cases the most effective. The trick is to try and embrace the exact opposite of your World view.

Drill down into your assumption

As above, write down all your assumptions, but this time write down all the attributes of that assumption. It could be you need to write it in Rails because that’s the only framework you know, or because that’s company policy. You might need to launch in a week because the PR department has already announced it.

For each assumption ask yourself “Why?” or “How else could I do this?”. Try and be flexible in your thinking, and for each of the assumption you make here, try and find an opposite as above, thereby cascading out all sorts of new assumptions.

This builds on reversals, and allows for more sophisticated thinking. It can feel simplistic at first, but with some assumptions you just need to keep asking “why?” like that annoying game children sometimes play.

Dinner for Six

You ever play that game where you choose six people dead or living as dinner guests, and compare with friends? Do the same again, but ask that table for ideas around your problem or challenge. They don’t have to be famous people - it could be college professors you admired, your family, anybody. Just so long as you get some contrasting voices in your head, it’ll start producing some chaos and randomness into your thought processes.

Some people like to go and do deep research into their dinner table - it could be the six most successful CEOs in your industry, or people who would be interested in your idea for example.

It’s possible with business people to go and find out how they did the things they did and work out their key motivations. Whenever I go down this route, I always end up with Peter Drucker and Seth Godin “in the room” because I admire their work and know their attitudes to certain parts of business so well from their books. This is actually re-enforcing learning: I might read a book by Godin, but this process causes me to apply it, and until I’ve done that, it’s not really learned behaviour.

Alternatively, when faced with a development problem, you might want to ask yourself “What would the 37signals guys do here?” or “What would happen if this were a problem in the Linux kernel?” and work from there. Ideally, choose projects you’re familiar with but which aren’t linked to the area you work in: you might respect 37signals web work, but what would they do with a device driver problem? Linus might know his kernel issues, but how would he develop a shopping cart?

Tug of War

Take a problem you’re trying to solve. Write down the best-case “win” and the worst-case “lose” for that problem. For example in the situation “produce a new blog”, the best-case might be “Technorati Top 100” and worst case scenario might be “Permanent writer’s block on day one, nobody reading”.

Write down all of the conditions needed to achieve each one, and you’ll notice a tug-of-war happening on the page in front of you. You’ll start to get a feel for what can happen and start seeing opportunities. Try and work out how to get from each worst-case scenario by putting down an opposite into the best-case scenario, and vice versa.

It’s amazing how this develops, simply because it’s so common for people to assume an idea is going to fail they find themselves producing a deluge of ‘worst case’ issues. By forcing a recast into ideas for producing the best scenario, new ideas just seem to pour out.

Binary Chopping

I’ve heard this called all sorts of things, and sometimes it uses more than just two words, but I like to start with two words to describe the problem I’m dealing with. For example: “Syndicated Content”

I then take each word and I split it into two more words. For “Syndicated” I might choose “subscription” and “contract”. For “Content” I might choose “articles” and “comments”. I can then drill each of those. Keep on going until you’ve got a nice big long list: “syndicated”, “subscription, “credits”, “annual”, “contract”, “services”, “fixed-term”, “content”, “articles”, “wiki”, “aggregator”, “comments”, “trackbacks”, “votes”.

Then, it’s time to look at each of those and combine them to see where you can get ideas:

  • “fixed-term” + “votes”
  • “credits” + “services”
  • “wiki” + “comments”

When you have a list of 20+ words, the power of this can be pretty amazing, and ideas spring out. Don’t dismiss them, just work through them and see where it takes you.

Introduce Random Words

This can have variable results, but often produces something interesting.

Write down something your problem, challenge, assumption or something you’re familiar with: e.g. “Produce a successful social network site”.

Now, come up with a random word. If you’re doing it without the help of a dictionary or some other random method you’re going to be acting sub-consciously (almost like the binary chop), and so you might be surprised at how close a connection it could be. Alternatively you could just a random word generator like this one.

Then, try and force connections and see what happens. Evaluate your ideas, and if need be use one of the other techniques here to drill down or evaluate your new ideas.

“Produce a successful social network site” + “housed” could produce an idea for college students who are looking to share a house on or near campus. With “cynical” it could be a site where people gather as common enemies to somebody(!), or with “pope” you could find yourself thinking about a site focused on the Christian community and churches.

Summary

I hope that there is at least one exercise in there that’s new to you and that you can use. I’m interested in hearing about others out there I’ve not heard before.

In particular, what techniques do people use when stuck at different levels of a project, like deep down in algorithm issues? Are we just sheep dealing with patterns, or can these help us work out alternatives when designing classes and implementing methods?