Something I’ve enjoyed about working in software is having colleagues from diverse backgrounds. There’s a laudable tradition of programmers explaining in some detail the idiosyncratic routes by which they found themselves in the profession.
This is how I did it:
Youth (1980s, 1990s, early 2000s)
It never, at any point in my childhood or adolesence, occured to me that you could use computers for more than writing documents, playing games, and (later) reading the web. My sister learned HTML in high school, and ran some fan websites, but it never occured to me that I might want to do anything like this.
I think if someone had showed me something like BASIC, or even cooler tools that exist today like Scratch or Lego Mindstorms, I would have had no particular interest in them. I was absolutely not a tinkerer of any kind.
Instead, I read a lot of books, played a lot of video games, and was a mediocre student at a pretty good series of public schools - much better at English than math. I learned to touch-type in middle school, in a one-semester “computer skills” class.
I had only the vaguest sense that there was an academic discipline called “Computer Science” - as far as I remember, no one ever mentioned the concept in any school I ever attended. I sort of knew that programmers existed, but I never gave much thought to how computers work, or where software came from, the same way I didn’t really give any thought to how cars work, or where gasoline came from.
Instead, I studied History, Political Science, and Russian. I learned about Linux at some point in college, probably from a website like BoingBoing, probably as part of some attempt to find free alternatives to Microsoft Office.
Early college, I planned to become an academic; late college, I planned to become a diplomat. At some point I took a class called “math for liberal arts majors”. I had a great time in college.
I graduated knowing about as much about computers as I had when I finished high school - good for writing, computer games, reading the web, and now email and instant messaging (this was all before smartphones).
Early jobs (2008-2011)
I joined the Peace Corps straight out of college, and spent 2 years teaching English in a regional university. I got a little Linux netbook, which I thought was cool, and eventually it broke somehow and my university’s IT nerds wiped the original operating system and installed some certainly-illegal copy of Windows XP. I used it mostly to play games.
After the Peace Corps, I moved with some friends to Washington DC, with the idea that that’s where you go to get internationally-focused jobs. I took the GRE and did remarkably badly on the math section, considered many possible graduate school programs, and got a temp job to pay rent.
I spent about a year working as a temp receptionist at a small trade association headquarters in DC - I answered the phones, made coffee for waiting visitors, and sorted the mail. It was a desk job, so I had a windows machine.
After a couple of days, I had mastered the phone and the coffee machine, and I had a lot of time on my hands. I asked for, and gradually got, weird little one-off jobs of all kinds. Most of these were low-value-added, semi-manual labor: unbox a bunch of monitors, stuff envelopes, pick something up from the other side of downtown. But, some of them involved making computers do things - a lot of this was Excel-based. I learned several spreadsheet-software power tools that served me well:
SUMIF, Pivot Tables. I found myself reading Excel-focused blogs to learn how to do more complicated things, and soon found myself hitting what seemed like Excel’s power ceiling. This led me to the concept of Microsoft’s VBA language, which can be used to script Microsoft Office products, including Excel.
Around this point, the job ended - I never actually learned any VBA, or figured out how to wield it usefully. But it was the first practical application of programming I’d encountered, and my experience with this job had taught me:
- Computers can be told to do useful, complicated work
- This was a much more immediately-valuable skill than anything I’d previously studied
- There was not a great international affairs career waiting for me to find it; at least not without a long, expensive and uncertain trip through graduate school
The receptionist gig fell through after I tried some mild negotiation hardball with the staffing agency, trying to secure a raise that would actually cover my share of the group-house rent. I was shortly unemployed, then lucky enough to get hired on full-time as a writer by the trade association. Part of this job involved covering for an in-house call center, which gave me exposure to things like call-logging software, and many more ad-hoc Excel challenges.
This job in turn died, for obscure reasons, but I’d been interviewing elsewhere and quickly after the job died I got a position as a “Program Officer for Data” at a DC international-exchange-program nonprofit, largely on the strengh of my ability to talk about Excel in an interview (and secondarily because of my international experience - my Peace Corps site had been in the region in which the organization specialized).
Perl, Python, Web Development (2012-2013)
At this nonprofit, I worked in a back-office role, largely focused on managing the flow of applications to the organization’s programs. These arrived through a custom-built web application, written and managed by an external software contractor.
Over the months in this role, I noticed lots of work that seemed repetitive with small variations: rename a bunch of files according to some rules and move them to a shared network drive for printing, that sort of thing. This reminded me of my interest in scripting Excel, so I started looking around for a tool to do this in an easier, faster, more reliable way.
For some reason, I don’t remember why, the tool I settled on was perl - I bought the camel book, figured out how to run perl scripts on a windows machine, and started writing scripts for these little pieces of work. I had a sense that there was a lot more to perl than I was using, and it bothered me that I had no real idea how to properly manage or structure these scripts. But the power ceiling and flexibility were much higher than with Excel, and I liked that.
At the time, circa 2012, massive online open courses were a trendy thing, and I started looking for one to learn to do this kind of thing a bit more correctly - this led me to an MITx course, Introduction to Computer Science and Programming using Python. I spent my evenings and weekends for a few months working through this class, and then started writing all my scripts in python. I can still read my python scripts from this period, though they are not great - my perl scripts, by contrast, are totally inscrutable to me.
This was a period when I was learning a lot of things, but I had huge gaps not only in my knowledge and skill, but in my conceptual framework. I remember trying to figure out some hacked-together way to persist data between invocations of a python script (I stumbled on python’s pickle module, I think, and ended up just saving and loading picked python objects from disk) - the concept I was reaching for was “a database”, but this (along with “serialization”) is just not a concept I had.
Transition to full-time programming (2014)
Another department in this nonprofit ran language-testing programs, which involved running custom web applications. Unlike my department, these applications were written and managed in-house. After 6 months or so of teaching myself programming, I asked one of the developers on that team if I could buy him a beer and ask for career advice. At the time, I still didn’t think I could work as a full-time programmer, because I lacked a relevant degree, but wanted to figure out how I could move into some ancillary role, working with programmers.
This beer was one of the better investments I ever made in my career. I was talking to this developer, self-deprecatingly, about some script I’d written, and I think I said something like, “It gets the job done, but the unit tests are pretty weak.” His reply was along the lines of “You wrote unit tests? Come work with us!” After a bit of company politics, that department offered me a job (and a large raise), and I moved over there and started writing PHP, CoffeeScript, and shell scripts full-time. I’ve never used PHP or CoffeeScript since that job, but I learned an amazing amount from working full-time with more experienced programmers. This was a great year.
Real software jobs (2014-present)
The rest of the story to today (the last 8 years or so) is fairly conventional - after a year, I responded to a recruiter on LinkedIn, and that turned into another, more senior job at a media company. I moved around internally at that company into progressively-more-senior roles, and eventually left for a staff engineer role at my current employer (who, so far, is great!)
There’s a lot of stuff I find interesting in the last 8 years - I learned a vast amount about things I had previously no idea about (the mechanics of networking, linux system administration, working on large teams, working with remote colleagues, configuration management, CI/CD, reasonable and unreasonable approaches to version control, basic academic computer science), through a combination of work projects, senior colleagues, experiments and reading a large number of programming books. This is all good stuff, but it’s outside the “how I learned to program” origin story, which I think is the more interesting (and potentially useful to people thinking of entering the field) part of the process; so I’ll stop here.
It’s funny reading back over this now, about 10 years into my software career. The idea of being a programmer never occured to me until I’d been doing it for a few years in a low-intensity way. I didn’t even start this transition until my mid-20s, and I only started at all because I wanted to automate the tedious parts of my job.
- Dan Luu’s “How I Learned to Program” post - an inspiration for mine
- The current version of the MITx course I took - I think one of the instructors is still Eric Grimson, who I believe taught my iteration in 2011. Great class! I learned extremely useful things with this!
- Treehouse, the service I used to learn basic web development - this was years ago and I imagine their model has changed a bit, but I found the investment worth it at the time.