Ryans Tutorials

Problem Solving Skills

Effective problem solving skills to make your journey through the other tutorials and the real world much more fun.

Introduction

This is an overview of problem solving skills that you can use all the time to solve problems, create awesome solutions and generally just make things better. They are really good for attacking problems you'll get yourself into on a computer but are also just as useful in any other area too.

The ideas presented on this page may seem simple and obvious. It's the easy and obvious stuff that is also easy to forget and lose track of however, especially as we get stuck into the actual problem we're trying to solve. So taking a few minutes to remind yourself of the basics can actually be very beneficial and potentially save you hours of frustration and head banging.

Technology is great, apart from when it's not, and when it's not doing what it should, or it's giving some cryptic error message it can be quite frustrating.

To err is human, but to really #@^% things up you need a computer.

When playing about with technology at a low level, which presumably you are if you're working through the tutorials you'll find on this site, and especially so whilst you're learning (and if you're like me, even after you become a technology ninja) you're going to make mistakes and you're going to find/ create funky problems/ opportunities to solve. Getting yourself into trouble, solving problems and getting experience is the best way to learn so I actually encourage you to get into these situations as much as possible.

The Right Attitude

To be an awesome problem solver, first we need to start with the right attitude.

Be Open Minded

Be open to the possibility that:

  • The problem you have may be different to the problem you think you have.
  • What is causing the problem may not actually be what is causing the problem.
  • You may need to throw out your solution and start again in a different direction.

Be Inquisitive

Always be looking around and noticing things. Try and notice everything, not just what is (or what you think is) directly related to the problem area. Often, things which you don't suspect have anything to do with what you are looking at actually do.

Look for:

  • things that seem odd or stand out.
  • any patterns.
  • anything that is there that maybe shouldn't be.
  • anything that is missing.

These are often good starting places to find clues.

Ask the Right Questions

This is one of those things you get much better at with practice. Often when a student is stuck I find that I can get them unstuck by simply asking them the right question.

I like to ask these general questions:

  • What is it actually doing?
  • How is it actually doing it?
  • Why is it doing it/ what would happen if it was taken out?
  • What is it's relationship with other components?

You will also find that by asking these questions you'll also come up with new questions specific to the situation or problem. This is good. The more questions you can ask the better.

In answering these questions, always try and find proof or evidence. Try to rely as little as possible on assumptions.

Slow Down

It amazes me how often a student has asked for help in solving a problem and in the middle of explaining the problem to me they have realised the solution. I think it is largely because when they have to explain it to me they have to slow down. Speech is naturally a slower process than thought and you also tend to phrase it differently when you tell the problem to someone else rather than just thinking internally.

Slowing down can be difficult to do but can make a big difference.

Another approach to help slow things down is to come back to a problem. Leave it for a day or two (or an hour or two) and come back to it. You'll be surprised how much of a difference it can make.

Don't be Lazy

I see many students take the Where's Wally approach to problem solving. That is, they randomly, rapidly skim, hoping to find the solution. Effective problem solving is more like piecing together a jigsaw puzzle. We first look at all the pieces, trying to find the ones that stand out (such as corners and edges). Then we attack the problem from there and as the picture builds, the easier it gets. It's more work but the outcome is always much better.

Technology is great. Alas, it has also made us lazy. The result of search engines like Google and devices that increasingly hide the processing away from us is that we just expect the answers and results to be at our fingertips. Many people are just seeking that silver bullet so they don't actually have to do any work.

Effective learning doesn't work like that however. Don't be lazy. Read all the material, don't just skim it. Often the difference between something working and not is a little detail you have missed. You may get something that works by skimming but if you don't understand why it works then you won't be able to adapt it easily to other scenarios.

  • If you write some code, make sure you run it. Make sure you test it with different input to check if all the different branches operate as intended.
  • If data is written into a file, make sure you look at the contents of the file and that those contents seem reasonable to you.
  • Just because you didn't get an error message doesn't necessarily mean it worked as intended. Make sure the output is what you expect it to be.

General Tips

Don't Panic

Panic is the initial reaction to many when faced with a problem. The seasoned problem solver however is calm and relaxed in the face of problems as they know that solutions exist and with the right approach (outlined below) they will triumph.

(The exception to this is velociraptors. If you find yourself looking into the steely cold eyes of one or more of these I don't like your chances. Unless, of course, Chuck Norris happens to be standing next to you.)

When you are calm you are able to think clearer and and more creatively.

Check for Typos

They are easy to make and can be the difference between something working exactly as intended or spewing forth a screen full of error messages. If you feel confident that what you have entered is correct then spelling errors are one of the first places you should look. Check further up in your code too. Sometimes the computer is telling you there is an error on line 57 but the actual error is a missing semicolon ( ; ) or closing bracket ( } ) on line 24.

(Hint: Writing clean indented code is one of the easiest ways to avoid these problems. Use a text editor that does syntax highlighting too as that also makes errors easy to detect.)

Formatting can also be important when writing code or commands. Sometimes something as simple as the presence or absence of a space can break your solution entirely.

Break the problem down

It is much easier to solve a series of small problems as opposed to one large problem. Often we try to just solve the problem in one go as we think this will be quicker and involve less work. This can come back to bite you however as you end up spending more time trying to figure out where you went wrong than you gained.

There are two ways I like to tackle this. Both will work nicely, it's just a matter of which you prefer.

  • Break the problem in 1/2. Then break each of those problems in 1/2. Keep doing this until the problems are nice and manageable.
  • Identify the easiest thing you can do which will get you closer to the solution and do that. Now identify the next easiest step and do that. Repeat until you have a fully working solution.

For both of these approaches you may need a few attempts before you get it right. For instance you may break the problem in 1/2 in a way that makes it more difficult as both sides rely upon parts of the other side. Don't be afraid to throw it out and have another go if it doesn't seem right.

At least 3 solutions

Whenever you're about to do something of a reasonable level of complexity you should always try and consider at least 3 different ways of solving it. Those solutions should ideally be as diverse as possible.

Whenever we tackle a problem, our mind first tries to think of similar situations we have encountered in the past and work off those experiences. Often there are better solutions and by considering alternatives rather than just diving in with your first impression you'll discover a lot more.

The Uninterested Observer

Once you get really stuck into a problem your mind has a tendency to get focused. This can be bad as you easily miss things that should be obvious. It's very easy to get hung up on a particular line of thinking and completely miss alternatives.

Telling or showing another person your problem can be a great source of inspiration. Things that you have overlooked or decided not to consider will appear obvious to them. They are also not personally attached to the problem and so will see it from a different point of view to you.

Have you ever written an assignment and proof read it several times convinced it is perfect. Then a friend has glanced at it and instantly spotted a typo or mistake?

Make Sure You are Solving the Right Problem

When you start looking at a problem and it seems really simple, you don’t really understand the complexity of the problem. Then you get into the problem, and you see that it’s really complicated, and you come up with all these convoluted solutions. That’s sort of the middle, and that’s where most people stop…

But the really great person will keep on going and find the key, the underlying principle of the problem — and come up with an elegant, really beautiful solution that works.

Steve Jobs

Sometimes the problem you initially see is not the problem at all. It is a symptom of the actual problem. If you solve the symptom you aren't solving the real problem, you're just putting a band-aid on it.

I find that a good approach for this is to continually ask why until you can't really go any further without getting silly or adversely impacting other areas. eg:

My bike wheel keeps getting punctures. I initially thought the problem was that the innertube was dodgy.

Why is it getting a puncture?
Ah, because there is a dent in the rim that has become sharp.
Why is there a dent in the rim?
It should be able to take a fair bit of force without doing that. And my shock absorber should take a lot of that force too. Maybe my shock absorber is damaged, oh hey it is.
Why is my shock absorber not working?
Ah, there's a pebble got lodged in it. Now it is removed I have found the actual cause of the problem and it should be properly fixed.

The Process

process

Assess the Situation

So we have become a zen master and resisted the urge to panic. Awesome! Now we need to assess the situation. It will be one of the following:

  • Something has gone wrong - You have a weird error message or output that is unexpected.
  • Something can be improved - Now you need to work out how.

If something has gone wrong then you need to find as much information as possible to help you work out what has gone wrong and why. Read any error messages carefully. If there is any output, look over it to see if there are any useful clues.

The computer will do exactly what we tell it to do. The problem is that sometimes what we asked the computer to do and what we think we asked the computer to do are very different things.

If something is to be improved then we should look at what information we need and different places that can come from. Then we should also consider what existing tools we have that may be useful. Think of these as building blocks on our way to a solution.

Sometimes we may need to do some testing to help assess the situation.

  • If I change the input do I get similar error messages or output?
  • Are there other commands I could run which will give me other information to compare the output against to better understand it?
  • Can I print variables out at different points to make sure they are behaving as intended?
  • Can I break my solution down into several steps and verify that each step is behaving as intended?

Create a Hypothesis

Once we have looked at the situation we hopefully have some clues to help us understand it better. Now we need to make a guess at what we need to do to get closer to an acceptable solution.

There is a reasonable chance (especially to begin with) that your hypothesis will be incorrect. That is ok, we have to start somewhere. With experience you will get better at assessing the situation and working out what needs to be done however.

Test Your Hypothesis

Go ahead and put your idea into practice. Think also about how you may work out if it worked as intended or not. This will be similar to step 1 where we assessed the situation.

Rinse and Repeat

Once you've put your hypothesis into practice you will get a result. If the result is what you were after then great. If not then we need to go back to step 1 and assess the situation. We need to discover why our hypothesis was wrong then learn from that and create and test a new hypothesis. With each iteration we should discover a little more and that extra knowledge will help us get closer next time.

Even if we get a favorable result, sometimes it can be good to still have another go or two. Often our first successful attempt is a little bit messy and there is room for improvement. With a few more iterations we may get a cleaner solution but we'll also increase our knowledge and both will help us with future problem solving.

Function over Purpose

A common trait of those that are really good problem solvers is that they can find creative new ways to use existing items. So for instance, a hammer is not just for hitting nails. It could also be used as a doorstop, or a paperweight. It could be used as an instrument if you bang it against the right object. Maybe, if the end is the right size, it can be used to plug a hole. etc.

Hammer and Guitar

It is common for people to see items and only see them for their intended purpose. The reality is there is nothing stopping you, and it's perfectly fine, to use almost anything in almost any way you can imagine. What you need to do is stop thinking about items in terms of their purpose and start thinking about them in terms of their characteristics.

The technology we have around us today is especially flexible in how it can be used. Sometimes this can be hard to appreciate as the functioning of the software is hidden from us and the functions they perform are often abstract. We need to take the time to appreciate what the software is actually doing and how it does it. The naming of software can also sometimes work against us. For example on the Unix command line there is a command mv which is used to move a file. It's name implies that it's function is to only move files. When we understand how it works however we then come to realise that it can also be used to rename files, and in conjunction with other aspects of Unix, make files either hidden or not hidden.

Develop this thinking habit

A simple way to develop this habit of thinking is to play a game. This game can be played by yourself of with friends. All you need to do is pick a simple everyday item (it could be anyhting, a shoe or a pen for example) then try and come up with as many different uses as you can for it (beyond it's normal intended usage).

When playing with friends you can take it in turns and see who can come up with the most creative idea or who is the first person to not be able to come up with an idea.

Logic and Creativity Games

gamepadTwo more important skills to develop for problem solving are logical and creative thinking. Creative thingking allows us to discover new approaches which may be beneficial to us. Logical thinking then helps us to proceed down that path. Some people are naturally good at logical and creative thinking but if you are not then don't worry. Everyone can improve both of these and it's not too difficult.

One of the best ways to improve these skills is through practice. The more problems you tackle and persevere with to find solutions, the better you will become. The more you learn the more resources you will also have at your disposal to use in different ways so working through the tutorials you'll find on this site is good for you too.

Another great way to enhance these skills is through games. Games are fun and you learn best when you're having fun. Below you will find some good games to play. There are many more out there though so these are just to get you started.

Keep it varied. The more different games you play the better.

If you have any suggestions for other games that could be listed here then let us know too.

Learning Theory

I know we're talking about problem solving here but learning and problem solving actually overlap quite a bit. Solving a problem often involves learning more about the particular problem area. There's quite a bit we can talk about in terms of learning theory but I think one of the most important is the stages we go through in terms of our development.

Blooms Taxonomy is a way of distinguishing different levels in terms of a persons general ability or skill level. Here is my summarised version tailored to problem solving.

  • Level 0 - I can identify what the actual problem is and what's causing it.
  • Level 1 - I can find/ identify an existing solution (created by someone else) and am able to apply it.
  • Level 2 - I can take a pre-made solution and tweak it to better suit this particular problem.
  • Level 3 - I can create my own solutions and don't need the help of others.
  • Level 4 - I can evaluate a solution and identify how good/ robust/ elegant it is.

You will probably progress through these levels as you get better at problem solving (particularly in a particular area of expertise). Level 0 is beginner and Level 4 is mastery.

People often get to Level 3 and think they have arrived, they are Grand Masters and all should look in awe upon their brilliance. Don't let this be you. Many catastrophes have been caused by people who were at Level 3 but really needed to be at Level 4.

A little knowledge can be a dangerous thing.