My office-mate sent me this.

I used to code a lot since the age of 14, when the dot-com bubble was booming. There were many software design competitions for high school students. Some of them were poorly publicized which means it is easy to get good result after spending reasonable amount of time in development. That was good, spending 2-4 weeks and got one more line on my resume, together with some prices cash/hardwares/free internet service(p-net excluded)/free trips to other countries. The larger the potential reward, the more effort I put.
One of the most rewarding competition was the olympiad for informatics, a programming contest that contestants are expected to solve a number of problems (usually feasibility or optimizing problems) within a few hours. In this particular competitions, everyone tried to make their programs run as fast as possible (correctly, of course!). Since then, I would consider all possible ways to make my code run fast when I code. Eventually, I became a fairly good coder (yes yes yes, I know I know, efficient code is not sufficiently a good code)
In university, after getting an A from the automata class and the only A from the algorithm design class, which the prof covered tons of theoretical stuff like NP and Co-NP, fixed-parameter tractability, W12345-complete problems, it seemed to me that a theoretician is way more cooler than a coder. A theoretician can work in the cafeteria, or outdoor in a beautiful sunny day, and say, “nah… this is np-hard, don’t waste your time to get an efficient algorithm….” or “aahah! I find a way to decrease the runtime from O(logn) to O(loglogn) by using a randomized…….” (without coding anything). I decided to be a theoretician.
However, sometimes later, I realized that being a theoretician, there was no way to explain what I am working on to my mum/dad/friends/colleagues/girls I adored, I decided to move away.
And after a series of unanticipated decisions, now I am working in an optimization lab, which my boss is the lab’s director. It is kind of cool. The comic above explains the whole thing. In reality there are tons of NP-hard problems, like playing the tetris and risk game. We still need to solve it even the theoretician tells you that it is NP-hard. The good thing for doing optimization is because it lies somewhere between theory and application. When we see a real-life problem, the first thing we usually do is to prove its hardness. If it is hard, then we can try to apply all the existing techniques and see if there is a good result.
Take the comic as an example. 1. given a whatever menu and a fixed amount of money, trying to order so that the sum is exactly the amount is a Hard problem, in a nerdy world people call this a Knapsack problem. 2. Finding a shortest path that visit all six other table exactly once is another Hard problem, nerdy people call this Traveling Salesman Problem. Yes! Every waiters/waitresses are tackling a class of hard problem every moment in computer science without realizing it!
So here you will see what the heck I am now working on, and what I will be working on in the coming four years.