Skip to contentAnemo
EN
Contact

Running Internal and External Teams on the Same System

· 4 min read

Two teams on one system collide in three places: deployments, shared data, and who gets called when something breaks. The collisions are not a people problem and they are not solved by better communication. They are a boundary problem, and the boundary has to be decided before either team writes code.

The good news is that the decisions are few and they are not technically difficult. They are just usually deferred, because they feel like details next to the architecture.

Key takeaways

Decision 1: can each team release without the other

This is the one that decides whether the arrangement works. If the external team's release requires your team's pipeline, your approval or your deployment window, then your team's calendar sets their pace, and you have created a dependency in the direction you were trying to avoid.

Separate repositories, separate pipelines, separate environments. The two systems meet at a defined interface, and each side can release anything that does not change that interface without asking.

When the interface itself has to change, that is a scheduled, two-sided event with notice. Which brings up the second decision.

Decision 2: who owns each piece of data

Every table, every entity, every piece of state has exactly one owner. The owner can change its shape. Everyone else reads it through an agreed route and does not write to it.

The failure mode is two teams writing to the same records with different assumptions about what the fields mean. This produces data corruption that appears weeks later, cannot be traced to a single change, and is expensive to unpick. It is by a wide margin the worst thing that goes wrong when two teams share a system.

Practically:

Decision 3: who gets called, and for what

Write down what happens when each system is the one that is broken. If the new product is down, who is paged and what is the response time? If your core system is down and the new product stops working as a result, who tells the new product's users?

The case people forget is partial failure: your system is slow rather than down, the new product times out, and both teams believe the other one has the problem. Agree in advance how each side reports its own health, so that question has an answer rather than a debate.

What to share and what not to

Share Do not share
Design language and terminology A codebase
Authentication, through one provider Direct database access
The interface contract, in writing Deployment pipelines
Incident communication channels On-call rotations, at first
Architecture reviews at milestones Daily code review

The pattern: share decisions, not infrastructure. Two teams agreeing on what a "customer" means costs one meeting and saves months. Two teams sharing a deployment pipeline costs something every week forever.

The review question

Your engineers will often want to review the external team's code. Understand the motive, because it determines the right answer.

If it is about quality, a one-off architecture review at a milestone gets you most of the assurance for a fraction of the time. If it is because the code will eventually be theirs to maintain, then the thing to settle is the handover plan, not the review process, and we cover that in who owns the new product after it ships.

Continuous review is the option that quietly undoes the whole arrangement, because it puts your senior engineers back on the critical path.

Frequently asked questions

What if both teams need to change the same area?

Then the boundary is in the wrong place, and moving it is cheaper than coordinating around it. Two teams needing to change the same code regularly means the split was made along the wrong line, and it is worth redrawing early rather than managing forever.

Should the teams attend each other's meetings?

The interface owners should talk regularly, perhaps weekly at first. Everyone else should not. Joint standups feel collaborative and consume the time the separation was designed to protect.

How do we stop the two products feeling different to users?

Agree the design language, the terminology and the authentication flow at the start, and share a component library if the technology allows it. Consistency comes from shared decisions much more cheaply than from shared code.

Can this work if our system is an old monolith?

Usually yes, and it is often where it helps most, because building the new product inside an old monolith is exactly what your team has no capacity to do. The work is defining a read path out of it. Tell us what you are working with and we will say whether the boundary can be drawn.

How we would work on this

Related services

Related reading

Building the product for what comes next

We would rather deliver one product that holds up than three that have to be rebuilt. That standard is the same on every project, whatever its size.

Ali Boran GazelCEO

Contact us