<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Software Galaxy]]></title><description><![CDATA[Master tricky software engineering topics, ace interviews and level up your coding skills with expert insights]]></description><link>https://softwaregalaxyblog.com</link><image><url>https://substackcdn.com/image/fetch/$s_!WmWN!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F252ecbcf-5d73-4b65-8d47-2924849ea1f6_1024x1024.png</url><title>Software Galaxy</title><link>https://softwaregalaxyblog.com</link></image><generator>Substack</generator><lastBuildDate>Thu, 16 Apr 2026 20:45:10 GMT</lastBuildDate><atom:link href="https://softwaregalaxyblog.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Vivek]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[softwaregalaxy@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[softwaregalaxy@substack.com]]></itunes:email><itunes:name><![CDATA[Vivek]]></itunes:name></itunes:owner><itunes:author><![CDATA[Vivek]]></itunes:author><googleplay:owner><![CDATA[softwaregalaxy@substack.com]]></googleplay:owner><googleplay:email><![CDATA[softwaregalaxy@substack.com]]></googleplay:email><googleplay:author><![CDATA[Vivek]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Async Transition in React 19]]></title><description><![CDATA[React 19 introduces a suite of features that empower developers to build seamless, performant user interfaces.]]></description><link>https://softwaregalaxyblog.com/p/async-transition-in-react-19</link><guid isPermaLink="false">https://softwaregalaxyblog.com/p/async-transition-in-react-19</guid><dc:creator><![CDATA[Vivek]]></dc:creator><pubDate>Sat, 13 Sep 2025 06:59:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WmWN!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F252ecbcf-5d73-4b65-8d47-2924849ea1f6_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>React 19 introduces a suite of features that empower developers to build seamless, performant user interfaces. Among these, async transitions stand out as a game-changer for handling asynchronous operations without freezing the UI. This is particularly impactful when building forms where users expect instant feedback, smooth interactions, and no jarring loading states.</p><p>In this blog post, we&#8217;ll dive deep into how async transitions in React 19 enable non-blocking form experiences, explore practical examples, and provide best practices for leveraging this feature to create seamless and delightful user interfaces.</p><p>By the end, you&#8217;ll understand how to use <code>useTransition</code> and related APIs to handle form submissions, data fetching, and state updates asynchronously while keeping your UI responsive. Let&#8217;s get started!</p><h2><strong>What Are Async Transitions in React 19?</strong></h2><p>React&#8217;s <code>useTransition</code> hook, first introduced in React 18, was refined in React 19 to make managing asynchronous state updates even more intuitive. Async transitions enable you to mark certain state updates as non-urgent, allowing React to prioritize rendering critical UI changes (such as user input) while deferring less urgent tasks (like fetching data or updating derived state).</p><p>When applied to forms, async transitions ensure that users can continue interacting with the UI &#8212; typing, clicking, or navigating &#8212; while background tasks like API calls or complex computations run without blocking the main thread. This results in a smoother, more responsive experience, even on low-powered devices or slow networks.</p><p>Here are some key benefits of async transitions for forms:</p><ul><li><p><strong>Non-blocking UI</strong>: Users can keep interacting with the form while async operations complete.</p></li><li><p><strong>Optimistic updates</strong>: You can show immediate feedback based on expected outcomes, then reconcile these with server responses.</p></li><li><p><strong>Granular control</strong>: Distinguish between urgent and non-urgent updates for better performance.</p></li><li><p><strong>Error handling</strong>: Gracefully manage errors during async operations without crashing the UI.</p></li></ul><h2><strong>Setting the Stage: A Sample Form</strong></h2><p>To illustrate async transitions, let&#8217;s build a user profile form where users can update their name, email, and bio. The form submits data to a mock API, which may take a few seconds to respond. Without async transitions, the UI might freeze during submission, frustrating users. With React 19&#8217;s tools, we&#8217;ll ensure the form remains interactive and provides clear feedback.</p><p>Here&#8217;s the basic setup:</p><pre><code>import { useState } from "react";

function ProfileForm() {
  const [formData, setFormData] = useState({
    name: "",
    email: "",
    bio: "",
  });

  const handleSubmit = async (e) =&gt; {
    e.preventDefault();
    // Simulate API call
    await new Promise((resolve) =&gt; setTimeout(resolve, 2000));
    console.log("Submitted:", formData);
  };

  const handleChange = (e) =&gt; {
    setFormData({ ...formData, [e.target.name]: e.target.value });
  };

  return (
    &lt;form onSubmit={handleSubmit}&gt;
      &lt;label&gt;
        Name:
        &lt;input
          type="text"
          name="name"
          value={formData.name}
          onChange={handleChange}
        /&gt;
      &lt;/label&gt;
      &lt;label&gt;
        Email:
        &lt;input
          type="email"
          name="email"
          value={formData.email}
          onChange={handleChange}
        /&gt;
      &lt;/label&gt;
      &lt;label&gt;
        Bio:
        &lt;textarea name="bio" value={formData.bio} onChange={handleChange} /&gt;
      &lt;/label&gt;
      &lt;button type="submit"&gt;Save&lt;/button&gt;
    &lt;/form&gt;
  );
}
</code></pre><p>This form works, but has a problem: during the 2-second API call, the UI might feel sluggish, especially if the user tries to interact with it. Let&#8217;s enhance it with async transitions.</p><h2><strong>Introducing </strong><code>useTransition</code></h2><p>The <code>useTransition</code> hook lets you wrap state updates in a transition, telling React to treat them as low priority. It returns an array with two values:</p><ul><li><p><code>startTransition</code>: A function to wrap non-urgent state updates.</p></li><li><p><code>isPending</code>: A boolean indicating whether the transition is in progress.</p></li></ul><p>Here&#8217;s how we can refactor the form for <code>useTransition</code>:</p><p></p><pre><code>import { useState, useTransition } from "react";

function ProfileForm() {
  const [formData, setFormData] = useState({
    name: "",
    email: "",
    bio: "",
  });
  const [isPending, startTransition] = useTransition();
  const [status, setStatus] = useState(null);

  const handleSubmit = async (e) =&gt; {
    e.preventDefault();
    startTransition(async () =&gt; {
      try {
        // Simulate API call
        await new Promise((resolve) =&gt; setTimeout(resolve, 2000));
        setStatus("Success! Profile updated.");
      } catch (error) {
        setStatus("Error updating profile.");
      }
    });
  };

  const handleChange = (e) =&gt; {
    setFormData({ ...formData, [e.target.name]: e.target.value });
  };

  return (
    &lt;form onSubmit={handleSubmit}&gt;
      &lt;label&gt;
        Name:
        &lt;input
          type="text"
          name="name"
          value={formData.name}
          onChange={handleChange}
        /&gt;
      &lt;/label&gt;
      &lt;label&gt;
        Email:
        &lt;input
          type="email"
          name="email"
          value={formData.email}
          onChange={handleChange}
        /&gt;
      &lt;/label&gt;
      &lt;label&gt;
        Bio:
        &lt;textarea name="bio" value={formData.bio} onChange={handleChange} /&gt;
      &lt;/label&gt;
      &lt;button type="submit" disabled={isPending}&gt;
        {isPending ? "Saving..." : "Save"}
      &lt;/button&gt;
      {status &amp;&amp; &lt;p&gt;{status}&lt;/p&gt;}
    &lt;/form&gt;
  );
}
</code></pre><p><strong>What&#8217;s Happening Here?</strong></p><ol><li><p><strong>Wrapping the Submission</strong>: The <code>handleSubmit</code> function uses <code>startTransition</code> to mark the async operation (API call and status update) as a low-priority task. This ensures the UI remains responsive while the API call runs.</p></li><li><p><strong>Pending State</strong>: The <code>isPending</code> boolean lets us disable the submit button and show a &#8220;Saving&#8230;&#8221; message during the transition, providing visual feedback.</p></li><li><p><strong>Error Handling</strong>: We handle potential errors gracefully, updating the status message without blocking the UI.</p></li><li><p><strong>Immediate Input Updates</strong>: Because <code>setFormData</code> (called in <code>handleChange</code>) isn&#8217;t wrapped in a transition, input changes are applied instantly, keeping the form interactive.</p></li></ol><p>The result? Users can keep typing or interacting with the form while the submission happens in the background. No freezes, no jarring delays.</p><h2><strong>Optimistic Updates for Instant Feedback</strong></h2><p>One powerful pattern with async transitions is <strong>optimistic updates</strong>, where you update the UI immediately based on the expected outcome, then reconcile with the server response. This makes the app feel faster and more responsive.</p><p>Let&#8217;s modify our form to show an optimistic &#8220;Profile updated!&#8221; message before the API call completes:</p>
      <p>
          <a href="https://softwaregalaxyblog.com/p/async-transition-in-react-19">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[A Tricky Javascript code snippet]]></title><description><![CDATA[What's the output of the code below - and why?]]></description><link>https://softwaregalaxyblog.com/p/a-tricky-javascript-code-snippet</link><guid isPermaLink="false">https://softwaregalaxyblog.com/p/a-tricky-javascript-code-snippet</guid><dc:creator><![CDATA[Vivek]]></dc:creator><pubDate>Sun, 07 Sep 2025 15:58:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WmWN!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F252ecbcf-5d73-4b65-8d47-2924849ea1f6_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>What's the output of the code below - and why?</p><p><code>const nums = [0, 1, 2, 3];<br>const filtered = nums.filter(Boolean);<br><br>console.log(filtered);</code></p>
      <p>
          <a href="https://softwaregalaxyblog.com/p/a-tricky-javascript-code-snippet">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Difference between Type and Interface in TypeScript]]></title><description><![CDATA[Ever stared at a TypeScript file and thought: &#8220;Wait&#8230; why did I just use type here instead of interface?&#8221; Yeah.]]></description><link>https://softwaregalaxyblog.com/p/difference-between-type-and-interface</link><guid isPermaLink="false">https://softwaregalaxyblog.com/p/difference-between-type-and-interface</guid><dc:creator><![CDATA[Vivek]]></dc:creator><pubDate>Sun, 07 Sep 2025 15:35:46 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WmWN!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F252ecbcf-5d73-4b65-8d47-2924849ea1f6_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Ever stared at a TypeScript file and thought: <em>&#8220;Wait&#8230; why did I just use </em><code>type</code><em> here instead of </em><code>interface</code><em>?&#8221;</em> Yeah. Me too. And honestly? It&#8217;s not always obvious. Feels like choosing between ketchup and mustard on a hot dog &#8212; both kinda work, but someone out there will judge you <em>hard</em>.</p><p>Let&#8217;s cut through the noise. No fluff. Just real talk, weird analogies, and a few hot takes. We&#8217;re diving into the <strong>Type vs Interface</strong> tango in TypeScript. Not the textbook way. The <em>way</em> &#8212; like explaining quantum physics using pizza toppings.</p><div><hr></div><p>Imagine you&#8217;re building a Lego city.</p><p><br><code>interface</code>? That&#8217;s your modular Lego baseplate. You snap pieces together. Want to extend a house? Just click another block on top. Need a balcony? Attach it. Tomorrow? Add solar panels. It&#8217;s <em>open-ended</em>. Evolves. Grows. Like a Tamagotchi, but less tragic when you forget it.</p><p>Now <code>type</code>? That&#8217;s your custom 3D-printed Lego piece. Precise. Sharp edges. Does <em>exactly</em> what you designed. But once it&#8217;s printed? No modifications. Want changes? Recreate the whole thing. Brutal. Efficient. Final.</p><p>That&#8217;s the vibe.</p><div><hr></div><h3><strong>So What&#8217;s the Real Difference?</strong></h3><p>Let&#8217;s not sugarcoat it &#8212; in 90% of cases, they do <em>almost</em> the same thing. You can define object shapes, functions, even unions. But the devil&#8217;s in the details. And TypeScript&#8217;s devil wears Prada and judges your code style.</p><h4><strong>1. Extensibility: The Big One</strong></h4><p><code>interface</code> can be <strong>reopened</strong>. Like a restaurant that closes at 3 PM and magically reopens at 7 with a new menu.</p><pre><code><code>interface Cat {
  meow: () =&gt; string;
}

// Later, somewhere else in your code...
interface Cat {
  purr: () =&gt; string;
}

// Boom. Cat now has both meow AND purr.
// TypeScript just&#8230; merged them. No drama.
</code></code></pre><p>Try that with <code>type</code>? Nope. Compiler throws a fit. <em>&#8220;Cannot redeclare &#8216;Cat&#8217;&#8221;</em>. It&#8217;s a one-shot deal. Like a tattoo you regret at 2 AM.</p><pre><code><code>type Dog = {
  bark: () =&gt; string;
};

type Dog = {
  wagTail: () =&gt; void;
}; // &#10060; Error. TypeScript says: "Nah, bro. Pick one."
</code></code></pre><p>So if you&#8217;re building a library, or expect your types to evolve across files? <code>interface</code> is your BFF.</p><div><hr></div><h4><strong>2. Flexibility in Shape</strong></h4><p><code>type</code> doesn&#8217;t play by the same rules. It&#8217;s&#8230; wilder. Can represent <strong>unions</strong>, <strong>tuples</strong>, <strong>mapped types</strong>, <strong>conditional types</strong> &#8212; stuff <code>interface</code> just can&#8217;t handle.</p>
      <p>
          <a href="https://softwaregalaxyblog.com/p/difference-between-type-and-interface">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Understanding Generics <T> in Typescript]]></title><description><![CDATA[You know that moment when you&#8217;re writing a function, and it hits you&#8212;&#8220;Wait, I need this same logic for strings, for users, for settings&#8230;&#8221;? And you start duplicating code like a photocopier on overdrive? Yeah. That&#8217;s the sound of tech debt knocking. Generics in TypeScript? They&#8217;re the quiet fix. The]]></description><link>https://softwaregalaxyblog.com/p/understanding-generics-t-in-typescript</link><guid isPermaLink="false">https://softwaregalaxyblog.com/p/understanding-generics-t-in-typescript</guid><dc:creator><![CDATA[Vivek]]></dc:creator><pubDate>Sat, 06 Sep 2025 15:54:02 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WmWN!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F252ecbcf-5d73-4b65-8d47-2924849ea1f6_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You know that moment when you&#8217;re writing a function, and it hits you&#8212;<em>&#8220;Wait, I need this same logic for strings, for users, for settings&#8230;&#8221;</em>? And you start duplicating code like a photocopier on overdrive? Yeah. That&#8217;s the sound of tech debt knocking. Generics in TypeScript? They&#8217;re the quiet fix. The <em>&#8220;write once, work everywhere&#8221;</em> backbone for smart, type-safe code. No hacks. No <code>any</code> loopholes.<br>Let&#8217;s dive in.</p><div><hr></div><p>Imagine you&#8217;re building a vending machine. You want it to handle snacks, drinks, maybe even tiny plushies. You <em>could</em> build a separate machine for each. Or&#8212;genius move&#8212;you design one that adapts. Slot in a chip? Fine. A soda? Cool. A rubber duck? Why not. That&#8217;s generics. A <strong>template</strong> that doesn&#8217;t lock you into one <em>type</em>.</p><p>So, what&#8217;s the deal with <code>&lt;T&gt;</code>? That weird angle-bracket thing?</p><p>Think of <code>T</code> as a placeholder. A stand-in. Like &#8220;insert your type here.&#8221; It&#8217;s not a real type&#8212;yet. It&#8217;s a <em>promise</em>: &#8220;Hey, when you call me, tell me what you&#8217;re working with, and I&#8217;ll adjust.&#8221;</p><pre><code><code>function wrapInBox&lt;T&gt;(item: T): { content: T } {
  return { content: item };
}
</code></code></pre><p>See that <code>&lt;T&gt;</code>? It&#8217;s not syntax fluff. It&#8217;s the <em>key</em>. Now you can:</p>
      <p>
          <a href="https://softwaregalaxyblog.com/p/understanding-generics-t-in-typescript">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[12 Must Know Components for Microservices]]></title><description><![CDATA[&#120783;&#120784; &#119846;&#119854;&#119852;&#119853; &#119844;&#119847;&#119848;&#119856; &#119836;&#119848;&#119846;&#119849;&#119848;&#119847;&#119838;&#119847;&#119853;&#119852; &#119839;&#119848;&#119851; &#119835;&#119854;&#119842;&#119845;&#119837;&#119842;&#119847;&#119840; &#119834;&#119847;&#119858; &#119846;&#119842;&#119836;&#119851;&#119848;&#119852;&#119838;&#119851;&#119855;&#119842;&#119836;&#119838; &#119834;&#119851;&#119836;&#119841;&#119842;&#119853;&#119838;&#119836;&#119853;&#119854;&#119851;&#119838;]]></description><link>https://softwaregalaxyblog.com/p/12-must-know-components-for-microservices</link><guid isPermaLink="false">https://softwaregalaxyblog.com/p/12-must-know-components-for-microservices</guid><dc:creator><![CDATA[Vivek]]></dc:creator><pubDate>Sat, 23 Aug 2025 04:36:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!DtaB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2f64f33-8160-471f-a216-ebc615ee9064_1114x1486.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#120783;&#120784; &#119846;&#119854;&#119852;&#119853; &#119844;&#119847;&#119848;&#119856; &#119836;&#119848;&#119846;&#119849;&#119848;&#119847;&#119838;&#119847;&#119853;&#119852; &#119839;&#119848;&#119851; &#119835;&#119854;&#119842;&#119845;&#119837;&#119842;&#119847;&#119840; &#119834;&#119847;&#119858; &#119846;&#119842;&#119836;&#119851;&#119848;&#119852;&#119838;&#119851;&#119855;&#119842;&#119836;&#119838; &#119834;&#119851;&#119836;&#119841;&#119842;&#119853;&#119838;&#119836;&#119853;&#119854;&#119851;&#119838;<br></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DtaB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2f64f33-8160-471f-a216-ebc615ee9064_1114x1486.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DtaB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2f64f33-8160-471f-a216-ebc615ee9064_1114x1486.png 424w, https://substackcdn.com/image/fetch/$s_!DtaB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2f64f33-8160-471f-a216-ebc615ee9064_1114x1486.png 848w, https://substackcdn.com/image/fetch/$s_!DtaB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2f64f33-8160-471f-a216-ebc615ee9064_1114x1486.png 1272w, https://substackcdn.com/image/fetch/$s_!DtaB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2f64f33-8160-471f-a216-ebc615ee9064_1114x1486.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DtaB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2f64f33-8160-471f-a216-ebc615ee9064_1114x1486.png" width="1114" height="1486" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e2f64f33-8160-471f-a216-ebc615ee9064_1114x1486.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1486,&quot;width&quot;:1114,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:683301,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://softwaregalaxyblog.com/i/171714270?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2f64f33-8160-471f-a216-ebc615ee9064_1114x1486.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!DtaB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2f64f33-8160-471f-a216-ebc615ee9064_1114x1486.png 424w, https://substackcdn.com/image/fetch/$s_!DtaB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2f64f33-8160-471f-a216-ebc615ee9064_1114x1486.png 848w, https://substackcdn.com/image/fetch/$s_!DtaB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2f64f33-8160-471f-a216-ebc615ee9064_1114x1486.png 1272w, https://substackcdn.com/image/fetch/$s_!DtaB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2f64f33-8160-471f-a216-ebc615ee9064_1114x1486.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><br><br>&#128204;API Gateway: Acts as a single entry point for clients to interact with the microservices. It handles request routing, composition, and protocol translation, and can provide security features like authentication and rate limiting.<br><br>&#128204;Container Orchestration: Tools like Kubernetes or Docker Swarm that manage the deployment, scaling, and operation of application containers. They help automate the management of microservices across clusters of machines.<br></p>
      <p>
          <a href="https://softwaregalaxyblog.com/p/12-must-know-components-for-microservices">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Linux: Daily Commands]]></title><description><![CDATA[Linux foundational commands should be always at your finger tips.]]></description><link>https://softwaregalaxyblog.com/p/linux-daily-commands</link><guid isPermaLink="false">https://softwaregalaxyblog.com/p/linux-daily-commands</guid><dc:creator><![CDATA[Vivek]]></dc:creator><pubDate>Wed, 20 Aug 2025 04:07:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!657x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6876642f-6f40-44ba-bda8-500147cb4c81_1018x1170.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Linux foundational commands should be always at your finger tips. But here&#8217;s what will really level up your command-line game:</p><p>&#128313; Learn how to chain commands with &amp;&amp; and ; for efficient workflows</p><p>&#128313; Use man &lt;command&gt; or &lt;command&gt; --help to unlock hidden options and usage tips</p><p>&#128313; Combine ls, grep, and sort to quickly locate files in messy directories</p><p>&#128313; Automate tasks with cron and pair it with commands like cp, rm, or mv</p><p>&#128313; Add alias shortcuts to your .bashrc or .zshrc for lightning-fast typing</p>
      <p>
          <a href="https://softwaregalaxyblog.com/p/linux-daily-commands">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Singleton Design Pattern]]></title><description><![CDATA[This is the mostly commonly asked interview question.]]></description><link>https://softwaregalaxyblog.com/p/singleton-design-pattern</link><guid isPermaLink="false">https://softwaregalaxyblog.com/p/singleton-design-pattern</guid><pubDate>Sat, 16 Aug 2025 09:41:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!TPVN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5571b65e-3abb-4720-a08e-b4ddef1fbe1f_1156x1008.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is the mostly commonly asked interview question. Answering it correctly along with coding will give you a huge edge. Let&#8217;s dive right in.</p><p><br>&#120298;&#120309;&#120302;&#120321; &#120310;&#120320; &#120321;&#120309;&#120306; &#120294;&#120310;&#120315;&#120308;&#120313;&#120306;&#120321;&#120316;&#120315; &#120291;&#120302;&#120321;&#120321;&#120306;&#120319;&#120315;?<br><br>Ever needed exactly one instance of a class throughout your entire application? That's where Singleton comes in.<br><br>It is one of the patterns from the Creational group, which focuses on instantiating an object or a group of related objects.<br><br>&#120298;&#120309;&#120306;&#120315; &#120320;&#120309;&#120316;&#120322;&#120313;&#120305; &#120284; &#120310;&#120314;&#120317;&#120313;&#120306;&#120314;&#120306;&#120315;&#120321; &#120310;&#120321;</p><p><br>Use a Singleton when you need a single point of control, such as a database connection pool, logger, or configuration manager. Multiple instances would waste resources or cause conflicts.<br><br>&#120283;&#120316;&#120324; &#120321;&#120316; &#120310;&#120314;&#120317;&#120313;&#120306;&#120314;&#120306;&#120315;&#120321; &#120310;&#120321;<br><br>The pattern restricts a class to create only one instance. It provides global access to that instance through a static method.<br><br>In practice, the class keeps a static reference to itself. When someone asks for an instance, it either creates one (if none exists) or returns the existing one. Thread safety matters here, especially in multi-threaded environments.<br><br>Common approaches include eager initialization (creating objects at startup), lazy initialization (creating objects when first needed), or using enums in languages that support them.<br><br>&#120298;&#120309;&#120326; &#120310;&#120321; &#120324;&#120316;&#120319;&#120312;&#120320;</p>
      <p>
          <a href="https://softwaregalaxyblog.com/p/singleton-design-pattern">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Coding is easy with these patterns]]></title><description><![CDATA[We cannot master everything in coding.]]></description><link>https://softwaregalaxyblog.com/p/coding-is-easy-with-these-patterns</link><guid isPermaLink="false">https://softwaregalaxyblog.com/p/coding-is-easy-with-these-patterns</guid><pubDate>Fri, 15 Aug 2025 03:21:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!R1UV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb346d542-8e0c-4a30-abd4-1e65c4d7c0a2_1024x1250.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We cannot master everything in coding. There are patterns to master. I am attaching a image at the bottom too that will help to grasp them all quickly. Mastering these patterns will help you in passing your interviews.<br><br> 1&#65039;&#8419; Prefix Sum &#8211; Precompute running totals to answer range sum queries in O(1).<br> 2&#65039;&#8419; Two Pointers &#8211; Use two indices to solve search and traversal problems efficiently.<br> 3&#65039;&#8419; Sliding Window &#8211; Maintain a moving subset to optimize subarray and substring calculations.<br> 4&#65039;&#8419; Fast &amp; Slow Pointers &#8211; Detect cycles or find midpoints in linked lists and arrays.<br> 5&#65039;&#8419; Linked List In-place Reversal &#8211; Reverse nodes without extra space using pointer manipulation.<br> 6&#65039;&#8419; Monotonic Stack &#8211; Keep elements in sorted order to quickly find next/previous greater or smaller values.<br> 7&#65039;&#8419; Top &#8216;K&#8217; Elements &#8211; Use heaps or sorting to get the largest or smallest K items efficiently.</p>
      <p>
          <a href="https://softwaregalaxyblog.com/p/coding-is-easy-with-these-patterns">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Resiliency Patterns - A Interview Question]]></title><description><![CDATA[This is one of the most tricky interview question asked.]]></description><link>https://softwaregalaxyblog.com/p/resiliency-patterns</link><guid isPermaLink="false">https://softwaregalaxyblog.com/p/resiliency-patterns</guid><pubDate>Wed, 13 Aug 2025 11:50:08 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!H0fO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde5b5623-170f-487e-8402-317e7874c24a_1154x1092.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is one of the most tricky interview question asked. What if the system doesn&#8217;t work as expected. What if one microservices doesn&#8217;t return the response as expected. How are we gonna handle those scenarios. Answer lies with these resiliency patterns.</p><p>Let&#8217;s dive in. This is one of the most important concepts in System Design is Resiliency Patterns<br><br>"Fall seven times, stand up eight."<br><br>A brief intro.<br><br><strong>[1.] Circuit Breaker</strong><br>&#9726; Acts like an electrical circuit breaker.<br>&#9726; When a service experiences repeated failures, the circuit breaker 'trips' and stops sending requests to that service for a period of time.<br>&#9726; This allows the failing service to recover without being overwhelmed.<br><br>The main circuit breaker states -<br>&#9726; Closed - Requests are allowed to pass through.<br>&#9726; Open - Requests are immediately rejected with an error.<br><br>&#9726; Circuit breakers are effective for protecting against cascading failures and isolating problematic services.</p>
      <p>
          <a href="https://softwaregalaxyblog.com/p/resiliency-patterns">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Microservices Patterns]]></title><description><![CDATA[Welcome to the world of microservices, where small is mighty!]]></description><link>https://softwaregalaxyblog.com/p/microservices-patterns</link><guid isPermaLink="false">https://softwaregalaxyblog.com/p/microservices-patterns</guid><pubDate>Wed, 13 Aug 2025 11:45:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WmWN!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F252ecbcf-5d73-4b65-8d47-2924849ea1f6_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Welcome to the world of microservices, where small is mighty!<br><br>Microservices are small, independent pieces of software that work together to build an application. They communicate using clear rules, and each piece can be developed, deployed, and scaled on its own.<br><br>Some commonly used design patterns that can be beneficial when designing and implementing microservices</p>
      <p>
          <a href="https://softwaregalaxyblog.com/p/microservices-patterns">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Understanding JWT (Json Web Token) ]]></title><description><![CDATA[10 points about JWTs and their role in authentication:]]></description><link>https://softwaregalaxyblog.com/p/jwt-json-web-token</link><guid isPermaLink="false">https://softwaregalaxyblog.com/p/jwt-json-web-token</guid><dc:creator><![CDATA[Vivek]]></dc:creator><pubDate>Wed, 13 Aug 2025 11:41:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!K0Li!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e8dc75f-65ba-4f77-9e5c-08d92ed057c0_916x1264.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>10 points about JWTs and their role in authentication:<br><br>[1] JWT is a standard for defining tokens. You can use them to represent claims.<br><br>[2] A single JWT contains all the required info about an entity, making it ideal for authentication.<br><br>[3] There are 3 main components of a JWT - header, payload, and signature.<br><br>[4] The Header component of a JWT contains claims about the token<br><br>[5] The Payload contains the registered claims and private claims about the users of the JWT</p>
      <p>
          <a href="https://softwaregalaxyblog.com/p/jwt-json-web-token">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Explaining Docker]]></title><description><![CDATA[This is your ultimate guide to understanding Docker.]]></description><link>https://softwaregalaxyblog.com/p/what-is-docker</link><guid isPermaLink="false">https://softwaregalaxyblog.com/p/what-is-docker</guid><pubDate>Wed, 13 Aug 2025 11:18:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WmWN!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F252ecbcf-5d73-4b65-8d47-2924849ea1f6_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is your ultimate guide to understanding Docker. Let&#8217;s break it down in simple terms.<br><br>&#9852; &#119827;&#119841;&#119838; &#119823;&#119851;&#119848;&#119835;&#119845;&#119838;&#119846; &#119811;&#119848;&#119836;&#119844;&#119838;&#119851; &#119826;&#119848;&#119845;&#119855;&#119838;&#119852;<br><br>Before Docker, developers often faced the dreaded "&#119856;&#119848;&#119851;&#119844;&#119852; &#119848;&#119847; &#119846;&#119858; &#119846;&#119834;&#119836;&#119841;&#119842;&#119847;&#119838;" problem.<br><br>Applications would run perfectly on a developer's local machine but fail in testing or production environments.<br><br>Why?<br><br>&#10143; Differences in operating systems<br>&#10143; Conflicting library versions<br>&#10143; Missing dependencies</p>
      <p>
          <a href="https://softwaregalaxyblog.com/p/what-is-docker">
              Read more
          </a>
      </p>
   ]]></content:encoded></item></channel></rss>