You Can’t Build on Vibrations Alone

By
Image of a Louis Kahn-designed building.

Architecture is in the eye of the beholder.

Right now, we’re in the vibe coding honeymoon phase. If you’ve somehow yet to encounter the term: A bunch of companies let you type into a box and, within seconds, code is scribbling across your screen, bringing to life whatever you requested—through vibes. Non-engineers feel empowered as their poorly worded plain-English prompts light a fuse, and neatly indented code manically unfurls down the screen. And then…UI! It’s not just code—you can preview your creation. You might even be able to click around.

But alas, honeymoons end—and then it’s back to work. Surgically lifting, editing, fixing, and grafting that code into something usable and scalable is no easy task. It turns out you really need to know your engineering to take it further. If you’re just prototyping or trying to make a point, these tools can be useful. But we’re a long way from turning this output into something usable and durable with a couple of clicks. 

The great architect Louis Kahn once said, “Design is not making beauty; beauty emerges from selection, affinities, integration, and love.” I want to translate Kahn’s quote from architecture-architecture to software architecture. It defines, I think, three critical ingredients of design—each of which is distinctly missing from vibe coding.

1. Intent

“So what are you really trying to achieve? Where is the pain?” — Any good product manager

Kahn’s statement is contrarian right out of the gate: Design is not making beauty. Beauty may be a byproduct of the output, but that’s not the goal when you’re building software. We need to ask: Why are we here? If you have no intent, you have no reason to build anything thoughtfully—the result becomes random or purely aesthetic. 

Architecture is a liaison: A translation layer that converts the aspirations and goals of what you’re trying to achieve into a tangible plan. Good architecture makes intent durable, clear, and executable—even as circumstances change.

Teasing out intent is not easy. In all my years of building software for clients, I’ve rarely kicked off a project with a clear outline of goals handed to me. It usually requires conversation and pushback to really get at why we’re here. Once we get to the root cause, every decision we make after that is informed by this necessary bias. Is that really necessary? Are we truly addressing that pain point?

2. Constraints

Kahn comes through yet again with the next few words in his quote: Beauty emerges from selection. No project, whether it’s a high-rise condominium or ERP software, has unlimited resources. Space, money, people, laws, time—they all come bearing down on any effort. 

Architecture is the manifestation of intentional constraints. Physical architects deal with materials, climate conditions, budgets, and so on. Software architects deal with technical debt, time-to-market pressures, legacy systems, scalability limits, and more.

“Constrained” is not a word that comes to mind when we talk about AI. We spend tons of time imposing guardrails, and hallucinations are really a symptom of AI failing to constrain itself.

Constraints have one additional benefit: they force us to plan better and think harder. With unlimited resources, we make strange and often bad decisions because we have nothing to guide us. Constraints are a gift: Unlimited anything leads to less deliberate problem-solving, while constraints require us to do some deeper thinking. The same goes for AI. 

3. Integration

Any project of meaningful size consists of a set of sub-systems that make up the whole. Kahn once again nails it: Beyond beauty emerges from selection, it also emerges from affinities, integration, and love. Plumbing, electrical, HVAC are all key systems that “live together” as part of a broader environment. In software, data models, security, user interface, business logic all make up parts of a whole. 

If the project is small, like a personal notepad or a shack in your backyard, you have far fewer interdependent systems. A monolithic approach may be just fine. But with any semblance of complexity, you’re left with a handful of systems that live together. How these systems are laid out and how they work together requires thoughtful planning and consideration.

How can we fold these missing components into our AI-assisted coding?

Making it less lofty

Kahn designed glorious buildings—but we’re talking about building APIs for ERP systems. Aren’t we a little ahead of ourselves when we talk about beauty and love? Well, I’d argue that a well-designed API can be beautiful, and can be a thing of joy and inspiration to everyone that uses it. That said, here’s my far less poetic definition of architecture: 

Architecture is taking your time to make sure the pieces fit together and the thing reliably works as intended.

This means: Take your time. Laying out an architecture composed of sub-systems that work together to realize your goals is not easy. You also have limitations—constraints—that must be accounted for. In many ways, architecture is the interplay of intent and constraints as they are mapped out across sub-systems.

The grain of salt

That said, I should warn you—this newsletter is coming out on April 30, 2025.

AI is moving fast. It’s getting smarter and better. Every other week, another model is released that seems to…clears throat…take its time. It’s thinking things through. It could take minutes! And the outputs are getting more structured and thoughtful. 

Things are moving so fast that the vibe-coding tools of today may well mature into the vibe-architecting tools tomorrow. Until then, AI is still an indispensable tool for stepping through all that thinking and decision-making. As we map out that architecture, it’s incredibly good at accelerating all those steps in between. 

And yes—Louis Kahn’s quote strangely (or not so strangely, I suppose) ends with the word “love.” Underpinning all that thinking and planning is a fundamental ingredient of architecture: Empathy. Internalizing intent and considering constraints, as cold as they sound, require humans to understand each other. AI may pull that off as well down the road. But until then…take your time.

Real Software in Real Time

Type in what you need and get a prototype in minutes.