Opportunities
I work as a software engineer today, but I didn't really get into writing code until college. Looking back, it's a little odd because I actually had quite a few opportunities.
In elementary school, maybe in the fourth grade or so, there was a mini-class where we sat in the computer lab and where we copied HTML to make little simple websites. Our teacher wore a T-shirt with the question "Do you get IT?", referring to information technology. Alas, I did not, and I happily went on not writing websites.
Around the same time, my friend Alex introduced me to Kingdom of Loathing (KoL), a text-and-stick-figure-drawing-based RPG that ended up forming the foundation of my entire sense of humor (thanks Alex). On the KoL forums people would sing the praises of tools like KoLmafia, a scriptable interface to KoL, so I gave it a shot. I didn't like it - why would I blast through my limited daily adventures in a minute when I could play the game instead? So, I passed on the chance to write those scripts.
This was also the heyday of Flash games - I'd bounce between a bunch of sites: AddictingGames, ArmorGames, Kongregate, Newgrounds, and so on. Sometimes people would post links to "hacked" versions of the games, where you'd have infinite health or lives or money, and play in more of a sandbox environment. I looked into how to do this (often, just changing some values in a .sol editor), but it seemed like a lot of effort. So I'd go to places like ArcadePreHacks instead, where someone else had already done the work and I could just play instead.
In my sophomore year of high school, a college counselor told me I should try learning to code.
She sent me a link to an introduction to Java course.
In the first lesson, I spent ages downloading Eclipse, getting lost in the menus, fumbling around in cmd.exe, and typing in a "Hello, world" program.
Boring.
I distinctly remember hating all this public static void main
and Square extends Rectangle
typing stuff just to do basic math or whatever, when I could be hanging out with my friends on Skype and playing too much League of Legends.
That same year, I also joined our school's newly formed robotics team. We competed in the FIRST Tech Challenge and programmed our robot in RobotC. I say we, but I personally didn't do any of the programming. I thought the real action was on the mechanical side, so I spent all my robotics time there. We did pretty well, and I continued to not write code.
There's probably way more that I'm missing. I never even considered taking AP Computer Science at my high school (and anyways, the teacher left us for a different school at some point, so the school stopped offering the course). I had a TI-84 graphing calculator and never really wrote a TI-BASIC program for it. I didn't really write formulas more complicated than SUM or AVERAGE in Excel or Google Sheets. I never considered rooting my phone. And so on.
When I decided to go to study Electrical and Computer Engineering (ECE) at CMU, I really expected to stay on the electrical side of things - signal processing and music technology. In the fall semester, I did too many things, as freshmen do. I joined a bunch of clubs and unjoined many of them by quietly not showing up. I briefly joined a research group, failed to write some Arduino code for a simple starter project they gave me, and quietly stopped showing up soon afterwards. I applied to all kinds of random ECE-adjacent internships that I wasn't qualified for and received exactly zero interviews for my trouble. I was humbled by the novel experience of putting real effort into my classes and still doing poorly, so it was a pretty busy time.
In the spring semester, I took CMU's well-known intro to programming course 15-112, and the races were off. This was a much better semester for me - I think I was starting to hit my stride and figuring out how to get things done. It finally stuck this time. I realized that actually, writing code could be interesting when the curriculum was presented a certain way (and in Python rather than Java). I was pretty good at it too. I started applying to software internships because, like I said, the electrical ones didn't pan out.
Finally, I got an take-home assignment from a start-up in Pittsburgh, some basic front-end web development task. I spent a couple days frantically cobbling together fragments of tutorials and StackOverflow answers to group some movies by genre and search by name, which rewarded me with an on-site interview. I showed up way too early, so I loitered in the nearby McDonald's and sipped an atrocious coffee and stared blankly until it was time to step into the office.
I don't remember anything about the talking part of the interview, but I did spend too long writing binary search on the whiteboard. All of the edge cases were wrong - literally, every single one of them. It was recursive only because we had just covered recursion in class and I seized on that hazy lecture memory like a lifeline. I left in a daze, feeling like I had ruined my one real chance, that I would have to figure out other summer plans before the semester ended in just a few weeks. So, I was extra-surprised a few days later when I received an internship offer, which would kick-start my career in software.
Looking back, it just makes me wonder: what else could've happened?
Software development is a field where you hear about people coding from a young age: Marcus Persson (Minecraft) writing text-based adventure games at 8 years old, or Aaron Swartz (Reddit, RSS, Creative Commons) creating proto-Wikipedia at 12, or Mark Zuckerberg (Facebook) making an instant messaging app at 12 or Jack Dorsey (Twitter, Square) coding taxi dispatch programs at 13, the list goes on. As a student at CMU, I often felt outclassed by my peers - it seemed like everyone else had learned to code in middle school, aced AP Computer Science, and whatever. At the time, I didn't realize that I could have easily been in their shoes too.
Had I been a little more excited in HTML class in that tiny elementary school computer lab, would I have ten more years of software development experience under my belt? Or would I have given up early on that proto-web, where Google Maps and jQuery were shiny and new, the iPhone not even invented yet?
If I had taken 15-112 during my freshman fall semester, would I have done poorly in that situation and decided coding wasn't for me? Or would I have eventually ended up switching anyways, like many of my high school friends who originally majored in in physics, mechanical engineering, math, or pre-med? Was it just the right place, right time, right people when I finally started writing code at CMU?
At the end of the day, I guess it doesn't matter that I missed so many chances to learn to code. I can't even speculate about what ifs - the finitude of time practically guarantees that if I spent more time programming earlier in my life, it would probably cost me some other precious, life-defining experience.
In the end, on the Nth attempt, for whatever reason, it finally worked and I learned - and that was enough for me.