Velox Needs a New Architecture — Now What?

The Architecture Is Telling You Something

Module 0, Lesson 1

What you'll learn

You can distinguish between a code problem and a structural problem - and explain why repairing the code without changing the structure will reproduce the same symptoms at the next release.

David Park opens his laptop and shares his screen. No slides - a spreadsheet. Five rows, each one a production incident from the last eight months. He walks through them in under five minutes, precise and unhurried, the way someone talks who has personally been paged for every line on the sheet: a shared deployment lock that broke task assignment when two teams shipped in the same window. A notification timeout on the enterprise tenant, patched three times, never quite gone. An unhandled exception in the integration connector that took the entire application down for eleven minutes. A reporting query that times out once a tenant crosses sixty thousand rows. Billing middleware adding eighteen milliseconds to every request in the system - including the ones that have nothing to do with billing.

Elena Vasquez has been quiet through all five. When David finishes, she says: "All five have the same root cause."

David looks up. "And it's not in the code."

Lars Hoffmann sets his marker down without writing anything. This is the first meeting of the Architecture Working Group, and nobody has said the word "architecture" yet.

Here's the thing about that room: you don't need to have sat through three seasons of Velox's growth to recognize it. You've been in a version of this meeting. Maybe not with these five incidents, but with five of your own - different names, same shape. That recognition is the point. Before this lesson gives you a framework, it's worth naming what you're actually looking at.

Velox grew from eight people to sixty in three years. What grew alongside the headcount: coordination overhead, the wait time between teams, a monolith that turns every release into an event that five teams have to survive together. What didn't grow: the ability for any one of those teams to ship something on its own.

What five incidents have in common

David isn't wrong about any individual item on his list. Each incident has a plausible local fix. Add a lock timeout. Cache the notification payload. Isolate the connector process. Add an index, or better, a read replica. Scope the billing middleware to billing routes only. If you handed these five rows to five different engineers, you'd get five reasonable pull requests by Friday.

That's exactly what happened, actually - over the eight months David is describing, each of these got patched, locally, correctly, by someone who understood their piece of the system. And each one came back, or a close cousin of it did, within two or three releases.

Elena's reframe is doing real work in that room, and it's worth slowing down on what it actually claims. She's not saying the five incidents are secretly one bug. She's saying they share a root cause that isn't in any of the code that got patched. To see what she means, look at how Velox's teams are actually organized: five teams, split by technical layer - one owns the UI, one owns the API gateway, and three own separate backend building blocks. Not one of those five teams owns a domain end-to-end. Not one of them can release independently of the other four, because every meaningful feature crosses at least three of those layers on its way to a user.

That's not a coincidence, and it's not a technology choice either. It's the direct, visible fingerprint of how communication is organized at Velox. There's a one-line version of this that's worth knowing by name, because you'll hear it again in the next module in full: systems tend to mirror the communication structures of the organizations that build them. Right now, treat that as a diagnostic tool, not a theory to study - it's the sentence that turns "five unrelated bugs" into "one visible pattern," and that's all it needs to do in this room today.

Velox's org chart, viewed from the architecture

Once you're looking for it, the pattern under David's five rows is easy to name. The shared deployment lock exists because no team can prove its change is isolated from the other four - so everyone freezes together. The notification timeout keeps drifting back because ownership of that code path has drifted too; whoever touched it last inherits it, which is not the same thing as someone owning it. The integration connector shares a deploy unit with core logic because nobody was ever given the job of owning "external integrations" as its own thing - so when it breaks, it takes its neighbors down with it. The reporting query is slow because reporting was never given its own data boundary; it reads the same tables every other feature writes to, live. And the billing middleware touches every request because the pipeline itself has no boundary around what billing needs to see.

Five different technical shapes. One organizational shape underneath all of them: nobody owns a domain, so nobody can change one domain without touching the other four.

There's a second layer to this worth naming, and it's less visible than the deployment freeze because it doesn't show up on an incident spreadsheet - it shows up in how people talk about the system. Velox's engineers have quietly adopted the belief that everyone has to understand everything: the reporting logic, the notification pipeline, the billing rules, the integration quirks, all of it, because any of it might be the thing that breaks your feature this sprint. Skelton and Pais's Team Topologies - you'll meet the rest of that framework properly much later in this course - names the resource this quietly exhausts: cognitive load. It's not a metaphor. A team, like a person, can hold a limited amount of domain complexity in working memory before quality drops. When a system is structured so that every team needs to understand every other team's domain just to ship safely, that limit isn't being respected - it's being ignored by design, one org chart decision at a time. Two more patterns round out the picture at Velox: knowledge concentrates in the two or three engineers who've been there since the beginning, because there was never a boundary that let anyone else specialize in a smaller piece; and when incidents pile up, leadership's answer has been to add more process - a longer QA pass, a stricter release checklist - rather than ask why isolated changes keep failing to stay isolated.

Notice what all four of these have in common: none of them are things you can fix by editing a file.

[Diagram: lesson_00.1image1.svg]

the same patch, the same symptom, six months apart - until something outside the loop changes

Sorting a pain by what will actually fix it

Here's the tool this lesson leaves you with, and it's deliberately simple, because the judgment call matters more than the mechanism: for any recurring pain, ask whether it would still be a problem if the code were perfect. If shipping a flawless patch tomorrow would make the pain disappear for good, it's a code problem. If the same shape of pain would resurface in a different corner of the system regardless of how well the patch was written - because the thing producing it is who owns what, who talks to whom, and who can ship without asking permission - it's a structural problem.

Some of Velox's five technical pains split cleanly. The reporting query timeout is the clearest example: build a proper read model or reporting-specific data store, and the timeout is gone, no matter how Velox organizes its teams tomorrow. That's a code problem, full stop. Others don't split cleanly at all, and that's not a failure of the framework - it's the honest answer for a meaningful fraction of what you'll sort in the exercise below. The shared deployment lock is the sharpest example of the opposite case: you could shrink the blast radius with better test isolation, but the reason five teams have to freeze together in the first place is that none of them owns a domain end-to-end - and that's not a line of code, it's an organizational decision nobody made on purpose.

Why David's fixes are correct and still not enough

It would be easy to hear all of this as "David did something wrong." He didn't. Every patch on that spreadsheet was the right call, locally, at the moment he made it. That's actually the uncomfortable part, and it's worth sitting with rather than rushing past.

Here's the honest version: when technical symptoms recur across releases despite local fixes, and when every fix requires coordination across multiple teams - the root cause is structural, not technical. That's not a criticism of the engineers who wrote the fixes. It's a description of what those fixes were up against. Six months from now, without a change to the structure producing these five symptoms, there will be five new incidents that look almost exactly like these - different table, different tenant, same underlying pattern. The patches don't reach the layer where the problem actually lives, and no amount of engineering skill applied at the code layer changes that. This is the difference between treating symptoms and treating causes, and it isn't a technical distinction. It's a diagnostic discipline - the one Elena just demonstrated in under ten seconds, and the one the rest of this module gives you a name and a method for.

That's also, not incidentally, why this meeting can't stay an architects' meeting. If the fix lived in the code, David's team could have owned it alone. Because the fix lives in who owns what and who has to coordinate with whom to ship anything, the room is going to need people in it who aren't architects at all. That's where Lars is about to take this next.

Further Reading

If you want the source for the cognitive-load argument: Skelton & Pais, Team Topologies (2nd ed., 2025) - read the chapter on cognitive load as a limited team resource. It's the concept Elena is naming when she points at the universal-knowledge illusion, well before the book's team taxonomy shows up later in this course.

If you want the underlying systems-thinking move: Donella H. Meadows, Thinking in Systems: A Primer (Chelsea Green Publishing, 2008) - read the chapter on how structure produces behavior. It's the same diagnostic instinct this lesson trains: stop asking what broke, start asking what the system is built to keep producing.

Exercise

Reference - Velox, eight months of incidents and working notes

Velox: five teams split by technical layer (UI, API gateway, three backend building blocks). No team owns a domain end-to-end. Every release touches at least three layers.

Task 1

Classify each pain and name the coordination pattern that justifies your answer.

  • All five Velox teams have to freeze their code and coordinate a shared release window, because none of them can prove a change won't break another team's code path. The freeze has been on the sprint calendar for over a year.

  • The notification service has been patched three times in eight months for the same enterprise-tenant timeout. Each patch fixes exactly what it targets - and something close to the same timeout comes back a release or two later.

  • An unhandled exception in the GitHub integration connector took the entire application down last quarter, because the connector shares a deploy unit and a process with core application logic.

  • The reporting query behind the executive dashboard times out once a tenant crosses sixty thousand rows, because it reads live from the same operational tables every other feature writes to.

  • Billing middleware adds eighteen milliseconds to every request in the system - including requests with nothing to do with billing - because the shared request pipeline routes everything through it by default.

  • Only one engineer fully understands how the reporting pipeline, the notification service, and the billing schema depend on each other. Every question about any of the three routes to her by habit, whether or not she's the one who touched that code last.

  • New engineers take six weeks to onboard, because no area of the Velox codebase maps to a single, learnable domain - every meaningful feature touches code that three or four different people own.

  • After the last string of incidents, leadership's response was to add a mandatory full-regression QA pass before every release, rather than ask why a change in one part of the system keeps breaking unrelated parts.

  • Nobody scheduled a conversation between the reporting, notification, and billing teams before the last billing schema migration. It broke the reporting pipeline and the notification service in the same release - both read from that schema, and the dependency had never been written down anywhere.

Task 2

Name three current technical pains in your own organization. For each, classify it as a Code Problem or a Structural Problem, and name the coordination pattern - who owns what, who has to talk to whom - that your classification depends on.

0 words (min 40)

Tags

Reverse ConwayConway's LawDDD Strategic DesignBounded ContextContext MappingEventStormingWardley MappingTeam TopologiesEvolutionary ArchitectureFitness FunctionsStrangler FigModulithSubdomain-ClassificationArchitecture for Flow