If you read my last post, you know the junior dev job market is brutal. But here's the thing that makes it worse: before a human ever sees your resume, software decides whether you're worth looking at.
That software is an Applicant Tracking System. And as developers, we should understand how it works. Because once you see the implementation, you'll realize it's far dumber than you'd expect.
What ATS Actually Is
An Applicant Tracking System is CRUD software for hiring pipelines. It posts jobs, collects applications, stores candidate data, and filters resumes.
The math makes it necessary. A single job posting at a mid-sized company gets 250+ applications. At companies like Google or Stripe, that number hits thousands. No human reads all of those.
Popular platforms include Workday, Greenhouse, Lever, iCIMS, and Taleo. Each has slightly different parsing logic, but they all follow the same basic pipeline.
Think of it as a data ingestion system with questionable parsing.
The Parsing Pipeline
When you submit your resume, the ATS doesn't "read" it. It runs a pipeline that would make most engineers cringe.
Step 1: Text Extraction
The ATS converts your document to plain text. This is where things break immediately.
What works:
-
.docxfiles (structured XML under the hood, easy to parse) -
.pdffiles created from text editors (text layer intact) - Plain
.txtfiles
What breaks:
- Scanned PDFs (the parser sees a raster image, not text nodes)
- Complex tables and multi-column layouts
- Headers and footers (many parsers skip these entirely)
- Text embedded in SVGs or images
- Custom fonts that don't map to Unicode correctly
If you've ever tried to extract text from a PDF programmatically, you know this pain. ATS parsers face the same issues, and they don't handle them gracefully.
Step 2: Section Classification
The parser attempts to identify document sections:
- Contact information
- Work experience
- Education
- Skills
It looks for common headers like "Experience," "Education," and "Skills." If you use "Where I've Made Impact" instead of "Work Experience," the parser doesn't understand what it's looking at.
This is basically string matching against a dictionary of known section headers. Not NLP. Not semantic understanding. Pattern matching.
Step 3: Entity Extraction
Here's where it gets interesting. The parser tries to extract structured data:
| Entity | Extraction Method |
|---|---|
| Name | First line or largest text element |
Regex: something@something.tld
|
|
| Phone | Regex: number patterns with area codes |
| Job Titles | Matched against known title databases |
| Companies | Matched against company name databases |
| Dates | Pattern matching (MM/YYYY works most reliably) |
| Skills | Keyword lookup against job requirements |
| Degrees | Pattern matching (BS, BA, MBA, PhD, etc.) |
This is essentially a named entity recognition system, but most ATS implementations are closer to regex with a dictionary than actual NER models. The accuracy is surprisingly low.
Step 4: Keyword Matching
Once parsed, the system compares extracted text against the job description:
- Hard skills: Python, React, AWS, Kubernetes, PostgreSQL
- Certifications: AWS Certified, PMP, Kubernetes CKA
- Job titles: Software Engineer, Frontend Developer, DevOps
- Buzzwords: Agile, CI/CD, microservices, distributed systems
Some systems do literal string matching. Others are slightly smarter and understand that "JS" and "JavaScript" are the same thing, or that "K8s" means "Kubernetes." But don't count on it.
Step 5: Scoring
The ATS assigns a match score:
- Percentage match (78% match)
- Tier ranking (A, B, C candidates)
- Pass/fail filter (meets minimum threshold or doesn't)
Only resumes above the threshold reach a recruiter.
Why Your Resume Gets Silently Dropped
Understanding the pipeline reveals why qualified developers get filtered out:
Formatting That Breaks Parsing
Your portfolio-quality resume with a CSS Grid layout and sidebar looks great in a browser. The ATS reads it as a jumbled mess.
The parser reads left-to-right, top-to-bottom. In a two-column layout, it might extract:
"Senior Software 5 years React
Engineer Built distributed..."
Instead of:
"Senior Software Engineer
5 years React experience
Built distributed systems..."
Fix: Single-column layout. Save the fancy design for your personal site.
Missing Keyword Matches
You have 5 years building REST APIs, but the job description says "API development" and you wrote "built backend services." The parser doesn't understand these mean the same thing.
// What the ATS does (simplified)
const match = jobKeywords.filter(kw =>
resumeText.toLowerCase().includes(kw.toLowerCase())
);
const score = match.length / jobKeywords.length;
It's not semantic search. It's includes().
Fix: Mirror the exact language from the job description. If they say "CI/CD pipelines," use "CI/CD pipelines," not "automated deployments."
Non-Standard Section Headers
// ATS parser pseudocode
const KNOWN_HEADERS = [
'experience', 'work experience', 'professional experience',
'education', 'skills', 'summary', 'certifications'
];
function classifySection(header) {
return KNOWN_HEADERS.find(h =>
header.toLowerCase().includes(h)
) || 'unknown'; // your content gets ignored
}
"My Journey in Code" maps to unknown. Your experience section disappears.
Fix: Use boring, standard headers. "Work Experience." "Skills." "Education."
File Format Issues
Some PDF exports from design tools (Canva, Figma) create visually perfect documents where the underlying text layer is scrambled. The ATS extracts gibberish.
Quick test: Open your PDF, Ctrl+A, Ctrl+C, paste into a plain text editor. If it's garbled, the ATS sees garbled text too.
The Developer's ATS Optimization Checklist
Format
- [ ] Single column layout
- [ ] Standard fonts (system fonts work fine)
- [ ] Clear section headers (Experience, Skills, Education)
- [ ] Consistent date format (MM/YYYY)
- [ ] No tables, text boxes, columns, or graphics
- [ ] PDF exported from a text editor, not a design tool
Keywords
Don't keyword stuff. Integrate terms naturally:
Before:
Worked on backend systems
After:
Built RESTful APIs serving 50K requests/day using Node.js, Express, and PostgreSQL. Implemented CI/CD pipeline with GitHub Actions reducing deployment time by 60%.
The second version naturally hits: REST API, Node.js, Express, PostgreSQL, CI/CD, GitHub Actions. All potential ATS keywords.
Skills Section
Give the parser an easy win. Create a dedicated skills section:
SKILLS
Languages: TypeScript, Python, Go, SQL
Frameworks: React, Next.js, Express, FastAPI
Cloud: AWS (EC2, Lambda, S3, RDS), Docker, Kubernetes
Databases: PostgreSQL, Redis, MongoDB
Tools: Git, GitHub Actions, Terraform, Datadog
This is structured data the ATS can reliably extract.
Job Titles
If your actual title was "Code Ninja" or "Software Wizard," translate it:
Software Engineer (internal title: Code Ninja) | Startup X | 2022-2025
The ATS recognizes "Software Engineer." It doesn't recognize "Code Ninja."
What ATS Can't Evaluate
While you're optimizing for the algorithm, remember what it completely misses:
- Code quality — It can't read your GitHub
- System design ability — No way to evaluate architectural thinking
- Cultural fit — Your personality doesn't parse
- Growth trajectory — It can't see your learning curve
- Side projects — Unless you name-drop the right keywords
- Open source contributions — Invisible to keyword matching
This is why networking and referrals matter so much. A referral bypasses the ATS entirely. Your resume goes straight to a human who can evaluate what the software can't.
The Uncomfortable Truth
ATS is a blunt instrument. It exists because companies are drowning in applications, not because it's good at identifying talent.
As developers, we'd probably architect this system differently. We'd use embeddings for semantic matching instead of string comparison. We'd parse documents with proper NLP instead of regex. We'd evaluate GitHub profiles and actual code.
But that's not what most companies use. They use systems built in the early 2010s with incremental improvements. And your resume needs to work with the system that exists, not the one that should exist.
The good news: once you understand the implementation, gaming it is straightforward. Clean format, standard headers, mirrored keywords, plain text that parses cleanly. It's not rocket science. It's just knowledge most candidates don't have.
If you want to see how your resume actually parses, I built ResumeFast that scores your resume against job descriptions. Knowing your match score before you apply changes everything.
---
## SEO Content for This Post
**Meta Description:**
Learn how ATS resume parsers actually work from a developer's perspective. Understand the parsing pipeline, why resumes get dropped, and how to optimize for keyword matching systems.
**Social Snippet (Twitter/X):**
Your resume doesn't get "read" by ATS software.
It runs through a pipeline that's basically:
- Regex for emails
- String matching for keywords
- includes() for scoring
Here's the implementation and how to beat it 👇
Top comments (0)