<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: python Akshay</title>
    <description>The latest articles on DEV Community by python Akshay (@akshay_js).</description>
    <link>https://dev.to/akshay_js</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2155188%2F17ffcd40-9ef9-4e4c-b3dc-e5f90eec51e4.png</url>
      <title>DEV Community: python Akshay</title>
      <link>https://dev.to/akshay_js</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/akshay_js"/>
    <language>en</language>
    <item>
      <title>Your First Resume for Campus Placements: A Developer-Friendly Guide for Indian Freshers</title>
      <dc:creator>python Akshay</dc:creator>
      <pubDate>Mon, 12 Oct 2026 14:04:06 +0000</pubDate>
      <link>https://dev.to/akshay_js/your-first-resume-for-campus-placements-a-developer-friendly-guide-for-indian-freshers-56na</link>
      <guid>https://dev.to/akshay_js/your-first-resume-for-campus-placements-a-developer-friendly-guide-for-indian-freshers-56na</guid>
      <description>&lt;p&gt;Placement season is a strange sprint. Companies arrive back to back, shortlists drop overnight, and one PDF has to clear screening software, a 10-second recruiter skim, and then an interviewer who reads every line while you sit opposite them.&lt;/p&gt;

&lt;p&gt;You can't control the cutoffs or the interview panel. You can control that PDF. Here's how I'd put one together as a fresher today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rule zero: one page, one column
&lt;/h2&gt;

&lt;p&gt;No fresher needs two pages. Recruiters screening an entire batch won't reach page two anyway.&lt;/p&gt;

&lt;p&gt;Stick to a &lt;strong&gt;single column&lt;/strong&gt;. Fancy two-column templates often confuse applicant tracking systems (ATS), which read top to bottom; your skills sidebar can end up stitched into your education line. Skip photos, tables, text boxes, icon-only labels and skill bars. "Java ★★★★☆" tells a recruiter nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The order of sections
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Header&lt;/li&gt;
&lt;li&gt;Two-line summary (optional)&lt;/li&gt;
&lt;li&gt;Education&lt;/li&gt;
&lt;li&gt;Technical skills&lt;/li&gt;
&lt;li&gt;Projects&lt;/li&gt;
&lt;li&gt;Internships and training&lt;/li&gt;
&lt;li&gt;Achievements and positions of responsibility&lt;/li&gt;
&lt;li&gt;Relevant certifications&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Experienced engineers lead with work history. You lead with what you actually have: your education and what you've built.&lt;/p&gt;

&lt;h2&gt;
  
  
  Header: get the boring bits right
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use a professional email, ideally &lt;a href="mailto:firstname.lastname@"&gt;firstname.lastname@&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Write links as plain text so they survive parsing: &lt;code&gt;github.com/yourname&lt;/code&gt;, &lt;code&gt;linkedin.com/in/yourname&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Leave out date of birth, full address, father's name, religion and marital status. They eat space and add nothing for most private-sector roles. (Government and PSU forms have their own formats; follow those exactly.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary: delete the "objective"
&lt;/h2&gt;

&lt;p&gt;"Seeking a challenging position in a reputed organisation…" appears on thousands of resumes. If you want a summary, write two lines: target role, strongest area, one proof point. For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Final-year B.Tech (CSE) student aiming for backend roles. Built and deployed two full-stack projects using Node.js and PostgreSQL; completed a two-month internship on an internal reporting tool.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Swap in your real details.&lt;/p&gt;

&lt;h2&gt;
  
  
  Education: exact, not rounded
&lt;/h2&gt;

&lt;p&gt;Spell out degree, branch, college, university and batch, because recruiters often filter on branch and passing year. Write your CGPA exactly as your university reports it. A 7.86 stays 7.86; mismatches with placement-cell records cost you trust. Class XII and Class X (board plus percentage) are usually expected on Indian campus resumes, one line each.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skills: grouped, and only what you can defend
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Languages : Java, Python, C++
Web       : React, Node.js, Express
Databases : MySQL, MongoDB
Tools     : Git, Docker, Postman
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Treat every item as a possible interview question. One tutorial on Kubernetes doesn't earn it a spot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Projects: your real work experience
&lt;/h2&gt;

&lt;p&gt;For most freshers this is the section that wins the interview. For each project, give it a name, the stack, a link, and two or three bullets that say what &lt;em&gt;you&lt;/em&gt; built and what it does. Start bullets with a verb ("Built", "Designed", "Reduced") and be specific about your part, especially for team projects. Two solid projects you can explain end to end beat five copied ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Internships, achievements, certifications
&lt;/h2&gt;

&lt;p&gt;List internships with organisation, role, dates and one or two concrete bullets. Under achievements, hackathon results, coding-contest ranks and club leadership roles all count; keep each to one line. Include certifications only when they relate to the role.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you hit submit
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Export as PDF, then select all, copy and paste it into a text editor. If the text comes out jumbled, an ATS will struggle too.&lt;/li&gt;
&lt;li&gt;Read the job description and make sure skills you genuinely have are named the way the company names them.&lt;/li&gt;
&lt;li&gt;Name the file sensibly: &lt;code&gt;Firstname_Lastname_Resume.pdf&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want a head start on layout, &lt;a href="https://www.imperfectors.com/resume?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=backlinks" rel="noopener noreferrer"&gt;Imperfectors&lt;/a&gt; is a free resume builder with one-column, ATS-safe templates and a watermark-free PDF download after email verification. If you'd like to see which keywords from a specific job description your resume is missing, that's the &lt;a href="https://www.imperfectors.com/pricing?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=backlinks" rel="noopener noreferrer"&gt;Pro plan&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Good luck this season. What tripped you up on your first placement resume? Tell me in the comments.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Akshay Arora is a full-stack developer in New Delhi building &lt;a href="https://www.imperfectors.com/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=backlinks" rel="noopener noreferrer"&gt;Imperfectors&lt;/a&gt;, a free ATS-friendly resume builder.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>beginners</category>
      <category>resume</category>
      <category>india</category>
    </item>
    <item>
      <title>Tailoring a Developer Resume to a Job Posting: A Keyword Workflow That Stays Honest</title>
      <dc:creator>python Akshay</dc:creator>
      <pubDate>Mon, 12 Oct 2026 13:42:31 +0000</pubDate>
      <link>https://dev.to/akshay_js/tailoring-a-developer-resume-to-a-job-posting-a-keyword-workflow-that-stays-honest-lb6</link>
      <guid>https://dev.to/akshay_js/tailoring-a-developer-resume-to-a-job-posting-a-keyword-workflow-that-stays-honest-lb6</guid>
      <description>&lt;p&gt;"Use the words in the job description" is correct advice, but it isn't a method. Taken literally, it ends with a wall of buzzwords pasted under Skills and no change in callbacks. Below is a repeatable workflow: pull out the right terms, rank them, place them where your experience proves them, and stop before it turns into keyword soup. After a couple of tries it takes 15–20 minutes per application.&lt;/p&gt;

&lt;h2&gt;
  
  
  What matching is for
&lt;/h2&gt;

&lt;p&gt;Apply on a company's careers page and your resume usually lands in an applicant tracking system that extracts the text and lets recruiters search and filter. Someone hiring a backend engineer may search "Go," "Kubernetes" or "distributed systems." If you have those skills but describe them differently, or hide them in a paragraph, you're harder to find. The goal is to be findable for what you can genuinely do, not to game software.&lt;/p&gt;

&lt;p&gt;That assumes your text extracts cleanly. If you're unsure, this &lt;a href="https://www.imperfectors.com/blog/ats-resume-format-guide?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;breakdown of what ATS parsers read and what breaks them&lt;/a&gt; covers headings, dates, columns and file types.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pass 1 and pass 2 over the posting
&lt;/h2&gt;

&lt;p&gt;First read for meaning: will this person build APIs, run infrastructure, or ship UI? Then read for terms, sorted into four groups:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Group&lt;/th&gt;
&lt;th&gt;Backend examples&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Title&lt;/td&gt;
&lt;td&gt;Backend Engineer, SDE-2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tools and skills&lt;/td&gt;
&lt;td&gt;Go, PostgreSQL, Kafka, Kubernetes, AWS, gRPC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Practices&lt;/td&gt;
&lt;td&gt;code review, CI/CD, observability, on-call&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context&lt;/td&gt;
&lt;td&gt;payments, high-throughput, B2B SaaS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Notice where each term sits. The title, the opening paragraph and the "Requirements" list outweigh "Nice to have."&lt;/p&gt;

&lt;h2&gt;
  
  
  Rank them
&lt;/h2&gt;

&lt;p&gt;Split the terms into &lt;strong&gt;must-have&lt;/strong&gt; (title, required skills, anything repeated, usually 5–10) and &lt;strong&gt;nice-to-have&lt;/strong&gt; (another 5–10). A term that shows up in the title, the summary and the requirements is almost certainly a must-have.&lt;/p&gt;

&lt;h2&gt;
  
  
  Audit your resume
&lt;/h2&gt;

&lt;p&gt;Mark each term with one of four labels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Present&lt;/strong&gt; in the employer's wording&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reworded:&lt;/strong&gt; "Postgres" vs "PostgreSQL," "K8s" vs "Kubernetes"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;True but missing:&lt;/strong&gt; you did it and never wrote it down&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not true:&lt;/strong&gt; you don't have this skill&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Edit only the reworded and true-but-missing items. The "not true" list is information, not a to-do list.&lt;/p&gt;

&lt;p&gt;A quick script speeds up the first pass:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;
&lt;span class="n"&gt;jd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jd.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;cv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;resume.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;terms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;go&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;postgresql&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kafka&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kubernetes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aws&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grpc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ci/cd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;observability&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;terms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;n_jd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;escape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jd&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;n_cv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;escape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cv&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OK     &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n_cv&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MISSING&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;JD:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n_jd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CV:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n_cv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It won't know that Postgres and PostgreSQL are the same, but the gaps stand out. Make &lt;code&gt;resume.txt&lt;/code&gt; by copying all the text out of your PDF, which also confirms the PDF contains real text.&lt;/p&gt;

&lt;h2&gt;
  
  
  Place each term where the evidence lives
&lt;/h2&gt;

&lt;p&gt;A keyword is strongest when it appears twice: once in Skills, where it's searchable, and once in a bullet, where it's believable. Reorder Skills so the must-haves come first without deleting the rest. Then rewrite one or two bullets per relevant role.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Before: Worked on backend services for the payments team.&lt;/p&gt;

&lt;p&gt;After: Built and maintained Go services for payment reconciliation on PostgreSQL; added tracing and dashboards that cut time-to-diagnose for on-call issues.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That bullet covers Go, PostgreSQL, payments and observability because that was the actual work. If you can't stand behind a result, describe the work and skip the result. And if the posting says "Backend Engineer" while your summary says "Full-stack developer," lead with backend if that's truly your strength.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mirror their wording once, then stop
&lt;/h2&gt;

&lt;p&gt;Write "CI/CD" at least once if that's their term. Once in Skills plus once or twice in context is enough. Warning signs that you've gone too far: 40 items under Skills, the same word in every bullet, tools you've only read about, or a section that reads aloud like a tag cloud. Interviewers ask about every line.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frontend example
&lt;/h2&gt;

&lt;p&gt;Posting: &lt;em&gt;Frontend Engineer, strong React and TypeScript, building our design system; accessibility (WCAG), Jest and Playwright testing, performance work required; Next.js a plus.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Audit: React and TypeScript present. "Component library" should also be called "design system." Accessibility is true but missing (you fixed keyboard navigation). Playwright isn't true, since you used Cypress, so list Cypress.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Built a shared React + TypeScript component library (internal design system) used across three product teams; added keyboard navigation and ARIA labels to meet WCAG guidelines, with Jest and Cypress tests.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Speeding up the comparison
&lt;/h2&gt;

&lt;p&gt;Doing it by hand is the most reliable approach, because you decide what's true. Tools can speed up the comparison. Imperfectors, which I'm building, includes &lt;a href="https://www.imperfectors.com/pricing?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;job-description keyword matching&lt;/a&gt; on its ₹499/month Pro plan: paste a JD and see matched and missing keywords. The resume builder itself is free. Treat any tool's output as a checklist, never a verdict.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Akshay Arora builds &lt;a href="https://www.imperfectors.com/?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;Imperfectors&lt;/a&gt;, a free ATS-friendly resume builder.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>career</category>
      <category>beginners</category>
      <category>resume</category>
    </item>
    <item>
      <title>How to Match Your Resume to a Job Description (Without Keyword Stuffing)</title>
      <dc:creator>python Akshay</dc:creator>
      <pubDate>Sun, 11 Oct 2026 11:05:16 +0000</pubDate>
      <link>https://dev.to/akshay_js/how-to-match-your-resume-to-a-job-description-without-keyword-stuffing-4odn</link>
      <guid>https://dev.to/akshay_js/how-to-match-your-resume-to-a-job-description-without-keyword-stuffing-4odn</guid>
      <description>&lt;p&gt;&lt;em&gt;A practical method for developers, with real examples from software engineering job descriptions.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most advice about "ATS keywords" boils down to "use the words in the job description." That's true, but it's not a method. It leads people to paste a block of buzzwords into their skills section and wonder why nothing changes.&lt;/p&gt;

&lt;p&gt;This post is a repeatable process: you extract the right terms, sort them by priority, find where they honestly belong in your resume, and stop before it turns into a word cloud. It takes 15–20 minutes per application once you've done it a couple of times.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why matching matters at all
&lt;/h2&gt;

&lt;p&gt;When you apply through a company's careers page, your resume usually goes into an applicant tracking system. It extracts the text, builds a candidate profile, and lets recruiters &lt;strong&gt;search and filter&lt;/strong&gt;. A recruiter looking for a backend engineer might search for "Go," "Kubernetes" or "distributed systems."&lt;/p&gt;

&lt;p&gt;If you have those skills but your resume calls them something else, or buries them in a paragraph, you're harder to find. Keyword matching is about &lt;strong&gt;being findable for the things you can actually do&lt;/strong&gt;. It's not about fooling software.&lt;/p&gt;

&lt;p&gt;(Matching only works if your resume's text extracts cleanly in the first place. If you're not sure, this &lt;a href="https://www.imperfectors.com/blog/ats-resume-format-guide" rel="noopener noreferrer"&gt;guide to what ATS parsers read and what breaks them&lt;/a&gt; covers headings, dates, columns and file types.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Read the JD once for meaning, then again for terms
&lt;/h2&gt;

&lt;p&gt;On the first pass, just answer: what is this person actually going to do? Build APIs? Own infrastructure? Ship UI?&lt;/p&gt;

&lt;p&gt;On the second pass, highlight terms in four buckets:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bucket&lt;/th&gt;
&lt;th&gt;Example terms from a backend JD&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Role title&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Backend Engineer, Software Engineer II, SDE-2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hard skills / tools&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Go, PostgreSQL, Kafka, Kubernetes, AWS, gRPC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Practices&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;code review, CI/CD, observability, on-call&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Domain / context&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;payments, high-throughput, B2B SaaS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Also note &lt;strong&gt;where&lt;/strong&gt; each term appears. Words in the job title, the first paragraph, and the "Requirements" or "Must have" list matter most. "Nice to have" matters less.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Sort into must-have vs nice-to-have
&lt;/h2&gt;

&lt;p&gt;Make two short lists:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Must-have&lt;/strong&gt; (title + required skills + anything repeated): usually 5–10 terms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nice-to-have&lt;/strong&gt; (preferred tools, context words): another 5–10.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a term appears in the title, the summary &lt;em&gt;and&lt;/em&gt; the requirements, it's almost certainly a must-have.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Audit your resume against the list
&lt;/h2&gt;

&lt;p&gt;Go through each term and mark it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Present&lt;/strong&gt;: already in your resume, in the employer's wording&lt;/li&gt;
&lt;li&gt;🔁 &lt;strong&gt;Different wording&lt;/strong&gt;: you wrote "Postgres," they wrote "PostgreSQL"; you wrote "K8s," they wrote "Kubernetes"&lt;/li&gt;
&lt;li&gt;➕ &lt;strong&gt;Missing but true&lt;/strong&gt;: you've done it, you just didn't mention it&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Missing and not true&lt;/strong&gt;: you don't have this skill&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your edits come from 🔁 and ➕. The ❌ list is information, not a to-do list. Don't add those.&lt;/p&gt;

&lt;p&gt;If you want a quick way to do the first pass, a tiny script works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;

&lt;span class="n"&gt;jd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jd.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;resume&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;resume.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;   &lt;span class="c1"&gt;# paste your resume's extracted text here
&lt;/span&gt;
&lt;span class="n"&gt;terms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;go&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;postgresql&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kafka&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kubernetes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aws&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grpc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ci/cd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;observability&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;code review&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;distributed systems&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;terms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;in_jd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;escape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jd&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;in_cv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;escape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resume&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OK &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;in_cv&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MISSING&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; JD:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;in_jd&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  resume:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;in_cv&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's crude (it won't know "Postgres" equals "PostgreSQL"), but it makes the gaps obvious. Get &lt;code&gt;resume.txt&lt;/code&gt; by opening your PDF, selecting all, and pasting into a text file; that also confirms your PDF has real text.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Put each keyword where the proof is
&lt;/h2&gt;

&lt;p&gt;A keyword is strongest when it appears in &lt;strong&gt;two places&lt;/strong&gt;: your Skills section (so it's searchable and scannable) and a bullet (so it's credible).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skills section:&lt;/strong&gt; reorder so the JD's must-haves come first. Don't delete the rest of your stack, just move it down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bullets:&lt;/strong&gt; rewrite one or two bullets per relevant role so they show the skill in use.&lt;/p&gt;

&lt;p&gt;Before:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Worked on backend services for the payments team.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Built and maintained Go services for payment reconciliation on PostgreSQL; added tracing and dashboards that cut time-to-diagnose for on-call issues.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The second bullet hits "Go," "PostgreSQL," "payments" and "observability" (via tracing and dashboards) &lt;strong&gt;because that's what the work was&lt;/strong&gt;. Only write what's true; if you don't have a result you can stand behind, describe the work clearly and skip the result.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary / title line:&lt;/strong&gt; if the JD says "Backend Engineer" and your summary says "Full-stack developer," and backend really is your strength, adjust the summary to lead with backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Use their wording, once
&lt;/h2&gt;

&lt;p&gt;If the JD says "CI/CD" and you wrote "build pipelines," use "CI/CD" at least once. If they say "React.js" and you wrote "React," either is fine for humans; for search, matching their exact form once doesn't hurt.&lt;/p&gt;

&lt;p&gt;You don't need to repeat a keyword five times. Once in Skills and once or twice in context is plenty.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Stop before it becomes stuffing
&lt;/h2&gt;

&lt;p&gt;Signs you've gone too far:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your Skills section has 40 items&lt;/li&gt;
&lt;li&gt;The same term appears in every bullet&lt;/li&gt;
&lt;li&gt;You've added tools you've only read about&lt;/li&gt;
&lt;li&gt;Reading it aloud sounds like a tag cloud&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recruiters read the shortlisted resumes, and interviewers ask about every line. Stuffing helps you get found and then hurts you in the room.&lt;/p&gt;

&lt;h2&gt;
  
  
  A worked mini-example
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;JD excerpt (frontend role):&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We're looking for a Frontend Engineer with strong React and TypeScript skills to build our design system. Experience with accessibility (WCAG), testing (Jest, Playwright) and performance optimisation is required. Next.js is a plus.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Must-haves:&lt;/strong&gt; Frontend Engineer, React, TypeScript, design system, accessibility/WCAG, Jest, Playwright, performance&lt;br&gt;
&lt;strong&gt;Nice-to-have:&lt;/strong&gt; Next.js&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resume audit:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React ✅, TypeScript ✅&lt;/li&gt;
&lt;li&gt;"Component library" 🔁 → also say "design system" if that's what it was&lt;/li&gt;
&lt;li&gt;Accessibility ➕ (you fixed keyboard navigation but never mentioned it)&lt;/li&gt;
&lt;li&gt;Jest ✅, Playwright ❌ (you've used Cypress, not Playwright: list Cypress, don't claim Playwright)&lt;/li&gt;
&lt;li&gt;Performance ➕ (you reduced bundle size)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Edited bullet:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Built a shared React + TypeScript component library (internal design system) used across three product teams; added keyboard navigation and ARIA labels to meet WCAG guidelines, with Jest and Cypress tests.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Doing this faster
&lt;/h2&gt;

&lt;p&gt;The manual method above is the most reliable because you're the one judging what's true. Tools can speed up the comparison step.&lt;/p&gt;

&lt;p&gt;If you'd rather not run a script, several resume tools offer job-description matching. The one I'm building, Imperfectors, has &lt;strong&gt;&lt;a href="https://www.imperfectors.com/pricing" rel="noopener noreferrer"&gt;job-description keyword matching&lt;/a&gt;&lt;/strong&gt; on its Pro plan (₹499/month): paste a JD and see which keywords your resume matches and which are missing. The resume builder itself is free. Whatever tool you use, treat its output as a checklist, not a verdict, and apply the "only if it's true" rule.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How many keywords should I match?&lt;/strong&gt;&lt;br&gt;
There's no magic number. Aim to cover the must-haves you genuinely have, in Skills and in at least one bullet each.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I tailor my resume for every job?&lt;/strong&gt;&lt;br&gt;
For roles you really want, yes. A 15-minute pass is usually enough. For similar roles, keep two or three base versions (e.g. backend, full-stack) and tweak.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is a "match score" the same as what the employer sees?&lt;/strong&gt;&lt;br&gt;
No. Each tool calculates its own score. Employers' systems vary. Use scores as a rough guide to gaps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What about soft skills like "communication"?&lt;/strong&gt;&lt;br&gt;
Show them in bullets (e.g. "wrote the onboarding docs," "led code reviews"), rather than listing them as keywords.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>career</category>
      <category>resume</category>
      <category>jobs</category>
    </item>
  </channel>
</rss>
