From Prototype to Production: The Gap That LLMs Can't Close
The Democratisation of Software Creation
Two years ago, if you had an idea for a software product, you had three options:
-
Learn to code (months to years of investment)
-
Hire a developer (expensive, and you’d need to know enough to manage them)
-
Use a no-code platform (limited, and you’d hit walls quickly)
Today, you have a fourth option: describe what you want to an LLM, and it will write the code for you.
This isn’t hype. I’ve watched people with no programming background build functional web applications in an afternoon. The AI handles the syntax, the framework choices, the fiddly bits that used to take years to learn.
This is genuinely transformative. I spent years nurturing coders, at every level — from nine-year-olds to adults — and the biggest obstacle was never intelligence, nor the lack of imagination. It was the gatekeeping: the arcana of syntax, the ceremony of tooling, the thousand small rituals between idea and working code. Programming languages are petty. Frameworks have learning curves. None of that is your problem. The essence of your problem is the thing you want to create your app to do.
AI coding tools have stripped away that unnecessary ceremony. The gap between "I have an idea" and "I have something that runs" has narrowed dramatically.
The New Gap
But a new gap has opened up.
The thing that LLMs are excellent at — generating code that implements a feature — is not the same as the thing that makes software sustainable.
Here’s what a typical AI-assisted prototype looks like:
-
It runs on the developer’s laptop, or maybe a quick Heroku deployment
-
Dependencies are whatever the LLM suggested, pinned to whatever version it knew about
-
The database schema evolved organically as features were added
-
Error handling is optimistic at best
-
There are no tests, or tests that the AI generated without really understanding the business logic
-
Documentation is the conversation history with the AI
-
Monitoring consists of "I’ll check if it’s working when someone complains"
For a prototype, none of this matters. The point of a prototype is to validate an idea, to see if something is worth building properly. A prototype that works is a successful prototype.
But if the idea is validated — if you’ve shown it to users and they want it, if you’re ready to take money for it, if this is becoming a business — then everything I just described is a problem.
What Production Actually Means
Production readiness isn’t a single thing. It’s a collection of practices and properties that, together, mean you can run software reliably for real users over time.
Let me break down what I think matters most:
Code Health
Code that an LLM generates is often locally sensible but globally incoherent. Each function works, but the overall structure is a patchwork. Naming conventions drift. Similar problems are solved in different ways in different places. The architecture (if you can call it that) is whatever emerged from the sequence of prompts.
This matters because code is read far more often than it’s written. When something breaks at 2am, you need to understand the system quickly. When you hire your first engineer, they need to get up to speed. When you want to add a feature, you need to know where it should go.
Code health is an investment in your future self.
Dependency Management
Every piece of software depends on other software: frameworks, libraries, databases, operating systems. These dependencies have versions, and those versions change.
One of my clients is running a Ruby application. Ruby 3.4 is current; Ruby 4.0 is on the horizon. Within a year or two, they’ll need to migrate. This is normal — it’s part of running software over time.
But if your dependencies were chosen by an LLM that doesn’t know your specific situation, and you haven’t thought about upgrade paths, that migration becomes a crisis instead of a routine maintenance task.
Good dependency management means:
-
Knowing what you depend on and why
-
Keeping dependencies reasonably current
-
Having a plan for major version upgrades
-
Not depending on things you don’t need
Documentation
The chat history with your AI assistant is not documentation.
Documentation serves multiple purposes:
-
It helps new team members understand the system
-
It helps you understand the system six months from now
-
It captures decisions and their rationale
-
It provides a reference for operations and troubleshooting
Good documentation doesn’t have to be extensive. A clear README, some architecture notes, runbooks for common operations — often that’s enough. But it has to exist, and it has to be maintained.
Data Integrity
Your prototype probably has a database. Questions:
-
Is it backed up?
-
Have you tested restoring from backup?
-
What happens if two users try to update the same record simultaneously?
-
What happens if a write fails halfway through?
-
Are you validating data at the application level, the database level, or both?
-
Do you have any idea what’s actually in your database right now?
Data is often the most valuable thing a startup has. Losing it, or corrupting it, can be existential.
Monitoring and Alerting
When your prototype breaks, you probably find out because you tried to use it and it didn’t work. That’s fine for a prototype.
When your production system breaks, you need to find out before your users do. You need to know what broke. You need historical data to understand why it broke.
This means:
-
Health checks
-
Error tracking
-
Performance monitoring
-
Alerting that actually reaches you
-
Enough logging to diagnose problems, but not so much that you drown in noise
Simplicity
This one is less tangible but perhaps most important.
LLMs tend to generate code that is more complex than necessary. They reach for abstractions, add layers of indirection, implement patterns they’ve seen in training data whether or not those patterns fit the problem.
Simplicity is hard. It requires understanding the problem deeply enough to find the minimal solution. It requires resisting the temptation to add things "just in case." It requires the confidence to delete code.
Simple systems are easier to understand, easier to debug, easier to extend, and easier to hand off. Simplicity is a gift to your future self and your future team.
A Note on AI
I should be clear: I use LLMs extensively in my own work. They’re remarkable tools and they make me significantly more productive.
But "more productive" isn’t the same as "replaceable."
The value I bring is knowing what to ask, recognising when the answer is subtly wrong, and understanding the context that the model doesn’t have — your business, your users, your constraints, your future. An LLM can generate a database migration. It takes experience to know whether that migration will lock your tables for thirty seconds or thirty minutes in production. An LLM can suggest a monitoring setup. It takes judgement to know which alerts will wake you up for real problems and which will cry wolf until you ignore them.
The craft isn’t going away. It’s just being applied at a different level.
Who I Am and How I Can Help
I’m a chartered engineer with two decades of experience in software. My particular expertise is in functional programming (especially Clojure), verifiable systems, and complex document processing — but the principles of production readiness apply across any technology stack.
I’ve spent years nurturing coders, at every level — from nine-year-olds to adults. The thing I learned is that you have to meet people where they are. You start with what they understand, and you build from there.
That’s how I approach consulting too.
I don’t want to throw away what you’ve built and start again. Your early iteration represents real learning about your problem and your users. I want to take what you’ve built and give it the foundations it needs to grow.
It’s not just growing pains caused by AI-generated code. Spreadsheets that have turned into databases, manual processes you’re copy-pasting through three times a day. It’s the same pattern, and I can offer the same help.
Concretely, this might mean:
-
Reviewing your codebase and identifying the highest-priority improvements
-
Refactoring for clarity and maintainability
-
Setting up proper dependency management and upgrade paths
-
Implementing monitoring and alerting
-
Writing the documentation you need
-
Establishing backup and recovery procedures
-
Simplifying where simplification is possible
My goal is to get you to a state where:
-
You can sleep at night knowing your system is monitored
-
You can hire an engineer and they can get productive quickly
-
You can hand off to a larger team when you’re ready to scale
-
You have a system that will still be running and maintainable in two years
And then? You go and do your job — which is building a business, talking to customers, selling. I’ll keep the software healthy. That’s my job.
Let’s Talk
If you’ve built something and you’re wondering what comes next, I’d be glad to hear about it.
No pitch, no pressure — just a conversation about where you are and where you want to go.
Reach out and let’s see if I can help.