The first time software architecture really clicked for me, it did not feel like learning an entirely new discipline. It felt familiar. A package enters a system. It gets identified.
Something determines what it is allowed to do. It moves through a defined path. Conditions divert it. Buffers hold it when something downstream is not ready.
Exceptions leave the normal path. Some things recirculate and try again. A bad routing decision can create congestion somewhere physically far away from the original mistake. Eventually completed work leaves the active system and capacity becomes available again.
I had spent years working inside that architecture. It was just made of steel.
THE BUILDING WAS ALREADY LOGIC
In 2020 I helped physically and virtually engineer a conveyance system. This was not simply a case of standing beside an installer and watching somebody bolt equipment together. I was present for installation and troubleshooting. I worked with the sensors.
The speeds. The diversion logic. The stacking areas. The container eligibility.
The dock-door relationships. Where boxes were allowed to go. Where they were not allowed to go. The physical system and the virtual system had to agree.
A box could physically fit somewhere and still not be virtually eligible to go there. A dock door could physically exist and still not be the correct door for a particular lane or time. A conveyor could physically move freight and still create a terrible system if its speed, sensor behavior or diversion logic was wrong. The steel was only half the machine.
The rules were the other half.
AND IT HAD TO RUN
The conveyance was not a demonstration. It had to operate roughly 23 hours a day. That changes engineering. There is nowhere for a bad theory to hide when the system has to keep running.
If a sensor is wrong, freight behaves wrong. If a speed is wrong, accumulation appears somewhere else. If diversion logic is wrong, the package does not care that the code looked elegant. It goes to the wrong place.
If a downstream operation cannot consume what the upstream operation produces, a buffer grows. If the buffer loses capacity, the problem propagates. Eventually the physical world tells you whether your logic was correct. That is one of the reasons I like physical systems.
They are rude. They do not care how persuasive your PowerPoint was.
THE PACKAGE IS INFORMATION
A package moving through conveyance is not literally data. But the behavior is close enough that the comparison became useful to me. The package enters at a location. It has identity.
It has state. It has attributes. Those attributes affect eligibility. The system evaluates conditions.
The package is routed. It may wait. It may merge with another stream. It may divert.
It may hit an exception. It may recirculate. Eventually it exits. Software does the same kinds of things with information.
A variable holds something. A pointer tells you where something is. A function receives something, performs defined work and returns something. A condition chooses a path.
A queue waits because downstream capacity is unavailable. A loop sends something around again. An exception leaves the preferred flow. Once I saw that, code stopped looking like a mysterious language.
It looked like another kind of building.
ARCHITECTURE IS NOT DOCUMENTATION
This is also why I care so much about file structure and architecture. In a physical building, location is behavior. You cannot randomly build another conveyor outside the wall and say it is basically equivalent to the one inside. Where the conveyor exists determines what can feed it.
What it can feed. Its capacity. Its failure modes. Its access.
Its dependencies. Its relationship to every other part of the system. Software is less visually unforgiving, which makes it easier to lie to yourself. You can put a file in a strange place and the program may still run.
You can duplicate logic. You can create a second source of truth. You can route around an architectural problem. For a while.
Then the system becomes harder to reason about because the map no longer describes the behavior. To me, architecture is not a diagram about the system. Architecture is what the system is allowed to do.
THE 2020 MACHINE
COVID made the 2020 build particularly interesting. Normal equipment availability was broken. You could not simply order every ideal component on an ordinary manufacturing timeline. The practical answer was to find industrial conveyance that was actually available, sometimes from different systems, and make the pieces operate together.
That is a different engineering problem from designing on a blank sheet of paper. You inherit constraints. Different equipment has different behavior. Different sensors.
Different speeds. Different physical interfaces. The question becomes: What do we have?
What can it do? What can it safely connect to? What logic makes these pieces behave as one machine? That is systems integration in the most literal possible sense.
Steel has APIs too. They are just less forgiving.
MORE THAN DOUBLE
Later I returned and pushed the system beyond twice its original capacity. That is where another software concept becomes physical. Scale changes behavior. A system that works beautifully at one volume may fail at another.
Buffers fill faster. Timing matters more. Small inefficiencies become large ones. Maintenance becomes more consequential.
Downstream capacity that once looked enormous becomes the constraint. The architecture has not necessarily changed. The operating envelope has. At one point, around 20,000 pieces could feel like a huge event.
Later, ordinary days could exceed that, with high-volume events moving north of 60,000 units per day. That does not mean we simply made the conveyor run three times faster. It means the surrounding system had to evolve. Labor.
Staging. Trailers. Doors. Maintenance.
Downstream buildings. Equipment. Scheduling. Flow.
Scaling one component without scaling its dependencies is how you create a spectacular failure.
THE BUILDING DEBUGS YOU BACK
Software developers debug programs. Physical operations debug the operator too. You make a change. The building responds.
Sometimes the response is what you expected. Sometimes it exposes a dependency you did not understand. Sometimes the failure appears nowhere near the change. That is familiar to anyone who has debugged software.
The error is here. The cause is over there. A merge backs up because a downstream process slowed. A lane overloads because allocation changed upstream.
A package recirculates because some eligibility condition was wrong. The visible failure is not necessarily the origin. You learn to trace. Where did this enter?
What touched it? What changed its state? What rule routed it here? Where should it have gone?
What was different this time? That is debugging.
THE HUMANS ARE PART OF THE RUNTIME
The comparison breaks if you forget the people. A fulfillment center is not only steel and logic. Humans are inside the system. They handle exceptions the machinery cannot resolve.
They absorb variability. They notice things sensors do not. They make judgment calls. They get tired.
They get overwhelmed. They develop pattern recognition. They improvise. They can also become the capacity constraint.
Any architecture that treats people as interchangeable constants will eventually discover that humans are not constants. Staffing changes throughput. Leadership changes behavior. Fatigue changes performance.
Congestion changes safety. Training changes exception recovery. The machine is socio-technical whether the diagram admits it or not.
FROM ROLLERS TO CODE
Years later, when I started working more directly with software, dashboards, automation and development, I did not feel as though I had abandoned operations for technology. The rollers disappeared. The logic did not. I was still asking:
Where does the thing enter? What identifies it? Where is state held? Who owns it?
What is allowed through? What happens when downstream capacity is unavailable? Where does the exception go? What retries?
What stops? What feeds what? What happens next? Those are warehouse questions.
They are software questions. They are systems questions. And once I understood that, code became much less intimidating. I had already spent years programming buildings.
I just had not called it that.