5 minute read

There’s a peculiar amnesia that’s swept through enterprise IT over the past decade—one that’s costing organisations dearly in both financial and operational terms. As we’ve collectively migrated from on-premises infrastructure to cloud platforms, we’ve somehow forgotten the resource abundance that once characterised our computing environments.

The Forgotten Landscape of Enterprise Computing

Not long ago, the standard enterprise server was a veritable powerhouse: 64GB RAM, 32 cores, and terabytes of storage. These machines weren’t exotic unicorns—they were the workhorses of corporate data centres. Clustered together with high-performance switching fabric, they provided the foundation for three-tier applications that kept businesses running.

The economics made sense: capital expenditure on hardware that would serve your organisation for 3-5 years, with predictable maintenance costs. Yes, you needed to plan for capacity in advance, but the trade-off was control and consistency. Your applications had room to breathe.

Then came the great cloud migration.

The Promise vs. Reality of Cloud Economics

The initial cloud pitch was compelling: eliminate capital expenditure, pay only for what you use, and scale effortlessly. Who wouldn’t want that? But somewhere along this journey, something troubling happened. The same managers who wouldn’t blink at provisioning robust on-premises infrastructure began to wince at the equivalent cloud specifications.

Suddenly, applications that had comfortably run on 64GB servers were expected to perform miracles on instances with a quarter of the memory. Databases that had sprawled across terabytes of dedicated storage were constrained to the minimum viable capacity. The mantra became “optimise, reduce, minimise”—not because the applications’ requirements had fundamentally changed, but because the cost model made resource consumption painfully visible.

The cloud providers, of course, had perfected the art of making costs transparent whilst obscuring the penalties of under-provisioning. The bill shows exactly what you’re spending on compute, storage, and network—but not what you’re losing in performance, reliability, and developer productivity when you squeeze your workloads into undersized instances.

The Hidden Costs of Constraint

I’ve witnessed this transformation from both sides. We’ve built applications that customers previously hosted in their data centres, providing detailed Bills of Materials for servers and network equipment. Now, as these same applications move to cloud environments, I watch management struggle with resource constraints that wouldn’t have been contemplated in the on-premises world.

The costs manifest in numerous ways:

Extended deployment times: Under-resourced environments lead to unexpected performance issues that require emergency tuning and architecture revisions.

Reliability compromises: Systems that lack sufficient headroom become brittle during peak loads, leading to degraded service precisely when customers need them most.

Architectural contortions: Development teams spend countless hours designing around resource limitations rather than solving business problems.

Technical debt accumulation: Temporary workarounds to address resource constraints become permanent fixtures in the codebase.

Perhaps most insidiously, this resource austerity creates a self-reinforcing cycle. When applications struggle in constrained environments, the response is often to add layers of caching, queue management, and request throttling—all of which introduce complexity that demands even more careful resource management.

The Siren Call of New Services

Paradoxically, whilst teams squabble over every gigabyte of RAM for existing workloads, there’s another troubling trend emerging: the reflexive addition of new cloud services to address what might be simple resource constraints.

In the on-premises world, adding a new technology component was a weighty decision. It required procurement cycles, hardware installation, knowledge acquisition, and long-term support commitments. These friction points encouraged engineers to extract maximum value from existing investments before introducing new elements to the architecture.

Today’s cloud landscape offers a dramatically different proposition. AWS alone offers over 200 distinct services—each just an API call away. The psychological barriers to adding “just one more service” have evaporated. Having trouble with database performance? Don’t increase your instance size—add ElastiCache! Application can’t keep up with requests? Don’t scale your compute—add SQS queues!

This service proliferation introduces several problematic patterns:

Architectural complexity without necessity: Each additional service represents another potential failure point, another integration to maintain, and another skill set for teams to master.

Cost opacity: While individual services might seem reasonably priced, the cumulative effect across dozens of interconnected services often exceeds what a properly-sized simpler architecture would cost.

Operational overhead: Each service requires monitoring, alerting, backup strategies, security reviews, and disaster recovery planning—costs rarely factored into the initial decision to adopt the service.

The traditional on-premises approach—where new components were added only when absolutely necessary—enforced an architectural discipline that the cloud’s convenience has eroded. In the on-premises world, you might spend weeks tuning a database to perform better because adding a caching layer was prohibitively complex. In the cloud world, it’s often easier to add three new services than to properly diagnose why your existing resources aren’t performing as expected.

Finding the Middle Path

The solution isn’t necessarily to return to the capital-intensive model of on-premises infrastructure. Cloud computing offers genuine advantages in flexibility, geographic distribution, and managed services that would be challenging to replicate in-house.

Instead, organisations need to recalibrate their resource expectations based on workload requirements rather than cloud sticker shock. This means:

  1. Realistic baseline provisioning: Start with resources that match what worked on-premises rather than arbitrary minimums.

  2. Workload-appropriate scaling: Use cloud elasticity for variable loads but don’t undersize the baseline.

  3. Economic transparency: Factor in developer time, incident response costs, and opportunity costs when evaluating cloud spending.

  4. Architecture for efficiency: Redesign for cloud-native patterns where it makes sense, but don’t expect architectural changes alone to overcome fundamental resource needs.

  5. Service justification discipline: Before adding new cloud services, rigorously evaluate whether properly sizing existing resources could solve the problem more elegantly.

  6. Architectural simplicity as a value: Recognise that each additional component or service introduces exponential complexity in operations, monitoring, and troubleshooting.

  7. Consider hybrid approaches: Not every workload benefits equally from cloud deployment. Maintain on-premises options for stable, resource-intensive applications where the economics favour predictable usage.

Memory Isn’t Just a Technical Specification

The collective amnesia about what our applications actually require isn’t merely a technical issue—it reflects a deeper organisational disconnect between those who build and operate systems and those who manage budgets.

In the on-premises world, infrastructure costs were largely invisible once the capital expenditure was approved. In the cloud model, every gigabyte and CPU cycle appears on a monthly bill, creating constant pressure to optimise. This visibility is valuable, but not when it drives decisions that ultimately compromise the systems businesses depend on.

We need to remember that the laws of physics and the fundamental requirements of our applications haven’t changed. What’s changed is how we procure and manage resources. That shift shouldn’t mean abandoning the hard-won knowledge about what our systems actually need to function reliably.

The next time your cloud architect or finance team questions why an application needs the same resources it consumed in your data centre, remind them: our applications didn’t suddenly become more efficient when we migrated them. They still do the same work, process the same data, and serve the same users.

The only thing that’s changed is the bill’s visibility—and our willingness to provide what these systems have always needed.