Living a Colorful Life in a Black-and-White ATS World

A career has edges. The schema only stores nodes.

I spent years in commercial kitchens and over a decade running a one-man construction business before I ever shipped software professionally. Here is what those years look like inside an applicant tracking system:

Sous Chef, Illahe Hills Country Club, 1996-1997
Owner, Alger Construction, 2006-2018

Two rows. Six fields. Everything that made those years worth putting on a resume in the first place lives in the space between them, and there is no field for the space between them.

That is not a bug in any particular vendor’s product. It is what happens when a career gets stored.

Compression Is the Point, and Compression Has a Cost

A resume is already a lossy representation of a working life. An applicant tracking system compresses it again into titles, employers, dates, skills, and years of experience. Recruiter searches narrow it further. Screening criteria narrow it again. By the time a hiring manager sees a candidate, a great deal of what made that person worth meeting has been discarded by systems doing exactly what they were built to do.

Hiring at scale requires structure. Nobody sensible is arguing otherwise.

But compression is only lossless when the thing being compressed matches the schema. Software engineer becomes senior software engineer becomes staff software engineer. The titles line up. The keywords line up. The progression survives the trip through the pipeline nearly intact.

For a career that moved sideways, the same pipeline behaves very differently. It preserves the least interesting facts and drops the reason those facts belong on the same page.

The Resume Contains the Nodes. Something Has to Explain the Edges.

Running a construction business teaches you schedules, budgets, vendors, dependencies, unhappy customers, and what it costs to discover a problem after the wall is closed. Working a station on a busy line teaches you sequencing, preparation, and how to communicate when six things are failing at once and none of them are your fault. Managing a distributed technical team a decade later draws on both, whether or not the job description has a checkbox for it.

Systems fail. Priorities collide. Resources are finite. People misunderstand each other. Plans meet reality. Learning to operate under those conditions is transferable, and it is the actual content of a nonlinear career.

A person reading a resume can sometimes reconstruct those connections. A parser has a harder problem, because almost everything it has been given is categorical. It is very good at representing what fits in a field. It has nowhere to put “running a small business taught me something about operational risk that later made me better at managing engineers.”

The information exists. The schema has no column for it.

This is why the quiet disappearance of the cover letter is more consequential than it looks. I understand why nobody misses them. Most were three paragraphs about being passionate about synergizing solutions in a fast-paced environment, and they earned their reputation. But the format was carrying a load that nothing replaced. The more nonlinear the candidate, the more of their value lives in relational information, and the application form keeps getting narrower precisely where that information needs to go.

We tell people to bring their whole selves to work while steadily reducing the bandwidth available to transmit one through the front door.

The Strongest Objection Is Not Efficiency

The honest counterargument to everything above is not that narrative is slow to read. It is that narrative is where bias lives.

Structured screening was partly a correction. Unstructured hiring, the kind that runs on interesting backgrounds and good conversations and a hiring manager’s instinct about fit, has a well documented tendency to favor candidates who resemble the person doing the evaluating. “This person’s unusual path is fascinating” has historically meant “this person reminds me of me.” Fields, rubrics, and consistent criteria were a response to a real failure, not an accident of software convenience.

So the argument cannot be that we should bring back the cover letter and read it with an open heart. That is a request to reopen a door that was closed for a reason.

The argument is narrower, and I think it survives the objection: the correction discarded a category of information instead of evaluating it consistently. Those are different problems with different fixes. Consistency is achievable for prose. Ask every candidate the same question. Score the answers against the same rubric. Read them at the same stage. That is structured data that happens to arrive as sentences.

What we built instead was a process that solved the bias problem by deleting the input.

The Keyword Arms Race Is a Symptom of the Deletion

The predictable response has been optimization on both sides. Candidates tailor resumes to postings. Tools score keyword alignment. Generative models rewrite bullets in the vocabulary of the job description, while recruiters deploy increasingly sophisticated matching and ranking on the other end.

None of that is unreasonable in isolation. If a company says “developer enablement” and my resume says “developer education,” making that equivalence explicit helps humans and machines alike.

Taken far enough, though, the process gets strange. One model rewrites a person’s career into the vocabulary most likely to satisfy another model deciding whether a human being should ever see it. We have built a translation layer between two parties who could have had a conversation.

And the translation runs in one direction only. Optimizing for machine legibility strips out exactly the information companies claim to be looking for. Adaptability is messy. Cross-disciplinary experience is messy. Pivots are messy. That messiness is usually where the signal is.

A Hiring Process Is a Statement of What an Organization Preserves

It is easy to blame the ATS, because it is the visible machinery. It is also the least interesting part of the story.

Someone decides which fields matter. Someone writes the screening questions. Someone marks a qualification as required rather than preferred. Someone chooses how recruiters query the pool, and whether a hiring manager sees fifty candidates, ten, or only the five that most closely resemble the profile used to write the posting. And someone decides you will never be told which of those things happened to you.

The resulting process is not neutral. It is a record of what an organization decided was worth keeping.

A process that preserves titles, years, and exact skills while discarding explanation will reliably favor careers legible through titles, years, and exact skills. A process that rewards similarity to a predefined profile will filter out candidates whose value comes from unusual combinations, because unusual combinations are by definition dissimilar.

For plenty of roles that is fine. Nobody wants an airline hiring pilots because the career story was compelling.

It is harder to defend when the same organization says it is looking for adaptable leaders, systems thinkers, creative problem solvers, and people who challenge established assumptions. Those are all contextual qualities. Context is the first thing lossy compression throws away.

We Do Not Need Better Resume Optimizers

I have not solved hiring, and candidates still have to operate inside the system that exists. Make transferable skills explicit. Describe outcomes in the language of the role. Find a human being when you can. A nonlinear career does not become legible because we insist it deserves to be.

But another generation of tools that help candidates compress themselves more efficiently is not a fix. It is better compliance with the thing causing the problem.

The smaller fix is available today and costs almost nothing. One field, asked of every applicant, scored the same way: what connects these experiences, and what did you carry from one to the next? Two hundred words. Read before the rejection, not after the offer. It is consistent, it is auditable, and it gives relational information somewhere to exist inside a structured process rather than outside it.

If an organization genuinely believes that unconventional backgrounds and adaptable thinkers create value, its hiring process needs a place to put them. Not in the culture page. In the schema, where decisions actually get made.

Otherwise, “bring your whole self to work” carries an undocumented prerequisite:

First, make sure your whole self fits in the fields.


P.S. I have also prepared my curriculum vitae in Latin. Thirty-five years of experience, zero recoverable keywords, and one very specific classics-major-turned-recruiter out there who will open it and say: hic est candidatus quem exspectabam.

Facebooktwitterredditlinkedinmail

Your Hiring Process Needs HTTP Status Codes

Because “we’ll be in touch” is not an observable state.

I submitted a job application recently.

It was one of those applications where you actually put in the effort. I read the job description carefully, tailored the resume, wrote a cover letter specifically for the organization, and answered the optional questions rather than pretending they were optional.

Then I clicked Submit and got… nothing.

No confirmation email. No “we received your application.” No indication that a candidate record had been created. Just a browser page telling me the submission had succeeded and the vague hope that somewhere, deep inside an applicant tracking system, my carefully assembled application had not been written directly to /dev/null.

As a developer, I find this troubling. Not because I expect an interview, or because I think every recruiter owes me personalized feedback. I just want a status code.

And I think that’s a smaller ask than it sounds like, for a reason I’ll come back to at the end: the states already exist. Somewhere in that ATS, my application is in one. The decision not to show me which one is a product decision, not a privacy constraint.

The Web Solved This Problem Decades Ago

When software sends a request to another system, we generally consider it useful for the receiving system to say what happened. Did it work? Is it still processing? Was the request malformed? Is the resource gone? Did something catch fire on the server?

HTTP gives us an entire vocabulary for this.

Hiring systems, meanwhile, have developed their own protocol:

POST /careers/applications

[no observable response]

This is sometimes followed, anywhere from three minutes to six months later, by:

After careful consideration...

Instead of inventing vague candidate statuses like “Under Consideration,” perhaps hiring systems could adopt something developers already understand.

The 2xx Family: Success, Allegedly

200 OK

A human being has reviewed your application.

Nothing else is implied.

Honestly, this alone would be revolutionary.

202 Accepted

Your application has been received and accepted for processing.

This is the most important status code in the entire hiring protocol. The candidate does not need the hiring manager’s notes or a walkthrough of the internal workflow. They need:

202 APPLICATION_ACCEPTED

Now we know the thing exists.

204 No Content

Your application was successfully received.

We have chosen not to acknowledge this in any way.

The 3xx Family: You Have Been Redirected

302 Found

We found an internal candidate.

Thanks for playing.

304 Not Modified

Your application has been “Under Review” for 47 days.

There has been no change since the last time you checked, or the 23 times before that. There will be no change the next time either. Please consider caching this response locally.

410 Gone

The position existed when you applied. It no longer exists. No additional information is available.

At least 410 would be useful. The current discovery mechanism is noticing that your bookmarked job posting has started redirecting to the careers homepage.

The 4xx Family: This One’s On You

401 Unauthorized

You must create an account before applying.

Your password must contain at least 14 characters, uppercase and lowercase letters, a number, a symbol, and one ancient Sumerian glyph. It cannot match any password you have used since 1997.

You will then manually enter every field from the resume you just uploaded.

You will never use this account again.

403 Forbidden

You have the required experience and qualifications.

Unfortunately, you live 37 miles outside the geographic boundary within which we have determined this Zoom meeting can occur.

404 Not Found

Hiring manager not found. Recruiter not found. Job posting not found.

Nobody knows who owns this requisition.

408 Request Timeout

After seven weeks without communication, the candidate has accepted another position.

The hiring team will contact them tomorrow to schedule the second interview.

409 Conflict

The position requires 12 years of production experience with a technology introduced six years ago.

The conflict cannot be resolved.

417 Expectation Failed

You expected the phrase “we’ll be in touch” to imply future communication.

It did not.

422 Unprocessable Content

Your experience is relevant, but your career path does not fit cleanly into the predefined boxes in our applicant tracking system.

Human intervention may be required.

Human intervention is unavailable.

425 Too Early

You applied 14 minutes after the job was posted.

LinkedIn reports 612 applicants.

We have questions too.

451 Unavailable For Legal Reasons

Your qualifications are not the issue.

The issue is a background check vendor, a non-compete of uncertain enforceability, or a sponsorship question nobody wants to be the one to ask about.

The 5xx Family: It Was Never You

500 Internal Server Error

Something has gone wrong internally. Your recruiter left, the headcount was frozen, the hiring manager changed, Finance reconsidered the budget, the organization restructured, or the position was posted by accident.

We will communicate all of these possibilities using the same message:

We have decided to move forward with other candidates.

502 Bad Gateway

The recruiter says they are waiting for the hiring manager.

The hiring manager says recruiting owns the next step.

Your request cannot be routed.

503 Service Unavailable

Your recruiter is no longer with the company.

Their calendar link remains active.

504 Gateway Timeout

“We expect to have a decision by Friday.”

Friday has passed. The specification does not define which Friday was intended.

Candidates Don’t Need Distributed Tracing

There’s a serious point hiding under all of this. Hiring has an observability problem, and it’s usually mistaken for a communication problem.

Companies understandably cannot expose everything happening inside a recruiting process. Candidate evaluations are private. Interview feedback may be sensitive. Hiring managers need room to compare people and make decisions.

That’s fine. Nobody is asking for:

GET /hiring-manager/private-thoughts/about-me

But there is an enormous amount of territory between exposing confidential deliberations and providing no information at all.

A hiring pipeline already has states. An application was received. It entered review. Someone reviewed it. An interview was requested. The requisition was paused. The position was filled. The position was canceled. The candidate was declined.

Those state transitions already exist in the system. They are already recorded, timestamped, and reportable, because that’s how recruiting teams measure their own funnel. The candidate is the one participant in the process who cannot see the record they’re in.

Give Us the Boring Version

Imagine an applicant portal that reported nothing more than this:

202  APPLICATION_RECEIVED     Mar 04
200  REVIEWED                 Mar 19
304  NO_CHANGE                Apr 02
304  NO_CHANGE                Apr 30
410  POSITION_CLOSED          May 12

That’s not radical transparency. It’s barely transparency at all. But it tells you the system is functioning.

It removes the need to wonder whether an application disappeared. It reduces pointless portal refreshing. And it prevents candidates from reading silence as information, when silence might mean anything from “the hiring manager is on vacation” to “the requisition was canceled two weeks ago.”

Mostly, it treats applicants like participants in a process rather than packets transmitted into an undocumented endpoint.

200 OK

I don’t expect every application to result in an interview. I’ve submitted enough of them to have considerable empirical evidence supporting that position.

I don’t expect detailed rejection feedback either. I understand why companies are reluctant to provide it. I don’t even particularly mind 403 REQUIREMENTS_NOT_MET or 410 POSITION_FILLED. Those are answers.

What makes modern hiring uniquely frustrating isn’t rejection. It’s uncertainty about whether anything is happening at all.

Software engineers have spent decades building systems around a simple principle: when one system asks another to do something, the response should carry enough information to understand what happened.

Candidates aren’t asking for distributed tracing of your recruiting infrastructure.

We’d settle for a status code.

Facebooktwitterredditlinkedinmail