devops-architecture/

Architecture is a people job

6 min read codestinger

When people imagine a software architect, they usually picture diagrams: boxes, arrows, a cloud icon or two. Those matter. But the most important architecture work I do happens before the diagram exists, in conversations with the people who will build, deploy, sell, configure and live with the system.

A design that is technically elegant but awkward to deploy, hard to configure or impossible to explain has failed. It just hasn't found out yet.

Everyone sees a different system#

Put five people in a room and ask them what the product is. You'll get five honest and different answers.

  • Deployers see installers, configuration files, upgrade paths and rollbacks. Their question is: will this go in cleanly at a customer site and stay up?
  • Solution designers see building blocks. Their question is: can I shape this to fit this customer's process without asking for new code?
  • Product owners see value, priorities and deadlines. Their question is: what do we get, what does it cost and what are we giving up?
  • Developers see modules, dependencies and technical debt. Their question is: can we build this well and still understand it next year?
  • Clients see outcomes. Their question is: does it solve my problem reliably, every day?

None of these views is wrong and none is complete. An architect's job is to hold all of them at once and find the design that serves them together.

Listen before you draw#

Before I propose anything, I try to spend time with each group and ask questions that surface what they really need:

  • What slows you down today?
  • What would you never want to do by hand again?
  • Where do things usually go wrong: at install, at configuration or months later?
  • What do you have to explain to someone else? What makes it hard to explain?
  • If you could change one thing about how this works, what would it be?

The answers are rarely about technology. They're about time, confidence and risk. Those are exactly the things good architecture should improve.

Know the strengths in the room#

Teams are not interchangeable resources. Every person has areas where they shine and areas where they're still growing. A good design takes that into account.

If one developer has a gift for clear APIs, give them the boundaries between components. If nobody enjoys operations, that's a signal to invest early in automation. Designing for the team you actually have is not a compromise. It's what makes a design deliverable.

Carry the heaviest parts yourself#

Designing for the team you have doesn't mean avoiding what the team hasn't mastered yet. Sometimes the right answer really is Rust, C or a hard piece of cryptography while the team is strongest in Python. Giving up on the right technology would weaken the product. Handing an unfamiliar, high-risk component to people still learning it would put both them and the deadline under pressure.

In those cases I take the heavy lifting on myself. An architect who still writes code can build the hardest part personally and deliver it as a building block the team can safely rely on:

  • A small, stable interface in the language the team already uses, so adopting it feels like using any other library.
  • Thorough tests, including the failure cases, so its behaviour is predictable under pressure.
  • Clear documentation of what it does, what it guarantees and what it doesn't.
  • Packaging and automation that make it install and upgrade like everything else in the project.

The team keeps its momentum and delivers features on top of a foundation it can trust, without being slowed down by the complexity underneath. Over time, pairing and code reviews open the internals up to anyone who wants to learn them, so the building block never becomes a mystery owned by one person.

Strengths grow when someone invests in them. Mentoring is part of an architect's job: pairing on a hard design, explaining the reasoning behind a decision and giving people ownership of something slightly beyond their current reach. Much of what I know was passed on to me that way and passing it on is how a team outgrows its architect.

Design features around people, not modules#

It's tempting to organise features the way the code is organised. Users don't care how the code is organised. They care about the job they're trying to do.

So I like to think in terms of the people who will use each feature:

  • For deployers: one clear place for configuration, sensible defaults, pre-flight checks that fail early with a helpful message, upgrades that can be rolled back.
  • For solution designers: configuration instead of custom code, templates they can copy and adapt, previews that show the effect of a change before it goes live.
  • For product owners: features that can be switched on gradually plus demos that show real behaviour rather than slides.
  • For clients: interfaces that speak their language, not ours.

Great technology is not yet a product#

Engineers, me included, can fall in love with an elegant algorithm or a clever engine. But technology on its own solves nothing for anyone. It becomes a product only when people can install it, trust it, understand it and rely on it day after day. It also needs a team that can support it for years. Teams with brilliant technology still fail when they forget the people around it.

Keeping deployers, designers, product owners and clients in the conversation is what turns good engineering into something people actually use.

Abstraction is a form of empathy#

Underneath, the system can be as sophisticated as it needs to be: concurrency, integrations, encryption, retries, caching. The people using it shouldn't have to know.

Every time a deployer has to understand our internal architecture to install the product (or a solution designer has to read code to configure it), the complexity has leaked. Good abstraction keeps it contained. It means clear names, honest error messages, safe defaults and interfaces that make the right thing easy and the wrong thing hard.

Hiding complexity is not about dumbing things down. It's about respecting other people's time and expertise.

Habits that help#

A few practices I keep coming back to:

  1. Shadow a real deployment before designing the installer or the configuration model.
  2. Demo early and often to the people who'll use the feature, not just to the people who asked for it.
  3. Write decisions down in plain language so product owners and clients can follow the reasoning, not just the team.
  4. Take the riskiest part yourself when the team hasn't mastered it yet. Hand it over as a tested, documented building block.
  5. Invite disagreement. The person who spots a problem in a design review has saved you weeks.
  6. Close the loop. When feedback changes a design, tell the person who gave it. It builds trust and it brings more feedback next time.

The short version#

Architecture is the art of making many people's needs fit into one system. That starts with understanding them: their perspective, their pressures and their strengths. It also means being willing to carry the heaviest parts yourself, so the team can build on solid ground. Get that right and the diagram almost draws itself. Get it wrong and no amount of clever engineering will save it.