The Low Code Factory Discuss an Engagement

Home/Insights/Handover-friendly systems

Delivery10 min read

How to design a handover-friendly system

Handover is not a phase at the end of a project. It is a constraint on every decision made along the way, and a system designed without it in mind cannot be retrofitted into one that somebody else can operate.

Handover, as commonly practised, is a fortnight at the end of a project during which documentation is written, a walkthrough is recorded, and a repository is transferred. Everyone agrees it went well. Six months later the receiving team cannot make a change without help, and the supplier who was supposed to be finished is still fielding questions.

The reason is that handover was treated as a deliverable rather than as a property. You cannot document your way out of a system that is difficult to own. The documentation will describe an architecture the reader cannot navigate, refer to conventions they do not share, and go stale within a quarter. The problem was not the documentation. The problem was every decision taken in the preceding six months that made the system hard to inherit, each of which was rational in isolation.

Designing for handover means accepting a specific discipline from the first week: the system is being built for somebody who is not in the room, who will arrive without context, and who will be under time pressure when they do.

Build in the client's environment from the first week

The single most effective decision available, and the one most often deferred.

A system developed in a supplier's environment and delivered at the end will encounter the client's reality for the first time at the worst possible moment. Their authentication is different. Their network has rules. Their deployment process requires approvals nobody mentioned. Their database is on a version that behaves subtly differently. Every one of these is discovered at handover, which is to say discovered when the budget is exhausted and the team is dispersing.

Building inside the client's environment from the beginning means those constraints are designed around rather than discovered. It is slower at the start — access takes time, environments are awkward, somebody has to be persuaded — and it removes an entire category of end-of-project catastrophe. It also means that at handover there is nothing to migrate, because the system is already where it will live.

Choose a stack the receiving organization can hire for

The technical decision with the longest shadow, and the one most often made on the delivery team's preferences.

A supplier's engineers are entitled to their preferences and frequently right about them. But a system written in a language the client's organization does not use, on a framework nobody there knows, with a build pipeline that exists nowhere else in their estate, is a system they cannot own regardless of how good it is. They will not be able to recruit for it, they will not be able to reassign anyone to it, and the first serious change request will come back to the supplier.

The right question is not "what is the best tool for this problem" but "what is the best tool for this problem that this organization can still maintain in three years". Those are different questions and the second one is the one that matters. Choosing boringly, in a mainstream stack the client already runs, is usually worth more than any technical elegance a more exotic choice would buy.

Put configuration where the business can reach it

A system whose thresholds, routing rules, schedules, endpoints and reference data are compiled into its source is a system that requires an engineer for every trivial change. That requirement is the mechanism by which a supplier becomes permanent, whether or not anybody intended it.

Typed, validated configuration that an authorised person can change — with the change recorded — transforms the ownership picture. Not because change is frequent, but because the cost of each change collapses. A business that can adjust an escalation threshold itself, without raising a ticket and waiting a quarter, keeps using the system as the process evolves. A business that cannot will work around it, and the workaround will become the process.

The line is worth drawing carefully. Configuration should cover the things that change with the business — rules, thresholds, routing, reference data, schedules. It should not become a general-purpose scripting surface, which merely relocates the complexity somewhere less testable.

Make the system explain itself to a non-engineer

The receiving team is usually not an engineering team. They are the operations function that owns the process, and their first question will not be about the code. It will be some variant of: what did it do last night, and why does this record look wrong?

A system that can only answer that question by having an engineer read a log file has not been handed over in any meaningful sense. It has been transferred, and the dependency remains.

The counter-measure is an operator interface that shows what ran, what it decided, what it sent, what came back, what failed, and what a human can do about it. Building that costs real time and no sponsor is excited about it. It is also the difference between a system the business owns and a system the business rents from whoever built it.

Document the decisions, not just the behaviour

Most technical documentation describes what the system does. That information is also available in the source code, more reliably and more currently, which is why such documentation goes unread and then goes stale.

What the source code cannot tell the next engineer is why. Why the boundary was drawn here rather than there. Why this queue exists when it appears redundant. Why the obvious approach was rejected. Why this apparently pointless retry is load-bearing.

That reasoning is what determines whether a future change is safe, and it exists nowhere but in the heads of the people who made the decision. Recording it — briefly, in the repository, as a short note per significant decision including the options rejected — is the highest-value documentation a project produces, and it takes an hour a month.

The failure to record it is why so many inherited systems accumulate defensive complexity. The new team does not understand why something is there, does not dare remove it, and builds around it. Repeat that a few times and the system becomes something nobody can reason about.

Test the handover before the project ends

Handover is usually verified by asking whether the receiving team feels comfortable, which is a question they cannot honestly answer until they have tried. The alternative is to test it, while the supplier is still there to close the gaps.

Have the client's team perform a real change, end to end, with the supplier watching and not helping. Not a demonstration — an actual change to an actual requirement, through their own deployment process, into their own environment. Whatever goes wrong in that exercise is precisely what would have gone wrong six months later, except that now there is somebody around to fix it.

Similarly, have them run an incident. Break something in a non-production environment and ask them to diagnose it using only what they have been given. If they cannot, the observability is insufficient, and that is a finding worth having while there is still budget.

The uncomfortable implication

Every one of these decisions costs the delivery team something. Building in the client's environment is slower. Choosing a boring stack forgoes real advantages. Building an operator console is weeks of work with no visible feature at the end. Testing the handover properly surfaces problems that nobody wanted to know about.

Each of them also reduces the client's future dependence on the supplier who is making the decision. That is an awkward incentive, and it is worth being clear-eyed about the fact that a supplier who benefits from being needed has no reason to design for their own redundancy.

The measure of a well-handed-over system is that the team who built it could disappear the following week and nobody would be blocked. That is a strange thing for a supplier to optimise for and it is the only definition of the job that is worth anything.

The short version Handover is a property, not a phase. Build in the client's environment from week one, choose a stack they can hire for, put configuration where the business can reach it, make the system explain itself to a non-engineer, document why rather than what, and test the handover by making them perform a real change while you watch.

Every engagement we run is designed so the client's team can operate the result without us. See how engagements are structured, or discuss a system you need to own.