Every single day in the last few years I do almost the same thing when I wake up (well, probably you do too). Anyway, during my quick breakfast I ask myself if I did everything possible to be a better person (as father, co-worker, …) than the day before, I think about my family and things that we have to do together and, finally, about my daily tasks at work.
But what relation does this daily routine description have to do with being a good programmer? Well, I’m starting to ask myself everyday if I am a good programmer and, from a specific point of view, my answer is: no, I am not. I think that the first thing to do is acknowledge this “defect” and work to fix it. Unfortunately I have to say that probably you are an amateur or an average programmer.
Let’s take a step back and try to answer…
What is a good programmer?
I found this lecture from Richard Buckland, a professor from UNSW, which can give you the big picture:
I know, you don’t have time to watch a 55min. video so here are the points: he walks through his past lectures showing how the students went from basics to advanced topics; start learning the basics and practice until you think your are good enough and then continue practicing because there is much more that you have to learn.
But this is the common sense! If you want to be really good in any area, you have to practice! So, let’s establish the following statement:
Statement 1: If you want to become a great programmer, you have to practice. How long? Until the end of the world (or your professional career, which one comes first).
I think that the statement above is not complete because I didn’t tell you what you have to study/practice so, let’s take someone as a reference: Jaehyun Park. This guy went from a B.Sc. to Ph.D. skipping the M.Sc., did some research with Andrew Ng (if you know a bit about Machine Learning, I’m sure that you know him) and the most important, he won a lot of programming contests and competitions (ICPC, IOI). I have no doubts that he is a great programmer.
(Let’s talk about being an average programmer and still be able to earn a lot of money on another post.)
Statement 2: If you want to become a great programmer, you have to understand the basics: recursion, abstract data types, …
I think that If you still don’t know how to create a common abstract data type from scratch or write a recursive code, if you don’t know what the order of growth classifications and if you avoid to learn other subjects related with algorithms, you are far from having the “good programmer” title. If you skipped these classes or you never read about these topics, take my words: use your free time to learn about it or you’ll NEVER get a good job.
Back to the beginning of this text, I wrote that I don’t think I am a good programmer. Why? Because I’m still struggling to solve challenges from programming contests. I spent almost a day to solve a problem at codility.com while someone took 24 minutes. I have to say that I couldn’t sleep well at night after the test because I couldn’t stop thinking about how I failed. I realized that I have to get back to the basics and this is what I’m doing now.
Statement 3: If you want to become a great programmer, you have to recursively identify your weak spots and improve them.
Classes that I’m taking (again)
Every single minute that I have away from my work I’m spending to learn more, including reading at lunch/dinner and listening while I’m taking shower (yes, sometimes I’m just listening to the class!).
- Algorithms, Part I and Algorithms, Part II (will start soon) – both offered by Princeton University at coursera.com
- Introduction to Algorithms – offered by MIT (I liked the way the professors reward their students)
- Computer Science 101 – offered by Harvard University at coursera.com
Books that I am reading
Can you believe that I am taking classes with Robert Sedgewick? And you could do the same? Yes! You can watch his lectures at coursera.com for free. He is the author of the first book listed below: Algorithms (4th Edition).
Books that are queued
I found these books excellent choices if you want to solve challenging problems and be able to check and learn with the answers.
“Do you really need all this?”
My answer is “yes, I do”. Of course I won’t create a linked list or a tree from scratch to use in my daily work when I have a LinkedList and TreeMap (a Red-Black tree) but I have to know, for example, that a Java LinkedList performs O(1) to add an element, Ω(1) and O(n/2) to remove an element (“Operations that index into the list will traverse the list from the beginning or the end, whichever is closer to the specified index.”).
Can an average programmer be a good full stack developer?
Yes and I think I’m an excellent full stack developer. I can assure you that I have learned a lot in my 20 years of professional life (hi-five if you had used these machines) and, until now, I only have heard good compliments from my bosses so, I think I’m on the right path.