It has been a while since I applied for a software developer position at Google. It is not a surprise that I did not get in. Not that I was not disappointed back then, but after a while, I could identify the critical aspects. I was unable to take the extra step. I believed that I’ve done enough up to the point. I believed that I’ve learned a lot and was willing to prove my knowledge. There is a quote by Ella Fitzgerald that had a continuous impact on my life ever since
It isn’t where you came from, its where you’re going that counts.
It was a surprise to me, that nobody asked me generic programmer questions like… How many bits are there in a byte? What is the difference between a reference and a pointer? What are gaps in C++? I only had to write programs. It seemed rather silly to me at first, nevertheless I realized that it is not important what you know, but how you can apply this knowledge. I must tell you one thing. I hate Competetive Programming (CP). It is a children’s playground of silly made-up problems with overly complicated solutions. It does not solve real world problems. It can’t be delivered. There is no one to use the product of this work. It is the holy grail of geekiness.
The issue is that I can’t think well under stress. Hard constraints that force you to sit down for say 45 minutes and do nothing else than think! What I do like, is making plans. Designs. Taking breaks when my brain overheats. Thinking about problems over night, over a pint of beer or discussing them with friends. I like readable and maintainable code. But CP is just the exact opposite. You code as fast as you can, preferably faster than all the other coders using macros and weird defines. It makes my head spin. Brain cells are not muscle cells, they do not need HIIT training… Why do great tech companies hunt for those CP nerds then? There is no way any knowledge gained in CP can be useful in day-to-day software development. In this week’s TWIG Leo Laporte had an idea that strongly correlates with what am I talking about here.
Programming has become more of a hack profession because you throw more power at it.. Aah! Don’t worry there is plenty of memory, plenty of computational power. So programming is no longer the tight craft/art that it used to be.
It still obviously is a craft, but too many hackers pollute the space. Being good at CP therefore might be a good filter for capable developers. The core of Gmail has supposedly not changed since the first launch on April Fool’s 2004 because it was written so well and scaled so well. There have been plenty of reports in the newspapers about nerds from weird countries winning CP competitions and getting hired by Google for salaries that would as well as CP make my head go spinning round and round. Being able to write scalable code is one of the main requirements not only by tech giants, but by all Start Ups I’ve heard about.
As I think about it, it starts making sense. You can’t launch an application and worry about the performance later (well, you actually can…). Should your product be successful, people will use it, and you will be forced to deliver the required performance. Throwing more computational power, or more virtual machines in the cloud, won’t solve it forever. CP might suck (and it certainly does). It might be a gateway skill for interesting jobs (which sucks). But the obvious truth still remains that software development has become a hack profession. Anyone can do it. There are courses all over the place for free. You can learn to hack Python (btw I love that language) and be ready to enter the hacking world within months. I therefore start to understand the need to find a filter. Part of the TWIG podcast was also the theory that 90% of jobs are lemon and 90% of job seeking developers out there are lemons.
Is all that is required to get ahead of the herd to dig into CP? I work with C++. I haven’t worked with multiple frameworks and libraries that day-to-day Java developers get exposed to. In contrast to standard C++ library, frameworks come and go, get replaced by others, get deprecated and updated. Any knowledge you’ve gathered a few years ago becomes obsolete. Yet this is not as true for C++. Defining the dtor virtual will remain essential even after lambda functions come into place. All this knowledge will however become irrelevant after you switch to a higher level language like Ruby, Python, Clojure or Scala. What will remain however, is your algorithmic thinking and problem solving capability. It isn’t where you came from, its where you’re going that counts. It does not matter what language or framework you’ve been using for the last ten years, it matters how fast you can learn another one.
For me, the time of mastering C++ has passed. I’ve learned everything that can be learned throughout the evenings. Now it is time to refresh my CP skills. I hate it…. It sucks… It is hard and challenging, but the harder the pain the more satisfying the gain. I would recommend this mental switch to every other serious programmer. Dig into hard problems that you’ve been avoiding so far. Go to one of the CP sites and start solving the problems until you reach your limit and push on. It is easy for our skills to wither when not used for a long time. In the day-to-day business, how often do you have to care about the computational complexity of a solution and how often do you struggle with a database call, position of a button or the name of a text field. The computational speed comes at the expense of readability. It is a known fact and the main reason for the existence of high level languages. I’ve always been a supporter of readable code. I am willing to moan about bad function naming, unclear control flow, weird return codes, incomplete constructors and many more… But as long as I can remember, I’ve never confronted a colleague because of a slow algorithm. Not until it has become a bottleneck. Not until I had to find it and fix it. And this passivity towards the old ways (when development was an art form) has to change. How often do you write code that needs to be optimized. It has not happened to me a lot lately. There are a few occasions in my memory, but all of them could be solved by devoting a few brain cycles towards the problem. If I ignore all the cases where the problem was solved by using one of the well known algorithms, I arrive at approximately zero. For the sake of the argument, let us ignore the fact, that not using optimal algorithms/data structures is pure n00bishness.
Where hard work comes in is the absence of knowledge that a smarter solution would be in place. To identify these code segments, one needs practice. Lots of it. And you won’t get practice by hacking together pieces of code all day. You surely can copy-paste buttons around and write correct functions to compute the salary average of your department, but will you realize that your architecture is wrong? That you should not be performing the calculations at all? I have my doubts.
Due to all of this, I’ve made a decision. I will overcome my hate towards CP and will train my brain to recognize and solve hard problems. To put the idea into a metaphor that will be easily understood: One should see solving CP problems as stretching one’s legs before a long marathon run. If you run towards a deadline every day, you should stretch your brain when time allows. And yes: You can probably jog in the morning, but I guess that you will have to stretch your brain in the evening ;). Stretching your brain will prevent you and your company from injury (writing bad code that needs to be fixed afterwards) and increase your stamina (ability to recognize bad code). It does not matter where you came from. It does not matter what experience you’ve gathered so far. Taking an extra step in learning and professional development is essential.
If you enjoyed this post, then make sure you subscribe to my Newsletter and/or Feed.