How do You Improve Problem Solving Skills?
I seriously lack problem solving skills particularly when it comes to solving algorithmic or mathematical questions. I think the issue is that I can't think "outside the box." I am only good at solving problems that I've sort of encountered before. For instance, I struggle through Project Euler questions and take long hours or even days to solve questions and I'm not even past question 10!
This worries me a lot since it seems that there is so much emphasis on the ability to solve problems or puzzles to get to good companies. What can I do to improve?
Some background if relevant at all: I'm a 2nd year student in computer science in a university, not very strong math skills (as pointed above)
8 comments
[ 2.8 ms ] story [ 28.4 ms ] thread1. Practice.
2. Work on developing a better understanding of the problems you're solving. For example, if you are designing a website and all you do is memorize an html/css layout from a tutorial, then you won't be able to solve problems that develop because you won't understand why certain properties behave the way they do.
Therefore, it's important to spend a lot of time figuring out why things work they way they do because by understanding those foundations, you have the material you need to solve problems.
The first and most obvious thing is to level your math - checkout the offerings on coursera. If you have never done higher math, there is a certain type of student (often quite mathematically gifted) that require the ground up approach higher math takes, I'd highly recommend a 100 page book called a concise introduction to pure mathematics by liebeck. This will teach you the mathematical foundations of logic and remember, I often say computer programming is convincing a computer to do something.
Writing and especially debugging code is often abstracted as having a generative model for computing in your head (playing computer in your head to predict what will happen). You're looking at this interface or problem and you are trying to find an efficient solution under different paths through a solution space, until you have closed that space with a provably efficient solution. This involves following out chains of reasoning - if this happens, that will happen and if this and that and the other thing happens, the computer will respond this way and so forth.
For that training, I would recommend learning to play go (the game, not the language) it operates in a binary space and teaches you to run out chains of reasoning.
If you can't fully understand low level concepts how can you even expect to even grasp the broader view? It's like trying to explain multiplication to someone who has no concept of addition. To understand a topic you must also understand all the sub-topics that make it up, and once you grasp all the moving parts a problem by nature become much more intuitive to you. This also includes math equations, if you are expected to know an equation dont JUST memorize it but instead understand why its necessary, how to derive it, and when you can and can't use it. You'll be able to look at an equation/function/program and pull things out automatically just by looking at it that may have taken some time and work to conclude before. This is very similar to Scott Young's learning ideology that I also recommend reading up on. [1]
Therefore after that semester I took some time and reviewed my algebra and basically re-learned trig from the ground up (it was very weak). Calc and Calc2 came a lot easier to me after this.
In college you must continually fill these gaps in your knowledge as every professor is different and has different expectations in student's knowledge. I've got in the habit of taking topics(whether it be a CS topic, math formula, ect) that I don't fully understand and writing it at the top of a blank sheet of paper. I then just start writing as if I was explaining the topic to my girlfriend. You'll quickly figure out where your gaps are and then know what you need to work on (which may include writing one of those sub-topics on a blank sheet and starting from there).
[1] http://www.scotthyoung.com/blog/2007/03/29/studying-and-holi...
1. Think on paper - The more you attempt to solve a problem on paper, the more you will explore different angles and have more clarity. You are more likely to eliminate dead ends more quickly when thinking on paper.
2. Imagination - Imagination is a very important ingredient when it comes to solving problems. Ask "out of box" questions to get "out of box" answers. Einstein made many scientific discoveries by asking himself what would happen if he traveled at the speed of light.
3. Solving puzzles may help too. I know a particularly gifted programmer who used to play Tangram a lot during his school years.