<?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: Praveen Kumar</title>
    <description>The latest articles on DEV Community by Praveen Kumar (@praveen_kumar_9e6779032cb).</description>
    <link>https://dev.to/praveen_kumar_9e6779032cb</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%2F4151113%2F860c676c-4d05-40b7-ab5f-5b22feefb9a7.png</url>
      <title>DEV Community: Praveen Kumar</title>
      <link>https://dev.to/praveen_kumar_9e6779032cb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/praveen_kumar_9e6779032cb"/>
    <language>en</language>
    <item>
      <title>What I learned counting 600,000 live job adverts every night</title>
      <dc:creator>Praveen Kumar</dc:creator>
      <pubDate>Wed, 30 Sep 2026 00:20:55 +0000</pubDate>
      <link>https://dev.to/praveen_kumar_9e6779032cb/what-i-learned-counting-600000-live-job-adverts-every-night-5b4</link>
      <guid>https://dev.to/praveen_kumar_9e6779032cb/what-i-learned-counting-600000-live-job-adverts-every-night-5b4</guid>
      <description>&lt;p&gt;I'm building TUNAI, a job-matching assistant. Under it sits a crawler that&lt;br&gt;
reads live job adverts straight from employers' own applicant tracking&lt;br&gt;
systems (Greenhouse, Workday, Lever, Ashby, Oracle HCM and about fifteen&lt;br&gt;
others) across the UK, the US, Canada and Australia. Today that is about&lt;br&gt;
600,000 live adverts, recounted every night.&lt;/p&gt;

&lt;p&gt;Once you hold that many adverts, you start noticing things no single job&lt;br&gt;
seeker could. I put the odd ones on a page that updates itself:&lt;br&gt;
&lt;a href="https://jobs.tun-ai.com/insights" rel="noopener noreferrer"&gt;jobs.tun-ai.com/insights&lt;/a&gt;. Here are a&lt;br&gt;
few, and then the three bugs that nearly made those numbers lie.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;34,000 live adverts say they were posted more than a year ago&lt;/strong&gt;, 6% of
the adverts that give a date. The oldest claims 2010. Another 66,000 are
more than six months old.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3,100 adverts have been reposted five or more times.&lt;/strong&gt; One has been
reposted 31 times.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Friday is the busiest day&lt;/strong&gt;: 20% of UK and US adverts go up on a
Friday, and only 4% at the weekend. In the UK, 31% of timed adverts
appear between 2pm and 5pm.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2,500 US job titles contain an exclamation mark.&lt;/strong&gt; The UK has 79.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three live titles still ask for a "rockstar"&lt;/strong&gt;, and five for a
"ninja". The hype word that won is "champion", with 140.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every figure on the page carries the number of adverts it rests on and the&lt;br&gt;
caveat that must travel with it. The posting dates, for example, are the&lt;br&gt;
employers' own, and plenty of the old ones are evergreen adverts kept open&lt;br&gt;
to collect CVs rather than to fill one job. The whole table is a CSV under&lt;br&gt;
CC BY, also on &lt;a href="https://www.kaggle.com/datasets/praveenkpandu/tunai-job-market-facts-uk-us" rel="noopener noreferrer"&gt;Kaggle&lt;/a&gt;,&lt;br&gt;
&lt;a href="https://huggingface.co/datasets/PraveenKPandu/tunai-job-market-facts" rel="noopener noreferrer"&gt;Hugging Face&lt;/a&gt;&lt;br&gt;
and &lt;a href="https://doi.org/10.5281/zenodo.23048127" rel="noopener noreferrer"&gt;Zenodo&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three bugs that nearly lied to me
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. The same job, listed twice by the same employer.&lt;/strong&gt; Oracle HCM lets one&lt;br&gt;
company run several career sites, and each site serves the same&lt;br&gt;
requisitions. Stored naively, 43,704 of 61,111 eligible Oracle adverts sat&lt;br&gt;
in 15,035 groups of byte-identical adverts. Merging on "similar text" had&lt;br&gt;
once destroyed hundreds of real vacancies, so the fix is deliberately&lt;br&gt;
narrow: a job points at the oldest of its group only when the source,&lt;br&gt;
title, place and the advert text are all identical, and both rows stay in&lt;br&gt;
the corpus. Only one gets a public page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. An index that was never used.&lt;/strong&gt; Postgres partial indexes only apply&lt;br&gt;
when the query's predicate matches the index's. Our indexes said&lt;br&gt;
&lt;code&gt;WHERE live&lt;/code&gt;; our queries said &lt;code&gt;live IS true&lt;/code&gt;. To a human those are the&lt;br&gt;
same; to the planner they are not, so the vector (HNSW) and GIN indexes&lt;br&gt;
sat unused and a match took 50 to 130 seconds. If you use partial indexes,&lt;br&gt;
check &lt;code&gt;idx_scan&lt;/code&gt; on each of them. Ours read zero.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. A reader that stopped too early.&lt;/strong&gt; The "how many adverts state pay"&lt;br&gt;
figure said 94% of US adverts give no pay. Industry research says roughly&lt;br&gt;
half do, so I sampled 200 of our "no pay" US adverts by hand: 43 stated&lt;br&gt;
pay in text we already held, and 42 of those put it after the 600th&lt;br&gt;
character, which is exactly where our reader stopped. US adverts tend to&lt;br&gt;
put the salary range near the end. The figure is&lt;br&gt;
withdrawn until the fix is certified. The lesson I keep relearning: when&lt;br&gt;
your number disagrees with everyone else's, check your reader before you&lt;br&gt;
publish the surprise.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it's for
&lt;/h2&gt;

&lt;p&gt;The counting exists because the product matches people to jobs: it ranks&lt;br&gt;
live adverts against your CV and keeps a shortlist current. There is also&lt;br&gt;
a free &lt;a href="https://jobs.tun-ai.com/jobs/ats-checker" rel="noopener noreferrer"&gt;ATS CV checker&lt;/a&gt; that&lt;br&gt;
shows how an applicant tracking system reads your CV, no sign-in needed.&lt;/p&gt;

&lt;p&gt;If a number on the insights page looks wrong to you, I would genuinely like&lt;br&gt;
to hear it.&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>python</category>
      <category>postgres</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
