<?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: Mike Beentjes</title>
    <description>The latest articles on DEV Community by Mike Beentjes (@mike_beentjes_253ae1fc918).</description>
    <link>https://dev.to/mike_beentjes_253ae1fc918</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%2F3669072%2F2d0599cb-a16f-418c-bcf7-7fe8785743ea.png</url>
      <title>DEV Community: Mike Beentjes</title>
      <link>https://dev.to/mike_beentjes_253ae1fc918</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mike_beentjes_253ae1fc918"/>
    <language>en</language>
    <item>
      <title>Don't Replace Your Legacy System. Wrap It.</title>
      <dc:creator>Mike Beentjes</dc:creator>
      <pubDate>Tue, 28 Jul 2026 09:54:57 +0000</pubDate>
      <link>https://dev.to/mike_beentjes_253ae1fc918/dont-replace-your-legacy-system-wrap-it-3gnk</link>
      <guid>https://dev.to/mike_beentjes_253ae1fc918/dont-replace-your-legacy-system-wrap-it-3gnk</guid>
      <description>&lt;p&gt;We're &lt;a href="https://byteme.nl/" rel="noopener noreferrer"&gt;Byte Me&lt;/a&gt;, a software agency from Alkmaar, the Netherlands. The most valuable advice we give clients is usually not "Let's build something new"; it's "Let's not touch the thing that works." Here's why and how.&lt;/p&gt;

&lt;p&gt;The rebuild reflex&lt;/p&gt;

&lt;p&gt;Every company running a 15-year-old ERP has had this meeting. Someone opens the ancient interface on the big screen, everyone groans, and a decision crystallizes: "We need to replace this."&lt;/p&gt;

&lt;p&gt;We understand the reflex. The UI looks like Windows XP. The one person who understands the database retired. Adding a field takes a change request and three weeks. Every new hire asks why orders live in a system older than they are.&lt;/p&gt;

&lt;p&gt;And yet, when companies come to us with "We want to replace our legacy system," our first answer is almost always: you probably don't.&lt;/p&gt;

&lt;p&gt;Not because rebuilds are impossible but because the odds are terrible. Big-bang legacy replacements are among the highest-risk projects in software. They take longer than planned, cost more than planned, and the scariest part isn't the code: it's the twenty years of business rules buried in that old system that nobody documented. The weird discount logic for that one big customer. The field that means something different depending on which decade the record was created in. The nightly job everyone forgets exists until you turn it off.&lt;/p&gt;

&lt;p&gt;That old system isn't just software. It's your company's institutional memory, compiled.&lt;/p&gt;

&lt;p&gt;Ugly ≠ broken&lt;/p&gt;

&lt;p&gt;Here's the reframe that changes these conversations: most legacy systems don't have a functionality problem. They have an access problem.&lt;/p&gt;

&lt;p&gt;The ERP still processes orders correctly. It's been doing so, reliably, for fifteen years, a track record your rebuild won't have on day one. What's actually painful:&lt;/p&gt;

&lt;p&gt;Customers can't see their own orders, so they email and call&lt;br&gt;
Sales can't check stock from the road&lt;br&gt;
Data has to be retyped into the accounting tool, the webshop, the planning board&lt;br&gt;
Reporting means exporting to Excel and praying&lt;/p&gt;

&lt;p&gt;None of those problems require replacing the core. They require putting a modern layer on top of it.&lt;/p&gt;

&lt;p&gt;The wrap: three patterns&lt;/p&gt;

&lt;p&gt;In practice, "wrap it" comes down to three patterns, usually combined.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The API facade&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most legacy systems have some way in: a SQL database, SOAP endpoints, CSV exports, and sometimes literally a shared folder. Whatever it is, wrap it once behind a clean API you design:&lt;/p&gt;

&lt;p&gt;[Legacy ERP ] ← adapter → [Facade API ] → portal, webshop, apps, reporting&lt;/p&gt;

&lt;p&gt;The facade speaks modern JSON/REST (or GraphQL) on one side and whatever the legacy speaks on the other. Crucially, every new thing you build talks to the facade, never directly to the legacy system. That single rule is what keeps your options open later: when the day comes to swap the core, you replace one adapter instead of rewiring ten applications.&lt;/p&gt;

&lt;p&gt;Two hard-won rules for the facade:&lt;/p&gt;

&lt;p&gt;Read-only first. Reading legacy data is low-risk. Writing into a legacy system is where dragons live; validation rules often exist only in the old UI, not in the database. Ship the read-only portal first; add writes carefully, one flow at a time.&lt;br&gt;
Don't leak the legacy schema. If your API exposes fields called ORDHDR_STAT_CD, you've built a tunnel, not a facade. Translate to a clean model at the boundary, and keep the weirdness contained.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The sync layer&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The second pain, double data entry, dies with a synchronization service: a small job that keeps the legacy system and the modern tools in agreement so humans stop being the integration layer.&lt;/p&gt;

&lt;p&gt;This sounds trivial and isn't. The design decision that matters is naming a single source of truth per entity. Orders live in the ERP; the webshop pushes to it, never the reverse. Customer contact details live in the CRM; the ERP receives updates. The moment two systems can both "win" an update, you've built a conflict generator, and someone will spend every Friday untangling it.&lt;/p&gt;

&lt;p&gt;Keep the sync boring: idempotent jobs, an explicit queue, logging you can actually read, and alerts when something doesn't match. A sync layer that fails silently is worse than no sync layer; people trust it, and it's wrong.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The strangler&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sometimes part of the legacy system really does need to go; the planning module truly can't do what the business needs. That's where the strangler fig pattern earns its keep: build the replacement for that one module against your facade, run it alongside the old one, migrate users, then switch the old module off. The rest of the ERP never notices.&lt;/p&gt;

&lt;p&gt;Over years, module by module, the new system can grow around the old one until maybe nothing of the original remains. Or you stop halfway because the remaining core is fine, and that's a perfectly good outcome too. The strangler pattern's superpower is that every step delivers value on its own, and you can stop at any point. A big-bang rebuild delivers nothing until it delivers everything.&lt;/p&gt;

&lt;p&gt;Why we push the thin layer (even though it pays us less)&lt;/p&gt;

&lt;p&gt;Let's be transparent about incentives, because this industry has a problem with them.&lt;/p&gt;

&lt;p&gt;A full rebuild is a bigger invoice than a facade plus a portal. If an agency's first proposal for your legacy problem is a ground-up replacement, ask them to price the wrap-and-strangle route too and watch how they react. An advisor will engage with the comparison; a salesperson will explain why only the big option "does it properly."&lt;/p&gt;

&lt;p&gt;We push the thin layer because it front-loads the value: customers get their portal in months, not years. Double entry stops. The scary migration risk shrinks to one adapter. And the client keeps control; every next step is a choice, not a sunk-cost obligation.&lt;/p&gt;

&lt;p&gt;The checklist&lt;/p&gt;

&lt;p&gt;Before anyone in your organization says "replace" again, run through this:&lt;/p&gt;

&lt;p&gt;List the actual pains. Access? Integration? Reporting? Or genuinely missing functionality? Only the last one justifies touching the core.&lt;br&gt;
Find the way in. Database, API, exports—there's almost always a seam. That seam is worth more than a rewrite budget.&lt;br&gt;
Build the facade, read-only first. One clean API, legacy weirdness contained at the boundary.&lt;br&gt;
Kill double entry with sync. One source of truth per entity, boring and observable.&lt;br&gt;
Strangle only what's truly broken. Module by module, value at every step, with the option to stop.&lt;/p&gt;

&lt;p&gt;The unglamorous truth: the best legacy strategy usually isn't a heroic rebuild. It's a modest layer of new software that makes the old software bearable and buys you the freedom to decide the rest later.&lt;/p&gt;

&lt;p&gt;Byte Me is a software agency based in Alkmaar, the Netherlands. We build custom software, portals, and iintegrations, oftenon top of systems considerably older than our interns. No sales talk, just a good conversation about what works: byteme.nl&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>software</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Stopping double data entry with a simple API integration</title>
      <dc:creator>Mike Beentjes</dc:creator>
      <pubDate>Thu, 18 Dec 2025 13:42:05 +0000</pubDate>
      <link>https://dev.to/mike_beentjes_253ae1fc918/stopping-double-data-entry-with-a-simple-api-integration-3157</link>
      <guid>https://dev.to/mike_beentjes_253ae1fc918/stopping-double-data-entry-with-a-simple-api-integration-3157</guid>
      <description>&lt;p&gt;Double data entry is one of those problems everyone accepts until it starts breaking things.&lt;/p&gt;

&lt;p&gt;Sales updates a CRM. Operations copies the same data into another system.&lt;br&gt;
Finance exports everything to Excel. Someone inevitably forgets a step. Suddenly you are debugging human behavior instead of software.&lt;/p&gt;

&lt;p&gt;Why double data entry keeps happening. Most companies do not suffer from a lack of tools. They suffer from too many tools that do not talk to each other.&lt;/p&gt;

&lt;p&gt;Typical setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CRM for customers&lt;/li&gt;
&lt;li&gt;ERP or planning tool for operations&lt;/li&gt;
&lt;li&gt;Accounting software for finance&lt;/li&gt;
&lt;li&gt;A few Excel files in between&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each system works fine on its own. The problem starts at the boundaries.&lt;br&gt;
The real cost is not time. Time loss is obvious, but the bigger problems are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inconsistent data across systems&lt;/li&gt;
&lt;li&gt;Bugs caused by outdated or incomplete information&lt;/li&gt;
&lt;li&gt;No single source of truth&lt;/li&gt;
&lt;li&gt;People losing trust in “the system”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once trust is gone, people create their own workarounds. That is when things really spiral.&lt;/p&gt;

&lt;p&gt;You often do not need a new system. The default reaction is often: replace everything. In practice, that is rarely necessary.&lt;/p&gt;

&lt;p&gt;In many cases, one small API integration already solves most of the pain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data is entered once&lt;/li&gt;
&lt;li&gt;Updates are synced automatically&lt;/li&gt;
&lt;li&gt;Each system keeps doing what it is good at&lt;/li&gt;
&lt;li&gt;No big migration. No massive rewrite.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A simple integration beats a complex rebuild&lt;/p&gt;

&lt;p&gt;What works well in practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identify one clear data owner (for example the CRM)&lt;/li&gt;
&lt;li&gt;Expose or consume a clean API endpoint&lt;/li&gt;
&lt;li&gt;Sync only what is actually needed&lt;/li&gt;
&lt;li&gt;Add basic validation and logging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is it.&lt;/p&gt;

&lt;p&gt;No fancy architecture diagrams. No over engineering. When this approach works best. This approach is especially effective when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Teams already like their existing tools&lt;/li&gt;
&lt;li&gt;Only a few processes cause friction&lt;/li&gt;
&lt;li&gt;Errors have a direct business impact&lt;/li&gt;
&lt;li&gt;You want quick, measurable improvement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is not about perfection. It is about removing unnecessary manual steps.&lt;/p&gt;

&lt;p&gt;Final thought:&lt;/p&gt;

&lt;p&gt;Most double data entry problems are not organizational issues. They are integration problems. Fix the data flow, and a lot of “process issues” disappear automatically.&lt;/p&gt;

&lt;p&gt;If you are interested in practical examples of this approach in real projects, we work on this kind of integration regularly at &lt;a href="https://byteme.nl/" rel="noopener noreferrer"&gt;Byte Me&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>automation</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
