<?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"><channel><title><![CDATA[raycodes]]></title><description><![CDATA[Hi, I’m Ray (Reza) Shams, a software engineer passionate about backend development, cloud technologies, and open-source projects.]]></description><link>https://raycodes.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1758838688719/6019a752-7dd7-4bb4-b275-65a1cf97cb31.png</url><title>raycodes</title><link>https://raycodes.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 09:46:12 GMT</lastBuildDate><atom:link href="https://raycodes.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[How AI Is Reshaping the SDLC — And What It Means for Backend Developers]]></title><description><![CDATA[AI isn't coming for your job. But it is coming for your workflow. Every phase of the software development life cycle is being quietly (and sometimes loudly) restructured by AI tooling — and if you're ]]></description><link>https://raycodes.dev/how-ai-is-reshaping-the-sdlc-and-what-it-means-for-backend-developers</link><guid isPermaLink="true">https://raycodes.dev/how-ai-is-reshaping-the-sdlc-and-what-it-means-for-backend-developers</guid><dc:creator><![CDATA[Ray Shams]]></dc:creator><pubDate>Wed, 17 Jun 2026 21:02:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/68c11d6c6b6ec9c40d6c8566/5d3ca7a9-ab84-4ac3-97d8-ce8df11e2366.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>AI isn't coming for your job. But it is coming for your workflow. Every phase of the software development life cycle is being quietly (and sometimes loudly) restructured by AI tooling — and if you're a backend developer, it's worth understanding what's actually changing, not just the hype.</p>
<hr />
<h2>Planning &amp; Requirements: From Guesswork to Pattern Matching</h2>
<p>Estimation has always been part art, part delusion. AI changes this by mining historical project data to surface realistic timelines and flag risks early. Tools are increasingly able to parse requirements documents, detect ambiguities, and even identify contradictions before a single line of code is written.</p>
<p>For backend engineers, this means fewer "wait, the spec was unclear" moments mid-sprint. In theory.</p>
<hr />
<h2>Design: AI as an Opinionated Architect</h2>
<p>System design is where AI still feels somewhat early, but it's catching up. Today's tools can suggest appropriate architecture patterns based on constraints like latency, scale, and team size. They can generate initial scaffolding and even reason about trade-offs between, say, event-driven vs request/response models.</p>
<p>It won't replace your judgment — especially for distributed systems where the devil is in the operational details — but it's a useful sounding board.</p>
<hr />
<h2>Implementation: The Phase That Changed the Most</h2>
<p>This is where AI has had its biggest impact, and you've probably felt it already.</p>
<p><strong>Code generation</strong> has gone from autocomplete to genuine co-authorship. Tools like GitHub Copilot, Cursor, and Claude can generate entire functions, write database queries, scaffold REST or gRPC APIs, and translate between languages. Studies and anecdotal reports consistently point to <strong>30–50% productivity gains</strong> on routine tasks.</p>
<p>The practical upside for backend work:</p>
<ul>
<li><p>Boilerplate (config classes, DTOs, mappers) vanishes faster</p>
</li>
<li><p>Context-switching tax drops when AI handles the "I know what this should look like but don't want to type it" tasks</p>
</li>
<li><p>Junior developers become productive faster</p>
</li>
</ul>
<p>The catch: AI-generated code is confidently wrong just often enough to be dangerous. It doesn't know your infra, your team's conventions, or the undocumented constraint in that legacy service. You still need to read what it generates.</p>
<hr />
<h2>Testing &amp; QA: Finally Getting Some Respect</h2>
<p>Testing is chronically under-resourced, and AI is helping close the gap.</p>
<p>Automated test case generation from code or specs means the "we don't have time to write tests" excuse gets harder to make. AI tools can identify edge cases (null inputs, boundary values, race conditions) that humans miss under deadline pressure. Self-healing test scripts that adapt to UI changes are also maturing quickly.</p>
<p>For backend developers specifically, AI-assisted contract testing and integration test generation are genuinely useful — areas where test coverage has traditionally been patchy.</p>
<hr />
<h2>CI/CD &amp; Deployment: Smarter Pipelines</h2>
<p>AI is starting to influence DevOps too. Predictive failure detection in pipelines, intelligent rollback decisions based on error patterns, and infrastructure-as-code suggestions are becoming real features, not just marketing claims.</p>
<p>The more interesting shift is in <strong>observability</strong>: AI-powered log analysis that can surface anomalies and correlate events across services is starting to reduce mean time to resolution in ways that traditional alerting can't.</p>
<hr />
<h2>Maintenance: The Long Tail Gets Shorter</h2>
<p>The bulk of software's lifetime is maintenance, and it's historically the least glamorous phase. AI is making a dent here too — automated vulnerability scanning with fix suggestions, smarter dependency upgrade tooling, and code explanation for legacy systems where the original author left the company in 2019 and took the context with them.</p>
<hr />
<h2>What Actually Changes for You as a Developer</h2>
<p>AI doesn't eliminate the need for strong engineering fundamentals. If anything, it raises the floor and compresses the gap between knowing what to build and having it built.</p>
<p>Your role shifts toward:</p>
<ul>
<li><p><strong>Code review at scale</strong> — you're evaluating AI output, not just teammate output</p>
</li>
<li><p><strong>System thinking</strong> — architectural and operational decisions matter more when implementation is faster</p>
</li>
<li><p><strong>Prompt craft</strong> — knowing how to direct AI tools effectively is a real skill</p>
</li>
<li><p><strong>Critical evaluation</strong> — trusting but verifying, always</p>
</li>
</ul>
<p>The developers who struggle will be those who use AI as a black box. The ones who thrive will treat it as a fast junior engineer: useful, productive, but needs supervision.</p>
<hr />
<h2>The Risks Worth Taking Seriously</h2>
<p>A few things that don't get enough attention:</p>
<p><strong>Security.</strong> AI tools occasionally generate code with subtle vulnerabilities — improper input validation, insecure defaults, outdated patterns. Always review generated code with the same scrutiny you'd apply to a PR from someone you don't know well.</p>
<p><strong>Over-reliance.</strong> If you stop reasoning through problems because the AI gives you an answer, you lose the muscle. The hard debugging and architectural thinking you skip today will cost you later.</p>
<p><strong>Technical debt.</strong> AI can generate a lot of code very fast. Fast accumulation of unreviewed, poorly understood code is how you end up with a codebase nobody wants to touch in three years.</p>
<hr />
<h2>Bottom Line</h2>
<p>AI is the most significant productivity shift in software development since version control and cloud infrastructure. It compresses the cost of going from idea to working code. But it doesn't compress the cost of going from working code to <em>good</em> code — that still requires engineering judgment, which is still yours to develop.</p>
<p>Use the tools. Just don't outsource your thinking along with your boilerplate.</p>
<hr />
<p><em>What's your experience been with AI tools in your day-to-day? I'd be curious to hear what's actually moved the needle vs. what's still hype.</em></p>
]]></content:encoded></item><item><title><![CDATA[Java 25 - Compact Object Headers – How to Save Memory in Production]]></title><description><![CDATA[Java 25 is out, and it brings some exciting improvements under the hood. One of the most impactful features for backend developers is Compact Object Headers (JEP 519).
Even if your code hasn’t changed, upgrading to Java 25 can reduce memory usage, im...]]></description><link>https://raycodes.dev/java-25-compact-object-headers-how-to-save-memory-in-production</link><guid isPermaLink="true">https://raycodes.dev/java-25-compact-object-headers-how-to-save-memory-in-production</guid><category><![CDATA[Java]]></category><category><![CDATA[performance]]></category><category><![CDATA[object]]></category><dc:creator><![CDATA[Ray Shams]]></dc:creator><pubDate>Sun, 21 Sep 2025 23:00:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1758750887883/96ba1095-7d57-4029-a07e-50bc6634e38c.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Java 25</strong> is out, and it brings some exciting improvements under the hood. One of the most impactful features for backend developers is <strong>Compact Object Headers (JEP 519)</strong>.</p>
<p>Even if your code hasn’t changed, upgrading to Java 25 can <strong>reduce memory usage</strong>, <strong>improve CPU cache efficiency</strong>, and <strong>make garbage collection faster</strong>—all automatically.</p>
<p>In this post, we’ll dive deep into:</p>
<ul>
<li><p>What an <strong>object header</strong> is.</p>
</li>
<li><p>Why it matters for memory-heavy applications.</p>
</li>
<li><p>How <strong>Java 25’s compact headers</strong> reduce overhead.</p>
</li>
<li><p>Practical impact and examples.</p>
</li>
</ul>
<h2 id="heading-what-is-an-object-header">What is an Object Header?</h2>
<p>Every Java object has a <strong>small header</strong> that stores metadata required by the JVM:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Component</td><td>Purpose</td></tr>
</thead>
<tbody>
<tr>
<td><strong>Mark Word</strong></td><td>Stores object state: hashcode, GC age, lock info</td></tr>
<tr>
<td><strong>Class Pointer</strong></td><td>Points to the class metadata (methods, type info)</td></tr>
<tr>
<td><strong>Array Length</strong></td><td>Only for arrays</td></tr>
</tbody>
</table>
</div><p>On a <strong>64-bit HotSpot JVM</strong>, a typical object header is <strong>12–16 bytes</strong>, sometimes <strong>larger than the actual object data</strong>.</p>
<p><strong>Example:</strong></p>
<pre><code class="lang-java"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Point</span> </span>{
    <span class="hljs-keyword">int</span> x;
    <span class="hljs-keyword">int</span> y;
}
</code></pre>
<ul>
<li><p>Fields = 8 bytes (2 ints)</p>
</li>
<li><p>Header = 12 bytes → padded to 16 bytes</p>
</li>
<li><p><strong>Total object size ≈ 24 bytes</strong></p>
</li>
</ul>
<p>Even for tiny objects, the header overhead is significant when you create millions of instances.</p>
<h2 id="heading-why-java-25-compact-object-headers-matter">Why Java 25 Compact Object Headers Matter</h2>
<p>Java 25 introduces <strong>Compact Object Headers</strong> (JEP 519), which <strong>reduce the size of the object header</strong> by:</p>
<ul>
<li><p>Packing the <strong>Mark Word</strong> and <strong>Class pointer</strong> more efficiently</p>
</li>
<li><p>Eliminating unnecessary padding</p>
</li>
<li><p>Keeping <strong>all GC and lock functionality intact</strong></p>
</li>
</ul>
<p>This is completely <strong>transparent to developers</strong>—no code changes are required.</p>
<h2 id="heading-memory-layout-before-vs-after">Memory Layout – Before vs After</h2>
<h3 id="heading-before-java-25">Before Java 25</h3>
<pre><code class="lang-apache">┌───────────────┐
│ <span class="hljs-attribute">Mark</span> Word     │ --&gt; <span class="hljs-number">8</span>B
├───────────────┤
│ <span class="hljs-attribute">Class</span> Ptr     │ --&gt; <span class="hljs-number">4</span>B
│ <span class="hljs-attribute">Padding</span>       │ --&gt; <span class="hljs-number">4</span>B
└───────────────┘
[ <span class="hljs-attribute">Object</span> Fields ]
</code></pre>
<ul>
<li>Header = 12 bytes → padded to 16 bytes</li>
</ul>
<h3 id="heading-after-java-25-compact-headers">After Java 25 Compact Headers</h3>
<pre><code class="lang-plaintext">┌───────────────┐
│ Compact Header │  ← Mark + Class packed efficiently (~8B)
└───────────────┘
[ Object Fields ]
</code></pre>
<ul>
<li><p>Header = ~8 bytes</p>
</li>
<li><p>Memory savings: <strong>~50%</strong> for small objects</p>
</li>
</ul>
<hr />
<h2 id="heading-practical-example">Practical Example</h2>
<pre><code class="lang-java"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Order</span> </span>{
    <span class="hljs-keyword">int</span> id;
    <span class="hljs-keyword">boolean</span> delivered;
}

List&lt;Order&gt; orders = <span class="hljs-keyword">new</span> ArrayList&lt;&gt;();
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i &lt; <span class="hljs-number">1_000_000</span>; i++) {
    orders.add(<span class="hljs-keyword">new</span> Order());
}
</code></pre>
<p><strong>Impact:</strong></p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>JVM</td><td>Memory per object</td><td>Total memory for 1M objects</td></tr>
</thead>
<tbody>
<tr>
<td>Java 17</td><td>16 bytes</td><td>~16 MB</td></tr>
<tr>
<td>Java 25</td><td>~8 bytes</td><td>~8 MB</td></tr>
</tbody>
</table>
</div><p>Saving <strong>~8 MB per million objects</strong> just by upgrading the JVM.</p>
<h2 id="heading-how-to-enable-verify">How to Enable / Verify</h2>
<ul>
<li><p><strong>Enabled by default</strong> on <strong>64-bit HotSpot JVM</strong></p>
</li>
<li><p>JVM flags (optional):</p>
</li>
</ul>
<pre><code class="lang-bash"><span class="hljs-comment"># Enable compact headers</span>
-XX:+UseCompactObjectHeaders

<span class="hljs-comment"># Disable compact headers</span>
-XX:-UseCompactObjectHeaders
</code></pre>
<p>You can also use tools like <strong>JOL (Java Object Layout)</strong> to inspect the <strong>object size</strong>:</p>
<pre><code class="lang-java">System.out.println(GraphLayout.parseInstance(<span class="hljs-keyword">new</span> Order()).toPrintable());
</code></pre>
<hr />
<h2 id="heading-who-benefits-most">Who Benefits Most?</h2>
<ul>
<li><p><strong>Microservices</strong> creating millions of DTOs per second</p>
</li>
<li><p><strong>Kafka consumers</strong> buffering large numbers of small messages</p>
</li>
<li><p><strong>In-memory caches</strong> storing small objects like <code>Point</code>, <code>Order</code>, etc.</p>
</li>
<li><p><strong>High-throughput applications</strong> where GC and memory footprint matter</p>
</li>
</ul>
<p>Even a small reduction in object size <strong>scales up to huge savings</strong> in production environments.</p>
<h2 id="heading-highlights">Highlights</h2>
<ul>
<li><p><strong>Java 25 Compact Object Headers</strong> reduce per-object memory overhead on 64-bit JVMs.</p>
</li>
<li><p><strong>No code changes needed</strong>—simply upgrade to Java 25.</p>
</li>
<li><p>Can <strong>improve GC performance</strong>, memory usage, and CPU cache efficiency.</p>
</li>
<li><p>Ideal for <strong>high-performance, memory-sensitive applications</strong>.</p>
</li>
</ul>
]]></content:encoded></item></channel></rss>