I’ve always liked to write and decided a good way to share my writing was on a personal blog. Three years ago I registered a free WordPress blog with the url “davidxia.worpdress.com.” I decided the “wordpress” in my URL was lame so I Googled how to buy a domain name. I registered “davidxia.com” through GoDaddy and rented some hosting space. (Unfortunately I rented hosting space with GoDaddy because I didn’t know any better. I’ve since switched to Linode.)
I didn’t like my WordPress blog’s default theme so I browsed other ones. I didn’t like any that I saw out of the box. I looked at the raw source of the web page and saw lots of funky greater and less than signs. I didn’t understand any of it. I knew it was called HTML so I read up on it. I could now make a bare bones webpage. I wanted to customize my blog’s design so I learned about web design and CSS.
I wanted to track the number of visitors to my website and to filter spam comments. I discovered WordPress provided plugins that fixed these problems. I learned how to install them. I wanted to make my website rank higher in Google search results so I read about search engine optimization.
My blog was a creative outlet for my thoughts and a way to exercise my prose. I started writing more as my traffic numbers grew. My blog introduced me to PHP since WordPress is written in that language.
After I graduated from Columbia University with a B.A. in mathematics in May 2010, I worked at an online marketing company in Manhattan. Although I was offered consulting and finance positions, I decided to work for the only technology company to which I applied.
I had only taken a single class in computer science before I started working: Introduction to Computer Science and Java. The most complicated program I wrote was an algorithm that played a dice game called Pig. At the end of the semester, students pitted their “players” against each other to see who had the smartest algorithm. My player ranked near the bottom of the list.
At this marketing company, I was in their quality assurance department on a team responsible for testing their business intelligence infrastructure. I helped make sure terabytes of data about clicks and financial transactions that were loaded into one place was correctly transferred to another place. After working there for half a year I wanted to create something on my own and to tackle something more challenging.
I had a lot of free time during my job and couldn’t stand the boredom. I started reading online Perl language tutorials after making friends with the system administrators who worked near me.
I bought a black and white Amazon Kindle. I wanted to read the New York Times during my long subway ride to work each morning. But I didn’t want to pay for a digital subscription. I also didn’t want to tediously copy/paste the articles from my computer browser and save into my Kindle. So I wrote a Perl script that did it in a couple of seconds. I started talking to researchers at my company who were familiar with machine learning and natural language processing. I came up with ideas about analyzing keywords from New York Times’ daily front page articles and playing with the data. These researchers encouraged me to check out Python’s comprehensive natural language toolkit. I wanted these powerful software tools so I started learning Python by Googling “Python beginner tutorial.”
I started with this, then read this, and then finished this. I realized that when I only read through tutorials and copied/pasted code samples into my computer, I learned much less than when I typed out the code. It made sense. In order to learn a new language I’d have to not only listen and read but also speak and write. To learn an instrument, I’d have to play the actual notes and not just read sheet music.
I converted my Perl scripts into Python and wrote more Python programs. But it wasn’t until I founded a company with my cofounder James that I seriously started learning how to program. Writing simple scripts is nothing compared to launching a web application. I quit my job around January 20, 2011 and from then until August 1, 2011, I spent at least 80 hours a week programming.
I am lucky. I have almost no financial obligations. No family, no student debt, no mortgage. Coming from a privileged background, I had nearly total freedom because I had no external responsibilities.
I couldn’t have done this without James and our two technical advisors Ben and Nan. James is one of the most affable, able, and ambitious people I know. Ben and Nan gladly taught me nearly every technical thing I know today.
In the beginning I had no idea what I was doing. I would identify a problem, Google for the answer, copy/paste code from a random website, and run the program. If it didn’t work, I’d repeat. Things slowly started making sense. I learned to configure servers, design data models, and write elegant objects. Writing RESTful CRUD apps every waking moment became boring, so I delved into the theoretical aspects of computer science. So I learned how computer manages memory, big O notation, search algorithms, linked lists, binary trees, and how to implement hash maps. I learned a bit of C along the way.
I attribute 80% of my progress during those six months to my own elbow grease; 19% to the support from my colleagues, family, and friends; and 1% to my naïveté and optimism that allowed me to quit my job in the first place and take the plunge into six months of engineering and entrepreneurial bootcamp.
In the end, I was comforted to learn that hard work counts for something in the real world. I now know that the biggest difference between someone who has wanted to learn to program for a long time but hasn’t started and a software engineer is mindset. Once I had the mindset, anything was possible.
Also check out this person’s article on how motivated self-starters learn programming.