<?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: Bob Palermo</title>
    <description>The latest articles on DEV Community by Bob Palermo (@bpalermo11).</description>
    <link>https://dev.to/bpalermo11</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%2F4158503%2F5e3045cc-2a6e-42d5-b872-ad8dc17d3448.png</url>
      <title>DEV Community: Bob Palermo</title>
      <link>https://dev.to/bpalermo11</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bpalermo11"/>
    <language>en</language>
    <item>
      <title>Rewrite vs. Evolve</title>
      <dc:creator>Bob Palermo</dc:creator>
      <pubDate>Wed, 14 Oct 2026 12:34:17 +0000</pubDate>
      <link>https://dev.to/bpalermo11/rewrite-vs-evolve-5l7</link>
      <guid>https://dev.to/bpalermo11/rewrite-vs-evolve-5l7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The platform has to change. The question is how: replace it with a clean-sheet build, or evolve the existing system toward the target.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This article is part of ZibiWorks, an ongoing fictional modernization case study. The ZibiWorks site is the canonical home of the series, with the full company context, starting architecture, and related installments. Explore the full series at &lt;a href="https://bobpalermo.github.io/zibiworks/" rel="noopener noreferrer"&gt;ZibiWorks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The infrastructure question is settled. ZibiWorks chose to move before&lt;br&gt;
modernizing the application, but that decision left the monolith, the shared&lt;br&gt;
database, and the tangled domains intact. With the migration path established,&lt;br&gt;
attention turns to how the application itself should change.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem forcing the question
&lt;/h2&gt;

&lt;p&gt;A specific business capability is under pressure: &lt;strong&gt;Order Fulfillment.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As ZibiWorks has grown, seasonal demand has grown with it, and Fulfillment&lt;br&gt;
needs to scale more independently than it can today. Because Fulfillment is&lt;br&gt;
embedded in the monolith, adding capacity for it means scaling far more of the&lt;br&gt;
application than necessary, and problems or deployments in unrelated areas can&lt;br&gt;
disrupt fulfillment processing. As order volume climbs, its availability and&lt;br&gt;
resiliency matter more every quarter, and leadership wants this materially&lt;br&gt;
improved before the next major peak season.&lt;/p&gt;

&lt;p&gt;ZibiWorks is not modernizing for cleanliness. It has a business capability&lt;br&gt;
that has to get better on a specific timeline, and that deadline is the single&lt;br&gt;
most important criterion weighing on the decision.&lt;/p&gt;

&lt;p&gt;Before comparing the two paths, one thing is worth settling: this is a decision&lt;br&gt;
about &lt;em&gt;how ZibiWorks travels&lt;/em&gt;, not &lt;em&gt;where it is going&lt;/em&gt;. Whichever path it takes,&lt;br&gt;
good domain analysis should land on substantially the same business&lt;br&gt;
capabilities, bounded contexts, ownership, and data responsibilities. An&lt;br&gt;
evolutionary path may surface new information along the way, so the final&lt;br&gt;
implementation can differ in detail, but the migration mechanism should not&lt;br&gt;
dictate the target decomposition. The destination is not what is in question&lt;br&gt;
here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two credible options
&lt;/h2&gt;

&lt;p&gt;Both are credible. Neither is foolish.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option A — Rewrite&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Design and build the new platform alongside the existing system&lt;/li&gt;
&lt;li&gt;Migrate the business onto it&lt;/li&gt;
&lt;li&gt;Retire the old system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Option B — Evolve&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create seams in the existing platform&lt;/li&gt;
&lt;li&gt;Move capabilities into new bounded contexts over time&lt;/li&gt;
&lt;li&gt;Retire legacy implementations as confidence grows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A clean rewrite is genuinely appealing: clean boundaries from day one, a modern&lt;br&gt;
architecture without legacy compromises during construction, freedom to rethink&lt;br&gt;
persistence and integration, and far less transitional scaffolding cluttering&lt;br&gt;
the codebase. Building straight toward the desired end state is a real&lt;br&gt;
advantage, and it deserves a serious evaluation rather than a reflexive "big&lt;br&gt;
rewrites fail."&lt;/p&gt;

&lt;p&gt;Evolution has its own strengths and its own real costs. The two differ on three&lt;br&gt;
things that matter here: where the complexity lands, when the business sees&lt;br&gt;
value, and how data moves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the complexity lands
&lt;/h2&gt;

&lt;p&gt;Neither approach avoids complexity; they place it differently in time. Both&lt;br&gt;
involve substantial construction work. What differs is where the &lt;em&gt;migration,&lt;br&gt;
coexistence, validation, and cutover&lt;/em&gt; complexity falls.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Evolution&lt;/th&gt;
&lt;th&gt;Rewrite&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Complexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Migration complexity distributed throughout the transition: temporary adapters, compatibility layers, and synchronization.&lt;/td&gt;
&lt;td&gt;Cleaner construction path, but migration and cutover complexity concentrated near completion.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Delivery of value&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fulfillment can improve independently while the rest of the platform evolves.&lt;/td&gt;
&lt;td&gt;Fulfillment improvements depend on enough of the replacement platform being ready.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data migration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Incremental, domain by domain. Ownership and validation move in smaller steps.&lt;/td&gt;
&lt;td&gt;Larger, coordinated migration and reconciliation near cutover.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Evolution distributes migration complexity across the journey. A rewrite concentrates much of it near the destination.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Can a rewrite meet the deadline?
&lt;/h2&gt;

&lt;p&gt;On construction alone, a rewrite might. The deciding question is not whether&lt;br&gt;
ZibiWorks could &lt;em&gt;build&lt;/em&gt; a replacement in time, but what it would take to put one&lt;br&gt;
safely into production before the busiest period of the year.&lt;/p&gt;

&lt;p&gt;A full-platform replacement couples the Fulfillment deadline to the readiness of&lt;br&gt;
the entire new platform. Before peak season, ZibiWorks would have to validate&lt;br&gt;
not just Fulfillment but every capability on it, resolve defects in capabilities&lt;br&gt;
that are not driving the deadline, and complete data migration, reconciliation,&lt;br&gt;
and a production cutover, then stabilize an entirely new platform right before&lt;br&gt;
its highest-demand weeks.&lt;/p&gt;

&lt;p&gt;Those pressures have nothing to do with Fulfillment. It could be&lt;br&gt;
production-ready while defects in Customer Management or Billing hold up the&lt;br&gt;
cutover, with QA and release capacity consumed by unrelated problems. Even a&lt;br&gt;
rewrite delivered on time would send ZibiWorks into peak season on a platform&lt;br&gt;
with little production history. The risk is not simply missing the date; it is&lt;br&gt;
introducing broad operational uncertainty across the whole system at the exact&lt;br&gt;
moment Fulfillment needs to be &lt;em&gt;more&lt;/em&gt; reliable.&lt;/p&gt;

&lt;p&gt;This is not an argument that rewrites fail. A narrowly scoped or phased&lt;br&gt;
replacement could be viable under different constraints, and in that form it&lt;br&gt;
starts to resemble evolution anyway. ZibiWorks is weighing a broad replacement&lt;br&gt;
because its problems span the monolith, and at that scope the coordination and&lt;br&gt;
stabilization risk against this deadline is what makes it hard to justify.&lt;/p&gt;

&lt;h2&gt;
  
  
  Could ZibiWorks buy more time?
&lt;/h2&gt;

&lt;p&gt;The opposite move is to attempt nothing structural: scale out the existing&lt;br&gt;
monolith, survive one more peak season, and defer modernization. It is a&lt;br&gt;
legitimate option, and it turns on a distinction that is easy to blur, between&lt;br&gt;
&lt;strong&gt;capacity and architectural resilience&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Horizontal scaling might handle the extra load, assuming Fulfillment's&lt;br&gt;
bottleneck responds to additional compute. But more instances do not give&lt;br&gt;
Fulfillment independent deployment or failure isolation, and the shared&lt;br&gt;
constraints stay shared: database contention and synchronous dependencies can&lt;br&gt;
remain, or even worsen as more instances press on the same backend. Scaling the&lt;br&gt;
whole monolith to serve one capability raises cost too, though that is&lt;br&gt;
secondary here.&lt;/p&gt;

&lt;p&gt;Leadership asked for two things, scalability &lt;em&gt;and&lt;/em&gt; resiliency. Additional&lt;br&gt;
capacity may improve availability, but it does not eliminate the shared failure&lt;br&gt;
risks Fulfillment faces within the monolith. Under lighter constraints, buying a&lt;br&gt;
season of runway could be reasonable. For ZibiWorks it defers the problem rather&lt;br&gt;
than reducing the risk it needs to retire before peak season.&lt;/p&gt;

&lt;h3&gt;
  
  
  Evaluating the options against the business needs
&lt;/h3&gt;

&lt;p&gt;The choice becomes clearer when each approach is measured against what ZibiWorks&lt;br&gt;
actually needs before peak season.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Decision criterion&lt;/th&gt;
&lt;th&gt;Full rewrite&lt;/th&gt;
&lt;th&gt;Scale existing monolith&lt;/th&gt;
&lt;th&gt;Evolve incrementally&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Improve Fulfillment before peak season&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Depends on full-platform readiness&lt;/td&gt;
&lt;td&gt;Can improve capacity quickly&lt;/td&gt;
&lt;td&gt;Can prioritize Fulfillment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scale Fulfillment independently&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes, after replacement&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes, after extraction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Improve Fulfillment resilience&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Can design for resilience, but benefits arrive with replacement&lt;/td&gt;
&lt;td&gt;Can add redundancy; shared failure risks remain&lt;/td&gt;
&lt;td&gt;Can improve resilience as Fulfillment is extracted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Isolate Fulfillment from unrelated failures&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes, with appropriate boundaries&lt;/td&gt;
&lt;td&gt;Existing application coupling remains&lt;/td&gt;
&lt;td&gt;Yes, with appropriate boundaries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Minimize peak-season deployment risk&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Coordinated cutover and stabilization&lt;/td&gt;
&lt;td&gt;Smaller immediate change, existing coupling remains&lt;/td&gt;
&lt;td&gt;Smaller incremental transitions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Continue broader modernization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Complete replacement&lt;/td&gt;
&lt;td&gt;Deferred&lt;/td&gt;
&lt;td&gt;Progressive modernization&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Leadership's requirements are explicit: improve Fulfillment's scalability &lt;em&gt;and&lt;/em&gt;&lt;br&gt;
resilience before peak season. Those are what the first rows measure. The rest,&lt;br&gt;
deployment risk and the ability to keep modernizing, are supporting&lt;br&gt;
architectural criteria rather than mandates, but they shape which option meets&lt;br&gt;
the requirements safely. Read that way, no column strictly dominates. A rewrite&lt;br&gt;
reaches the same target capabilities but gates them behind the whole&lt;br&gt;
replacement; scaling adds capacity fastest but leaves the coupling and&lt;br&gt;
resilience gap in place; evolution can act on Fulfillment first, provided the&lt;br&gt;
extraction and its boundaries hold.&lt;/p&gt;

&lt;h2&gt;
  
  
  The decision
&lt;/h2&gt;

&lt;p&gt;ZibiWorks chooses &lt;strong&gt;evolutionary modernization&lt;/strong&gt;. It is the clearest path to&lt;br&gt;
improving Fulfillment on its own timeline, without gating that improvement&lt;br&gt;
behind a complete replacement. Scaling the monolith could improve capacity and,&lt;br&gt;
through redundancy, availability, but it does not resolve the shared application&lt;br&gt;
failure modes or give Fulfillment the independent failure isolation leadership's&lt;br&gt;
resilience requirement implies. Evolution's gains are not free: they depend on&lt;br&gt;
successfully extracting Fulfillment behind boundaries that hold. On ZibiWorks'&lt;br&gt;
constraints that is the better bet than coupling Fulfillment's deadline to a&lt;br&gt;
platform-wide cutover.&lt;/p&gt;

&lt;p&gt;Under different constraints (no deadline, a smaller system, an appetite for one&lt;br&gt;
coordinated cutover) the rewrite could be the better call. Here, the deadline&lt;br&gt;
and the breadth of the system decide it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What evolution requires
&lt;/h2&gt;

&lt;p&gt;"Evolve the monolith" is a decision, not yet an architecture. Delivering it&lt;br&gt;
means designing two architectures at once and keeping them distinct.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Target architecture&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The system ZibiWorks ultimately wants&lt;/li&gt;
&lt;li&gt;Domains, ownership, data responsibilities, integration&lt;/li&gt;
&lt;li&gt;Permanent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Migration architecture&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The temporary mechanisms that get there safely&lt;/li&gt;
&lt;li&gt;Adapters, shims, DI seams, sync paths, fallbacks, routing, bridges&lt;/li&gt;
&lt;li&gt;Designed to disappear&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keeping these separate is what stops the migration scaffolding from being&lt;br&gt;
mistaken for the target. The migration architecture is real, designed work, even&lt;br&gt;
though most of it is meant to be removed when the migration is done.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reversibility, and its limit
&lt;/h3&gt;

&lt;p&gt;One benefit of a designed migration architecture is that transitions can be made&lt;br&gt;
reversible. The monolith depends on an interface representing a business&lt;br&gt;
capability. Dependency injection first resolves that interface to the legacy&lt;br&gt;
implementation; during migration it is swapped for an adapter that talks to a&lt;br&gt;
newly extracted domain. From the monolith's point of view the contract is&lt;br&gt;
unchanged even though the implementation boundary has moved, so routing can be&lt;br&gt;
pointed back at the legacy implementation through configuration. A large&lt;br&gt;
architectural change becomes a sequence of smaller, individually reversible&lt;br&gt;
steps.&lt;/p&gt;

&lt;p&gt;But routing rollback is not the same as business-state rollback. Flipping the&lt;br&gt;
switch back is easy at the application boundary; whether it is &lt;em&gt;safe&lt;/em&gt; depends on&lt;br&gt;
what has happened to the underlying data. If the new domain has become&lt;br&gt;
authoritative, how can the legacy implementation still be a viable fallback?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ &lt;strong&gt;Data completeness and data authority are not the same thing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Authoritative writes can move to the extracted domain while the monolith keeps a &lt;em&gt;complete enough&lt;/em&gt; representation of the data it needs, maintained from the new domain's events. The new domain owns the writes; the monolith's copy stays current enough for legacy workflows to keep running; the old implementation remains a plausible fallback. Call it &lt;strong&gt;dual presence, single authority&lt;/strong&gt;: the data is present in both places, but only one side is the source of truth.&lt;/p&gt;

&lt;p&gt;Completeness is not the same as authority, and it is not the same as safe rollback. Once authority has moved, reversing it also depends on state compatibility, business semantics, and the ability to reconcile whatever each side wrote in the meantime. Asynchronous synchronization keeps the fallback viable; it does not, by itself, guarantee a clean reversal.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Strangler Fig
&lt;/h3&gt;

&lt;p&gt;With evolution chosen and the migration architecture understood, the &lt;strong&gt;Strangler&lt;br&gt;
Fig&lt;/strong&gt; pattern is the strategy that organizes the work. It gives the migration a&lt;br&gt;
repeatable sequence: pick a capability, redirect its responsibility to a new&lt;br&gt;
domain behind the existing contract, let old and new run side by side, move data&lt;br&gt;
authority across once confidence builds, then retire the legacy implementation.&lt;br&gt;
The cycle repeats, one capability at a time, until the monolith has been&lt;br&gt;
strangled. Fulfillment is the natural first candidate, since it is the capability&lt;br&gt;
under the most pressure.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Scaffolding Fallacy
&lt;/h3&gt;

&lt;p&gt;Most of that migration architecture is built to be thrown away, which invites a&lt;br&gt;
tempting but wrong conclusion: that if something is going to be removed later,&lt;br&gt;
the effort spent building it must be waste. Construction scaffolding is temporary&lt;br&gt;
and is no part of the finished building, yet no one calls it wasted. Its value is&lt;br&gt;
letting the building go up safely. Migration architecture is the same. It can&lt;br&gt;
have no place in the target and still be worth a great deal during the&lt;br&gt;
transition.&lt;/p&gt;

&lt;p&gt;The guardrail is that "temporary" is not a license for uncontrolled complexity.&lt;br&gt;
Scaffolding that earns its place has a purpose, a transition it enables, an&lt;br&gt;
owner, and a known removal condition.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Temporary by design is very different from accidentally permanent. The problem&lt;br&gt;
is not throwaway code; it is throwaway code that nobody ever throws away.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Consequences
&lt;/h2&gt;

&lt;p&gt;The decision is a trade made with its costs in view.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What ZibiWorks gains&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fulfillment addressed first, ahead of peak season&lt;/li&gt;
&lt;li&gt;Business value arriving earlier, not at the end&lt;/li&gt;
&lt;li&gt;Smaller, independently validated transitions&lt;/li&gt;
&lt;li&gt;A smaller blast radius per change, with more chances to roll back&lt;/li&gt;
&lt;li&gt;Data migration spread across the program&lt;/li&gt;
&lt;li&gt;No single platform-wide cutover&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What ZibiWorks accepts&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Temporary architecture and some disposable code&lt;/li&gt;
&lt;li&gt;Coexistence between old and new&lt;/li&gt;
&lt;li&gt;Eventual-consistency and synchronization concerns&lt;/li&gt;
&lt;li&gt;Added operational complexity during migration&lt;/li&gt;
&lt;li&gt;The ongoing job of actively retiring scaffolding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The right column is the price of the left one.&lt;/p&gt;

&lt;p&gt;ZibiWorks has now decided to modernize, chosen evolution, and settled on&lt;br&gt;
Strangler Fig as the approach. But a strategy is not a cut line. If a capability,&lt;br&gt;
starting with Fulfillment, is going to move out of the monolith one piece at a&lt;br&gt;
time, the next thing to understand is where the system can safely come apart.&lt;/p&gt;




&lt;p&gt;ZibiWorks is fictional. The ideas and opinions expressed throughout the series are my own and do not represent the views, positions, or practices of my employer.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>refactoring</category>
      <category>softwareengineering</category>
      <category>devops</category>
    </item>
    <item>
      <title>Move It or Fix It First?</title>
      <dc:creator>Bob Palermo</dc:creator>
      <pubDate>Wed, 07 Oct 2026 14:14:56 +0000</pubDate>
      <link>https://dev.to/bpalermo11/move-it-or-fix-it-first-5f8d</link>
      <guid>https://dev.to/bpalermo11/move-it-or-fix-it-first-5f8d</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Leadership wants to move to the cloud. Before evaluating that answer, separate what migration solves from what modernization solves.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This article is part of ZibiWorks, an ongoing fictional modernization case study. The ZibiWorks site is the canonical home of the series, with the full company context, starting architecture, and related installments. Explore the full series at &lt;a href="https://bobpalermo.github.io/zibiworks/" rel="noopener noreferrer"&gt;ZibiWorks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;"Move to the cloud" is a reasonable instinct, and it comes from real pressure.&lt;br&gt;
But it is a solution, not a problem. Before evaluating it, the job is to work&lt;br&gt;
out what moving would actually solve, what it would leave untouched, and whether&lt;br&gt;
the timing even makes sense.&lt;/p&gt;

&lt;h2&gt;
  
  
  What leadership is actually reacting to
&lt;/h2&gt;

&lt;p&gt;Behind "move to the cloud" is a stack of legitimate pressures: hardware&lt;br&gt;
approaching its refresh cycle, a rising operational burden in the data center,&lt;br&gt;
disaster-recovery expectations that are getting harder to meet, seasonal demand&lt;br&gt;
that forces sizing for peaks, environment provisioning that takes too long, and&lt;br&gt;
a reluctance to sign off on another large capital investment just as the company&lt;br&gt;
expects to grow.&lt;/p&gt;

&lt;p&gt;ZibiWorks also has a separate, well-known set of problems in the application&lt;br&gt;
itself, established back in &lt;a href="https://bobpalermo.github.io/zibiworks/start-here/the-starting-point/" rel="noopener noreferrer"&gt;The Starting&lt;br&gt;
Point&lt;/a&gt;: risky monolithic releases,&lt;br&gt;
teams colliding in one codebase, a shared database, tightly coupled business&lt;br&gt;
domains, brittle partner integrations, and no way to scale business capabilities&lt;br&gt;
independently.&lt;/p&gt;

&lt;p&gt;Both lists are real. The trap is treating them as one problem with one answer.&lt;br&gt;
Sort the pressures by what kind of problem they are, and a pattern shows up:&lt;br&gt;
some are about &lt;em&gt;where the application runs&lt;/em&gt;, and some are about &lt;em&gt;how it is&lt;br&gt;
built&lt;/em&gt;. A third set is not a problem class at all. These are the constraints and&lt;br&gt;
timing that shape when and how either kind of change can happen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it runs (infrastructure)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hardware refresh and OS lifecycle&lt;/li&gt;
&lt;li&gt;Disaster recovery&lt;/li&gt;
&lt;li&gt;Capacity planning and seasonal peaks&lt;/li&gt;
&lt;li&gt;Slow environment provisioning&lt;/li&gt;
&lt;li&gt;Data-center burden and capital expenditure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How it is built (application)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tightly coupled business capabilities&lt;/li&gt;
&lt;li&gt;Shared database&lt;/li&gt;
&lt;li&gt;Monolithic, risky deployment&lt;/li&gt;
&lt;li&gt;Brittle partner integrations&lt;/li&gt;
&lt;li&gt;No independent scaling of capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Constraints and timing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Systems that must stay on premises&lt;/li&gt;
&lt;li&gt;Unsupported runtimes or licensing limits&lt;/li&gt;
&lt;li&gt;Prepaid or committed licenses&lt;/li&gt;
&lt;li&gt;Upcoming renewals, refreshes, or growth events&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Migration and modernization solve different problems
&lt;/h2&gt;

&lt;p&gt;Migration changes &lt;em&gt;where&lt;/em&gt; the application runs. Modernization changes &lt;em&gt;how it is&lt;br&gt;
built&lt;/em&gt;. They are not rival strategies so much as answers to different questions,&lt;br&gt;
and the split in the pressures above maps almost cleanly onto them.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pressure&lt;/th&gt;
&lt;th&gt;Migration helps?&lt;/th&gt;
&lt;th&gt;Modernization helps?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hardware refresh, DR, seasonal peaks&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slow environment provisioning&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monolithic, risky releases&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shared database, domain coupling&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Brittle partner integrations&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Systems that must stay on premises&lt;/td&gt;
&lt;td&gt;Negative / adds complexity&lt;/td&gt;
&lt;td&gt;Neutral&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The one line to carry out of this installment:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Moving the monolith to the cloud does not un-share the database or untangle the domains. Modernizing in place does not replace aging hardware or fix DR.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is why "migrate or modernize" is a false binary. The real options sit on a&lt;br&gt;
spectrum: &lt;strong&gt;modernize in place&lt;/strong&gt;, &lt;strong&gt;migrate largely as-is&lt;/strong&gt;, &lt;strong&gt;migrate with&lt;br&gt;
selective remediation&lt;/strong&gt;, or &lt;strong&gt;migrate and modernize together&lt;/strong&gt;. Doing both at&lt;br&gt;
once addresses the most problems, which is exactly why it is tempting, but it&lt;br&gt;
also carries the most cost, the longest duration, the heaviest coordination, and&lt;br&gt;
the greatest execution risk. The question is not which option is best in the&lt;br&gt;
abstract. It is which sequence fits ZibiWorks right now.&lt;/p&gt;

&lt;h2&gt;
  
  
  What narrows the decision
&lt;/h2&gt;

&lt;p&gt;Sequencing is decided less by architecture than by lifecycle, money, and&lt;br&gt;
dependencies. Three facts do most of the work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Timing and economics.&lt;/strong&gt; Much of what makes a move cheap or expensive is not&lt;br&gt;
technical at all. The cost of leaving and the cost of staying both turn on where&lt;br&gt;
ZibiWorks sits in the hardware, license, and contract lifecycle, and that&lt;br&gt;
position changes constantly. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ &lt;strong&gt;Timing is part of the architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The same decision flips with the calendar. A migration that looks unattractive the month after a hardware purchase can look obvious when that hardware is a year from replacement. Note when things expire, not just what they are.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Dependencies.&lt;/strong&gt; A workload's readiness to move is partly set by the systems&lt;br&gt;
around it, and ZibiWorks does not run in isolation.&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%2F8c4ztdqyso04ow4fyeow.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%2F8c4ztdqyso04ow4fyeow.png" alt="The ZibiWorks platform depends on SQL Server, a legacy Fulfillment system, and Warehouse / Manufacturing, so its readiness to move is partly set by systems around it." width="800" height="731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Legacy dependencies do not automatically block a move; they change its cost and&lt;br&gt;
shape. Some can move, some cannot move yet, and anything that must stay on&lt;br&gt;
premises turns a clean migration into a hybrid one, with private connectivity&lt;br&gt;
and latency to manage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Whether the move is even necessary.&lt;/strong&gt; It is worth saying plainly that if the&lt;br&gt;
current infrastructure had years of life left, met capacity and recovery needs,&lt;br&gt;
and was cheap to run, delaying the move could be the right call. Migration has&lt;br&gt;
to earn its place against simply modernizing where the system already runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  How ZibiWorks lands, and why
&lt;/h2&gt;

&lt;p&gt;For ZibiWorks, those facts line up in one direction. The hardware refresh is&lt;br&gt;
approaching and major licenses are nearing renewal at roughly the same time.&lt;br&gt;
Recovery expectations are rising faster than the data center can meet them,&lt;br&gt;
seasonal peaks force expensive over-provisioning, and expected growth would&lt;br&gt;
otherwise trigger a fresh round of infrastructure investment. Environment&lt;br&gt;
provisioning is already too slow for the delivery pace. On the application side,&lt;br&gt;
the monolith can run in the target cloud with manageable remediation, and the&lt;br&gt;
few legacy systems that must stay on premises can be reached over private&lt;br&gt;
connectivity. Crucially, full modernization would take far longer than the&lt;br&gt;
infrastructure lifecycle allows.&lt;/p&gt;

&lt;p&gt;Put together, the infrastructure clock is forcing a decision now, and the&lt;br&gt;
application work cannot be finished on that timeline. So:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Move now. Modernize next. Change only what is required to make the move safe and useful.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is &lt;strong&gt;migration with selective remediation&lt;/strong&gt;: not a blind lift-and-shift,&lt;br&gt;
and not a big-bang modernize-while-moving. Under different facts (new hardware,&lt;br&gt;
prepaid licenses with years left, no growth event, healthy DR), the same&lt;br&gt;
reasoning could land on "stay and modernize." The decision follows the&lt;br&gt;
constraints, not a preference for one strategy.&lt;/p&gt;

&lt;h3&gt;
  
  
  What gets fixed now, and what waits
&lt;/h3&gt;

&lt;p&gt;Selective remediation only works if the line between the two is explicit. The&lt;br&gt;
deferred items are real and important; they simply do not need to be solved to&lt;br&gt;
move the application safely. Keeping that line clear is what stops the move from&lt;br&gt;
sliding into a rewrite.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix now: migration blockers&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repeatable, automated deployment&lt;/li&gt;
&lt;li&gt;Externalized environment configuration&lt;/li&gt;
&lt;li&gt;Remove hard dependencies on server identity&lt;/li&gt;
&lt;li&gt;Health checks&lt;/li&gt;
&lt;li&gt;Baseline observability&lt;/li&gt;
&lt;li&gt;Reliable backup and recovery&lt;/li&gt;
&lt;li&gt;Infrastructure automation&lt;/li&gt;
&lt;li&gt;Connectivity to systems staying on premises&lt;/li&gt;
&lt;li&gt;Anything unsupported in the target environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Defer: non-blocking modernization concerns&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The shared database&lt;/li&gt;
&lt;li&gt;Business-domain coupling&lt;/li&gt;
&lt;li&gt;Monolithic deployment&lt;/li&gt;
&lt;li&gt;Brittle integration boundaries&lt;/li&gt;
&lt;li&gt;Most code-level modernization work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A known problem can be deliberately deferred when solving it is not required to&lt;br&gt;
reach the current objective. That is a discipline, not an oversight.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;When "later" becomes "never"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Deferring modernization is a deliberate decision, but it carries a risk. Once the migration is complete and the immediate infrastructure pressures are gone, the urgency to address those architectural problems may fade. "Migrate now, modernize later" can quietly become "migrate now, modernize never."&lt;/p&gt;

&lt;p&gt;That does not make migration-first the wrong choice. It means the deferred work has to stay visible as part of the broader modernization effort.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What the move leaves behind
&lt;/h2&gt;

&lt;p&gt;After the move, ZibiWorks has better infrastructure automation, better recovery,&lt;br&gt;
faster provisioning, a more flexible capacity model, and less dependence on&lt;br&gt;
physical hardware. The platform is in a better position to evolve. But when the&lt;br&gt;
teams open the codebase again, the same problems are waiting: the monolith is&lt;br&gt;
still a monolith, the database is still shared, the business capabilities are&lt;br&gt;
still tightly coupled. ZibiWorks chose not to solve those during the move. Now&lt;br&gt;
it is time to.&lt;/p&gt;

&lt;p&gt;The next question is whether to replace the application or evolve it.&lt;/p&gt;




&lt;p&gt;ZibiWorks is fictional. The ideas and opinions expressed throughout the series are my own and do not represent the views, positions, or practices of my employer.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>cloud</category>
      <category>devops</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>What's Driving Change?</title>
      <dc:creator>Bob Palermo</dc:creator>
      <pubDate>Mon, 05 Oct 2026 12:33:27 +0000</pubDate>
      <link>https://dev.to/bpalermo11/whats-driving-change-51l</link>
      <guid>https://dev.to/bpalermo11/whats-driving-change-51l</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Before designing anything, find where the current platform is starting to limit the business, and which touch points deserve a closer look.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This article is part of ZibiWorks, an ongoing fictional modernization case study. The ZibiWorks site is the canonical home of the series, with the full company context, starting architecture, and related installments. Explore the full series at &lt;a href="https://bobpalermo.github.io/zibiworks/" rel="noopener noreferrer"&gt;ZibiWorks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;ZibiWorks believes they need to modernize, but that conclusion did not come from an architecture diagram. It came from mounting pressure on &lt;a href="https://bobpalermo.github.io/zibiworks/start-here/meet-zibiworks/" rel="noopener noreferrer"&gt;the business&lt;/a&gt; and the teams supporting it. Changes take longer than they should. Deployments carry more risk. Partner integrations are getting harder to manage. New customer experiences and connected-product capabilities are placing demands on a platform that was built for a simpler business.&lt;/p&gt;

&lt;p&gt;Those pressures are real, but they do not yet tell us what architecture to build. The instinct is often to jump directly to services, a message bus, the cloud, or a cleaner data model. That is premature. Before choosing an architecture, we need to understand where the current one is actually getting in the way, what business outcomes are being affected, and which problems are significant enough to justify change.&lt;/p&gt;

&lt;p&gt;So this installment is about where modernization should start, not what to build. We will identify the business and technical pressures worth addressing, turn them into an initial set of success criteria, and establish the guiding principles that later architecture choices can be weighed against. Those criteria and principles become the decision lens for everything that follows.&lt;/p&gt;

&lt;h2&gt;
  
  
  What should guide the decision?
&lt;/h2&gt;

&lt;p&gt;Before choosing an architecture, we need to know what should guide the choice.&lt;br&gt;
That comes from combining two things: the business context, which tells us what&lt;br&gt;
matters, and the technical context, which tells us what is feasible,&lt;br&gt;
sustainable, and responsible to build and operate. The business rarely asks for&lt;br&gt;
"changeability" or "resilience" by name; those are architectural&lt;br&gt;
interpretations. Neither side provides the answer alone.&lt;/p&gt;

&lt;p&gt;In brownfield work that business context often shows up as existing pain; in greenfield&lt;br&gt;
work it more often arrives as goals, constraints, and assumptions. Either way,&lt;br&gt;
the two inputs are:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business context&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desired outcomes and business capabilities&lt;/li&gt;
&lt;li&gt;Where the pressure is (for ZibiWorks, existing pain)&lt;/li&gt;
&lt;li&gt;Cost, delivery, and timing&lt;/li&gt;
&lt;li&gt;Customer expectations and growth assumptions&lt;/li&gt;
&lt;li&gt;Risk tolerance and regulatory constraints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Technical context&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Current platform capabilities, where one exists&lt;/li&gt;
&lt;li&gt;Available technology choices and constraints&lt;/li&gt;
&lt;li&gt;Team skills and operational maturity&lt;/li&gt;
&lt;li&gt;Resilience, security, data integrity, observability&lt;/li&gt;
&lt;li&gt;Technical debt (where applicable) and cost to operate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Combining the two produces the first useful output, and it is not a target&lt;br&gt;
architecture. It gives us two things we can use to evaluate architecture&lt;br&gt;
choices: &lt;strong&gt;success criteria&lt;/strong&gt;, which describe what needs to improve and how we&lt;br&gt;
will know, and &lt;strong&gt;guiding principles&lt;/strong&gt;, which describe how we make decisions&lt;br&gt;
while pursuing those improvements.&lt;/p&gt;

&lt;p&gt;Those criteria and principles become the lens for the decisions that follow.&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%2F8l71578r321sqcdlgg1p.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%2F8l71578r321sqcdlgg1p.png" alt="The decision lens: business and technical context feed principles and success criteria, which drive evaluation, tradeoffs, outcomes, and revision." width="800" height="126"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These are working criteria and principles, not commandments. As the business and&lt;br&gt;
technical context change, the decision lens changes with them.&lt;/p&gt;

&lt;p&gt;For ZibiWorks, then, the first step is not to redesign the platform because the&lt;br&gt;
architecture looks old. It is to find where the current architecture is actually&lt;br&gt;
creating meaningful friction, trace those pressures into the platform, and mark&lt;br&gt;
where architectural change might create leverage, stopping short of choosing a&lt;br&gt;
solution. Each pressure below follows the same path:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business pressure → Business constraint → Architectural touch point → Options examined later&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The platform still works
&lt;/h2&gt;

&lt;p&gt;The platform is doing its job. Orders are placed, Zibis are shipped, customers and partners are served. The business is operating.&lt;/p&gt;

&lt;p&gt;The original architecture was a good fit for an earlier ZibiWorks. What changed is the business around it. Growth has changed the consequences of the original tradeoffs.&lt;/p&gt;

&lt;p&gt;The result is not a broken platform. It is a working platform beginning to show wear in a few important places. Those pressures are where the rest of this installment focuses.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pressure 01 · Brittleness: The platform is getting harder to change safely
&lt;/h3&gt;

&lt;p&gt;Over time, ZibiWorks' concerns have grown into one another. Orders reach into&lt;br&gt;
Pricing, Inventory, Payments, Fulfillment, Shipping, Customer, and Zibi&lt;br&gt;
Lifecycle, with product and catalog logic close behind. Shared models span&lt;br&gt;
several business areas. Entity Framework entities flow upward through the stack.&lt;br&gt;
&lt;code&gt;Common&lt;/code&gt; models are reused broadly, and shared tables carry ambiguous ownership.&lt;/p&gt;

&lt;p&gt;No single one of these dependencies is wrong. An Order genuinely needs pricing&lt;br&gt;
and inventory. The trouble comes from how many of them accumulate and cross&lt;br&gt;
through the same shared models, so a change in one area rarely stays in one&lt;br&gt;
area.&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%2Foa1v0bv72xcsrjys6inl.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%2Foa1v0bv72xcsrjys6inl.png" alt="Orders is entangled with Pricing, Payments, Customer, Inventory, Fulfillment, and Shipping, so a local change rarely stays local." width="800" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A local change around Orders rarely stays local, because Orders is entangled with several surrounding concerns.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interwoven concerns → Larger blast radius → Broader testing → More coordination → Slower delivery&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A local change can have non-local effects. Making a change safely takes broader&lt;br&gt;
knowledge of the system, regression testing expands, releases need more&lt;br&gt;
coordination, and one change is harder to isolate from everything else.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pressure 02 · Partner Coupling: External change has become an internal delivery problem
&lt;/h3&gt;

&lt;p&gt;ZibiWorks depends on PayPaw, Handle With Care, Paw &amp;amp; Circuit, RoboMotion&lt;br&gt;
Systems, and HomeSphere. As covered in &lt;a href="https://bobpalermo.github.io/zibiworks/start-here/the-starting-point/" rel="noopener noreferrer"&gt;The Starting&lt;br&gt;
Point&lt;/a&gt;, partner-specific fields,&lt;br&gt;
statuses, identifiers, workflows, payload shapes, and batch formats have worked&lt;br&gt;
their way into internal logic and shared models.&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%2F8c1h8mkndu96pvs1kdcs.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%2F8c1h8mkndu96pvs1kdcs.png" alt="Partner concerns leak inward into Orders, Shipping, and Inventory and through shared models." width="800" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Partner change now reaches beyond the partner boundary.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The business impact is specific: a partner change can require changes in parts&lt;br&gt;
of ZibiWorks that look unrelated to that partner. A new API version, changed&lt;br&gt;
payload, revised status model, new capability, deprecated interface, or new&lt;br&gt;
compliance requirement can all ripple inward.&lt;/p&gt;

&lt;p&gt;There is a second cost that is easy to miss. Because the integrations are woven&lt;br&gt;
so deeply into the platform, ZibiWorks may not be able to adopt a better&lt;br&gt;
partner API or a new partner feature quickly. That quietly limits its options.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pressure 03 · Growth: Each new capability increases the cost of the next one
&lt;/h3&gt;

&lt;p&gt;ZibiWorks wants to expand: more connected Zibis, more partners, more&lt;br&gt;
customer and internal capabilities, new products and services, more reporting,&lt;br&gt;
and eventually new platform opportunities. The current platform can support all&lt;br&gt;
of it. The problem is that each new capability tends to make the next one&lt;br&gt;
harder. That points at a kind of scalability people often skip past.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Runtime scalability&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More requests&lt;/li&gt;
&lt;li&gt;More transactions&lt;/li&gt;
&lt;li&gt;More connected devices&lt;/li&gt;
&lt;li&gt;Can the infrastructure handle growth?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Change scalability&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More capabilities&lt;/li&gt;
&lt;li&gt;More teams changing the system&lt;/li&gt;
&lt;li&gt;More dependencies and coordination&lt;/li&gt;
&lt;li&gt;Can the organization keep changing safely?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Scalability is not only about runtime capacity. Runtime scaling and change&lt;br&gt;
scaling are different problems. Right now, change scalability is the bigger&lt;br&gt;
problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pressure 04 · Capacity: Normal demand or peak demand?
&lt;/h3&gt;

&lt;p&gt;ZibiWorks runs on traditional infrastructure, so it has to size capacity&lt;br&gt;
ahead of demand. Demand is not steady. Holidays, promotions, product launches,&lt;br&gt;
partner campaigns, and seasonal buying all push it around.&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%2Flierppajml322a3a0j05.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%2Flierppajml322a3a0j05.png" alt="Demand fluctuates over time against a flat normal-sized capacity line and a higher peak-sized capacity line." width="800" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Size for normal demand:&lt;/strong&gt; lower steady-state cost, greater peak risk.&lt;br&gt;
&lt;strong&gt;Size for peak demand:&lt;/strong&gt; more headroom, more idle capacity.&lt;/p&gt;

&lt;p&gt;The architecture makes this sharper. Much of the platform scales as a&lt;br&gt;
coordinated unit, so a spike in one area can force ZibiWorks to add capacity&lt;br&gt;
broadly rather than where the load actually is. The conclusion is not that cloud&lt;br&gt;
is the answer. ZibiWorks needs a better answer to variable demand, and cloud&lt;br&gt;
elasticity may eventually be one option worth weighing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pressure 05 · Customer Experience: Reliability is becoming part of the product
&lt;/h3&gt;

&lt;p&gt;ZibiWorks is increasingly customer-facing. When the platform mostly supported&lt;br&gt;
internal operations, downtime was an internal disruption. As more of it faces&lt;br&gt;
customers, downtime becomes something customers see: a slow storefront, a failed&lt;br&gt;
checkout, account functions that will not load, delayed order information,&lt;br&gt;
Zibi management that is unavailable, connected features that degrade.&lt;/p&gt;

&lt;p&gt;This connects directly to the capacity pressure. The periods of highest customer&lt;br&gt;
demand are often the periods of highest infrastructure strain, so a capacity&lt;br&gt;
shortfall tends to show up as a customer-facing outage at the worst possible&lt;br&gt;
time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Customer demand ↑ → Infrastructure pressure ↑ → Performance / availability risk → Customer experience&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Reliability and scalability are becoming part of the customer experience, which&lt;br&gt;
raises later questions about resilience, observability, failure isolation,&lt;br&gt;
graceful degradation, and recovery.&lt;/p&gt;

&lt;p&gt;None of these pressures selects an architecture. They mark where the current&lt;br&gt;
platform constrains the business. Patterns and technologies come later.&lt;/p&gt;

&lt;h2&gt;
  
  
  From business pressure to architectural touch point
&lt;/h2&gt;

&lt;p&gt;Each pressure points at an area of the architecture worth examining later. These&lt;br&gt;
touch points show where the series will look next without assuming the eventual&lt;br&gt;
solution.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Business pressure&lt;/th&gt;
&lt;th&gt;Architectural touch point&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Changes ripple&lt;/td&gt;
&lt;td&gt;Boundaries, dependency structure, modularity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Partner blast radius&lt;/td&gt;
&lt;td&gt;Integration boundaries, anti-corruption layers (ACLs), contract isolation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Growth cost rises&lt;/td&gt;
&lt;td&gt;Extensibility, deployment boundaries, incremental evolution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Variable demand&lt;/td&gt;
&lt;td&gt;Scaling model, workload isolation, elasticity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Visible downtime&lt;/td&gt;
&lt;td&gt;Resilience, failure isolation, observability, recovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ambiguous ownership&lt;/td&gt;
&lt;td&gt;Domain modeling, data ownership, contextual models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Diverging experiences&lt;/td&gt;
&lt;td&gt;API boundaries, consumer-specific contracts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reporting pressure&lt;/td&gt;
&lt;td&gt;Analytical separation, read models, data movement&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Sorting what is fine from what is not
&lt;/h2&gt;

&lt;p&gt;Not everything imperfect in the platform is worth changing. Some of what looks&lt;br&gt;
dated is still doing its job perfectly well, and some of what works today is&lt;br&gt;
already starting to strain. The point of sorting is to separate the parts that&lt;br&gt;
are fine from the parts that are actually costing the business something.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Still serving the business&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;.NET&lt;/li&gt;
&lt;li&gt;SQL Server&lt;/li&gt;
&lt;li&gt;Entity Framework&lt;/li&gt;
&lt;li&gt;Responsive web application&lt;/li&gt;
&lt;li&gt;Relational transactions&lt;/li&gt;
&lt;li&gt;Shared deployment where it still simplifies operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Creating measurable friction&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cross-domain business coupling&lt;/li&gt;
&lt;li&gt;Ambiguous data ownership&lt;/li&gt;
&lt;li&gt;Partner logic inside core services&lt;/li&gt;
&lt;li&gt;Coordinated deployment&lt;/li&gt;
&lt;li&gt;Broad regression impact&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The business is beginning to require&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stable API contracts&lt;/li&gt;
&lt;li&gt;Additional user experiences&lt;/li&gt;
&lt;li&gt;More independent scaling&lt;/li&gt;
&lt;li&gt;Clear telemetry and state ownership&lt;/li&gt;
&lt;li&gt;Separation of operational and analytical workloads&lt;/li&gt;
&lt;li&gt;Higher customer-facing availability&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;If this does not materially affect delivery speed, risk, scalability, availability, security, cost, or a business capability, why are we changing it?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We carry forward only the areas where a technical constraint can be tied to&lt;br&gt;
meaningful business impact.&lt;/p&gt;

&lt;h2&gt;
  
  
  The initial decision lens
&lt;/h2&gt;

&lt;p&gt;The pressures point to five areas worth deeper investigation. Together they&lt;br&gt;
become the first working &lt;strong&gt;success criteria&lt;/strong&gt; for ZibiWorks: for each, the&lt;br&gt;
current strain and what improvement would look like.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area &amp;amp; current strain&lt;/th&gt;
&lt;th&gt;What success looks like&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Changeability.&lt;/strong&gt; Cross-domain coupling, shared ownership, and broad regression impact are raising the cost of change.&lt;/td&gt;
&lt;td&gt;A smaller blast radius, less regression and coordination effort, and more changes that stay local.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Extensibility.&lt;/strong&gt; Partner coupling and the rising cost of adding capabilities make external change expensive.&lt;/td&gt;
&lt;td&gt;Less effort to absorb partner and capability changes, with fewer unrelated areas affected.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Scalability.&lt;/strong&gt; Variable demand and increasingly different workload profiles expose both runtime and change-scaling constraints.&lt;/td&gt;
&lt;td&gt;Handling variable demand without scaling the platform as one unit, while improving the system's ability to absorb ongoing change.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Reliability.&lt;/strong&gt; Performance and availability problems are becoming visible to customers.&lt;/td&gt;
&lt;td&gt;Fewer customer-visible failures, with better failure isolation and recovery where the business impact justifies it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Data.&lt;/strong&gt; Ambiguous ownership and competing operational and analytical needs are creating friction.&lt;/td&gt;
&lt;td&gt;Clearer ownership and meaning, with less interference between operational and analytical workloads.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are directions, not numeric targets. The evidence tells us what needs to&lt;br&gt;
improve; the levels worth committing to come as specific decisions get made.&lt;/p&gt;

&lt;p&gt;These criteria describe what needs to improve. The guiding principles describe how ZibiWorks should make decisions while pursuing those improvements. They are not intended to map one-to-one to the criteria; most apply across several of them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Favor change isolation where coupling is materially slowing delivery.&lt;/li&gt;
&lt;li&gt;Improve resilience where failures are becoming customer-visible.&lt;/li&gt;
&lt;li&gt;Prefer reversible changes while the cost of being wrong is high.&lt;/li&gt;
&lt;li&gt;Add complexity only when it buys a capability the business actually needs.&lt;/li&gt;
&lt;li&gt;Preserve simplicity where the current design is still serving the business.&lt;/li&gt;
&lt;li&gt;Design for foreseeable growth, not every theoretical future.&lt;/li&gt;
&lt;li&gt;Treat security, data integrity, and operability as baseline constraints.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are ZibiWorks' first working criteria and principles, not permanent rules.&lt;br&gt;
They give the next decisions a consistent starting point and will be revisited&lt;br&gt;
as the context changes.&lt;/p&gt;

&lt;p&gt;With the pressures identified, the criteria named, and the principles in hand,&lt;br&gt;
ZibiWorks can take on its first real choice: do we address these constraints&lt;br&gt;
before moving the platform, or move first and modernize afterward?&lt;/p&gt;




&lt;p&gt;ZibiWorks is fictional. The ideas and opinions expressed throughout the series are my own and do not represent the views, positions, or practices of my employer.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>softwareengineering</category>
      <category>dotnet</category>
      <category>csharp</category>
    </item>
  </channel>
</rss>
