Liberal Arts Degree to Software Industry

Paul Carduner
7 min readFeb 14, 2016

--

Last week I was at Whitman College talking to students in the newly created computer science department about careers in the tech industry. Many students were interested in knowing what they could do while still in school to better prepare themselves for joining the industry. Having watched a lot of interns and new graduates get started with their software engineering careers at facebook, here are my suggestions to anyone who is interested in hitting the ground running when they first join the industry. I’ll throw in some extra notes at the end for folks coming from a non-traditional engineering background — i.e. those who didn’t study computer science at <insert tech school>.

The Temple of the Liberal Arts by Jacques Sablet

Disclaimer: The tech industry is a big place and there are lots of different types of work. You don’t have to do all (or any?) of these things to be successful, and depending on the type of work you end up doing, these suggestions may not actually be that helpful. They are based on my own unique experience building mostly web-based, consumer-facing software on open source technology stacks, and not from a well researched review of the industry at large.

1. get comfortable using linux

I personally like Ubuntu, but any flavor of linux will do.

  • be able to find your way around the command line and know how to use utilities like find, grep, curl, tail, etc.
  • understand the file system structure — i.e. what is the difference between /etc /var /home, etc.
  • understand how file permissions work and know how to use commands like chmod, chown, etc.
  • know how to install software — both using a package manager and from source
  • Learn some basic shell scripting

2. get comfortable using a version control system

Everyone seems to be using git these days, so that would be a good place to start. Since the primary use case for git is to collaborate on a project with other software developers, you’ll want to understand the git workflows for collaboration pretty well. Oh, and get set up with a github account.

3. learn to use a command line text/code editor

Everyone should really know enough vi(m) to be dangerous. While I rarely find myself using vim, every now and then I’m in a position where vim is the most expedient way to edit a file. And then I’m glad I spent the first 3 years of my programming life using vim exclusively.

Oh, and if you want to join the cool kids after you learn vim, learn emacs.

4. learn a high-level, dynamic, interpreted programming language

I personally like python, but there are a lot of other popular options out there these days like ruby and javascript. Even if you end up spending most of your time in lower level languages, I find that knowing a language like python can really come in handy for algorithmic coding interviews. It’s nice to be able to dispense with the intricacies of lower level languages and just focus on figuring out the best algorithm.

5. learn a low-level, statically typed, compiled programming language (without a garbage collector)

I would probably start by reading The C Programming Language. I’ve pretty much forgotten everything I once knew about C (which wasn’t much) and would probably struggle to write a “hello world” program without googling, but what has stuck with me is an understanding and appreciation for memory management, not to mention the difference between a reference and a value. These ideas seem to crop up in unexpected places, even when working with higher level programming languages, so it’s helpful to have at least a cursory understanding of C under your belt so you’re not taken by surprise.

6. build your own (static) website from scratch

Web technology has become so pervasive, that it’s really table stakes to know the basics. You’ll want to know how to write modern, semantic html and the CSS to go with it. Throw in some JavaScript while you are at it. And before you consider yourself done with this step, get your website published on the world wide web for everyone to see. I personally like github pages for hosting. If you can’t think of an interesting static website to create, create one for your resume. I much prefer looking at resumes in a web browser than having to open up Acrobat Reader or Microsoft Office.

Also, there are bonus points if your website looks good on both a mobile web browser and a desktop web browser. Using something like the bootstrap css library makes this pretty easy.

7. contribute to an open source project

This is one of the best ways to gain real world experience working within a team of software developers on a professional level project. Of all the items in this list, contributing to an open source project is probably the hardest one to do. However, it’s also probably one of the most impactful things you can do to prepare yourself for joining the industry. There are lots of great articles on how to go about this, but in short I would say find a project that you yourself (or at least people you know) use on a regular basis, and reach out to the project’s maintainers to see how you can help.

And if you are having a hard time getting a summer internship in the industry, check out Google Summer of Code, where you can get paid to contribute to open source projects.

8. get familiar with test driven development (TDD)

Outside of toy projects and small scripts, software testing is one thing you will probably find yourself spending a lot of time on. Many projects have nearly as many lines of code to test their software as they do to implement the software itself. And writing good tests is often harder than people think. So to that end, it’s important to become familiar with the various unit testing libraries available for the programming languages you are learning, as well as to get in the habit of writing the tests at the same time you are writing the software.

9. understand how to use a (relational) database

Pretty much everything you will encounter in the tech industry is at some point going to interact with a database. There are lots of different types of databases out there, but the most commonly used are relational databases like MySQL and PostGresQL. So called NoSQL databases have been growing in popularity for years, and it would be great to learn how those work too, but I wouldn’t consider learning how to use MongoDB a substitute for learning about relational databases.

10. go deep in one particular technology stack

Pick one programming language, and one framework written in that programming language, and try to learn as much about it as you can, including all the more esoteric parts of it. Even if you don’t end up using this particular technology in your first day job, knowing what it feels like to really know a technology in and out will help you understand and appreciate your own knowledge gap when faced with new technology you haven’t used before. Knowing what you don’t know is half the battle.

I remember during my first internship, someone asked me how well I knew CSS, and I thought to myself, “I’m fluent, it’s such a simple language, what is there to know besides the syntax?” I quickly found out that while I thought I knew 90% of what there was to know about CSS, I actually knew closer to 10%. The truth is, you don’t really know CSS until you understand how browsers actually interpret and implement the various CSS rules, not to mention all the esoteric bugs in Internet Explorer’s CSS implementation and the various workarounds for those bugs.

What if I didn’t go to MIT?

I get lots of emails and LinkedIn requests from tech industry recruiters asking if I know anyone who would be interested in a job at “super amazing pre-IPO startup X”. Under the job description’s requirements section, there is usually a line like this (I literally copied this off an email from this morning):

“Masters or Bachelors in Computer Science or similar, with a high GPA from a top tier school.” — every job description I’ve ever seen

Fortunately for most of us, my response to this requirement is typically the following:

While having a 4.0 GPA in MIT’s computer science department is a nice feather to put in your cap, it is neither necessary nor sufficient for a successful career in the tech industry. As someone who dropped out of a liberal arts college in Eastern Washington that didn’t even have a computer science department, and who has seen plenty of top-10 tech school graduates (with PhDs no less) fumble their way through technical interviews, I can confirm this to be true. And it’s not just me who is saying this.

“Laszlo Bock, head of People Operations at Google, spearheaded research looking at everyone they hired to figure out if high GPAs actually correlated with performance. Turns out they don’t.” — First Round Capital

Unfortunately, this does not stop recruiters (and to a lesser extent hiring managers) from using educational background as a litmus test to decide who gets to have an interview. The one surefire way I know of to circumvent this nonsense selection criteria is to prove your skills in the open source arena with legitimately impactful technical contributions to relevant open source projects. Build yourself a reputation around significant open source contributions, and you won’t even need a resume, let alone a CS degree from MIT, to get a job interview.

Getting a 4.0 at MIT isn’t easy and neither is making a splash in the open source world. On the plus side though, the only things that can hold you back are your own ambition, access to a computer with an internet connection, and the time to do the work.

--

--

Paul Carduner

Cat Training Officer @ nori.com | Seattle/Tech/Climbing/Skiing/Ex-Facebook/Ex-Startups.