← Back to Blog

ATS Resume Tips for Software Engineers: What I Learned Building a Resume Scoring System

Published ยท Finch Team

Updated

Most ATS resume tips come from HR bloggers who have never looked at how an applicant tracking system actually processes a PDF. I'm a CS student who spent a year building an AI pipeline that generated resumes and scored them against ATS criteria, and I tested identical documents through Greenhouse, Lever, and Workday. The ATS resume tips software engineer candidates actually need are more technical and less mystical than what you'll find on most career sites.

Here's what I found.

What an ATS Actually Does (It's Simpler Than You Think)

An applicant tracking system is, at its core, a database with a document parser bolted on. When you upload your resume, the ATS runs a parsing step that tries to extract structured data: your name, email, phone, work history, education, and skills. That structured data gets stored in fields that recruiters can search and filter.

The parser is the part that matters for your resume formatting. It reads your PDF (or DOCX), tries to identify sections by heading text, and maps content into the right fields. If the parser can't figure out what a section is, that content might get dumped into a generic "other" field that nobody searches.

Here's the thing most people get wrong: the ATS doesn't reject you. In almost all cases, a human still makes the reject/advance decision. What the ATS does is make your resume harder or easier for that human to find. If the parser botches your skills section, a recruiter filtering for "React" won't see you even though React is on your resume.

There's also keyword matching, but it's not the black box people think it is. Most systems do straightforward string matching against the job description. Some do semantic similarity. None of them are running GPT-4 on your resume (that would be absurdly expensive at scale).

Greenhouse vs. Lever vs. Workday: Same Resume, Different Results

This is the part that surprised me. We tested the exact same PDF through all three major ATS platforms, and the parsing results were noticeably different.

Greenhouse was the most forgiving. It handled our LaTeX-generated PDFs cleanly, correctly identified section headers, and extracted skills from both a dedicated Skills section and from bullet point text. It even picked up GitHub links and labeled them as portfolio URLs.

Lever was almost as good but had one quirk: it sometimes split multi-line bullet points into separate entries. If your bullet wraps to a second line and the line break falls in an awkward spot, Lever might read it as two separate items. This doesn't break anything, but it makes the parsed output look messy.

Workday was the strictest. It struggled more with non-standard section headings. If you label your section "What I've Built" instead of "Projects" or "Experience," Workday is more likely to misclassify it. Workday also had the most trouble with ligatures in PDFs that didn't include proper Unicode mappings.

The takeaway: don't optimize for one ATS. Use standard section headings (Experience, Education, Skills, Projects), clean PDF generation, and proper font encoding. That combination works across all three.

The Formatting Rules That Actually Matter for ATS Resume Tips

Let me separate the real rules from the myths.

Real rules:

Single-column layout. Two-column resumes look nice in Figma. They break in parsers. The ATS reads top-to-bottom, left-to-right. If your skills are in a left sidebar and your experience is in the right column, the parser will interleave them into nonsense. I've seen parsed output where a job title gets concatenated with a skill name because they were on the same vertical line in different columns.

Standard section headings. Use "Experience" or "Work Experience," not "Where I've Worked." Use "Education," not "Academic Background." Use "Skills" or "Technical Skills," not "My Toolkit." ATS parsers have a list of expected headings they look for. Creativity here costs you.

No text in images. If your name or contact info is rendered as an image (some Canva templates do this), the parser sees nothing. Your resume might parse as a blank document with a body text blob.

Proper Unicode mapping in PDFs. This is the nerdy one. When pdflatex compiles a document, certain character combinations (fi, fl, ff) can render as ligatures: single glyphs that look like two letters. If the PDF doesn't include a ToUnicode mapping, the ATS parser sees a single unknown character instead of "fi." So "proficient" becomes "pro?cient" in the parsed text, and a keyword search for "proficient" fails.

This is why the LaTeX template in our resume generator included \pdfgentounicode=1. It tells pdflatex to generate Unicode mappings for every glyph, so parsers always get clean text. It's a one-line fix that most people never think about.

Myths that don't matter:

"Don't use color." ATS systems ignore color entirely. They extract text. If you want your name in dark blue, go for it. It won't affect parsing.

"Don't use bullet points." Standard bullet characters (the round ones, Unicode 2022) parse fine everywhere we tested. Fancy symbols like arrows or checkmarks are slightly riskier but still worked in Greenhouse and Lever.

"Save as DOCX, not PDF." This was true maybe in 2018. Modern parsers handle PDF fine as long as the text layer is real text (not a scanned image). LaTeX-generated PDFs are actually ideal because the text layer is always clean.

"Don't use tables." Tables for layout are risky (same problem as columns). But a table inside a section, like a simple two-column skills grid, parsed correctly in all three systems we tested.

If you want to see how this plays out for students specifically, check out our CS student resume guide.

ATS Resume Keywords: The Match Game

Keyword optimization is the one ATS tip that's both real and overhyped at the same time.

Yes, recruiters search for keywords. If the job posting says "Kubernetes" and your resume says "k8s," some systems won't match that. If the posting says "React.js" and you wrote "React," most will match (Greenhouse does, Workday sometimes doesn't).

But here's what people miss: you don't need to stuff keywords. You need to mirror the job description's specific terminology naturally. If the posting says "RESTful APIs," use "RESTful APIs" somewhere in your resume, not just "REST" or "APIs." If it says "CI/CD pipelines," use that exact phrase.

The approach that works:

  1. Read the job description
  2. Highlight the technical terms and tools mentioned
  3. Make sure each one appears somewhere in your resume (skills section, bullet points, or project descriptions)
  4. Don't force it. If the job asks for Rust and you don't know Rust, don't add Rust to your resume

When we built Finch's resume generator, it first sorted each job into one of 17 technical domains, then wrote experience bullets in that domain's terminology. A backend engineering role got different keyword emphasis than a data science role, even for the same candidate.

That's the habit to copy by hand: decide what kind of role the posting is, then use its words. We also gave each resume a color-coded match score: green (80+), blue (70-79), amber (60-69), red (below 60). For a rough version by hand, count how many of the posting's key terms your resume uses. That tells you how well it matches before you spend time applying.

For more on getting keywords right, read our resume keywords for tech jobs post.

ATS Score Breakdown: What the Numbers Mean

We scored every resume our generator made, so I can tell you what actually moved the needle on an ATS score.

The scoring looked at several factors:

Keyword match rate is the biggest one. What percentage of the job description's key terms appear in your resume? For software engineering roles, this means languages, frameworks, tools, and domain terms. A resume that hits 80%+ of the job's technical keywords will score well.

Section completeness matters too. A resume with Experience, Education, Skills, and Projects sections will outscore one that's missing Projects, all else being equal. The parser expects certain sections and rewards their presence.

Formatting cleanliness is the baseline. If the parser can't extract your text properly, nothing else matters. This is binary: either your resume parses correctly or it doesn't.

What doesn't affect ATS scores (despite what you might read): the visual design of your resume, your font choice (as long as it embeds properly), whether you use bold or italic, and the length of your summary statement.

The practical implication: spend your optimization time on keyword alignment and section structure, not on finding the perfect template. A plain single-column LaTeX resume with the right keywords will outscore a gorgeous Canva design with generic language every time.

The Tailoring Problem (And Why Most People Skip It)

Here's the uncomfortable math. If you're applying to 30 jobs, and each job has different keyword emphasis, you technically need 30 different resumes to maximize your ATS match rate.

Nobody does this manually. People make one resume, maybe two (one for frontend roles, one for backend), and blast them everywhere. The result is that your resume is well-optimized for maybe 3 of those 30 jobs and generic for the other 27.

The realistic fix is a base resume for each role type, plus full tailoring for the roles that fit you best. Finch helps you pick those roles now. Each week it picks the 3 roles that fit your major best and says why, so you know which ones to tailor first. It's free, and you can start with your major.

If you tailor in LaTeX, Jake Gutierrez's template is the one we used: letter paper, 11pt, 0.5-inch margins, with \pdfgentounicode=1 for clean ATS parsing. Keep it to one page by trimming in steps (fewer experiences, then shorter bullets) until it fits.

What to Do Right Now

If you're a software engineer (or a CS student about to be one) and you want to make your resume ATS-friendly today, here's the checklist:

Format: Single column. Standard section headings. PDF with real text (not a scan). If you use LaTeX, add \pdfgentounicode=1 to your preamble.

Content: Mirror the job description's terminology. Include a Skills section grouped by category. Write bullets with specific technologies and measurable outcomes.

Process: Tailor for each application, or at minimum for each role type. A frontend resume and a backend resume are the bare minimum if you're applying to both.

Scale: Apply to more than you think you need to. The best ATS resume tips for software engineers don't matter if you're only sending 5 applications. Volume with quality is the winning combination.

For the broader strategy of getting more applications out efficiently, check out our guide on applying to more jobs faster. And if you're still building your resume from scratch, start with our software engineering internship resume breakdown.

Your resume doesn't need to game the ATS. It needs to survive the ATS cleanly so a human can actually evaluate you. Get the formatting right, match the keywords, and spend your remaining energy on applying to more places.