<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Career on PHP Boy Scout</title><link>https://blog-570662.gitlab.io/tags/career/</link><description>Recent content in Career on PHP Boy Scout</description><generator>Hugo -- gohugo.io</generator><language>en-gb</language><copyright>Matt Cockayne</copyright><lastBuildDate>Fri, 22 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog-570662.gitlab.io/tags/career/index.xml" rel="self" type="application/rss+xml"/><item><title>Technical CV writing is still hard, and now a robot reads it first</title><link>https://blog-570662.gitlab.io/technical-cv-writing-and-the-ai-filter/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://blog-570662.gitlab.io/technical-cv-writing-and-the-ai-filter/</guid><description>&lt;img src="https://blog-570662.gitlab.io/technical-cv-writing-and-the-ai-filter/cover-technical-cv-writing-and-the-ai-filter.png" alt="Featured image of post Technical CV writing is still hard, and now a robot reads it first" /&gt;&lt;p&gt;Seven years ago I wrote a post called &lt;a class="link" href="https://blog-570662.gitlab.io/technical-cv-writing/" &gt;Technical CV writing is hard&lt;/a&gt;, pulled my own CV apart, and explained every choice in it. I even bragged that it converted to a first interview about eighty per cent of the time, then added &amp;ldquo;watch me now jinx myself for the future&amp;rdquo;. Reader, I jinxed myself. I&amp;rsquo;m back on the market, the same CV that served me for two decades went out into the world, and what came back was a sort of stunned silence. Not even rejections. Just nothing.&lt;/p&gt;
&lt;h2 id="the-cv-that-suddenly-stopped-working"&gt;The CV that suddenly stopped working
&lt;/h2&gt;&lt;p&gt;The thing about that silence is how &lt;em&gt;specific&lt;/em&gt; it was. Some applications behaved exactly as they always had: a human read the CV, liked it or didn&amp;rsquo;t, and replied like a person. Others went into a void. And the void had a pattern to it. It was the bigger, more process-heavy outfits, the ones you&amp;rsquo;d bet good money have an Applicant Tracking System and an &amp;ldquo;AI-assisted screening&amp;rdquo; line item in some HR budget.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s when the penny dropped. My CV wasn&amp;rsquo;t failing to impress anyone. It wasn&amp;rsquo;t reaching anyone. The first thing reading it wasn&amp;rsquo;t a person at all.&lt;/p&gt;
&lt;h2 id="the-reader-changed-and-i-hadnt-noticed"&gt;The reader changed, and I hadn&amp;rsquo;t noticed
&lt;/h2&gt;&lt;p&gt;I&amp;rsquo;ve made this exact point on this blog before, only about software: &lt;a class="link" href="https://blog-570662.gitlab.io/half-your-users-dont-have-eyes/" &gt;half your users don&amp;rsquo;t have eyes&lt;/a&gt;. A CLI tool&amp;rsquo;s output has two audiences, the human at the terminal and the script parsing the output, and they want completely different things. It turns out a CV is now precisely the same. It has two readers, and the first one is a machine.&lt;/p&gt;
&lt;p&gt;A human recruiter reads a CV the way I designed mine to be read: narrative, personality, a sense of the person. An ATS or an AI screen does nothing of the sort. It parses for structure, for keyword density, for recency, for numbers it can latch onto. My CV was a beautifully tailored sales pitch aimed squarely at a human who, increasingly, never gets to see it, because a parser in front of them scored it and quietly binned it first.&lt;/p&gt;
&lt;p&gt;Everything that made it a good &lt;em&gt;human&lt;/em&gt; document was, to the machine, either invisible or actively confusing.&lt;/p&gt;
&lt;h2 id="so-i-asked-an-ai-what-the-ai-hated"&gt;So I asked an AI what the AI hated
&lt;/h2&gt;&lt;p&gt;There&amp;rsquo;s an irony here I&amp;rsquo;m choosing to enjoy rather than resent. The way I worked out what the filters object to was to sit down with Gemini, hand it my CV, and ask it to read the thing the way a recruitment AI would and tell me where it tripped. Using one AI to get past another. Fight fire with fire.&lt;/p&gt;
&lt;p&gt;The one instruction I was firm about, and I&amp;rsquo;ll come back to it, was that the CV had to stay recognisably &lt;em&gt;me&lt;/em&gt;. I wasn&amp;rsquo;t asking Gemini to launder my career into something generic and machine-shaped. I was asking it to help me keep as much of my own voice and judgement as possible, while making the thing easier for an AI to approve and a human to enjoy. There&amp;rsquo;s a practical edge to that, too: the screening tools are increasingly tuned to spot the patterns of generated text and weight them down, so a CV that reads as though a model wrote it can trip the very filter you were trying to please, quite apart from leaving the human at the end of it cold.&lt;/p&gt;
&lt;p&gt;With that ground rule set, the hurdles it surfaced were genuinely illuminating, and a bit humbling given I&amp;rsquo;d written a whole confident blog post about how to do this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The skills tables are worse than useless.&lt;/strong&gt; My CV led with two lovely tables: Management Skills and Technical Skills, each with a level and years of experience. Clean and scannable for a human. To a lot of parsers, a table is a trap: they flatten it into a jumble and lose the structure entirely. Worse, listing &amp;ldquo;20+ years&amp;rdquo; against nearly everything triggers what I can only call the recency trap. Modern screening looks for skills that show up &lt;em&gt;in your recent job descriptions&lt;/em&gt;, not in a header table. A language sitting in my skills table but not in my last two roles reads as stale or unverified, no matter how many years I claimed next to it. Gemini put it plainly: &amp;ldquo;if a tool sees Golang in a top table but doesn&amp;rsquo;t see it explicitly mentioned in your last two job descriptions, it assumes the skill is stale or unverified.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img alt="My skills laid out as tables of skill, level and commercial experience. Lovely for a human to scan, a jumble the moment a parser flattens the formatting. This is the long-standing shape, here in its original 2019 form." class="gallery-image" data-flex-basis="251px" data-flex-grow="104" height="792" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog-570662.gitlab.io/technical-cv-writing-and-the-ai-filter/cv-skills-before.png" srcset="https://blog-570662.gitlab.io/technical-cv-writing-and-the-ai-filter/cv-skills-before_hu_d839434784c23aee.png 800w, https://blog-570662.gitlab.io/technical-cv-writing-and-the-ai-filter/cv-skills-before.png 831w" width="831"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;I have a passion for what I do&amp;rdquo; is noise.&lt;/strong&gt; My opening profile statement, which I was rather proud of, is exactly the sort of thing a screening tool discards wholesale. As Gemini noted, these tools &amp;ldquo;completely ignore subjective self-assessments &amp;hellip; because they cannot be measured or verified.&amp;rdquo; It wants a dense, factual summary full of the nouns it&amp;rsquo;s searching for, right at the top.&lt;/p&gt;
&lt;p&gt;&lt;img alt="The old opening: my name, my contact details, and a warm but entirely unmeasurable “I have a passion for what I do” profile statement." class="gallery-image" data-flex-basis="1055px" data-flex-grow="439" height="188" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog-570662.gitlab.io/technical-cv-writing-and-the-ai-filter/cv-profile-before.png" srcset="https://blog-570662.gitlab.io/technical-cv-writing-and-the-ai-filter/cv-profile-before_hu_6f720dcded107b1.png 800w, https://blog-570662.gitlab.io/technical-cv-writing-and-the-ai-filter/cv-profile-before.png 827w" width="827"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My numbers thin out the further back you go.&lt;/strong&gt; My recent roles are full of the data these tools love: a 75% reduction in deployment times, three thousand-odd Kubernetes clusters, a GitLab instance with four hundred thousand repositories. My older roles, written years ago in a more narrative style, are all &amp;ldquo;oversaw the delivery of solutions&amp;rdquo; with not a metric in sight. The machine reads that as a career that got vaguer over time, which is the opposite of true.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Four pages is at least two too many.&lt;/strong&gt; Parsers weight the first page or two most heavily. My education and the foundational stuff sat on pages three and four, where the algorithm barely bothers to look.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It couldn&amp;rsquo;t work out what I am.&lt;/strong&gt; This was the sharp one. With &amp;ldquo;pre-sales&amp;rdquo;, &amp;ldquo;client management&amp;rdquo; and &amp;ldquo;Managing Director&amp;rdquo; sitting next to deep technical keywords, the classifier genuinely can&amp;rsquo;t decide whether I&amp;rsquo;m a commercial manager who used to code or a hands-on engineer who drifted into management. As Gemini described it: &amp;ldquo;the algorithm gets confused &amp;hellip; It struggles to classify you: Are you a commercial manager who used to code, or a hands-on techie who got pushed into management?&amp;rdquo; So it does the safe thing and matches me to neither.&lt;/p&gt;
&lt;h2 id="what-im-actually-changing"&gt;What I&amp;rsquo;m actually changing
&lt;/h2&gt;&lt;p&gt;Knowing the hurdles, here&amp;rsquo;s what the rebuild looks like. This is the part I want to be useful, so it&amp;rsquo;s concrete.&lt;/p&gt;
&lt;p&gt;The tables are gone. In their place is a &amp;ldquo;Core Expertise&amp;rdquo; section, plain text the parser can read, grouped so my leadership sits next to my technical stack. And I&amp;rsquo;ve done the thing 2019-me was too much of a show-off to do: tiered it &lt;em&gt;honestly&lt;/em&gt;. Instead of &amp;ldquo;Expert+&amp;rdquo; against everything, there&amp;rsquo;s a primary tier of what I actually do day to day, a proficient tier I can deploy without blinking, and a frank &amp;ldquo;familiar, not current&amp;rdquo; tier for the languages I last touched in anger a decade ago. That honesty isn&amp;rsquo;t just decency. A wall of &amp;ldquo;expert at everything&amp;rdquo; reads as noise to a machine and as bluster to a human, and I&amp;rsquo;d been doing both.&lt;/p&gt;
&lt;p&gt;&lt;img alt="The replacement: a plain-text Core Expertise list a parser can read straight through, tiered honestly into what I do day to day, what I’m proficient in, and what I’m only still familiar with." class="gallery-image" data-flex-basis="288px" data-flex-grow="120" height="1149" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog-570662.gitlab.io/technical-cv-writing-and-the-ai-filter/cv-skills-after.jpg" srcset="https://blog-570662.gitlab.io/technical-cv-writing-and-the-ai-filter/cv-skills-after_hu_89689e72a4badcba.jpg 800w, https://blog-570662.gitlab.io/technical-cv-writing-and-the-ai-filter/cv-skills-after.jpg 1383w" width="1383"&gt;&lt;/p&gt;
&lt;p&gt;The subjective profile is replaced with a keyword-rich professional summary that says, in the first two lines, exactly what I am and at what scale.&lt;/p&gt;
&lt;p&gt;&lt;img alt="The replacement: a Professional Summary that leads with the role and the scale, in the nouns a parser is actually hunting for, with the person still audible underneath." class="gallery-image" data-flex-basis="623px" data-flex-grow="259" height="537" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog-570662.gitlab.io/technical-cv-writing-and-the-ai-filter/cv-profile-after.jpg" srcset="https://blog-570662.gitlab.io/technical-cv-writing-and-the-ai-filter/cv-profile-after_hu_79f08a915a901057.jpg 800w, https://blog-570662.gitlab.io/technical-cv-writing-and-the-ai-filter/cv-profile-after.jpg 1394w" width="1394"&gt; The keywords that mattered have been woven down &lt;em&gt;into&lt;/em&gt; the recent role bullets, so the parser sees them where it trusts them. And I&amp;rsquo;ve reframed the people-management and pre-sales language toward technical enablement and architectural advisory, because what I&amp;rsquo;m actually chasing is the technical-leader sweet spot: the person who owns the architecture and mentors the engineers, without the HR admin and the sales pitches. The CV now points at that, deliberately, so the classifier stops dithering.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s also a more personal beat in here. A previous employer handed me a role with a &amp;ldquo;VP&amp;rdquo; title, sold to me as exactly the technical-leadership job I&amp;rsquo;d been chasing. It wasn&amp;rsquo;t. The title turned out to be a pay-grade bracket rather than a description of the work, the work itself was hands-on firefighting with little of the leadership or empowerment I&amp;rsquo;d been promised, and I moved on within a few months. To a screening AI, that pairing is doubly awkward. A &amp;ldquo;VP&amp;rdquo; title files me as a meeting-heavy executive and rules me out of the hands-on Principal and Lead roles I actually want, and a sub-six-month stint trips the flight-risk flag that some trackers quietly score you down for. So the fix is to stop letting the inflated label do the talking: describe the functional reality of the work, retitle it to the technical track it actually was, and let the scale of what I wrestled with speak instead of the job title. Titles, it turns out, are for the pay band. The bullets are for the truth.&lt;/p&gt;
&lt;p&gt;&lt;img alt="The same recent roles on the new CV. The “VP” label is gone, retitled to the technical track the work actually was, and every entry leads with the work and the numbers, the things a parser weights and a human believes." class="gallery-image" data-flex-basis="344px" data-flex-grow="143" height="970" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog-570662.gitlab.io/technical-cv-writing-and-the-ai-filter/cv-experience.jpg" srcset="https://blog-570662.gitlab.io/technical-cv-writing-and-the-ai-filter/cv-experience_hu_569d0c416ee24504.jpg 800w, https://blog-570662.gitlab.io/technical-cv-writing-and-the-ai-filter/cv-experience.jpg 1394w" width="1394"&gt;&lt;/p&gt;
&lt;h2 id="keeping-myself-in-it"&gt;Keeping myself in it
&lt;/h2&gt;&lt;p&gt;Back to that ground rule. Every one of these changes is in service of getting past the machine to the human behind it, and neither reader is well served by a CV with the person scrubbed out of it. The screen, increasingly, is trained to notice generic generated phrasing and mark it down; the human, always, would rather read something with a pulse. So the keywords go in, the structure gets fixed, the metrics come forward, and the &lt;em&gt;voice stays mine&lt;/em&gt;. No &amp;ldquo;results-driven synergistic leveraging of cross-functional paradigms&amp;rdquo; that nobody would ever say out loud. That was the whole point of doing it this way: let the AI help reshape the &lt;em&gt;structure&lt;/em&gt; a parser cares about, while the &lt;em&gt;words&lt;/em&gt; stay mine, so what comes out is easier for a machine to approve, easier for a human to enjoy, and still unmistakably written by me. Optimising for the filter and sounding like myself turned out not to be in conflict at all.&lt;/p&gt;
&lt;h2 id="i-genuinely-dont-know-if-this-works-yet"&gt;I genuinely don&amp;rsquo;t know if this works yet
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s the part that makes this a post and not a victory lap. I don&amp;rsquo;t know if any of this lands. The old CV converted at around eighty per cent, on my own possibly-generous reckoning, right up until it abruptly didn&amp;rsquo;t. The new one is going out now, into the same market and the same filters that were stonewalling me a fortnight ago.&lt;/p&gt;
&lt;p&gt;So this is a promise as much as a post. I&amp;rsquo;m going to keep count, the way I should have all along, and come back with the actual numbers: did reshaping my CV for a reader with no eyes genuinely move the needle, or did I just make it uglier and learn nothing? Either way you&amp;rsquo;ll get the truth, because a follow-up that only reports good news isn&amp;rsquo;t worth writing. Watch this space, and if you&amp;rsquo;re sending CVs into the same silence, maybe try reading yours the way a machine would first. It&amp;rsquo;s a deeply odd exercise, and I suspect it&amp;rsquo;s now an essential one.&lt;/p&gt;</description></item></channel></rss>