<?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: Santosh Ravi Teja Goteti</title>
    <description>The latest articles on DEV Community by Santosh Ravi Teja Goteti (@santosh_ravitejagoteti_).</description>
    <link>https://dev.to/santosh_ravitejagoteti_</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%2F3943050%2F42608c1c-0bf6-4051-8458-e90cd2048453.png</url>
      <title>DEV Community: Santosh Ravi Teja Goteti</title>
      <link>https://dev.to/santosh_ravitejagoteti_</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/santosh_ravitejagoteti_"/>
    <language>en</language>
    <item>
      <title>Interviewers don't grade your system design diagram. They grade whether you can defend it.
Take a look at this System design prep app, play around with it and see if it can help you in any ways!</title>
      <dc:creator>Santosh Ravi Teja Goteti</dc:creator>
      <pubDate>Wed, 07 Oct 2026 01:49:18 +0000</pubDate>
      <link>https://dev.to/santosh_ravitejagoteti_/interviewers-dont-grade-your-system-design-diagram-they-grade-whether-you-can-defend-it-take-a-1b28</link>
      <guid>https://dev.to/santosh_ravitejagoteti_/interviewers-dont-grade-your-system-design-diagram-they-grade-whether-you-can-defend-it-take-a-1b28</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/santosh_ravitejagoteti_/i-built-a-system-design-app-that-teaches-why-not-what-5bda" class="crayons-story__hidden-navigation-link"&gt;I built a system design app that teaches why and helps you in interviews&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/santosh_ravitejagoteti_" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3943050%2F42608c1c-0bf6-4051-8458-e90cd2048453.png" alt="santosh_ravitejagoteti_ profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/santosh_ravitejagoteti_" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Santosh Ravi Teja Goteti
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Santosh Ravi Teja Goteti
                
                
              
              &lt;div id="story-author-preview-content-4804267" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/santosh_ravitejagoteti_" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3943050%2F42608c1c-0bf6-4051-8458-e90cd2048453.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Santosh Ravi Teja Goteti&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/santosh_ravitejagoteti_/i-built-a-system-design-app-that-teaches-why-not-what-5bda" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 6&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/santosh_ravitejagoteti_/i-built-a-system-design-app-that-teaches-why-not-what-5bda" id="article-link-4804267"&gt;
          I built a system design app that teaches why and helps you in interviews
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/showdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;showdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/systemdesign"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;systemdesign&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/santosh_ravitejagoteti_/i-built-a-system-design-app-that-teaches-why-not-what-5bda" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/santosh_ravitejagoteti_/i-built-a-system-design-app-that-teaches-why-not-what-5bda#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              1&lt;span class="hidden s:inline"&gt;&amp;nbsp;comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            6 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>architecture</category>
      <category>career</category>
      <category>interview</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>I built a system design app that teaches why and helps you in interviews</title>
      <dc:creator>Santosh Ravi Teja Goteti</dc:creator>
      <pubDate>Tue, 06 Oct 2026 04:19:54 +0000</pubDate>
      <link>https://dev.to/santosh_ravitejagoteti_/i-built-a-system-design-app-that-teaches-why-not-what-5bda</link>
      <guid>https://dev.to/santosh_ravitejagoteti_/i-built-a-system-design-app-that-teaches-why-not-what-5bda</guid>
      <description>&lt;p&gt;SysDesign Studio is an open-source, interactive way to practice system design interviews. Evolve architectures step by step, trace failure paths, and defend every decision.&lt;/p&gt;

&lt;p&gt;Most system design prep teaches you to draw boxes: load balancer, cache, queue, done.&lt;/p&gt;

&lt;p&gt;Then the interviewer asks, &lt;em&gt;"Why a cache and not read replicas?"&lt;/em&gt; or &lt;em&gt;"What happens when that Redis node dies?"&lt;/em&gt; A memorized diagram can't answer either question.&lt;/p&gt;

&lt;p&gt;That gap is what interviews actually test. So I built &lt;strong&gt;SysDesign Studio&lt;/strong&gt;, an open-source app for practicing the reasoning behind the boxes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frv56wki47jo28jddrnh7.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frv56wki47jo28jddrnh7.gif" alt="SysDesign Studio: An architecture evolving from v1 to v7" width="759" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⭐ &lt;strong&gt;Source:&lt;/strong&gt; &lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Santoshrt999" rel="noopener noreferrer"&gt;
        Santoshrt999
      &lt;/a&gt; / &lt;a href="https://github.com/Santoshrt999/sysDesign-studio" rel="noopener noreferrer"&gt;
        sysDesign-studio
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;SysDesign Studio&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Learn to reason about systems, not just draw them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A polished learning app for system design interviews. It helps engineers reason through architecture decisions, trade-offs, bottlenecks, and failure modes instead of memorizing buzzwords.&lt;/p&gt;
&lt;p&gt;Built with Next.js, TypeScript, Tailwind CSS, and a content-driven problem model so each design lesson is easy to extend without touching the UI.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Author&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;This project is created and maintained by Santosh Goteti.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;About&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;SysDesign Studio is built for engineers who want to strengthen the mental models behind real systems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;why a component exists in the first place&lt;/li&gt;
&lt;li&gt;what problem it solves under realistic load&lt;/li&gt;
&lt;li&gt;which alternatives were considered and rejected&lt;/li&gt;
&lt;li&gt;what breaks first as scale increases&lt;/li&gt;
&lt;li&gt;how the design evolves from a simple starting point to a resilient system&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This repository turns those ideas into a guided interview-style learning journey.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why this project?&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;System design interviews are not about drawing fancy diagrams — they…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Santoshrt999/sysDesign-studio" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  The problem with how we prep
&lt;/h2&gt;

&lt;p&gt;Most resources show you the &lt;strong&gt;final&lt;/strong&gt; architecture of a system. That's like learning chess by staring at checkmate positions. You never see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why&lt;/strong&gt; each component showed up, and what number forced it in&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which alternatives&lt;/strong&gt; were on the table, and why they lost&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What breaks next&lt;/strong&gt;: every fix introduces a new failure mode&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How the design evolved&lt;/strong&gt; from one server to global scale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Interviewers aren't grading your diagram. They're grading whether you can defend it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works: a 7-stage interview flow
&lt;/h2&gt;

&lt;p&gt;Every problem follows the shape of a real interview:&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;What you practice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1. Understand&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Clarifying questions, plus how each answer changes the design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2. Size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Back-of-envelope math that always ends in a &lt;em&gt;"so what"&lt;/em&gt; for the design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3. Start simple&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;APIs, data model, sync vs. async, and the simplest design that works&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4. Evolve&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;v1 → v7, one bottleneck at a time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5. Flows&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Animated write, read, and &lt;strong&gt;failure&lt;/strong&gt; paths through the diagram&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;6. Deep dives&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The hard sub-problems, with options and a recommendation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;7. Defend&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Trade-offs, follow-up questions, and common mistakes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every evolution step uses the same strict template:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Problem → Evidence (numbers) → Options (each with a verdict) → Decision → New risks + mitigations → "Say it"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The &lt;strong&gt;"Say it"&lt;/strong&gt; line is what you'd literally say out loud to the interviewer. It's the piece I wished I'd had when I was preparing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four problems are fully written, with more on the way!
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Difficulty&lt;/th&gt;
&lt;th&gt;The core tension&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🔗 &lt;strong&gt;URL Shortener&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;A read-heavy key-value system where ID generation is the hard part&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🚦 &lt;strong&gt;Rate Limiter&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;A ~1 ms allow/deny decision on every request, with counters shared across a fleet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📞 &lt;strong&gt;Phone Directory&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;"Who's calling?": a lookup that must answer while the phone is still ringing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🕷️ &lt;strong&gt;Web Crawler&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Hard&lt;/td&gt;
&lt;td&gt;Politeness, dedupe, and a frontier that feeds thousands of fetchers without hammering anyone&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each one has 7 evolution steps, 7–8 flows (including failure scenarios), 3 deep dives, trade-offs, follow-ups, and mistakes to avoid.&lt;/p&gt;

&lt;p&gt;Here's a taste of each.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔗 URL Shortener, v3: "Cache the read path"
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fktwoi1grkt5hg7z8akxj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fktwoi1grkt5hg7z8akxj.png" alt="Evolve stage: cache added to the diagram" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; every redirect hits the database. That's 350K reads/s at peak against one primary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evidence:&lt;/strong&gt; a single Postgres primary handles roughly 10–20K primary-key lookups/s, so we're 20–30× over. Reads outnumber writes 100:1, and the traffic is heavily skewed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Options:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ &lt;strong&gt;Read replicas&lt;/strong&gt;: you'd need 25+ full copies, replication lag breaks the "creator clicks immediately" case, and it ignores the skew. &lt;em&gt;It's the expensive way to buy throughput.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Shard now&lt;/strong&gt;: sharding is coming for storage reasons, but for reads alone it's slower to roll out and costs more.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Cache-aside with Redis&lt;/strong&gt;: the hot set is about 100 GB, and you get a hit rate above 90%.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The insight that makes the cache win is that &lt;strong&gt;short-code → URL mappings never change&lt;/strong&gt;. The classic cache headache, invalidation, mostly disappears; the only exception is takedowns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New risks the step introduces:&lt;/strong&gt; a cache stampede on a viral link (fixed with single-flight request coalescing), losing a cache node (Redis Cluster with replicas), and scanners probing random codes (negative caching plus per-IP limits).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💬 &lt;strong&gt;Say it:&lt;/strong&gt; &lt;em&gt;"Short-code-to-URL mappings never change, so caching them is unusually safe. With 100:1 reads and a skewed distribution I expect a 90%+ hit rate, which brings DB load from 350K/s down to about 35K/s."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🚦 Rate Limiter: the race condition nobody draws
&lt;/h3&gt;

&lt;p&gt;The naive version is &lt;code&gt;GET count → compare → SET count&lt;/code&gt;. With two gateways, both can read 99 and both allow request #100. In a load test with 1,000 concurrent checks against a 100-token bucket, &lt;strong&gt;about 140 got through&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The step compares three fixes. GET/SET from the gateway is racy and slow. Optimistic locking (&lt;code&gt;WATCH/MULTI&lt;/code&gt;) is correct, but its retries pile up on hot keys exactly when you need speed. The winner is a &lt;strong&gt;token bucket in a single atomic Lua script&lt;/strong&gt;: one round trip, no race, and it uses Redis's clock so gateway clock skew doesn't matter.&lt;/p&gt;

&lt;p&gt;The deep dives then cover algorithm choice, how exact the count really needs to be, and the classic question: &lt;strong&gt;fail open or fail closed?&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📞 Phone Directory: the fastest lookup is the one you never make
&lt;/h3&gt;

&lt;p&gt;Caller ID has a hard deadline: the answer must arrive before the user picks up. The server path is already about 15 ms, but mobile p99 round trips run &lt;strong&gt;300–800 ms&lt;/strong&gt; on weak networks.&lt;/p&gt;

&lt;p&gt;Two tricks from this problem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A Bloom filter for unknown numbers.&lt;/strong&gt; About 30% of lookups are numbers we've never seen, so a cache can't help. A 3.6 GB Bloom filter answers "definitely not here" in memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An on-device snapshot.&lt;/strong&gt; The top 5M numbers cover about 50% of lookups but weigh only about 100 MB. They ship nightly through a CDN with daily deltas, so &lt;strong&gt;half of all lookups never leave the phone&lt;/strong&gt; and keep working offline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also covers the messy parts real systems face: number normalization, merging conflicting crowd-sourced names, and privacy-by-design deletion.&lt;/p&gt;

&lt;h3&gt;
  
  
  🕷️ Web Crawler: why the frontier is &lt;em&gt;not&lt;/em&gt; "just a Kafka topic"
&lt;/h3&gt;

&lt;p&gt;The estimate that changes everything: politeness limits you to about &lt;strong&gt;1 request/s per host&lt;/strong&gt;. To reach 2,000 pages/s, you must be fetching from &lt;strong&gt;at least 2,000 different hosts at every moment&lt;/strong&gt;. A 500M-URL site would take about 16 years at that rate.&lt;/p&gt;

&lt;p&gt;So the frontier can't be one global FIFO. A broker can't express &lt;em&gt;"not before time T, per host, with priority."&lt;/em&gt; The design uses a purpose-built scheduler instead: priority front queues, a back queue per host, and a min-heap keyed on &lt;code&gt;next_allowed_time&lt;/code&gt;. Kafka still shows up, between fetch and parse, where ordering and timing don't matter.&lt;/p&gt;

&lt;p&gt;The failure flows cover slow and hostile sites, fetchers dying mid-fetch, &lt;strong&gt;crawler traps&lt;/strong&gt; (infinite URL spaces), and a frontier partition losing its politeness state during failover.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure paths are first-class
&lt;/h2&gt;

&lt;p&gt;Every problem includes animated failure flows that run on the final architecture, with failing hops drawn in red:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpinx9zj98glssuaog4t9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpinx9zj98glssuaog4t9.png" alt="Failure flow: a Redis cache node dies, the client times out and the circuit breaker opens" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A cache node dies mid-spam-wave&lt;/li&gt;
&lt;li&gt;A viral link triggers a stampede&lt;/li&gt;
&lt;li&gt;A whole region goes down&lt;/li&gt;
&lt;li&gt;An event gets processed twice&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each flow can also be viewed as an auto-generated &lt;strong&gt;sequence diagram&lt;/strong&gt;.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc39y0zx765u91y5zzhxs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc39y0zx765u91y5zzhxs.png" alt="The same failure flow as an auto-generated Mermaid sequence diagram" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Under the hood
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 15&lt;/strong&gt;, &lt;strong&gt;React 19&lt;/strong&gt;, &lt;strong&gt;TypeScript&lt;/strong&gt;, &lt;strong&gt;Tailwind v4&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@xyflow/react&lt;/strong&gt; for the architecture diagrams, with custom floating edges&lt;/li&gt;
&lt;li&gt;Packets animate along edges with SVG &lt;code&gt;animateMotion&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mermaid&lt;/strong&gt; sequence diagrams are generated from the same flow data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framer Motion&lt;/strong&gt; for stage transitions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The design decision I'm happiest with is that &lt;strong&gt;content is pure data&lt;/strong&gt;. Each problem is a single TypeScript file, and each evolution step is a &lt;em&gt;delta&lt;/em&gt; on the previous diagram:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;v3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cache the read path&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;problem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Every redirect hits the database: 350K reads/s at peak against one primary.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;evidence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;A single Postgres primary does roughly 10–20K simple PK lookups/s...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="cm"&gt;/* each with pros, cons, and a verdict */&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nx"&gt;decision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cache-aside: on GET, try Redis...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;newRisks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="cm"&gt;/* risk + mitigation pairs */&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nx"&gt;sayIt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Short-code-to-URL mappings never change, so caching them is unusually safe...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;addNodes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cache&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cache&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Redis Cluster ~100 GB&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cache&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;960&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="nx"&gt;addEdges&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;api-cache&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;api&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cache&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GET / SET&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;diagramAt(problem, n)&lt;/code&gt; replays the deltas to build the diagram at any step and tracks which nodes changed, which drives the &lt;strong&gt;NEW / CHANGED&lt;/strong&gt; highlights. Flows are validated against the final diagram's edges, so a flow can't route a packet along a connection that doesn't exist.&lt;/p&gt;

&lt;p&gt;As a result, &lt;strong&gt;adding a new problem never touches the UI.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] More problems: Video Streaming, Chat App, News Feed, Payment System, Distributed KV Store, and more&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Practice mode&lt;/strong&gt;: reveal one stage at a time and sketch your own answer first&lt;/li&gt;
&lt;li&gt;[ ] Drag-and-drop canvas to build your own design and compare it to the reference&lt;/li&gt;
&lt;li&gt;[ ] Building-block guides, decision trees, and a scaling cheat sheet&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it / contribute
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Santoshrt999/sysDesign-studio.git
&lt;span class="nb"&gt;cd &lt;/span&gt;sysDesign-studio
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Want to add a problem? It's one TypeScript file plus one line in the registry. PRs and content reviews are very welcome, especially from people who've sat on the interviewer side of the table.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Which system design problem should I write next?&lt;/strong&gt; Tell me in the comments 👇&lt;/p&gt;

&lt;p&gt;If this helps your prep, a ⭐ on &lt;a href="https://github.com/Santoshrt999/sysDesign-studio" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; helps others find it.&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>showdev</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>I built a Claude Code skill that scores your legacy Java code 1–100 and modernizes it to Java 21</title>
      <dc:creator>Santosh Ravi Teja Goteti</dc:creator>
      <pubDate>Thu, 21 May 2026 00:59:53 +0000</pubDate>
      <link>https://dev.to/santosh_ravitejagoteti_/i-built-a-claude-code-skill-that-scores-your-legacy-java-code-1-100-and-modernizes-it-to-java-21-2jee</link>
      <guid>https://dev.to/santosh_ravitejagoteti_/i-built-a-claude-code-skill-that-scores-your-legacy-java-code-1-100-and-modernizes-it-to-java-21-2jee</guid>
      <description>&lt;h2&gt;
  
  
  The problem with Java 8 → Java 21 migrations
&lt;/h2&gt;

&lt;p&gt;If you're working on a Java 8 codebase — or trying to break into banking and legacy system roles — this article is for you. Every Java 8 codebase has the same problems. You know they exist, but finding and fixing them across 50,000 lines is slow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;double&lt;/code&gt; for monetary values → silent FX
precision loss in production&lt;/li&gt;
&lt;li&gt;Unguarded &lt;code&gt;order.getCounterparty().getAccount(
).getBalance()&lt;/code&gt; → NPE in settlement&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;synchronized&lt;/code&gt; HashMap → race conditions under
concurrent trade load&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Executors.newFixedThreadPool(200)&lt;/code&gt; →
bottleneck at peak volume&lt;/li&gt;
&lt;li&gt;60-line DTOs with manual equals/hashCode →
noise hiding domain logic&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;A two-skill Claude Code plugin that acts as a&lt;br&gt;
  Senior Java Architect:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skill 1 — &lt;code&gt;/java-modernization-review&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
  Analyzes your Java file, saves a full report to&lt;br&gt;
  &lt;code&gt;analysis.md&lt;/code&gt;, and stops.&lt;br&gt;
  You review it before any code is touched.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skill 2 — &lt;code&gt;/java-modernization-implement&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
  Reads &lt;code&gt;analysis.md&lt;/code&gt;, applies every change,&lt;br&gt;
  writes &lt;code&gt;*Modern.java&lt;/code&gt; alongside&lt;br&gt;
  the original. Never overwrites your file.&lt;/p&gt;
&lt;h2&gt;
  
  
  The scoring system
&lt;/h2&gt;

&lt;p&gt;Every review produces a Before/After score&lt;br&gt;
  across 9 dimensions (100 points total):&lt;/p&gt;

&lt;p&gt;## Scoring breakdown (100 points total)&lt;/p&gt;

&lt;p&gt;🔴 &lt;strong&gt;NPE prevention&lt;/strong&gt; — 15 pts&lt;br&gt;
  🔴 &lt;strong&gt;Monetary precision (BigDecimal)&lt;/strong&gt; — 15 pts&lt;br&gt;
  🔴 &lt;strong&gt;Thread safety&lt;/strong&gt; — 15 pts&lt;br&gt;
  🟡 &lt;strong&gt;Streams &amp;amp; collections&lt;/strong&gt; — 10 pts&lt;br&gt;
  🟡 &lt;strong&gt;Exception handling&lt;/strong&gt; — 10 pts&lt;br&gt;
  🟡 &lt;strong&gt;Modern data carriers (Records)&lt;/strong&gt; — 10 pts&lt;br&gt;
  🟡 &lt;strong&gt;Concurrency model (virtual threads)&lt;/strong&gt; — 10 pts&lt;br&gt;
  🟡 &lt;strong&gt;Modern Java features&lt;/strong&gt; — 10 pts&lt;br&gt;
  🟢 &lt;strong&gt;Financial domain rules&lt;/strong&gt; — 5 pts&lt;/p&gt;
&lt;h2&gt;
  
  
  Real example: TradeProcessor.java
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Legacy code the skill flagged as critical:&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// C1 — NPE: any of these can be null&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCounterparty&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getAccount&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getB&lt;/span&gt;
  &lt;span class="n"&gt;alance&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt; &lt;span class="c1"&gt;// C2 — Precision loss on every FX trade&lt;/span&gt;
 &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAmount&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getFxRate&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;  &lt;span class="c1"&gt;// C2 — Precision loss on every FX trade&lt;/span&gt;
 &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAmount&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getFxRate&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt; &lt;span class="c1"&gt;// C3 — Race condition on position updates&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;HashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Double&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;positionMap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;synchronized&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;updatePosition&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cp&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="nc"&gt;Double&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;positionMap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cp&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;positionMap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cp&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// C4 — Swallowed settlement failure&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// TODO: handle later&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;After /java-modernization-implement:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;  &lt;span class="c1"&gt;// C1 fixed — Optional chain, no NPE possible&lt;/span&gt;
 &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="nf"&gt;getCounterpartyBalance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Order&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ofNullable&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
          &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;Order:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;getCounterparty&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
          &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;Counterparty:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;getAccount&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
          &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;Account:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;getBalance&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
          &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;orElseThrow&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Account balance unavailable"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;  &lt;span class="c1"&gt;// C2 + C3 fixed — BigDecimal stream + lock-free map&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ConcurrentHashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;positionMap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;
  &lt;span class="nc"&gt;ConcurrentHashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;updatePosition&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;counterparty&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;positionMap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;merge&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;counterparty&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;BigDecimal:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Java 21 — virtual threads&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ExecutorService&lt;/span&gt; &lt;span class="n"&gt;executor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Executors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newVirtualThreadPerTaskExecutor&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Score: 3/100 → 95/100 (+92 points)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;What it covers — every Java release from 9 to 21&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Priority 1 — Streams, Optional, method references&lt;/li&gt;
&lt;li&gt;Priority 2 — var, helpful NPE messages, built-in HTTP client (Java 9–11)&lt;/li&gt;
&lt;li&gt;Priority 3 — Records, sealed classes, pattern matching, text blocks (Java 12–16)&lt;/li&gt;
&lt;li&gt;Priority 4 — Virtual threads, structured concurrency, lock-free atomics (Java 17–21)&lt;/li&gt;
&lt;li&gt;Priority 5 — String templates, type inference improvements (Java 18–21)&lt;/li&gt;
&lt;li&gt;Priority 6 — Date→java.time, StringBuffer→StringBuilder, reactive→virtual threads&lt;/li&gt;
&lt;li&gt;Priority 7 — Module system (module-info.java)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Two-step workflow — review before any code changes
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Step 1 — /java-modernization-review&lt;/strong&gt;&lt;br&gt;
    → Analyzes file&lt;br&gt;
    → Saves analysis.md&lt;br&gt;
    → Stops and waits for your approval&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 — /java-modernization-implement&lt;/strong&gt;&lt;br&gt;
    → Reads analysis.md&lt;br&gt;
    → Applies every change&lt;br&gt;
    → Writes *Modern.java (original untouched)&lt;br&gt;
    → Prints final score + delta&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Install in Claude Code
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;/plugin marketplace add Santoshrt999/Java-Claude-Skills&lt;/li&gt;
&lt;li&gt;  /plugin install java-claude-skills@java-modernization-review&lt;/li&gt;
&lt;li&gt;  /plugin install java-claude-skills@java-modernization-implement&lt;/li&gt;
&lt;li&gt;  /reload-plugins&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full source code and the TradeProcessor example are in the repo:&lt;br&gt;
  👉 &lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Santoshrt999" rel="noopener noreferrer"&gt;
        Santoshrt999
      &lt;/a&gt; / &lt;a href="https://github.com/Santoshrt999/Java-Claude-Skills" rel="noopener noreferrer"&gt;
        Java-Claude-Skills
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Claude Code skill: review and modernize legacy Java 8 code to Java 21 with AI. Generates a 1-100 score. Specialized for financial systems.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Java Claude Skills — Java 8 → Java 21 Modernization for Claude Code&lt;/h1&gt;
&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AI-powered Java code modernization skill for &lt;a href="https://claude.ai/code" rel="nofollow noopener noreferrer"&gt;Claude Code&lt;/a&gt;.&lt;/strong&gt;&lt;br&gt;
Analyzes legacy Java, generates a prioritized upgrade report, scores it 1–100, and applies every change — all inside your editor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/0aa106087bc40725f30c1c025723497c13754b0bd2ab78037a4ae7cd1d7c03d0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4a6176612d3825323025453225383625393225323032312d6f72616e67653f6c6f676f3d6f70656e6a646b"&gt;&lt;img src="https://camo.githubusercontent.com/0aa106087bc40725f30c1c025723497c13754b0bd2ab78037a4ae7cd1d7c03d0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4a6176612d3825323025453225383625393225323032312d6f72616e67653f6c6f676f3d6f70656e6a646b" alt="Java"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/d486bad36448b299f5e146787ce434ceeb3db948ecbc592f628ef57dc2507345/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436c61756465253230436f64652d536b696c6c2d626c756576696f6c65743f6c6f676f3d616e7468726f706963"&gt;&lt;img src="https://camo.githubusercontent.com/d486bad36448b299f5e146787ce434ceeb3db948ecbc592f628ef57dc2507345/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436c61756465253230436f64652d536b696c6c2d626c756576696f6c65743f6c6f676f3d616e7468726f706963" alt="Claude Code"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/5caa455d8debc46fb23abbadb45a733a937f3910a73fc875c2f7820468e1bb54/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d677265656e"&gt;&lt;img src="https://camo.githubusercontent.com/5caa455d8debc46fb23abbadb45a733a937f3910a73fc875c2f7820468e1bb54/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d677265656e" alt="License"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/863b917f6acbe825373254ba8f25e61adb9a8c660ebf6bf566c70ecdb9e7adfd/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f6d61696e2d46696e616e6369616c25323053797374656d732d626c7565"&gt;&lt;img src="https://camo.githubusercontent.com/863b917f6acbe825373254ba8f25e61adb9a8c660ebf6bf566c70ecdb9e7adfd/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f6d61696e2d46696e616e6369616c25323053797374656d732d626c7565" alt="Financial Systems"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why this skill?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Migrating Java 8 code to Java 21 is high-value but tedious — every codebase has the same problems:&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;double&lt;/code&gt; for monetary values&lt;/td&gt;
&lt;td&gt;Silent precision loss on every FX calculation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unguarded chained &lt;code&gt;.get()&lt;/code&gt; calls&lt;/td&gt;
&lt;td&gt;NPE crashes in production settlement flows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;synchronized&lt;/code&gt; HashMap&lt;/td&gt;
&lt;td&gt;Race conditions on position updates under load&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed thread pools&lt;/td&gt;
&lt;td&gt;Bottleneck at 200–500 concurrent trades&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Boilerplate DTOs with 60+ lines&lt;/td&gt;
&lt;td&gt;Noise that obscures domain logic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;This skill acts as a &lt;strong&gt;Senior Java Architect&lt;/strong&gt; in your Claude Code session. It knows every Java feature from 8 through 21, enforces financial-domain safety rules, and produces code you can ship — not just advice.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Skills&lt;/h2&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Santoshrt999/Java-Claude-Skills" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Again, if you're working on a Java 8 codebase — or trying to break into banking and legacy system roles — this repo is built for you.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The financial domain examples are intentional: trade processors, FX arithmetic, position maps, settlement logic. That's the code you'll actually face in banking interviews and on the job. Practice modernizing it here before you touch production.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Curious what scores you're seeing on your own codebases. Drop them in the comments.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>java</category>
      <category>claudecode</category>
      <category>ai</category>
      <category>fintech</category>
    </item>
  </channel>
</rss>
