Open Standards & Portable Architecture

ModernLift · ·11 min read
Part 6 of 8

Avoiding technology lock-in is an architecture decision, not a procurement one. A portable system keeps its switching cost low by construction — built to open standards and interfaces rather than proprietary ones, with vendor-specific services isolated behind abstractions, data held in open formats you can export, and the skills to run it available in the open market. The goal is not to use no proprietary technology; it is to ensure that leaving any one piece is a contained change rather than a rewrite of the estate.

Technology lock-in is the cost of leaving a vendor, a platform, or a technology once your business depends on it. You avoid it the same way you incur it: by construction. A locked-in system is welded to one vendor’s proprietary services, stores its data in that vendor’s format, and runs on a skill the market is leaving. A portable system keeps its switching cost low on purpose, so leaving any one piece is a contained change rather than a rewrite of the estate. This is an architecture decision, not a procurement one, and that is the good news: you control it.

Earlier parts of this series priced the disease: the licensing traps, the hidden maintenance bill, the engineering capacity lock-in consumes, and the budget ratio it tilts. This part begins the cure by describing the destination, what a system that doesn’t lock you in actually looks like. You cannot escape lock-in toward nothing. You escape it toward an architecture deliberately built to keep the switching cost low, and knowing that target precisely is what separates modernization from simply trading one proprietary trap for a newer one. The reassuring news is that the disciplines that get you there are the same ones that make a system cheaper to change for every other reason too.

Lock-in is designed in, so portability is designed in too

The central insight is that lock-in is not something that happens to a system from the outside. It is a property the architecture either has or lacks, decided by how the system is built. A system welded to one vendor’s proprietary services, storing data in that vendor’s format, written in a skill the market is leaving, is locked in by construction — no contract clause causes that, the architecture does. The corollary is the hopeful one: if lock-in is designed in, portability can be designed in too.

That reframes “avoiding lock-in” from a procurement negotiation into an engineering decision you actually control. You will never out-negotiate a vendor whose pricing assumes you cannot leave. But you can build a system where leaving is a contained change rather than a rewrite — and that capability, baked into the architecture, is worth more at every future renewal than any clause your lawyers can win. The best position to negotiate from is the one where you don’t have to.

The four properties of a portable system

Portability is not one decision but four, each one the antidote to a dimension of lock-in from Part 1.

  • Built to open standards. The system’s interfaces, protocols, and data exchange use published, widely supported standards rather than vendor-specific ones. Open standards mean more than one implementation exists, which is the precondition for ever having an alternative to switch to.
  • Proprietary dependencies isolated behind abstractions. Where a proprietary service earns its place, the system depends on it through an interface of your own, not directly. The applications call your abstraction; your abstraction calls the vendor. Replacing the vendor becomes a change in one place instead of a change everywhere — the opposite of the middleware-by-accumulation trap from Part 2.
  • Data in open, exportable formats. Information lives in documented, standard formats with an export path that is actually exercised, not theoretical. Data you can move is data you own; data trapped in a proprietary schema is data you merely license.
  • Skills available in the open market. The stack is one the broad labor market knows, so the people to run it can be hired rather than hoarded. This is the antidote to skills lock-in — choosing technologies whose talent pool is growing, not retiring.
Lock-in dimension (Part 1)Portable-architecture antidote
ContractualOpen standards with more than one implementation
PlatformProprietary services isolated behind your own interfaces
DataOpen, documented, exercised export formats
SkillsA mainstream stack the open market can staff

A system with all four is not lock-in-free — nothing is — but its switching cost is low by construction, distributed into contained changes rather than concentrated into one prohibitive migration. That is the difference between a dependency and a trap.

Where lock-in actually bites, and the portable choice

The four properties are abstract until you map them onto the decisions a real system makes. Lock-in does not arrive as one big commitment. It accumulates through dozens of small defaults, each reasonable on its own, each raising the exit cost a little. Here is where it usually concentrates, and the choice that keeps the switching cost contained.

Where it bitesThe lock-in versionThe portable choice
DatabaseProprietary stored procedures, vendor-only SQL dialects, engine-specific features carrying business logicANSI-standard SQL where it covers the need; business logic in the application, not the engine; a schema you can dump and reload elsewhere
Cloud computeA managed service with a proprietary API and no equivalent anywhere else (a specific serverless runtime, a proprietary queue, a vendor-only event bus)Containers on the OCI standard, orchestration on Kubernetes, and an adapter in front of any managed service so the application calls your interface, not the vendor’s
Data formatsRecords exportable only as a proprietary blob, or an export path that exists in the docs but has never been runOpen, documented formats (JSON, CSV, Parquet) and an export that is exercised on a schedule, not assumed
Identity and authAuth logic coupled to one provider’s proprietary tokens and flowsOpen standards (OIDC, SAML) so the provider sits behind a boundary the rest of the system does not see
ObservabilityTelemetry emitted in one vendor’s proprietary agent format, so changing tools means re-instrumenting the codeOpenTelemetry, an open standard with more than one backend, so the data and the tool that reads it are decoupled
Infrastructure definitionEnvironment defined only in one cloud’s proprietary console or template languageInfrastructure as code in a portable tool, so the environment is a versioned artifact you can read, review, and rebuild
Language and runtimeA stack whose talent pool is retiring faster than it is replacedA mainstream stack the open market actively staffs, chosen with the ten-year hiring picture in mind

None of these choices forbids the proprietary option. The point is narrower: when you do reach for a proprietary service, put your own interface in front of it so the dependency lives in one place. The database can be a managed one; the business logic just should not live inside its proprietary extensions. The queue can be the cloud’s native one; your code should just call enqueue() on an abstraction, not the vendor SDK directly.

Cloud lock-in is the version most teams actually face

For most modern systems, lock-in is no longer a mainframe or a desktop suite. It is the cloud. The pull is strong and mostly benign: managed services remove operational burden, and the deepest, most convenient services are the most proprietary ones. A team that builds its core workflow directly on one cloud’s proprietary serverless, queue, and datastore has not made a mistake exactly, but it has quietly made leaving that cloud a rewrite rather than a migration.

The portable posture is not “multi-cloud everything,” which is expensive and usually pays for an option no one exercises. It is more disciplined than that. Run the parts that have open equivalents on the open equivalents, which is most of them: containers, Kubernetes, standard SQL, object storage behind an S3-compatible interface, OpenTelemetry for signals. Use the deep proprietary service where it genuinely earns its place, but isolate it behind an adapter so it is one contained dependency, not a root the whole tree grows from. That gives you the operational benefit of the managed cloud and keeps the exit a project rather than a rebuild.

Containment, not avoidance

The most common misreading of “avoid lock-in” is “use no proprietary technology,” and it is an expensive mistake. Proprietary services are frequently the best tool for a job; a managed offering can be the right call precisely because someone else carries the operational burden. Refusing them on principle is its own kind of waste, and it can lock you into self-built complexity that is harder to leave than any vendor.

The discipline is not avoidance but containment. Use the proprietary service where it earns its place — but isolate it behind an interface so the rest of the system depends on the capability it provides, not the vendor providing it. Done well, you keep the benefit of the proprietary tool and retain the option to replace it, because the dependency lives in one contained place instead of being smeared across the estate. The question to ask of any proprietary dependency is not “can we avoid this?” but “if this vendor doubled the price tomorrow, how many things would we have to change to leave?” If the answer is “one adapter,” the lock-in is contained. If it is “everything that touches it,” you are building the next trap.

Portable does not mean perpetually moving

A second misreading worth heading off: portability is the option to move cheaply, not an obligation to keep moving. A well-built portable system can run happily on one vendor for years — the value of portability is not that you exercise it constantly, but that you could, which is exactly what restores the negotiating power Part 2 showed lock-in removes. You build for portability so that staying is a choice you keep making freely, not a sentence the architecture has handed down. The cost of the discipline is modest and front-loaded; the value is an option you hold for the life of the system.

Portability isn’t free either

Portable architecture is a target, not a religion, and three honesty notes keep it useful. First, every abstraction has a cost — the interface you build to isolate a vendor is itself code to maintain, and over-abstracting in pursuit of theoretical portability you will never use is its own form of waste. Build the abstraction where the switching cost it contains is real and the dependency is one you genuinely might want to leave; do not wrap everything on principle.

Second, portability is rarely absolute. Some proprietary capabilities have no open-standard equivalent, and isolating them behind an interface reduces the switching cost without eliminating it. Honest architecture names where the residual lock-in lives rather than pretending an abstraction made it disappear.

Third — and this is the bridge to the rest of the cure — describing the target is the easy part. You are not building this system on a blank page. You are starting from an existing, locked-in, business-critical estate that must keep running while you move it toward this architecture, with the data intact and the behavior proven. That migration, not the diagram, is where the real difficulty lives, and where parity validation earns its place — proving a portable replacement behaves identically before it carries a single live transaction.

Where this leads

We have the destination: a portable architecture with a low switching cost by construction. The hard question is how to get an already-locked-in system there without the big-bang rewrite that fails most of the time. Part 7, Escaping Vendor Lock-In, lays out the practical playbook — how to lower the switching cost of a live, business-critical system one slice at a time, restoring negotiating power and recovering capacity as you go, without betting the business on a cutover date.

Frequently asked questions

How do you avoid technology lock-in?
By designing for a low switching cost rather than negotiating for a good contract. That means building to open standards and published interfaces, isolating any proprietary service behind an abstraction so it can be swapped without touching the applications that use it, keeping data in open, exportable formats, and choosing technologies whose skills are available in the open labor market. Lock-in is the cost of leaving; portable architecture is the discipline of keeping that cost contained, component by component.
Does avoiding lock-in mean never using proprietary technology?
No. Proprietary services are often the best tool for a job, and refusing them on principle costs more than it saves. The discipline is not avoidance but containment — use the proprietary service where it earns its place, but isolate it behind a standard interface so your system depends on the capability, not the vendor. Done well, you get the benefit of the proprietary tool and keep the option to replace it, which is the whole point.
How do you avoid cloud vendor lock-in specifically?
Not by going multi-cloud on everything, which usually pays for an option no one exercises. Run the parts that have open equivalents on those equivalents: containers on the OCI standard, orchestration on Kubernetes, standard SQL, object storage behind an S3-compatible interface, and OpenTelemetry for signals. Use a deep proprietary managed service where it genuinely earns its place, but put your own adapter in front of it so it is one contained dependency rather than a root the whole system grows from. That keeps the operational benefit of the managed cloud while keeping the exit a project rather than a rebuild.
What makes an architecture portable?
Four properties. It is built to open standards rather than vendor-specific ones, so its interfaces are widely supported. Its proprietary dependencies are isolated behind abstractions, so any one can be replaced in containment. Its data lives in open, documented, exportable formats, so the information is genuinely owned. And it runs on a stack whose skills are available in the open market, so it carries no skills lock-in. Portability is the sum of these — a system whose every dependency can be left without rewriting the rest.
All 8 parts of Vendor Lock-In & The Cost of Maintenance →