30 May 2024 / Technical leadership / 8 chapters

Decide which choices can stay local

From How technical decisions break down as a team grows

If every implementation detail has to go past the same few people, central review gets slow, and teams wait for approval on things they're better placed to decide anyway. So I'd work out which choices actually cross a team or product boundary and leave everything else close to the work.

A local decision is one where the effects stay inside the component or feature that team owns. Internal function names, a private module layout, a small interface arrangement, or the implementation behind a stable contract usually fit. The owning team can review and change these without anyone else having to coordinate.

A shared decision changes what another team has to understand, send, store, operate or explain. That could be a public or internal API, a common data definition, identity and permission behaviour, an event someone else consumes, a workflow state support relies on, or an operational dependency. The code change might be a few lines while the coordination cost is a lot bigger.

A handful of questions works better than a long classification policy:

  • Will another component read or write the result?
  • Does it change what shared data means?
  • Will another team need to deploy, migrate or update their docs?
  • Could it affect access, billing, records or recovery?
  • Would two different implementations be visible to a user or operator?
  • Is it hard to reverse once data or integrations depend on it?

A yes means the owner should work out who's affected and pick a suitable level of review. It doesn't mean an architecture committee. A backwards-compatible field addition might only need a quick contract check. A change to account ownership might need product, data, security and support to look at it, because each of them relies on what "owner" means.

Some decisions start local and become shared through reuse. A team builds a helper for its own feature, other teams pick it up, and now that helper has a contract whether anyone planned one or not. That's when to sort out ownership and change rules, before someone ships an incompatible update.

Put the boundary in the team guidance: local choices get reviewed in the owning code area, and changes to named shared contracts need named reviewers. Keep that list of contracts short enough to remember and specific enough that people recognise one when it comes up in planning.

All articles