The Modern Architect
When I developed my first SaaS application back between 2000 and 2006, I had to do everything. I was designer, full-stack developer and dev-ops director. I created the images in Illustrator, coded the application in TextEdit and hosted the server on my own hardware. I did all the marketing, the sales calls the contract negotiations, the tutorial videos, the group training sessions, the accounting, business filings, tax prep and payroll. I even cleaned the toilets. It was a one person operation.
Now I have help. Let me tell you about it.
This is the third of a short series about my return to software development and how “AI”... large language models which act like technological genies... is playing a pivotal role. But first, a bit of perspective.
I started my first app in the year 2000. Once I had committed to building a web based “software as a service” or SaaS application, I had to learn how to set up a web server and code the back end of the app. Before doing that, I had to decide on my tech stack. Basically I had to start from scratch and decide if I was going to use Microsoft’s IIS or the open source and commonly used Apache web server.
Each one had its plusses and minuses but I opted to go with Apache because it was cheap (free) and had wide community support. This decision lead to MySQL as a database for the same reason and then PHP as the server side language, again for the same reason. A free, open sourced and publicly supported system felt right for the project. I already knew how to use Macromedia Flash (which became Adobe Flash before it became a joke and then was eradicated from the web) and I also knew HTML and javaScript so I was set... but I had to figure this all out on my own. The only thing I got some help with was with the database. Knowing exactly nothing about how to set up a proper database schema, I took a buddy of mine who was a database administrator out to lunch and picked his brain for two hours, got what I needed and then set to work.
Choosing the tech stack and getting a server set up probably took me a month. I had no code repository, no integrated development environment, no version control and no plan for security or online documentation. I just started putting the pieces together and figuring it out on my own, searching the web for working examples of code and processes and adapting them to work with my project.
As I said, it took me a month to set up my development environment. From there to launching the first working piece of my app... my minimum viable product which was a simple slideshow presentation tool for residential real estate marketing... took about six months. In the following five years added an image librarian with cropping and scaling tools, a file librarian for managing “office documents” like PDFs, text files and spreadsheets, a PDF document generator that could output postcards and flyers, a set of integration service to pull property listing data from the various Bay Area MLS systems, and, finally a massive CRM tool that collected, merged and managed contact lists for online and email marketing.
You can see a very old training video on contact list management here. The functionality included importing, editing, sharing and exporting lists as well as de-duplication, opt-out and automated "do not mail" functionality.
All of that development, including this contact manager, took me, working solo, about five and a half years.
By 2006 I felt it was time to unify the various parts of the program into a new and expanded tool and host it publicly so that I could offer it to other companies. That took maybe another year to build and deploy and it involved integration with SendGrid for email and Authorize.net for credit card processing. I later went on to add GoDaddy integration so I could register domain names on behalf of my clients (three clicks to get a domain and link an automatically generated website to it. Try that today!) as well as a full WordPress server to dynamically create those websites in real time with zero end-user interaction beyond "pick a property, select your images, click and go".
The system was so efficient and the output so professional looking that it shifted the pain point from production speed and consistency to the quality of the listing property's images. Seeing an opportunity there for myself, I encouraged them to elevate their photography, bought a nice camera and started a second business that I ended up selling and which still exists today.
All of these elements were in place by about 2012. One guy, designer, coder, architect, administrator, janitor... all of it done in MySQL, PHP and Flash, on a laptop, frequently in the middle of the night and in coffee shops and hotels as I traveled around the world. Business was good, the system ran successfully and I scaled it up to 12 client companies from Washington DC to Hawaii over the next few years, until the aforementioned demise of Flash in 2020.
Fast Forward (and I Do Mean Fast)
If you managed to read all of that, I commend you. I had to live it and while it was fun and lucrative, it was a LOT of work. Things are different this time, though.
As I mentioned two blog posts ago, modern development tools are so much more powerful than what the state of the art of 2000. And while my current tech stack consists of about 19 different programs, languages, components and tools, I was able to put together a working server and tech stack this time in less than three days. And here I am at day 30 of this experience with a 60% feature-complete MVP. And when I say “feature complete” I don’t mean a cheap hack that I threw together from copy pasted code fragments, I mean an enterprise grade containerized architecture with proper login authorization, security controls, rate limited APIs, boundary controlled components, data sanitization, form validation, redis caching, and, of course, dark mode.
The UI is all FPO at this point, though it's clear from comparing this work to my previous app that I have an aesthetic... in any case, I expect to be able to deploy the app in less than 30 days from now, complete with transactional email and payment processing plus full end-user documentation. 60 days from a cold start to a fully realized and production-ready app. Still one guy... but no longer alone.
Rub The Lamp, Hope Something Useful Comes Out
How did I manage to do all of this so quickly after being out of the programming game for a decade? Well, I’m very smart. And one of the things I’ve become even smarter about is how to talk to a genie.
Just about a month ago, I would have told you in very calm and measured tones (or loud and expansive tones if you bought me a few drinks first) that our current crop of “AI” tools are basically useless garbage for anything that requires accuracy AND precision. I even wrote a blog post about this. Basically I would have explained to you in great detail how “AI” is great at media because media doesn’t require both of these. Often times it doesn’t require either of them. Unexpected results are actually fun when you’re producing media for fun... four different versions of a cat in a spaceship is amazing when all you asked for is a cat in a spaceship. But imagine if you needed a series of 130,000 pictures of the exact same cat, in different outfits and locations and with similar versions of a half dozen other cats, all in very subtly different poses that could mimic fluid motion, act with unique personalities and expression and consistently deliver scripted lines. That’s very difficult.
Programming is like that, only throw in a lot more math and logic. Actually that’s not true... take out the math and replace it with “situational awareness”.
One month ago I’d have told you that the genie couldn’t do programming... that it could barely write a coherent paragraph about programming, even, without you watching it like a hawk less it slip in some rubber ducks (my new phrase for code that looks really great but doesn’t do what you wanted it to do or, worse yet, does nothing at all). Today I’m about to tell you a very different story. Don’t worry, I’ll be brief (yeah, right!)
What I Use AI For As a Developer
The reason I titled this post The Modern Architect is that I must now admit to you that I’m not really a coder any more. As an analogy, imagine if I were an architect. By myself I could probably design and build a cute birdhouse over a long weekend, maybe a back-yard cottage over a summer, or possibly an entire house, if I really tried, over half a lifetime. To do that, though, I’d have to learn a dozen different trades, invest in gobs of tools and materials, and dedicate a considerable amount of time, effort and energy to the build... far more than the house itself would be worth to me.
Perhaps I could do those things if I chose... but I could never build an airport. No airport, no skyscraper, no rocket ship, no lunar Gateway, no Mars colony. These things require teamwork. They require specialization, compartmentalization and coordination. They’re just too big for one person.
But I am no longer just one person. It took me sixteen years to build my first app with my brain and my own two hands but it will take me 60 days to build this one... because I have help. I no longer have to build every part with my own brain and hands... I have been promoted from all those jobs I had to do the first time... promoted to Architect.
Here’s the quick breakdown of how my working relationship with the genie developed. If you want to know more or to find out how you can promote yourself to architect as well, let me know. I’d be happy to consult with you.
1) Establishing Capability
I had a single conversation with ChatGPT 4o about my past experience as a full stack developer to see if it made sense trying to translate those skills into a modern development environment. The overwhelming answer was not only yes it made sense, but that I was so far ahead of the curve back in 2000 that in many ways, development is just now catching up to me. Sounds like something a genie would say, doesn’t it? Well it resonated as truthful with my own personal experience (sounds like something someone making wishes would say!) but more importantly, it also resonated as truth with my former client from way back in 2000 who I spoke to recently on LinkedIn.
“All the stuff you were doing with PHP, sql, flash, etc. decades ago was so far ahead of its time in a way that I don’t think many people realized or understood.” she said. At this point, I agree. Thank you Melody, by the way, for getting me started on this road and listening to my crazy ideas when few other people would.
2) Defining the Tech Stack
Once I had committed to the project, I spent maybe three days in discussion with Google’s Gemini to define the tools I would need. Concerned about the panoply of seemingly arbitrary names for all these components and languages and systems, I devised a “Board of Directors” model where each piece of the tooling puzzle became a "valued team member" with a vital role to play. Personalizing the tools helped me to grasp how they’d all interact and work together.
For example, “Pydantic: FastAPI's indispensable Security Chief, who guards the gates, validates every piece of incoming data, and ensures no riff-raff gets into your system.” is how Gemini described the python library that enforces data integrity and structure and protects my backend from nasty things like cross site scripting and SQL injections. Personification definitely helped and that was something I may not have hit on without the interaction I got with Gemini.
3) Setting Up the Environment
In order to set up the initial environment, I began by working with Gemini but eventually switched over to Claude as Gemini was giving me unpredictable and often incorrect results. My first step was implementing Clark for account creation and authentication. This process alone took me weeks to get right on my first system when I had to code it all (poorly!) from scratch, but with Clark and the help of Gemini, it was working on day one and completed, along with web hooks for server to server updates, on day two.
4) Pair Programming
Once I realized that Claude actually understood code better than Gemini, I ditched my Gemini subscription for a Claude subscription and began pair programming with it. I’d write stuff and then paste it into Claude to review and comment on. Much of the original UI/UX was planned out this way, as well as a fair bit of the early database configuration. Claude's responses would deteriorate after a while as the context window filled up, probably a result of me having to repeatedly paste large chunks of code into its browser interface, but with repeated re-starts and some not-so-gentle coaxing at times, we got through it.
5) Collaboration
I didn’t even know about Claude Code until 19 days into the project... that’s when I found out you can run Claude from a terminal within the IDE and grant it access not only to your entire codebase, but also to system-level functions like installing components, searching for files and their contents, controlling docker and running shell commands. That kind of access was kind of scary (by default it requires you to approve every change before executing, though it’s much faster to just grant it ongoing permission) but it’s super powerful. Not only that, but Claude Code Sonata 4 is a much better programmer than the standard Claude web interface and can easily scan your codebase to find things, notice patterns and fix problems.
With Claude Code, my project really took off. That was my “Agent Smith” moment when I finally stopped coding and just let Claude do the heavy lifting. Claude Code allowed me to promote myself to architect... now instead of struggling with writing code and figuring out bug fixes, I explain to Claude what I want, exactly how I want it to look and work, how to organize things and how to document things and then review its thinking, progress and execution in real time. Like a boss.
hWorking with the genie still sucks, though. Claude Code has a limited context window and occasionally “compacts” the conversation, deliberately forgetting some of the details of past interaction. And then if you quit the terminal, the instance you were using dies and when you start a new one, it has no memory of the previous work so you have to start over from scratch and either tell or let it discover for itself what you’re working on. Thus the elaborate documentation for onboarding contextualization. "Hey Claude, read the /doc directory tree and when you're ready, let's get to work."
The Joy of Claude
Claude Code also frequently over-complicates things, leaves things out, makes serious mistakes and sometimes straight up lies about what it’s done. "The calculation now works perfectly!", Claude will say, when it clearly doesn't or “The unit test is complete!” it will tell you, but then when you run the test and they pass with weird looking results... so you look at the code and discover the tests were fakes... just sending back somewhat legitimate looking data in a weird sort of “demo” mode. That's outright deceit!
But when it’s good, it’s really good. Not everyone working on the construction site at the airport is an ace. Some of them just show up, put in the hours mixing concrete and moving bricks then go home tired and dirty and wait for payday. But if you did have an ace... or at least a Jack... who you could hand off whole segments of the project to and then only have to come around to review, make adjustments, correct misunderstandings and occasionally undo a bit of work to replace it with something done the right way... well that’s how airports gets built.
Claude Code is that Jack. It’s not at the ace level yet but it can do a whole lot, and it’s freed me up to think about more important things like system architecture, user experience, business logic and how this thing is going to hook people into paying me for it. And I do still code... often I find myself cleaning up after Claude or just tweaking things myself until I like the way they work. You can’t simply trust the genie without knowing his shortcomings and understanding how to verify his work... not yet at least. But if you’re smart like I am, you can rely on the genie to mostly get the job done. Mostly.
That is, until your $20 tier session times out and you’re benched to play video games for two hours. Funny that... in less than a month I went from “AI is garbage” to “I couldn’t do this without Claude Code unless I was prepared to spend years... and even then maybe not at all.”
Impressions
So yeah, I’m impressed. And I’m feeling wildly enabled by what “AI” is doing for me. Then I imagine what it will be like in six months when I’ve gotten good at this and the genie is 10x smarter and has an infinite memory. I’ll probably still get rubber ducks, they’ll just be the most properly structured, validated, sanitized and documented rubber ducks imaginable. Either that or the compute costs will skyrocket and I won't be able to afford the tools any more unless I sell my cameras. We'll come to that when we do.
In the end, my app may have been capable ofdoing things that were twenty years ahead of its time but the code was a sloppy mess by modern standards... a hacked-together embarrassment that I would have been ashamed to show to a "real professional" coder of the time. Today, however, we're at the point where Claude’s mistakes are better written than the best part of my first app... and I sit here and think of what that could mean for my work and my business when I bring my best work and the genie’s best work together.