I have recently taken on a bunch of hiring at work. In particular, I am now spending a substantial amount of my time at work reading resumes. These are for new grads and intern candidates for software development positions. I have some thoughts on how to write your resume, and since most new grads are not fortunate enough to have access to people who will be reading their resumes, I thought I would write up these thoughts.
Preamble
I know that writing your resume is hard. There’s a number of competing goals, and it’s difficult to balance them. In addition, many computer science students do not receive adequate training in technical writing, and their only resource is often a harried student resources administrator who would like very much for your resume to be wonderful, but can’t write it for you without most of your information, in the week you have left to apply for jobs.
It’s still important to do a good job. I personally do not grade resumes very harshly, for many reasons. Most of what I am looking for is something like 4 bullet points out of a possible 10, since it’s next to impossible for a new grad or intern candidate to have accomplished anything meaningful. Not everyone is going to be as lenient as me, though, and the less of your resume I have to ignore, the happier I’m going to be, which, unfortunately, will affect my objectivity no matter how hard I try not to let it. If I am the person who reviews your resume, and it lists something like a Bachelor’s degree, the word “Python” somewhere, and a project or two that you seem to have completed (even class projects count in many cases!), I’m not going to turn you down because the rest of your resume is bad, but that doesn’t mean you should try to get away with it!
What a Resume Should Do
The ultimate goal of your resume is to land an interview at the company you send it to. It is not to impress your mother, or make yourself sound good, or “get you a job.” The duty of the resume ends when the person you send it to agrees to give you a phone call. This informs some decisions about what to put on your resume; namely, some amount of “acronym soup”1 is tolerated, and it is actually reasonable to plop down a long list of dubiously useful buzzwords to get someone to notice you or to get past HR. If you knew for a fact that a software hiring manager was going to be the first person to see your resume, you would not list information as desperately as you must when that might not be the case: I have found myself with a skills section that says absurd things like “SQL, MySQL” just because I do not know if I will have to have “SQL” as a separate buzzword. You have to make some odd decisions to play it safe because a resume is not, fundamentally, a representation of the talents you’ll ultimately bring to a company, it is a plea for someone to call you back.
So “land an interview” is not an actionable goal. What sort of subgoals does your resume need to accomplish to fuel the greater effort? The major things to do are:
- Present enough conventionally mandated boilerplate to not have your resume thrown out
- Present some relevant achievements
- Explain what relevant skills you have (indirectly)
- Explain what your interests are (indirectly)
- Make you stand out in some way
And the complements to the two indirect ones, of course: leave out anything irrelevant, even if it is an achievement or skill of some sort, don’t mention important skills that you don’t have (either in positive or negative: it should go without saying not to lie here, but also don’t list something like “Worked with a front-end engineer because I don’t know JavaScript”), and don’t make your resume seem like you’re interested in a field or job that is not, in fact, something you want to do.
Rapid Fire Don’ts
Here are a number of things not to do when sending out a resume for a software development position. Most of these are actually relevant to any resume, but I can’t pretend I know how resumes are evaluated in other industries, and some of these are fairly specific.
- Do not list skills that I don’t care about, such as:
- Microsoft Office suite tools
- Notepad (seriously, I’ve seen this)
- Any text editor, actually
- Any productivity software whatsoever, with the exception of tools directly related to the software development process (that would mean you can list git, but you can’t list Trello: Trello is external to the development itself, while git or another VCS is deeply ingrained in how developers work).
- Things that are wildly outside the ken, such as martial arts, or acting, etc
- Do not list achievements that are irrelevant to development work, such as:
- Being an Eagle Scout/Gold Award recipient
- Employee of the Month at your high school job
- …your high school job, at all, in general
- Anything about your minor/second major beyond the fact that you obtained it. This can be bent if you, say, wrote software in the course of research in that field, but in general I don’t care that you took a few Math electives or play the trumpet or whatever.
- Do not provide your course list. It is not very different from anyone else’s course list, and beyond that, I actually don’t care what courses you’ve taken. If there’s anything extraordinary and unusual, you can find somewhere to squeeze it in.
- Do not list redundant qualifications. I see a number of resumes where a GPA of 3.8+ is provided, and “Dean’s List” is also somewhere on the resume. I do not need both pieces of information.
- Do not attempt to quantify your own skills. Tell me in what contexts you’ve used them and what you’ve done by leveraging your skillset, but emphatically do not tell me you are an “expert in Python” or a “JavaScript guru.” I know a lot more about Python than basically any fresh grad2, and if I do interview you I’m going to make you prove you’re an expert, at which point it will come out that you are either a) lying on your resume or b) simply delusional about your own abilities, neither of which reflect well on you.
- Do not list any skills or technologies that you are not willing to talk about in an interview. If you haven’t used Visual Source Safe in 5 years and you don’t remember how it works, that means it’s time to take it off.
- Do not misspell technologies you claim to be versed in. It does not speak well for you that you’ve spent 4 years studying it and still think it’s spelled “JAVA.” It’s not. It’s “Java.” Please stop doing this one, people. It hurts me every time.
- Do not have huge proofreading errors in general. I don’t care about a typo here and there or “it’s” in place of “its,” or whatever, but eventually these things add up and I just start to assume you’re not going to be able to communicate well in the workplace.
- Do not list frameworks, operating systems, libaries, databases, or anything else that is not a programming language under programming languages. Do not list HTML or XML or CSS under programming languages, even if you shorten it to just “languages.” Seeming like you don’t know the difference between a programming language, a markup languages, and a library is not a good look.
- And this is perhaps actually the most important one: Do not give me a resume that’s over a page long!
So, Then, Do You Have Any Positive Advice?
Of course! There’s a number of easy things to do to make your resume better. I’m gonna go through them in the order from above.
Present enough conventionally mandated boilerplate to not have your resume thrown out
So I need your name, phone number, and education information. I would prefer that this take up approximately 3 lines of text, because it is some of the least relevant information. Yes, even for a new grad, your education information doesn’t matter much to me: you have a BS in Computer Science from some school, that’s great, but I don’t care about your course listing or your honors program or basically anything else except: I went here from dates X to Y and got my diploma. Many places will insist that you include your GPA, which, again, I don’t personally care about but which it is sensible to include anyway.
Aside: I don’t care about your GPA partially because it’s just not a measure of anything except diligence and partially because my own GPA was merely alright, due to hating school passionately. I seem to be doing okay, though, so I have personal experience of why it’s not particularly relevant.
Beyond that, the rest of what’s conventionally required is actually there for you to use to sell yourself, and so I can’t in good conscience call it boilerplate.
Present some relevant achievements
I want to know every interesting project you’ve done. Any side projects (even pretty small side projects are worth including: if you wrote a Blackjack bot, that’s plenty substantial enough to mention), and any major class projects. A good barometer for whether or not a class project is worth including is, “did everyone else in my class also write this program?” If the answer is yes, it’s not interesting. If the answer is no, mention it.
I also want to know anything cool you’ve done in the software development universe that isn’t a project. Did you go to PyCon? Did you get the Grace Hopper award? Did you do an independent research project with a professor? Those are all awesome and I want to hear about them. Include these.
Finally, I of course would expect to see any relevant work experience here. If you had a prior internship or part time job or something, list it and mention what you accomplished there.
Explain what relevant skills you have (indirectly)
Now, there is a place on your resume for a blunt listing of skills. I’ll cover that a little later on, when I mention some things about formatting. But in general, just seeing something listed on your resume is not a strong signal that you actually have any particular expertise in it. This is unfortunate but true: I have interviewed people who have things listed on their resume that they cannot talk about coherently. Thus I cannot trust a list of technologies without any further evidence of competence.
So, on any projects you list (personal, school, or work), figure out a way to work in the technologies you leveraged to build them. For example:
- Built a web app in Django to collate TPS reports, including an interactive frontend using jQuery for AJAX requests
That tells me an awful lot more than two disconnected pieces of information, one of which lists Django, jQuery, and AJAX, and other of which merely states “Built a web app to collate TPS reports, including an interactive frontend.” In the first one, I know that you’ve built a project using those technologies. In the disconnected example, I might assume that all your web projects were in Ruby, and Django is only listed because you ran through the tutorial one weekend.
Use this as a general pattern for demonstrating your experience with anything you want to call attention to! You could say, for example,
- Constructed requirements document for a greenfield TPS reports engine, delineated tasks into User Stories, and got our team set up to work in an Agile way.
Note: I don’t give a shit about anything demonstrated in that last one (except that you gathered requirements, that’s quite relevant), and most of it isn’t something a new grad or intern will have any exposure to, but the point is it’s a fairly flexible template. Most bullet points in your resume should look like:
- ${created something} ${in a way that demonstrates some knowledge} for ${reason that explains or at least hints at its value} ${and maybe some followup explanation}.
Maybe what you created was improved performance. In that case, you could say:
- Parallelized TPS report process using Hadoop, decreasing running time by 42%, which allowed our business analysts to have access to their data up to a full business day sooner.
Explain what your interests are (indirectly)
If you’re applying for a web development job, call attention to any web development work you’ve done. If I’m reviewing resumes for a web dev position and I see a lot of bullet points about Android and NLP, I’m going to assume you don’t want to work here. Maybe you actually really like web dev, and it’s a historical accident that most of your work has been in other areas. That’s totally fine! As a new grad, “most of your work” is 0 of your expected lifetime output to many significant figures, and if you just think web apps are awesome, find a way to show me. “Built a toy site in Django to see what the excitement was about” is a huge selling point that you might enjoy the work you’re ostensibly applying for.
Another great way of doing this is a link to a portfolio or your github/bitbucket account. These things are wildly not required for you to get a callback, but if you have them, they’re a great way to demonstrate what you work on when you’re free to choose. This is probably the best way to signal that you have interest in what the company is doing outside of having prior experience in that field.
I assume this goes without saying, but don’t tell me about your non-professional interests. Maybe we’ll get along great and go play ball on the weekend or see concerts together or whatever. But I don’t care, and including such things is bound to hurt you: either I think your interests are bullshit and I subconsciously give you a demerit (I swear, I try very hard not to do anything like this, but it is unreasonably difficult for humans to maintain true objectivity, and you should not risk it), or I think your interests are awesome and I give you a thumbs up, which is a) discriminatory in the hiring process and b) liable to set off alarms that I need to be more objective, and is just as likely to cause me to wildly overcompensate as it is to end up in your favour.
Don’t mention personal things on your resume. It’s a terrible, terrible idea.
Make you stand out in some way
This one is really hard. Most new grads are substantially the same. There are some obvious ways to do this: prior internships or work history, open source contributions, a personal github, and various other harder-to-achieve things like winning well known awards for CS students or having a strong portfolio. It is advisable to do any or all of these things, because the world is a cold and harsh place, but it is not for me to categorically dismiss all those who don’t.
Perhaps the easiest way to make your resume stand out is to not clog it up with bullshit that doesn’t matter. If you went through your resume according to my list of Don’ts, you’re probably looking at somewhere around half a page of content. If you have more than that, congratulations on your upcoming offer from Google; you can stop reading now.
It is a truth universally acknowledged that a resume must be no more than one page, and not much less than one page. But, it is a truth that I, at least, avow, that much of the text on the average resume is of negative value, and should be removed.
So here’s what you do: Take all those bullet points about the projects you’ve done and go into a little more detail. Make them sound cooler. Try not to stretch things too much — I’d much rather a sparse resume than one where it sounds like you have no confidence and have to reach really hard to make anything sound good — but just elaborate a little.
Then, do some reformatting. Make your section titles bigger, or use a bigger font. Make your name on its own line and bigger than necessary. Include some extra line breaks. Now your resume is much more pleasant to read, and is also the magic size.
Try to avoid the temptation to make your resume stand out by getting fancy with the design. If you are really a strong designer, then you might get away with it, but it’s mostly just a distraction. If you’re applying for a design job (or even a front-end developer job, potentially), it might be appropriate to add some flair, but for a normal SWE job it’s not a good idea: you probably won’t do a good job, and the person reading it will at best not care even if you do.
Some Structural Tips
Many people present their skills poorly. I’ve seen a number of ways of formatting your skills presentation, and there’s several ways of doing it that are appropriate depending on your goals. My own resume has a very short skills section, mostly as a result of the places I apply to. I generally apply to small startups, where I have a reasonable assumption that a technical person is going to be the first person to see my resume, so I mostly just list some things to get them out of the way and leave space for talking about what I’ve actually done with the rest of the page. If you’re applying to larger companies where you’re worried about a semi-automated HR screen, you should list many more skills (as above, it might make sense to list several flavours of SQL just in case someone has a checkbox that says “T-SQL” that won’t get checked if you don’t have that string on your resume). And there are other considerations, too: perhaps you would like to fill some more room on the page because you listened to my advice and now have blank space you feel compelled to fill. In that case, choose a more elaborate format for listing your skills!
The general ways of breaking down your skills section are
- By category: Languages, Databases, Web Technologies, Tools, maybe a catchall, etc. Whatever grouping makes sense for your background.
- By skill level: Proficient, Comfortable, Exposed To, something like that. Proficient is a reasonable word to use here for the languages or technologies you’re best at; it’s a sort of code word that means “proficient compared to the other categories,” whereas using a word like “Expert” is, as mentioned above, a bad idea. You’re a new grad, you’re not an expert in anything. And if you were an expert in something, you wouldn’t have a whole section for it, because you’re damn sure not an expert in multiple things.
You can mix and match, you can use a crazy table, whatever. But those are the standard ways of doing it, and you don’t want to deviate too much. For example, you could have something like the following:
- Languages: Java (proficient), Scheme (comfortable), Python (beginner)
or on the other side:
- Proficient: Java, Ruby | Django, MySQL | HTML, CSS
or, say you want to mix and match across categories to save some space or preserve context. Maybe you do something like:
- Web Technologies: Python (with Django and Twisted), PHP (CodeIgniter), JavaScript (jQuery, backbone.js)
But, for the love of god, don’t delineate a category and then include examples in it that don’t belong!
If you are listing personal projects and you are able to link to their source, you should. This is a great place to include links to your github, because it means I don’t have to sort through your repos list and try to figure out which ones are worth looking at, and it allows you to link it without making it intrusive or having to find room for it somewhere else.
An aside about github: if your github is all trivial exercises and forks of popular projects that you haven’t actually contributed to, consider leaving it out. If there’s nothing of meat in there it doesn’t help you at all, and if there’s only 1 or 2 projects nestled amongst a background of noise, try to link directly to what is worth looking at. Using github as a place to manage a bunch of things that aren’t really for interviewers to see but that you want to keep track of is great, but if that’s how you’re using it then don’t try to show it off.
Wrapping Up
Hopefully this advice will help you craft a resume that gets looked at. It should help you make your resume punchier and more to the point, and avoid some novice foibles. I can’t guarantee you’ll get callbacks from this, but it will at least lower your false negative rate.
*Résumé. Whatever.
1. “Acronym soup” is a term to refer to long lists of acronyms detailing technologies that you have experience with; think “XML HTML SQL SVN ANT….”
2. I am not an “expert in Python” and I would never claim to be, much less on my resume. This isn’t intended as bragging; it’s intended to drive home how poor people are at evaluating their own skill level.