The Real Architecture Is Not Code, It Is Conversation
Hatched by Robert De La Fontaine
Apr 21, 2026
9 min read
6 views
84%
What if the hardest part of building software is not the software?
Most people think a system is defined by its tools: the language, the framework, the library, the model. But in practice, the most important question is usually quieter and stranger: how do the parts talk to each other? A web portal, a command line tool, a PowerShell script, a Go service, a Python model, a database, a socket connection. These are not just technologies. They are different accents in the same conversation.
That is why a modern system is less like a single machine and more like a city. Some roads are fast, some are local, some are for traffic that never sleeps. WebSockets are the overnight courier service. The CLI is the utility tunnel. A database is the public archive. Runtime files are sticky notes on the refrigerator. And a language like Go often becomes the traffic controller, because it is good at managing many things at once without losing its composure.
The surprising idea here is not that these tools can be combined. It is that the design problem is no longer choosing one tool, but choosing the right kind of relationship between tools. Once you see that, the project stops being about stacking technologies and starts becoming about orchestration.
The real question: what should be real time, and what should be persistent?
A useful way to understand any multi tool system is to separate its jobs into two categories: momentary events and durable state.
Momentary events are things like a user typing into a portal, a model streaming a response, a backend service reporting progress, or a CLI task emitting logs. These are best handled by mechanisms that reward immediacy. That is where WebSockets shine. A browser socket connection is not about storage, it is about presence. It says, “I am here, I am listening, and I can answer now.”
Durable state is different. It includes user accounts, saved sessions, lesson history, model configurations, permissions, backups, and records of what happened yesterday. That is where a database excels. It is slow compared to a socket, but it is trustworthy. It remembers.
Then there is a third category that often gets ignored: transient glue. These are files, command invocations, temporary payloads, and process handoffs. They are not the main memory of the system, and they are not the live conversation either. They are the handoff points. A Python script writes a result to a file, a Go service reads it, a PowerShell process triggers another step, a browser receives a notification. This layer can feel old fashioned, but it is often the easiest and most legible way to coordinate systems that were never meant to be one system.
A strong architecture does not force every interaction into the same shape. It chooses the right medium for the kind of truth being exchanged.
This is why the instinct to reach for a database, runtime files, or IPC is not indecision. It is architectural maturity. Each option implies a different contract:
- Database: “This needs to persist and be queryable.”
- File: “This is a handoff or artifact.”
- Socket or IPC: “This needs to move now.”
- CLI command: “This is an action, not a conversation.”
When you think this way, you stop asking, “Which tool is best?” and start asking, “What kind of truth is this message carrying?”
Go, Python, PowerShell: not rivals, but layers of control
The most interesting part of the stack is not that these languages can cooperate. It is that each one naturally occupies a different position in the control hierarchy.
Go is excellent when you want a dependable coordinator. It handles concurrency well, builds clean command line tools, and communicates efficiently over the network. If the system is a control room, Go is a good candidate for the operator console. It watches connections, moves tasks along, and keeps the machinery responsive.
Python is the laboratory. It is where you reach for spaCy, data processing, quick prototypes, model integration, and the thousand small experiments that make the system smarter. Python is often the language of “let me test this idea now.”
PowerShell is the bridge into the operating system’s native habits, especially on Windows. It is practical, scriptable, and often the easiest way to make the machine itself do something useful. In a layered architecture, PowerShell is not glamorous, but it is extremely useful. It is the mechanical hand that can open doors other languages cannot.
This is where the idea of control layers becomes powerful. A system does not merely “call” another tool. It delegates authority. One layer can launch another, pass data, collect output, or supervise a process. The question is not only whether Go can run Python, or whether PowerShell can run inside Go. The question is: which layer should be allowed to initiate, which should respond, and which should store the result?
Imagine a small educational portal. A browser sends a request to the Go service. Go decides whether this is a live interaction or a background task. If it is live, Go opens a WebSocket and streams progress. If it needs natural language parsing, Go invokes a Python helper. If it needs an OS level operation, Go delegates to PowerShell. If the result must be remembered, the system writes to a database. None of these choices are arbitrary. Each one reflects a different type of responsibility.
This is the hidden lesson behind combining languages: polyglot systems are really systems of delegated authority. The hardest part is not syntax. It is governance.
The architecture of a portal is the architecture of a classroom
A portal sounds like a technical word, but it is really an educational metaphor. A portal is not just a website. It is an interface where different kinds of work become possible without forcing every user into the same workflow.
That matters because an educational system, a creative system, and a developer tool are all asking the same question in different ways: how can a person move from intention to result with the least friction? A browser based portal, especially one with real time feedback, becomes a kind of digital classroom. It can host coding help, creative generation, administrative tools, and user support inside the same conceptual space.
Here the choice between real time and asynchronous interaction is not a technical detail. It is pedagogical.
A real time socket based flow feels like a live conversation. It is useful when the user needs immediate feedback, like interactive tutoring, debugging, or a collaborative session. You can almost hear the rhythm of it: type, respond, refine, repeat.
An asynchronous flow feels more like correspondence. It is better for batch jobs, longer analysis, file generation, indexing, or any task where the system should work quietly and report back later. A good portal often needs both.
Concrete example: a student asks the system to analyze a paragraph. The portal could send the request over a socket, show the typing indicator, and deliver a response live. But if the student uploads an entire chapter for summarization, the system might queue the job, save the request in a database, call a Python script for text processing, then notify the browser when the result is ready. Same portal, different tempo.
This is why the most successful systems often feel less like software and more like well designed institutions. They know when to interrupt, when to wait, and when to remember.
The best portal is not one that does everything in one place. It is one that makes the right kind of action feel obvious.
The hidden tradeoff: simplicity of wiring versus clarity of responsibility
There is a temptation in system design to use the simplest possible bridge for everything. Files are easy. Exec calls are easy. A database is familiar. A socket works. So why not let everything talk through the most convenient channel?
Because convenience can destroy meaning.
If every component can write to every other component through files, you may end up with a system that is easy to start but hard to understand. If every task gets launched as a subprocess, you may create hidden dependencies and fragile failure modes. If the database becomes the dumping ground for every message, you may blur the line between live state and historical record. If everything is shoved into WebSockets, you may end up with a real time system that is chatty, expensive, and difficult to debug.
A mature architecture keeps its contracts legible. It answers:
- What is the source of truth?
- What is a temporary handoff?
- What is a live interaction?
- What is a background job?
- What is a reversible action, and what is a permanent record?
This clarity matters more than the specific technology choice because it determines whether the system can evolve. If tomorrow you replace Python with another service, or swap one model provider for another, or move from file handoffs to a message queue, the architecture should still make sense. That is only possible when each layer knows its role.
A useful mental model is to think of the stack as a theater production:
- Browser and portal: the stage seen by the audience.
- WebSockets: the live microphone between actors and crew.
- Go services: stage management, timing, and coordination.
- Python scripts: specialized performers brought in for certain scenes.
- PowerShell: backstage machinery and local operations.
- Database: the script archive, cast list, and performance record.
- Files: cue cards, props, temporary notes.
When the roles are clear, the performance is smooth. When they are not, everyone trips over everyone else.
Key Takeaways
-
Design around the kind of truth being exchanged. Use databases for durable state, sockets for live interaction, files for transient handoffs, and CLI calls for discrete actions.
-
Treat Go, Python, and PowerShell as layers of authority, not just languages. Decide which layer coordinates, which layer computes, and which layer touches the operating system.
-
Separate real time interaction from asynchronous work. Not every request should feel like a conversation. Some should be immediate, others should be queued and returned later.
-
Keep contracts legible. Avoid making one mechanism do everything. Simplicity of wiring can create confusion if it hides responsibility.
-
Build the system like a classroom or theater, not a pile of tools. When every component has a clear role, the whole platform becomes easier to extend, debug, and trust.
The deeper lesson: a system is a negotiation, not a machine
The most important insight here is that software architecture is not mainly about assembling components. It is about negotiating relationships between components. Who speaks first? Who remembers? Who waits? Who can interrupt? Who is allowed to act, and who must ask?
That is why a portal built from Go, Python, PowerShell, WebSockets, files, and a database can be more than a technical stack. It can become a formalized conversation between speed and memory, between live interaction and durable record, between general purpose coordination and specialized intelligence.
In that light, the real breakthrough is not choosing the “best” language or library. It is learning to think in terms of interfaces of responsibility. A good system feels intelligent not because every part is powerful, but because every part knows what it is for.
And once you understand that, the question changes. It is no longer, “Which tool should I learn next?” It becomes, “What role should this tool play in the larger conversation?” That is the moment architecture stops being a collection of tricks and becomes a design philosophy.
The future of building software may belong less to monoliths and more to orchestrated dialogue. Not one language to rule them all, but a well conducted chorus.
Sources
Hatch New Ideas with Glasp AI 🐣
Glasp AI allows you to hatch new ideas based on your curated content. Let's curate and create with Glasp AI :)
Start Hatching 🐣