I am a self-taught programmer. I didn’t major in CS and didn’t pick up a programming book until several years after graduating college. In the time since, I completely switched industries and make a comfortable living as a software engineer in NYC. Along the way, I taught a handful of students and at any given monent in time, usually have a roster of 3 – 5 private students who want to learn. One of the most common questions I get is: what did I do to get good at programming (if you consider me good which is debatable). It’s pretty simple so I’ll just go through it:
1) Summer 2009 – picked up this book on basic C programming and burned through it in about a month. I committed about six to eight hours a day every day going through text and working through the examples. I ran my own business at the time and over the summer, I kept my hours light.
2) Mid to late summer 2009 – Went through this book. I read every chapter twice and the memory management chapter four or five times. They devoted a section to Quartz drawing which I went through at least three times.
3) Late summer 2009 – Stanford University iPhone programming course on iTunes. Every iOS dev knows this course and I went through the Spring 2009 curriculum. This was taught by Evan Doll and Alan Cannistraro. Today, the instructor is Paul Hegarty. I went through the videos in the following manner: watch a video straight through. Then watch it again but follow along the coding examples on my computer. Then watch it again but hand-write the coding examples on a piece of paper. Then try to do the assignments. So in effect, I went through this series at least three times.
After this point, I lost track of the books I went through but by my estimate, it’s probably around 50. I’ll just recall from memory whatever I can.
4) Studied RESTful web services vs SOAP/RPC systems. This was mostly Googling and watching stuff on Youtube, no books.
5) October 2009 – Went through the O’Reilly book on Java. I can’t find the exact edition online but I think it had a kangaroo on the cover and was around 800 pages. I went through this book twice and a few chapters, three times – specifically anything that related to asynchronous processes. I went through another Java book as well that was focused purely on JSP’s and servlets. The servlet stuff was useful but JSP’s were a waste of time.
6) October/November 2009 – Taught myself Google App Engine in Java (as opposed to Python) by going through a shit-ton of examples online. This was a textbook which I used as reference. It was pretty helpful but overly focused on Google Web Toolkit which, in retrospect, is not a tool I would use for AJAX development. Other available web design frameworks like Bootstrap are much better for this even though it’s not AJAX based. I think AJAX is overrated and a bit of a fad.
7) Deployed my first functional backend on App engine. I remember this night very well. It was a game-changing moment for me.
8) Decemeber/January – published an iPhone app which simulated gambling with fake money. The backend was deployed on App Engine along with the website and the iPhone app, of course, was written by me.
Throughout that timeline, a typical day went like this:
– Wake up, go to work for about six hours (again, ran my own business), come home and program for 8 – 10 hours. On weekends, program for 6 to 10 hours. This went on every day for a couple years. From 2009 to today, I probably have taken 7-10 days off from programming.
As I teach more and more students, I find that most of them think I am naturally inclined as a programmer and am born with certain advantages. This may or may not be true. Here’s what I know for sure: I am beyond obsessed with being a good programmer. The amount of time I put into it on a daily basis is unhealthy. There is nothing else I would rather be doing than programming unless it involves being naked. Whether or not my abilties are naturally ordained is not for me to say but I know this – over time, relentless effort and natural talent resemble one another.
Here are the thoughts that keep me moving forward:
1) It’s supposed to be hard. If it was easy, everyone would do it.
2) When I’m not programming, my competition is.
Are you programming right now?