<?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: Derrick Muturi</title>
    <description>The latest articles on DEV Community by Derrick Muturi (@muturiii).</description>
    <link>https://dev.to/muturiii</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%2F4181764%2Fec772572-6d2c-49f9-a983-630c7d5a10c4.png</url>
      <title>DEV Community: Derrick Muturi</title>
      <link>https://dev.to/muturiii</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/muturiii"/>
    <language>en</language>
    <item>
      <title>We Built a CV Scanner That Compares Skills Against Real Jobs. Then Production Exposed a Bottleneck.</title>
      <dc:creator>Derrick Muturi</dc:creator>
      <pubDate>Fri, 06 Nov 2026 12:14:56 +0000</pubDate>
      <link>https://dev.to/muturiii/we-built-a-cv-scanner-that-compares-skills-against-real-jobs-then-production-exposed-a-bottleneck-4c14</link>
      <guid>https://dev.to/muturiii/we-built-a-cv-scanner-that-compares-skills-against-real-jobs-then-production-exposed-a-bottleneck-4c14</guid>
      <description>&lt;p&gt;Building an AI-powered application is one thing. Getting it to behave reliably when someone actually uses it is another.&lt;/p&gt;

&lt;p&gt;I've been building &lt;strong&gt;Glassbox&lt;/strong&gt;, a tool that compares the skills on a CV against skills mentioned in real tech job descriptions.&lt;/p&gt;

&lt;p&gt;The idea is straightforward: instead of assigning someone an unexplained career score, show them where their documented skills overlap with what employers are asking for.&lt;/p&gt;

&lt;p&gt;But the engineering turned out to be much more interesting than the original idea.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the pipeline works
&lt;/h2&gt;

&lt;p&gt;At a high level, Glassbox:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reads the uploaded CV and extracts its skills.&lt;/li&gt;
&lt;li&gt;Retrieves relevant tech job descriptions.&lt;/li&gt;
&lt;li&gt;Normalizes and compares the extracted skills against the job market.&lt;/li&gt;
&lt;li&gt;Uses title embeddings to help match relevant roles.&lt;/li&gt;
&lt;li&gt;Produces an analysis of skills in demand, overlaps and potential gaps.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The application uses a Next.js frontend, a Python backend, PostgreSQL, and an ONNX-based embedding component.&lt;/p&gt;

&lt;p&gt;One design principle has been important throughout: &lt;strong&gt;the results need to be explainable&lt;/strong&gt;. Seeing that six of the ten most-requested skills for a role are already on your CV is more useful than receiving a mysterious 60% hiring score.&lt;/p&gt;

&lt;h2&gt;
  
  
  When production started struggling
&lt;/h2&gt;

&lt;p&gt;A recent production investigation uncovered a particularly expensive part of the pipeline.&lt;/p&gt;

&lt;p&gt;We measured two live scan requests:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Request A&lt;/th&gt;
&lt;th&gt;Request B&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Job search&lt;/td&gt;
&lt;td&gt;15.7s&lt;/td&gt;
&lt;td&gt;16.6s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Embedding&lt;/td&gt;
&lt;td&gt;27.1s&lt;/td&gt;
&lt;td&gt;31.1s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scoring&lt;/td&gt;
&lt;td&gt;0.23s&lt;/td&gt;
&lt;td&gt;0.22s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total request&lt;/td&gt;
&lt;td&gt;51.8s&lt;/td&gt;
&lt;td&gt;57.3s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;PDF extraction was almost negligible.&lt;/p&gt;

&lt;p&gt;The surprising part wasn't the AI model itself. It was the amount of repeated work being performed around it.&lt;/p&gt;

&lt;p&gt;Embedding thousands of job titles for each comparison could consume more time than extracting CV skills and scoring results combined.&lt;/p&gt;

&lt;p&gt;Earlier, we had also investigated a memory-sensitive embedding path and introduced bounded inference batches of 32 inputs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing a bounded embedding cache
&lt;/h2&gt;

&lt;p&gt;We then implemented a cache for job-title vectors.&lt;/p&gt;

&lt;p&gt;The reasoning was simple: job titles frequently repeat across requests. If the same title has already been embedded by the same model, we shouldn't perform the inference again.&lt;/p&gt;

&lt;p&gt;We deliberately kept the cache bounded at 4,096 entries instead of letting process memory grow indefinitely.&lt;/p&gt;

&lt;p&gt;Importantly, CV-derived profiles remain outside that cache.&lt;/p&gt;

&lt;p&gt;We benchmarked the change against the same synthetic workload containing 4,000 jobs.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Run&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cold&lt;/td&gt;
&lt;td&gt;9.68s&lt;/td&gt;
&lt;td&gt;8.02s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Warm run 1&lt;/td&gt;
&lt;td&gt;13.03s&lt;/td&gt;
&lt;td&gt;1.24s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Warm run 2&lt;/td&gt;
&lt;td&gt;8.27s&lt;/td&gt;
&lt;td&gt;1.14s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The fixture-backed responses produced identical JSON hashes before and after the change, including the job ordering and the 3,893 jobs retained by the existing role filter.&lt;/p&gt;

&lt;p&gt;That mattered. A performance improvement that silently changes the analysis is not necessarily an improvement.&lt;/p&gt;

&lt;h2&gt;
  
  
  The important caveat
&lt;/h2&gt;

&lt;p&gt;These were &lt;strong&gt;local synthetic benchmarks&lt;/strong&gt;, not production end-to-end measurements after deployment.&lt;/p&gt;

&lt;p&gt;Only three runs were performed, so they aren't enough to establish reliable latency percentiles.&lt;/p&gt;

&lt;p&gt;And there's another constraint: the backend can scale to zero, meaning an in-memory cache is lost whenever the container shuts down.&lt;/p&gt;

&lt;p&gt;Cold scans still need embedding, and job retrieval alone was taking roughly 16 seconds in the measured production requests.&lt;/p&gt;

&lt;p&gt;So caching helps, but it doesn't finish the optimization story.&lt;/p&gt;

&lt;h2&gt;
  
  
  What building Glassbox has taught me
&lt;/h2&gt;

&lt;p&gt;Three lessons stand out:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Measure stages separately.&lt;/strong&gt; An endpoint taking 50 seconds tells you very little until you know where those seconds are going.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Preserve behavior when optimizing.&lt;/strong&gt; Identical output and bounded memory mattered just as much as lower latency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building a working AI demo isn't the same as building a usable product.&lt;/strong&gt; Loading states, production failures, long waits and recovery paths are part of the user experience.&lt;/p&gt;

&lt;p&gt;We're still improving Glassbox, and I'm interested in hearing how other developers approach caching, CPU inference and latency in resource-constrained applications.&lt;/p&gt;

&lt;p&gt;If you're curious about the product itself, you can try it here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://seeglassbox.com/?utm_source=devto&amp;amp;utm_medium=community&amp;amp;utm_campaign=cv_scan_launch*" rel="noopener noreferrer"&gt;&lt;strong&gt;Glassbox&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if you've built a similar pipeline, I'd especially love to know: &lt;strong&gt;how do you balance cold-start costs against keeping an inference service warm?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>backend</category>
      <category>performance</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>What Do Entry-Level Software Jobs Actually Ask For Compared With Senior Roles?</title>
      <dc:creator>Derrick Muturi</dc:creator>
      <pubDate>Wed, 14 Oct 2026 08:58:12 +0000</pubDate>
      <link>https://dev.to/muturiii/what-do-entry-level-software-jobs-actually-ask-for-compared-with-senior-roles-1fb8</link>
      <guid>https://dev.to/muturiii/what-do-entry-level-software-jobs-actually-ask-for-compared-with-senior-roles-1fb8</guid>
      <description>&lt;p&gt;People often talk about entry-level software jobs as if they’re just senior roles with a smaller salary. But do the job advertisements actually ask for the same skills?&lt;/p&gt;

&lt;p&gt;I wanted to look beyond the usual discussions and compare what employers list in their job ads.&lt;/p&gt;

&lt;p&gt;I collected software job advertisements for the week of October 12, 2026, and compared 559 entry-level jobs with 2,237 senior jobs. Here’s what stood out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Entry-level jobs list fewer required skills, but the list isn’t exactly short&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The typical entry-level software job in the sample listed four required skills. For senior roles, that number was six.&lt;/p&gt;

&lt;p&gt;That’s a difference, but four required skills can still represent a substantial amount of knowledge, particularly for someone trying to land their first job.&lt;/p&gt;

&lt;p&gt;And the number of skills alone doesn’t tell us how difficult those requirements are. Four highly specialized skills can be a bigger barrier than six familiar ones.&lt;/p&gt;

&lt;p&gt;Still, the difference suggests that the advertisements distinguish between what they expect from someone starting out and what they expect from a senior engineer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. C++ appears more often in entry-level ads&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One result I found interesting was the difference in programming languages.&lt;/p&gt;

&lt;p&gt;C++ appeared in 29% of the entry-level ads, compared with 14% of senior ads.&lt;/p&gt;

&lt;p&gt;That’s roughly twice the share.&lt;/p&gt;

&lt;p&gt;Kubernetes showed the opposite pattern. It appeared in 12% of entry-level ads and 25% of senior ads.&lt;/p&gt;

&lt;p&gt;These are two examples of how skill mentions can vary between experience levels. They don’t tell us why employers ask for particular skills, or whether those skills are essential to doing the job.&lt;/p&gt;

&lt;p&gt;But they do raise an interesting question: how much do the skills employers advertise for entry-level roles differ from those they advertise for experienced engineers?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Some entry-level ads mention several programming languages&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Of the 559 entry-level ads, 222 (about 40%) mentioned at least three programming languages.&lt;/p&gt;

&lt;p&gt;That might sound like a lot for a role aimed at someone starting their career.&lt;/p&gt;

&lt;p&gt;There’s an important qualification, though: this count includes languages mentioned as nice to have, not just languages listed as requirements.&lt;/p&gt;

&lt;p&gt;It would be misleading to interpret this as meaning that 40% of entry-level jobs require candidates to know three or more languages.&lt;/p&gt;

&lt;p&gt;It’s a count of what the advertisements mention, not a measure of what candidates must master before applying.&lt;/p&gt;

&lt;p&gt;That distinction matters when we’re trying to understand what job ads actually communicate to people entering the industry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;What can we conclude?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These numbers offer a snapshot of how the collected advertisements describe entry-level and senior software roles. They don’t tell us everything about hiring practices, and they can’t establish what the wider job market looks like.&lt;/p&gt;

&lt;p&gt;The data covers one week of advertisements from selected company career boards and other sources. The sample leans toward US-based tech and AI employers, so it isn’t representative of every employer or region.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://seeglassbox.com/market/entry-level-software" rel="noopener noreferrer"&gt;Glassbox&lt;/a&gt; to count the skills and requirements that appear in tech job ads and make those patterns easier to examine.&lt;/p&gt;

&lt;p&gt;I’ll be updating the counts weekly. It’ll be interesting to see which differences persist and which change as the collected job advertisements change.&lt;/p&gt;

</description>
      <category>career</category>
      <category>softwareengineering</category>
      <category>beginners</category>
      <category>datascience</category>
    </item>
  </channel>
</rss>
