Mar 10, 20156 min read

How I learned to program - part 1

How and why I abandoned my degree and took a job that quartered my salary

A few people on Twitter have expressed interest in hearing my story about how I went from doing research at a pharmaceutical company to working at Google within the span of 3.5 years. I'm more than happy to relate my experience for anyone else who might want to make a similar leap. However, keep in mind that my experience of learning may be very different from the ideal path now. The rapid growth of web development has led to an enormous proliferation and abundance of learning resources, and these days there are many guides for you to follow that didn't exist when I started. I want instead to tell you my own story, provide some general guidance about the process, and to convince you that now more than ever, anyone can learn to program.

In the beginning…

At the time I started learning how to program, the only prior exposure that I had to the subject was a C++ class I took in 7th grade at a summer school I attended. As some of you may imagine, programming is a bit intense and obtuse for a typical 7th grader, and on top of that C++ isn't as accessible as the vast majority of languages available today. The whole experience was frustrating and managed to convince me for a few decades that programming was just not for me.

I started to explore other options when I became dissatisfied with my career path in biotech research. I talked to a few programmers I knew and figured out that web and application development were diverging fields. I hadn't really figured out which of those I wanted to explore more, so to start somewhere I chose Java. I felt (and still feel) that Java offers the best balance between allowing a new developer to learn the basics about what is going on under the hood while not getting bogged down in the details that made C++ so not fun all those years ago.

I picked up Head First Java and started studying and practicing. Being unhappy with your career really lights a fire under your ass as far as getting started with a new one. I remember coming home from work many days and studying non-stop until I went to sleep, pausing only to eat. For anyone attempting to do this now I'd strongly recommend deciding to build a project and using that goal to guide your learning. I committed to building a flash card app for my wife (then-girlfriend) who was studying for the GREs. Even though the app sucked and was pretty useless for studying, I'm not sure how much would've stuck if I hadn't built something myself using what I learned.

My first development job

Around 7-8 months after I had decided to leave my field, I decided that I was also ready to take a shot at finding a real job. I was referred by my friend to a programming internship at a startup. Since this was a web development position, I knew I had to do a blitz to learn HTML and CSS well, so I read CSS: The Missing Manual and HTML and CSS web Standards Solutions: A Web Standardista's Approach, both amazing resources at the time, but outdated now (already!). I sent the company my resume. However, my credentials were such a terrible match for the job description that the company assumed I must have applied for the wrong role and screened me for a different job instead.

Luckily, I got that sorted out and they scheduled me for an in-person interview. I learned that the company used PHP and not Java, so I bought a copy of PHP 6 and MySQL 5 to study for my interview. I saw that the constructs of programming (e.g. if-else statements, loops, variables) are the trickiest parts to learn, and that the particulars of the language are mostly just details, at least for a beginner. However, I did the interview and walked out feeling like I had bombed it, but the interviewer (who would be my supervisor and mentor) saw potential in me somehow and the company still gave me an offer. The only issue was I would have to take a huge pay cut: the job paid basically minimum wage.

I know that some would argue that taking the job for that salary cheapens not only my skills, but also the entire industry. I definitely understand the concern, but I think in the end, you have to decide what makes the most sense for yourself. If you can afford to take a huge pay cut to learn what you have to learn to be marketable in your target industry, I believe in most cases you will find that you got a bargain. The difference between trying to cobble together an education in your evenings vs. being thoroughly entrenched in programming problems 40 hours a week should be fairly obvious.

Leveling up

I was one of only two full-time developers at my company, and being a part of such a small team required me to learn a broad range of topics very quickly. I started to learn concepts I hadn't been exposed to before. I learned about databases and MySQL (partly from that book I bought, but mostly on the job). The tech stack featured Symfony, a PHP framework, and I finally got a handle on the Model-View-Controller paradigm, a cornerstone concept for organizing your code. I began my journey to learning the command line and the vim text editor, among many other things. It's really difficult to overstate the difference between my time of self-study and my time of learning on the job. My supervisor was an incredible, albeit sarcastic mentor, and through his frequent berating of my work he taught me the difference between working code and good code.

I was taught that much of programming is spent maintaining and modifying existing code as opposed to creating new code. I quickly realized that it was vital for me to learn the best practices in this industry in order to improve as a developer, and I knew I had to improve quickly to impress my company and get out of this minimum wage business. I had enjoyed the Head First Java book, and to study the concept of good, maintainable code more, I picked up Head First Object-Oriented Analysis and Design and Head First Design Patterns. I also bought the classic The Pragmatic Programmer. These books all taught me some tried and true ways to design my code to allow future developers to understand my intent and to change my code to suit their new use cases easily. In short, I kept studying in the evenings, almost as urgently as I had before I got my first job.

After six months, my company promoted me from an intern to an actual web developer and I started making a livable wage. However, the pressure wasn't quite off yet. By this time, I had started to read about what big companies like Microsoft, Google, and Amazon look for in their job applicants. It exposed a huge gap in my knowledge, namely in data structures and algorithms, concepts that should be deeply drilled into any Computer Science student's brain. I knew I still had a long way to go. I'll share more about how I filled in this gap, and how I eventually specialized in front-end development in my next post.