23 Nov 2011

I have been coding for years now. I have found out that a great programmer should acquire these 3 skills:

- Translate a concept into code
- Write beautiful code, minimizing redundancy and maximizing readability.
- Solve problems creatively

Unsurprisingly, solving problem is the one that makes up a wide difference between a great programmer and a good one. Translating a concept into code is fairly easy; there is a joke at Topcoder.com that 95% of the total points is figuring out the solution and 5% is actually coding it. Writing beautiful comes with experience. It just takes time.

However, the problem solving skill does not come with experience. I have practiced solving about 60 problems, though most of them I have to consult the solution. And I just don't get any better. I believe there is something wrong with my basic habit that prevents me from getting better.

I have seen programmers who never try to understand error messages, hence, they cannot solve technology-related problems, e.g. installation problems. That disables them to do automated tests, automated deployment, and a lot of other stuffs, which would make them better programmers. I believe I am currently in the same analogous trap.

So, here I am, setting out to unlearn my Mathematic-related skill and learn to solve problems the right way.

Learning Mathematics can be viewed in 2 extremities:

- Learning the techniques and mastering those techniques
- Learning to explore patterns and finding multiple solutions

In Thailand, Learning Mathematics is focused so much on learning techniques. They even teach Calculus in high school. So, I have pratically learned only knowledge and techniques during my high school. I have never learnt and never acquired the problem solving skill properly.

Solving problems is about exploration, exploring possible solutions or similar problems and recognizing the emerging patterns. The approach is somewhat similar to the one in the Polya's book, How to Solve it:

- Try solving a few simple cases
- Represent the problem in, at least, a few different ways
- Try solving easier and similar problems
- Try solving the problem (We should see a pattern at this point)
- Look for other solutions
- Write about how to solve the problem; especially, about how I see a critical point that leads to a solution
- Devising an algorithm instead, if it cannot be solved with an analysis

I will only try to solve problems that requires basic Mathematics knowledge but requires creativity. For example,

```
There is a square and a ball in it. The ball bounces at the border according to the natural law;
the angle of reflection is equal to the angle of incidence.
Find the angle(s) that guarantee the ball travels in a cyclic manner.
```

This problem requires basic knowledge but high creativity. If you start drawing a picture like this, you probably are very smart already:

As it turns out, any angle whose tangent is a rational number makes the ball travel in a cyclic manner. (You can try figuring it out yourselves)

This is probably the goal right now: to solve this kind of problems by myself. This journey is about how I solves interesting problems and what I learn on the way. I hope I will become a better problem solver soon!