Notes for a presentation to high school CS students
Earlier this year I had the opportunity to speak with computer science high school students about career advice & a what’s-a-day-in-the-life-like type of thing. To prepare for the presentation, I wrote out some notes about what my journey to this industry was like. (No I didn’t try to present this, I would have bored them to tears!)
As a kid, I was lucky to have easy access to computers. Pretty sure the earliest one we had in the house was a Commodore64.
A Commodore 64. Not the author’s.
In middle school, I remember writing silly text based programs / games / pranks in QBasic. In the first day of AutoCAD class, the head of IT challenged us to bypass the school’s security software (“Foolproof”; his “y’all can’t hack my Foolproof” in a Texan drawl was a popular punchline among my group of friends for years). After successfully doing so (IIRC it involved using a startup disk to edit a bootfile to not load the software), I was promptly hauled to the principal’s office, let go, then… blamed for every hacking incident at my school for the next years 🙃.1
Beyond that, I remember interest in Visual Basic programs, and an unsuccessful foray into C with the CodeWarrior IDE; with no support or guidance I gave up on that quickly. This was pre-Internet days in Saudi Arabia. Our first Internet access was the ability to download email a couple times a day, later there were a limited number of sites one could visit. I remember searches in a science class for “Tycho Brahe” (the substring “bra” was problematic to the censored Saudi Internet 🤦🏻♂️) getting blocked with an ominous message about how “this has been logged” and the authorities would follow-up with you. Some people ran BBSes, which were fun for the silly text based role-playing games, but for programming, there really was nowhere that you could go for help.
High school & university
Later, in high school, I took AP Computer Science classes. I wasn’t a great student (a teacher complained about my “modus operandi of procrastinating” in one of my report cards) but I really enjoyed writing software! Somewhere I still have a floppy disk with a chess program I wrote including my half-baked idea of an AI opponent.
After graduation, for whatever reason I didn’t apply to university for Computer Science. I think there was a sense of wanting to avoid the inevitable and/or take the opportunity to explore other things.
Later, at second year of university at UNC Asheville, I decided to pursue Computer Science and Philosophy degrees. Then a few months later I became completely preoccupied with anti-war organizing (this was 2003-2004) and couldn’t keep up with much. Something had to give. Somewhere between failing the course in learning assembly, and hand-writing Java code because my laptop wasn’t compatible with the Windows-based IDE our class was using (if I remember right?), I decided to drop the CS degree. In retrospect, not the smartest decision, but YOLO and all that.
Around that time, 2005-2006, I made my first personal website with HTML (no CSS) on a university server, and later used Drupal to make some sites for some friends.
After university, I worked a series of odd jobs: waiter (a forgetful one, alas), delivery driver, and production worker at Kinko’s. Around that time I wanted to modify the appearance of one of the Drupal sites I was maintaining. After googling a bit, I found instructions to modify a template file. The file was in PHP. Once I figured out how to do that, I wanted to do more, and I continued with the virtuous loop of make changes in production, see the famous “white screen of death”, make more changes, FTP the files into place, then eventually get something working. I was hooked.
I learned a ton through this type of development work, even if all of it flies in the face of best practices today.
With my interest for programming re-awakened, I thought more seriously about trying to get a job in the industry. It all seemed hopelessly out of reach. I didn’t have a CS degree and it seemed like all employers wanted one. People working in web development all seemed much smarter and farther ahead than me. I decided to try for it anyway, looking up some local web development agencies and cobbling together a CV and visually-heavy portfolio (thanks to Eric for his design skills in that!) and threw myself at the mercies of any tech employer who would take me.
Found a job
To my surprise, I was offered a 3 month position at a web agency called DesignHammer, most of it working on Drupal sites. I spent the next 5 years there. Working in a web agency is quite unlike software engineering at a more established company. You have clients with all kinds of projects, and a near constant time pressure to deliver as quickly as possible, to (superficially at least) highest possible quality. Testing or clean code aren’t really priorities for most clients; shipping is. On the plus side, almost all my work was with Drupal, and I was able to contribute back to the open source community as part of my client work, which was pretty cool.
After five years and some big life changes, I wanted to do something different and had the idea I would freelance. Freelancing wasn’t for me; too much accounting and self-promotion/networking that I wasn’t any good at, nor interested in. I lasted a couple of months doing that, then accepted an offer to be the director-of-technology/lead developer/engineering manager at Savas Labs, another digital web agency. This was similar to the last job except that I now had roles in mentoring, attending to code quality, training, etc.
After a couple of years of that, I came across a job posting for Wikimedia Foundation, and wrote about that experience here; I’ve been at WMF ever since.
A (non) traditional career path?
I think the above describes a “non-traditional” career path though I’m really not sure.2 A lot of my colleagues have similar, winding routes to where they are today. I’m sure there are lots of people who study CS in high school, then in university, then land a job and continue in that direction, but I am not sure how common it is.
What I’d do differently? The obvious one, stick with and complete the Computer Science degree, even if that meant an extra year or two in uni. It’s still quite common to see “B.S. or M.S. in Computer Science” in the requirements for tech job postings, even if the words “or equivalent in related work experience” appear begrudgingly as an afterthought. The work experience is the most important thing, IMO, but the degree is what gets you to the place where people will consider you for a role.
Beyond the getting-hired side, having a working knowledge of the theoretical underpinnings of what you work with day-to-day seems useful. Maybe the best would be to have 1-2 years of practical experience, then work on the CS degree.
I don’t regret studying philosophy; on the contrary, I wish I had taken a few more classes available to me. My advice to someone pursuing computer science would be to also study something else (in the humanities or otherwise). Learn about the world and have a broader view of your role in it, beyond “this is cool tech that I get to play with” (see e.g. surveillance tech industry, military robotics, cryptocurrency scams, etc).
My day in the life of a software engineer
I can speak to my experience, because for everyone it’s a little different, but for most of my days:
- Solving puzzles: a lot of my work is figuring out how to implement business rules or product requirements. A lot of that involves code archaeology, prototyping, and talking to product managers, designers, other engineers, engineering managers. And by “talking to”, I really mean “writing” because our work environment is global, and synchronous meetings are hard with a 9 hour timezone gap.
- Writing code: I often don’t spend most of my day writing code, but it is a decent chunk of my time.
- Code review: Some organizations employing software engineers don’t do code reviews, but I can’t really imagine working at a place like that now. Reviewing other people’s code, and receiving thoughtful reviews of my code, is one of the best ways to improve your knowledge and ability.
- Debugging: Whether it’s analyzing logs to find the source of a production error, or doing code archaeology to understand why someone made a particular change several years ago.
- Mentorship: : try to help out people where I can, either in formal mentoring roles or in helping out in answering technical questions.
Getting started in tech
It’s hard to get a start in tech industry in the year 2023. The frameworks that we use in web development have much higher barriers to entry than the PHP templates and FTP deployments I used in 2005-2006. My suggestions:
- Build a network. Talk to people. Having people who will think of you when a position opens at their organization or at an organization they know of.
- Get a variety of experience in tech. Try to find projects you’re interested in and contribute to them. Be open to different things. Maybe you’ll try machine learning engineering once and despise it, or maybe you’ll realize that’s the thing you were looking for. Having a lot of varied experiences also helps with crafting an attractive CV. And having any job in tech makes it easier to get one more aligned with what you want to do.
- Interviewing is a skill, develop it. No one should expect to be good at interviewing. It’s a terrible process, it sucks, and it’s also key to landing a job, unless you know someone (see “Learn networking” above). Talking specifics about things you’ve done is super helpful, as opposed to vague theoretical statements. If the organization you apply to has a whiteboard interview, you should study for typical questions asked in those types of things.
- Don’t send the same CV to every job you apply for. The CV should speak to the job you’re interested in. Your cover letter should show the reviewer you know something about what they’re looking for.
- Have projects. Whether it’s personal projects (like a website, your own, or someone else’s) or working on open source. It helps to show things you’ve built, and be able to speak in detail about what you’ve done.
- Given the state of the world, and your place in it, think about what you want to do with your tech skills, and make a plan for how you want to get there. If it’s working on e.g. climate tech, research organizations in that space and figure out what you need to learn (languages, skills, background knowledge) to be able to contribute there.
Let me know. And enjoy your studies! 🧑🎓