Every Problem Looks Like a Coding Problem
Code is so flexible that it can produce any system at any level of complexity. As long as the code can be written and it is valid, it can express whatever you have in mind. Follow that all the way and every problem becomes a coding problem.
The trouble shows up after the code is written. You reach a point where you have already made a handful of concessions, small ones that looked reasonable at the time, and they turn out to contradict a constraint you only discovered later. The code stops working. It was valid the day you wrote it. The problem is that you had already committed to a shape that cannot bend to what the system finally needs.
So I lean toward systems engineered from the ground up to work a certain way, over ones improvised in code as you go. I am biased here, so bear with me.
Take a small example. Two services wired together, say on Cloudflare. Lovely architecture. An agent needs to talk to both. At first they just produce some output. Easy. Then you add authentication, so each service validates the user. Still cheap, a bit more work. Then you add a central identity so every service trusts the same federated user. You might think you are done.
Well, you are certainly not. Authentication only tells you who someone is. It says nothing about what they are allowed to do, so each service has to check that too. Things are getting more complex.
And an authenticated, authorized user is still not the end. The channel they are acting through might not be safe for what is about to happen. If I want to share a secret with you while other people are in the room, I do not say it out loud. Same with an agent sitting in a Slack channel. If the channel is public, or anyone else is present, secrets and sensitive context have no business going there. So the execution context has to factor into every decision too.
That is a tiny preview. We have barely scratched the surface, there are more layers beneath these. And if you are generating a whole system from the ground up in code, you are almost certainly not accounting for all of them. So whatever you build ends up limited, quietly, in ways you only find later.
Code is generic and capable, and I love that about it. What I find most valuable are reusable components built from the start to live inside a system like this. That is what we build with ChatBotKit.