IT Development & Integration

Most organisations do not fail at software delivery because they cannot write code. They fail because their systems cannot change without breaking each other. Over years of expansion, an IT landscape accumulates connections: a customer record copied into a billing engine, an order pushed into a warehouse system, a nightly file that reconciles two ledgers nobody fully understands. Each connection was reasonable when it was built. Taken together they form a lattice of hidden dependencies in which a small change in one place produces an unpredictable failure somewhere else. This is the real subject of development and integration. It is not the act of connecting two systems once, but the discipline of keeping many systems able to evolve independently over a long time.

This article treats integration as a design problem rather than a plumbing exercise. It argues that the durable properties of a system, the ability to release safely, to replace a component, to absorb a new channel or partner, come from a small number of first principles: explicit contracts, loose coupling, and mediated rather than direct communication. We examine how API design, event-driven and message-based patterns, and disciplined boundaries produce software that is safe to change, and how the common failure modes almost always trace back to violating those same principles. Finally we describe how Nashua approaches this work in practice.

What Nashua offers hereEngagements that build software safe to change and make systems talk without point-to-point sprawl.See the engagements

The integration debt beneath modern delivery

Integration has quietly become the dominant cost in most enterprise IT landscapes, and it rarely appears as a line item. It hides inside project delays, inside the caution that surrounds every release, inside the meetings needed to coordinate a change across three teams who each own a system the change touches. When people say a platform is hard to work with, they usually do not mean the code is bad. They mean the system is entangled: you cannot reason about one part without reasoning about several others, and you cannot ship one part without moving the rest.

The reason this matters now, more than a decade ago, is that the surface area of integration has multiplied. A single business capability may span a core system of record, several software as a service applications, a data platform, a mobile channel, and one or more external partners connected by their own interfaces. Customers expect changes in weeks, not quarters. Regulation demands that data flows be traceable and auditable. Meanwhile the underlying systems are increasingly ones the organisation does not own and cannot modify, which shifts the whole burden of adaptation onto the integration layer.

The consequence is that integration quality now sets the ceiling on delivery speed. An organisation with clean boundaries and explicit contracts can add a channel or replace a vendor with a contained, well understood piece of work. An organisation without them treats every such request as a research project, because no one can predict what will break. The difference is not talent or budget. It is whether the IT landscape was designed to change, and that design lives almost entirely in how systems are made to talk to one another.

There is a further reason the topic has grown urgent. As more capability is assembled from purchased software and external services, the code an organisation writes itself shrinks, while the code that connects things grows. The centre of gravity of engineering has moved from building features inside a single application to composing behaviour across many. That shift rewards teams who treat integration as a designed asset and punishes those who treat it as an afterthought bolted on at the end of each project. The IT landscapes that will age well are the ones where someone owned the shape of the connections deliberately, rather than letting them accrete one deadline at a time.

Contracts before connections

The first principle of durable integration is that a contract is more important than a connection. A connection is the mechanism by which two systems exchange data. A contract is the agreement about what that data means, what shape it takes, what guarantees hold, and what each side may assume about the other. Teams that focus on connections build things that work on the day they are tested. Teams that focus on contracts build things that keep working as both sides evolve, because the contract is the stable surface behind which each side is free to change.

A good contract is explicit and narrow. It states the data it carries and nothing incidental about how the provider happens to store it internally. This distinction between the interface and the implementation is the whole game. When a consumer starts relying on an internal detail that leaked through a poorly designed interface, a coupling has formed that no one agreed to and no one is tracking. The provider can no longer refactor freely, because a change to its internals now silently breaks a consumer. Well designed application programming interfaces exist precisely to prevent this: they publish a deliberate, minimal surface and hide everything behind it.

Contracts also carry semantics, not only structure. Two systems can agree on a field called status and still be incompatible because they disagree on what its values mean or when it is set. Serious contract design therefore covers meaning, versioning, error behaviour, and the guarantees around delivery and ordering. It treats compatibility as a first class concern: a change is either backward compatible, in which case existing consumers are undisturbed, or it is not, in which case it requires a versioning strategy and a migration path. Making that distinction visible, and refusing to break it silently, is the single most valuable habit an integration practice can hold. Everything else in this article is, in one way or another, a technique for keeping contracts honest.

From point-to-point wiring to event-driven flow

The oldest integration style is point-to-point: system A calls system B directly when it needs something. For a handful of systems this is perfectly reasonable. The trouble is that the number of possible connections grows far faster than the number of systems, and each direct link binds two components together in time and in knowledge. A must know where B is, must be available when B is, and must handle B being slow or absent. Multiply that across a growing landscape and you arrive at the familiar spaghetti: a dense mesh of bespoke links where no one can change a system without tracing every thread that touches it.

The response that has matured over the last decade is to mediate communication rather than hard wire it, and increasingly to make it event-driven. Instead of A commanding B directly, A publishes a fact, an order was placed, a payment cleared, an address changed, and any system that cares subscribes to that fact. The publisher does not know or care who consumes the event. Consumers can be added or removed without touching the producer. This inversion is the essence of loose coupling: the systems no longer depend on each other, they depend on a shared, explicit contract about the events that pass between them.

Message-based and event-driven integration also decouples systems in time. A message placed on a durable broker is delivered when the consumer is ready, which means a slow or temporarily unavailable downstream system no longer stalls the upstream one. This asynchrony is not merely a performance trick. It changes the failure model: back pressure, retries, and buffering replace cascading outages. The trend across the industry, visible in the rise of streaming platforms and managed messaging services, is precisely this move from synchronous request chains toward flows of events that systems observe and react to. It is not universally appropriate, synchronous calls remain the right choice when a caller genuinely needs an immediate answer, but as the default posture for integrating many systems it has proven far more resilient than direct wiring.

Designing for loose coupling

Loose coupling is often quoted as a goal and rarely defined with enough precision to act on. In practice it has several distinct dimensions, and good architecture attends to each. There is coupling in location: does a system need to know where another lives, or does it address a logical destination that can be moved. There is coupling in time: must both systems be available simultaneously, or can they proceed independently. There is coupling in format: are they bound to a shared representation, or does a mediation layer translate between them. And there is coupling in knowledge: how much does one system need to understand about another's internals to work with it. Every integration decision tightens or loosens one of these, and the aim is to keep each as loose as the requirement allows.

Several design principles follow directly. Mediate rather than connect directly, so that a broker, gateway, or integration layer absorbs the differences between systems and gives each a single, stable thing to talk to. Own your boundaries explicitly: an anti-corruption layer that translates an external model into your own vocabulary prevents a partner's or vendor's design from bleeding into and dictating yours. Keep interfaces small, because every field you expose is a promise you must keep. Make communication idempotent and tolerant of retries, because in any distributed system messages will occasionally arrive twice or out of order, and a design that assumes perfect delivery is a design that will corrupt data under load. Prefer to move facts, not commands, so that a system announces what has happened and lets others decide what to do, rather than reaching across a boundary to orchestrate work that is not its own.

Underlying all of this is a single test: can each component be changed, deployed, and reasoned about on its own. When the answer is yes, the IT landscape can evolve one piece at a time, which is the only sustainable way large systems change. When the answer is no, you do not have an architecture so much as a single distributed program that merely looks like several systems, with all the fragility that implies and none of the independence. Designing for loose coupling is the deliberate, continuous work of keeping that answer yes as the IT landscape grows.

Integration backboneSystem of recordCRMBillingIdentityData platformPartner APIs
A mediated backbone replaces the point-to-point mesh, so each system integrates once rather than binding directly to every other.

Where integrations go wrong

Integration failures are remarkably consistent across organisations, which is encouraging, because it means they can be anticipated. A few recur often enough to name.

The distributed monolith. Systems are split into separate deployable services, but they are so tightly coupled through shared databases, synchronous call chains, or leaked internal models that they must be released together and fail together. This is the worst of both worlds: the operational complexity of many systems with the rigidity of one. It almost always comes from splitting along technical lines rather than around genuine boundaries of ownership and change.

The shared database. Two systems integrate by reading and writing the same tables. It feels efficient and it is catastrophic for change, because the database schema becomes an implicit contract that no one designed and everyone depends on. Neither system can evolve its storage without risking the other, and the coupling is invisible until it breaks.

The silent breaking change. A provider alters a field, a meaning, or an error behaviour without versioning, and consumers fail in ways that surface far from the cause. This is a contract violation, and it is why compatibility must be an explicit, enforced discipline rather than a matter of goodwill.

Chatty and fragile synchronous chains. A single user action triggers a long sequence of blocking calls across many systems. The end-to-end reliability is the product of every link, so the whole chain becomes less reliable than any part of it, and one slow component stalls everything upstream.

Integration logic with no home. Transformation and routing rules accumulate in scripts, stored procedures, and scheduled jobs that no team owns and no test covers. The IT landscape still runs, but nobody understands it, and every change is an act of archaeology.

The lost message. A system publishes or consumes without regard for what happens when delivery fails: no retry, no dead letter path, no idempotency, no way to replay. Under normal load it looks flawless. Under stress or partial outage it silently drops or double processes data, and the damage is discovered weeks later in a reconciliation that does not balance. This is the failure mode that most often erodes trust in integration, because its symptoms are quiet and its cause is buried in an assumption of perfect delivery that no distributed system can honour. The common thread across all of these is the same: a coupling or an assumption was created that no one made explicit, and therefore no one is managing. Naming them is the first step to designing them out, and a mature practice reviews every new integration against exactly this list before it ships.

How Nashua approaches development and integration

Nashua treats integration as an architectural discipline first and a technology choice second. Engagements begin by making the existing landscape legible: mapping the systems, the flows between them, and above all the couplings, including the undocumented ones hiding in shared databases and untended jobs. This map is where the real risk lives, and surfacing it changes the conversation from a list of tools to a set of deliberate decisions about boundaries. Only once the boundaries are clear does the question of mechanism, an API, an event stream, a message queue, become answerable, because the right mechanism depends entirely on the coupling you are trying to loosen.

From there the work follows the principles set out above. Contracts are designed explicitly and versioned deliberately, so that providers can evolve without breaking consumers and both sides know exactly what they may rely on. Where systems need to react to change rather than command each other, Nashua favours event-driven and message-based patterns mediated through an integration layer, replacing point-to-point links with a backbone that each system talks to once. Where an immediate answer is genuinely required, well designed synchronous interfaces are used with clear timeout, retry, and failure behaviour. The aim throughout is software that is safe to change: components that can be released, replaced, and reasoned about independently, protected from one another by contracts and anti-corruption layers rather than by hope.

Delivery practice reinforces the architecture. Contract tests hold both sides of an interface honest and catch breaking changes before they reach production, which turns compatibility from a matter of discipline into something the pipeline enforces automatically. Automated build and release pipelines make deployments small, frequent, and reversible, which is only possible because the boundaries are clean enough to deploy one component at a time. Observability is built into the flows, with correlation across events and messages, so that a problem can be traced to its source rather than inferred from symptoms after the fact. Integration logic is given a home: an owned, tested, versioned place rather than a scatter of untended jobs, so that the IT landscape remains legible to the people who inherit it.

Just as important is what Nashua declines to do. It does not reach for an event stream where a simple call is clearer, nor split a system into services that have no reason to be separate, nor add a broker to a problem that does not have a coupling worth loosening. The failure modes described earlier are as much about excess as about neglect, and restraint is part of the craft. None of this is exotic, and that is the point. Durable integration comes from applying a small set of principles consistently and knowing when each applies, and Nashua's contribution is to bring that consistency, and the experience of having seen where landscapes go wrong, so that what is built is designed to change rather than merely made to work on the day it ships.

Where Nashua makes the difference

The difference Nashua brings is not a single technology but a way of thinking that treats changeability as the primary requirement and holds to it under the pressure of delivery. Many suppliers can build a connection that works in a demonstration. Far fewer design an IT landscape that is still easy to change three years and thirty integrations later, when the original team has moved on and the business has asked for things no one anticipated. That long horizon is where the discipline of contracts, loose coupling, and mediated communication earns its keep, and it is where deep, patient engineering experience is worth more than any particular product.

There is also a practical corollary that changes what the work is permitted to assume. When an engagement calls for a capability that does not yet exist, it need not wait on a procurement cycle or a vendor's roadmap. The Nashua 360 Enterprise Platform is built to accommodate almost any feature at pace, through extreme vibe coding: what is needed is described in plain language and generated quickly, but always within firm architecture principles and under stringent quality assurance, so that speed never comes at the cost of coherence, security or control. The effect is strategic rather than merely convenient. It moves the make-or-buy line, keeps optionality cheap, and lets the architecture follow the strategy rather than the strategy bending to whatever happened to be on a shelf.

What ties it together is judgement: knowing when an event fits better than a call, when a boundary should be defended with an anti-corruption layer, when a breaking change is worth the migration and when it is not, when to invest in a versioning strategy and when a simpler path is honest enough. These decisions cannot be bought off a shelf, and they compound. A single sound choice is barely visible. A thousand of them, made consistently over the life of an IT landscape, are the difference between a system that grows more brittle with every release and one that stays supple. Made well and consistently, they yield an IT landscape that absorbs new channels, partners, and regulations as ordinary work rather than crisis. That is the outcome Nashua aims for: not integrations that merely function, but systems that remain safe to change for as long as the business needs them to, which in the end is the only measure of integration that matters.