<?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[Harshana Tech Blogs]]></title><description><![CDATA[A technical publication focused on software architecture, system design, and modern engineering practices. Here, I break down real-world technical challenges, d]]></description><link>https://haratech.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6a861f409faa391036c32edf/7919b4ac-ea0d-4899-8c63-c8430da6d415.jpg</url><title>Harshana Tech Blogs</title><link>https://haratech.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 11:30:54 GMT</lastBuildDate><atom:link href="https://haratech.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Connecting modern cloud microservices to a 15-year-old legacy ERP is easily one of the most frustrating parts of system design]]></title><description><![CDATA[In reality enterprise integration is obviously not really easy, in the case of lagacy modernization its even more hard. But can you ditch a 15 years old legacy system. :) no way. so we got to deal wit]]></description><link>https://haratech.hashnode.dev/connecting-modern-cloud-microservices-to-a-15-year-old-legacy-erp-is-easily-one-of-the-most-frustrating-parts-of-system-design</link><guid isPermaLink="true">https://haratech.hashnode.dev/connecting-modern-cloud-microservices-to-a-15-year-old-legacy-erp-is-easily-one-of-the-most-frustrating-parts-of-system-design</guid><category><![CDATA[architecture]]></category><category><![CDATA[System Design]]></category><dc:creator><![CDATA[Harshana Madushanka]]></dc:creator><pubDate>Thu, 20 Aug 2026 08:44:07 GMT</pubDate><content:encoded><![CDATA[<p>In reality enterprise integration is obviously not really easy, in the case of lagacy modernization its even more hard. But can you ditch a 15 years old legacy system. :) no way. so we got to deal with these really old system which had not been designed to handle modern speeds.</p>
<p>However, There is no right and wrong way of doing it, and there is no so called "Ideal" or best solution, but given a scenario we can come up with a working model. ( :D dont take my words too literlarly). lets forget about a evovling architecture and couplling for a bit. I have come across one possible case study as follows. This is my personal take (be aware that , this is not a full design but attempts to cover one major goal of legacy modernization)</p>
<p>Picture this: your frontend is handling thousands of checkouts a second without breaking a sweat. But downstream, your core inventory system is sitting on an old on-premise server that chokes the moment traffic spikes.</p>
<p>Naturally, the first reaction is usually, <em>"we'll just throw a queue in front of it."</em></p>
<p>Sounds great on paper. In production? It usually blows up in two ways:</p>
<p>First, queues aren’t infinite. If the legacy system drops offline during a sale, messages just pile up. Before you know it, consumer lag skyrockets, memory caps hit, and the whole pipeline stalls.</p>
<p>Second—and this one hurts—you take a massive financial hit. If your API takes the customer's money upfront and the ERP quietly fails 20 minutes later, now you have to issue mass refunds. You don't just lose the sale; you burn non-refundable payment gateway fees on every single failed transaction.</p>
<p>If you actually want to protect the backend, a queue isn't enough. You need backpressure:</p>
<ul>
<li><p><strong>Throttle the consumer:</strong> Don't let your workers pull off the queue at full speed. Feed the legacy system strictly at a rate it can digest.</p>
</li>
<li><p><strong>Circuit break the errors:</strong> Put a circuit breaker on those ERP calls. If the failure rate crosses something like 5%, trip a flag in a shared Redis cache immediately.</p>
</li>
<li><p><strong>Block at the front door:</strong> Have your API Gateway check that Redis flag (mmm .. not the best way though, may be you can use consule for distributed flag management, so you can perform in memery reference in no time) on every request. If the circuit is tripped, stop taking orders at the gateway—or drop the UI into "Backorder" mode <em>before</em> touching the customer’s credit card.</p>
</li>
</ul>
<p>A queue flattens traffic spikes, but it doesn't magically create backend capacity. If the legacy system can't process the work, the ingestion layer needs to stop taking money.</p>
<p>Curious how others are handling this—anyone dealing with legacy ERP bottlenecks right now?</p>
]]></content:encoded></item><item><title><![CDATA[Requirements Analysis: A Pragmatic Reality Check for Small Teams]]></title><description><![CDATA[There is a dangerous myth in modern Agile teams: Requirements are just user stories written by a Business Analyst, and the design will naturally emerge as we code.
If you operate on this assumption, y]]></description><link>https://haratech.hashnode.dev/requirements-analysis-a-pragmatic-reality-check-for-small-teams</link><guid isPermaLink="true">https://haratech.hashnode.dev/requirements-analysis-a-pragmatic-reality-check-for-small-teams</guid><category><![CDATA[Architecture Design]]></category><category><![CDATA[Software Engineering]]></category><dc:creator><![CDATA[Harshana Madushanka]]></dc:creator><pubDate>Thu, 20 Aug 2026 03:29:39 GMT</pubDate><content:encoded><![CDATA[<p>There is a dangerous myth in modern Agile teams: <em>Requirements are just user stories written by a Business Analyst, and the design will naturally emerge as we code.</em></p>
<p>If you operate on this assumption, you are setting your team up for failure. In smaller teams building targeted solutions for a client, taking a client's initial wishlist at face value doesn't yield an Agile product—it yields a Big Ball of Mud that is impossible to extend as the business grows.</p>
<p>Here is the pragmatic reality of how requirements analysis actually works when done right.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6a861f409faa391036c32edf/68a984c6-68d9-4e86-ba73-4ae7b43d58d1.jpg" alt="" style="display:block;margin:0 auto" />

<hr />
<h2>1. The Myth of the "Passive BA" and the Client's Vague Idea</h2>
<p>Clients rarely know what they actually need. They know their immediate pain points, but they express them through their own narrow school of thought. They don't tell you the full story—not out of malice, but because they lack the technical and structural perspective to see the whole picture.</p>
<p>Simply recording a client’s raw ideas isn't requirements gathering; it’s stenography.</p>
<p>A Business Analyst (BA) cannot be a passive order-taker. BAs must hone a sharp, critical thought process to unearth the underlying gaps in the business problem. The BA’s job is to:</p>
<ul>
<li><p>Look beyond what the client <em>says</em> they want to uncover what actually drives <strong>business value</strong>.</p>
</li>
<li><p>Explore dimensions beyond simple functional needs—including governance, data security, team constraints, and technical realities.</p>
</li>
<li><p>Guide the client through critical discovery rather than just taking dictation.</p>
</li>
</ul>
<p>A concrete, inflexible idea imposed upfront guarantees a poor set of requirements. Requirements analysis must be treated as a discovery process, not an administrative task.</p>
<hr />
<h2>2. Requirements Analysis is a Two-Way Feedback Loop</h2>
<p>Requirements design is not a one-way function where a BA writes stories and drops them onto the dev team's board. It is a back-and-forth feedback loop involving Architects, Tech Leads, and CTOs.</p>
<p>Once the BA forms a clear picture of the core business goals, those requirements must move to technical leadership for <strong>sanitization</strong>. Technical leaders evaluate the requirements against several crucial vectors:</p>
<ul>
<li><p><strong>Vendor/Business Value:</strong> Does building this feature actually align with the commercial and strategic goals of the solution?</p>
</li>
<li><p><strong>Technical Feasibility:</strong> Can this be implemented reliably with available technologies?</p>
</li>
<li><p><strong>Team Capacity &amp; Expertise:</strong> Do we have the skills and bandwidth to deliver this within the requested timeframe?</p>
</li>
</ul>
<p>This technical review acts as a sanitizing filter. It allows the engineering team to step in early and help the client understand the trade-offs: cost, time-to-market, and the operational gravity of complex software.</p>
<h2>3. The Agile Misunderstanding: "Design Will Evolve On Its Own"</h2>
<p>One of the most destructive misconceptions in software development is the belief that because a project is "Agile," the design will naturally reveal itself and improve over time without upfront effort.</p>
<p>In reality, the exact opposite happens. Without early domain boundary definition, codebases degrade into chaotic, intertwined systems as new features are tacked on.</p>
<p>Pragmatic requirements analysis distills a chaotic list of client ideas into a <strong>clean, core domain model</strong>. Clients routinely request features that span five different functional domains without realizing it. The engineering team must consolidate these requirements so they gravitate around a clear, unified domain.</p>
<p>Having this clean core upfront allows system architects and UI/UX designers to build a simple, evolvable design early in the process. Agile allows you to <em>adapt</em> the implementation, but it does not remove the need for deeply molded software models upfront.</p>
<h2>4. Molding Requirements into Software Models</h2>
<p>To build software that survives growth, requirements must be molded directly into domain models as early as possible.</p>
<p>When you model requirements deeply from the start:</p>
<ol>
<li><p><strong>Boundaries Stay Clean:</strong> Features remain contained within their respective domains rather than bleeding across the system.</p>
</li>
<li><p><strong>Refactoring Remains Safe:</strong> An evolvable architecture allows for change without requiring a complete rewrite.</p>
</li>
<li><p><strong>Value Reaches Production Faster:</strong> By trimming out multi-domain noise early, the team builds a lean core that delivers immediate utility to the business.</p>
</li>
</ol>
<h2>Final Thoughts</h2>
<p>Agile is a methodology for iterative delivery, not an excuse to skip critical thinking.</p>
<p>In small-to-medium teams, requirements analysis is a collaborative engineering discipline. It requires BAs to challenge assumptions, Architects to sanitize scope, and the entire team to educate the client on trade-offs.</p>
<p>Spend the time upfront to distill vague client ideas into clean, domain-aligned models. Your future codebase—and your team—will thank you.</p>
]]></content:encoded></item></channel></rss>