One Year of Programming With AI
Ha, this image is “so AI” I can’t believe it!
I love post-mortem or any type of “looking back” series of posts where you give yourself permission to analyze and critique the past. It feels kind of vulnerable, slightly embarrassing and cathartic, all at once. When I started consulting again I created several tools for myself using Google's Ecosystem. Estimates, Agreements, Forms, a CRM, Social Media Calendar, Time Tracker, Invoice Templates and on and on. Then I created processes for my business around Client Onboarding, Client Communication, Task Management, Invoicing, Marketing, Products & Services, etc. Of course, after that, I wanted to automate, so for example, when a client approves an Estimate, they are immediately emailed a copy for themselves and the Consulting Agreement to sign. After they accept the Agreement, they then receive a copy of that document and a link to purchase a Block of Hours. Then once that’s purchased, another email goes out to them to schedule the first meeting. All of that happens within minutes and none of it could have happened without AI.
How it started
Building all of my business automation in Google Apps Script turned out to be a great way to dip my toe into AI Development. I am already familiar with Google Apps Script and have used it extensively over the years to automate several business workflows for my clients. It’s incredibly powerful and works extensively across all of the Google Workspace tools. In particular, most scripts are just one file. ChatGPT was a great “co-programmer” to work with to take my vision and continuously tweak code to make it work. There was a lot of cutting and pasting going on at that time between ChatGPT and the Apps Script Editor. Eventually, my ideas evolved and my scripts became more complex. They were essentially turning into standalone apps which led me to download VS Code and Github Copilot. I needed more structure and a way to manage multiple scripts and folders. As I scoured over YouTube for tutorials on how to set up VS Code and Copilot correctly, the videos that came up again and again were for Cursor, another VS Code clone that was optimized for AI Development. It was clear I needed to upgrade again and learn everything there was about Cursor.
I’ve been a Linux fan for a long time and my main machine is a Chromebook. I know what you’re thinking, but it’s worked out great. I’ve written about it multiple times before and you can ask me more details about why Chromebooks are excellent business machines anytime. What’s great about Chromebooks is that you can partition your drive and run Linux apps as needed. This was perfect for Cursor. Then Google came out with Antigravity, their own VS Code clone and that dovetailed nicely into their ecosystem. I realized after installing Cursor and then subsequently Antigravity, that AI needed more power than my partition was willing to give. I bought a robust dedicated Ubuntu laptop and did a fresh install of Antigravity. This has basically been my AI Development setup for the last 8 months. It’s one thing to get AI installed, configured and running day to day, but understanding how to use AI to write effective code was and is the biggest challenge of all. It took me months to learn that my approach to coding was slowing down my development.
What I’ve learned
Similar stories abound, “I built a multi-million dollar app overnight with AI!” or “My whole business is now run by AI agents!” All of those stories pull us in. We’ve heard the promises of AI and they’re significant. The reality is that how we should be programming and building with AI is not how we did in the past, yet we are approaching it the same way. We treat the AI model like a magic box where we dump in commands, expect incredible results, but nothing around us has changed. We haven’t changed. The words people are using to describe this change are “deterministic” and “non-deterministic, meaning our approach should be a hybrid. We shouldn’t just slap on an AI wrapper and say it’s AI and conversely we should not be having AI solve every problem when it doesn’t warrant that type of power. We need to be looking at development architecture through a different lens and ask ourselves, “What information needs to be delivered here? Which solution is the best for the job? Will adding AI at this juncture create more value?” For example, I wouldn’t use AI to do simple math, “How many hours have we been spending pursuing leads this month?” That can be solved with deterministic arithmetic. What I would use AI for is “Review all of our sales call transcriptions, emails and CRM data. Identify all potential customers where the final dealbreaker was price. Break down the list into categories of price-ranges and put together a campaign plan to win-back those customers at each range.” That’s more of a non-deterministic approach. When we plan and develop through this lens, we are using the right tool for the right job.
We’re scared of AI. The movies, the news stories and the over-hyped CEO announcements have led to us hindering and holding back what AI can do. Our reaction is to create too many rules and guardrails to keep the AI model locked into this narrow path, so it doesn’t go rogue. This approach diminishes our impression of AI. Working with it in that manner seems convoluted and throttled. A lot of these restraints are built into the models themselves and you have to repeatedly chip away the unproductive capabilities by deliberately explaining and listing what it can do. We aren’t told that upfront and have to discover this on our own. To complicate it further, each model has its own “personality” where the only way you can figure out their true selves is by repeatedly peppering it with challenges and evaluating its solutions. I feel like I’ve been in this AI dating experiment over the last year, where they exaggerated their bios, leaving me to uncover their lies at a painstakingly slow pace. It’s worth it though, because without the hardship and repeated diversions I wouldn’t have really learned how to work with AI. I wasn’t seeking the easy route, I never do, I wanted to understand the mechanics of it. How it thinks, makes decisions and delivers outcomes. I didn’t want to disrupt the flow, I wanted to shape it. A little at a time, I gave the models more autonomy, mostly because I wanted to speed up development. But as the models got faster and the developer tools built in subagents, it was easier to let go a little more. I think what we are evolving to here is trust, and maybe all of this time that’s what I was looking for.
Surprises along the way
I started programming with AI, by letting ChatGPT write Google Apps Script for me and then I would paste it into the editor. This was before most of the AI coding tools became popular and I spent a lot of time asking ChatGPT questions, trying to understand why it made the choices it made, as well as chasing down bugs and of course hallucinations in those days. When new models came out for Google Gemini or Claude, I would try those too, but I found Gemini too brief and Claude too mechanical. I wanted to have a conversation about what I was building as I was building it. ChatGPT was and still is fantastic in that role. I started using Antigravity, because they made a Linux version, so that seemed a no-brainer to use their tool. The code Antigravity created was very thorough and polished, but the interaction was off. It would take me a long time to get the result I wanted with repeated coding sessions working on the same feature. One day, I took the proposed Implementation Plan from Antigravity, told ChatGPT what I was trying to do and ChatGPT created a prompt to revise the plan. It nailed it. The feature came out exactly how I wanted the first time. I continued to use ChatGPT as my advisor and co-programmer after that. For hours, days, weeks and months I cut and pasted back and forth between ChatGPT and Antigravity. For a new project I was working on I connected ChatGPT to my Github account and then it occurred to me that if ChatGPT was connected to my Github account and Antigravity was also connected to my Github account, then why not have both of those apps communicate together? I updated the development playbook to a new workflow where I started the session in Antigravity, then Antigravity created the Implementation plan and committed it to Github, ChatGPT would grab it, evaluate it, send it to me for review with changes, then I would approve it and commit it back to Github where Antigravity would grab it and build it out. The point of all of this is that not only did I find a way to code that worked for me, I also innovated along the way. In the last eight months I updated my workflow four times. I modified and adapted when I learned more and the technology changed. I didn’t set out to have ChatGPT be my advisor and co-programmer, it just sort of evolved. Essentially, I created my own AI programming tutor.
The reason I updated my workflow four times in the last year wasn’t only because I learned how to build with AI better, the AI models capabilities kept getting upgraded. Context bloat was an issue from the start and dumping huge prompts explaining everything you wanted the model to follow, reduced the context memory and led to hallucinations sooner than later. This was addressed by “Agent Skills", which were rules and “guardrails” as how the agent should perform. This turned into creating multiple agent skills for architect, builder, project manager, QA, orchestrator and so on. Individuals created their own “Agent Skill Packs” to sell and some free to all. Agent skills were soon referred to as “Agents” which wasn’t really true, because they were just a set of instructions for how that agent was to perform and what its limitations were. Furthermore, their capabilities were hampered because you could only initiate their abilities by calling them when needed. This ended up putting more emphasis on “Workflows” because you could initiate a workflow and then within that workflow call agents. This was a tremendous breakthrough and it really felt like you were actually building a team. My process ended up being this, “Start session (Workflow) > Orchestrator Agent looks at TODO.md for the next high priority task > Architect Agent builds out the plan > Wes/ChatGPT approves the plan > Project Manager Agent organizes the tasks > Builder Agent completes the task > QA Agent tests the code > Project Manager Agent presents the Walkthrough > Wes approves the coding session > Project Manager Agent commits and closes the session. I was completely dumbfounded and impressed. It took a lot of tweaking of workflows and skills to get it to that point. Even better, the closing workflow updated a “session.md” file that the “Start session” workflow would review before the start of every session. This helped with handoffs and keeping memory fresh between sessions. This process virtually eliminated all memory problems moving forward. What struck me the most was how much time and effort it took to get to this point. To build something of value has taken me several months and it’s still evolving. For the people that are building high value apps overnight, I don’t believe it and even if you are, that means that someone else can too, so your app has little value.
The latest
In May, Google came out with Antigravity 2.0. It was a complete rewrite. In fact, the original IDE was still available, but its days are numbered. This new version was an expansion on an existing feature of Antigravity called Agent Manager. Essentially the new version was a ChatGPT Codex clone. It wasn’t as powerful or as seasoned as Codex, but this was the direction they were going. I was a fan. It seemed pretty obvious after a while that I wasn’t even looking at the code window anymore. I was more interested in if my agents were doing their jobs, where the hiccups were and if agents were being assigned by the Orchestrator Agent when issues would appear. The gold standard at that time was Claude Code and if you were programming with AI, you were using Claude Code. I’ve always been sort of a loner, staying away from the crowd and this was no different. My whole career has been spent working with programmers, managing programmers and eventually managing companies. The most productive periods during those times were collaborative environments. I’m not talking about the top down directive and then handing it off to be executed process, I’m talking about the “we have this problem, do you have some time to discuss a solution?” type of process. People underestimate collaboration, it’s not about the hero finding the solution, it’s eliminating variables, taking the ten thousand foot view and breaking the problem down into pieces. It’s very powerful. I found that collaboration with ChatGPT, so when ChatGPT came out with Codex for Linux in August, I couldn’t help it. I knew that combining my advisor, co-programmer and coding platform into one, was just going to speed up development. Now with dynamic agents and subagents, those automatically get called to address issues in Codex without being called. Antigravity 2.0 has that too, but Codex has been doing it longer and has updated its agents along the way. Codex has put a lot of time and effort into updating Codex this year and many have noticed. It seems over the past year I see the early adopters doubling down and new users flocking to it. I knew it was time for me to do the same.
Migrating to Codex wasn’t hard, but it was interesting. I had ChatGPT audit all of my projects and prepare a migration plan while at the same time build a Development Playbook that we would use as a guide for migrating each project and creating a global process for development moving forward. The principles were simple, high autonomy, high quality and a safe environment. This wasn’t just a migration, it was a leapfrog moment. I kept thinking we need to create a fasttrack environment where we can put high value on communication, but limit the amount of approvals. Once I approve a gate or checkpoint, I don’t need to approve that gate or variants of that gate until it’s done. If I am continually having to approve the gate, either the initial presentation of the gate wasn’t clear or the directive to continue until completion isn’t clear. This goes back to what I was describing earlier about continuing to give permission to Codex to do its job without fear of screwing up. The irony of now managing agents and previously managing employees is not lost on me. It seems for now, I’ll be having many deja vu moments coming up in the future.
It’s only been a week since I migrated to Codex and to say I’m excited is an understatement. It feels like I was just gifted a Ferrari and I have no idea how to drive it and I’m afraid to get it out of first gear. I’m already thinking of how I can use it more efficiently and even more curious about what I don’t know yet about what it can teach me.
Where do we go from here
For development, the main areas I am leaning towards are collaboration, trust and speed. Where I really want to get to is a point where I discuss a feature, we weigh its pros and cons and then send it out to the agents to complete the task knowing it will intelligently and reliably finish the task following the intention of the goal. What I’m looking forward to getting to is over time evaluating the data from clients using my apps to improve their businesses and then working with my agents to make successive improvements to the programming to steer where we want the businesses to go.
My goal with AI development is and will always be to push the boundaries of what it can do for me and my clients. I want to believe the hype, but I need to see it with my own eyes and experience it through the solutions that I build. It’s taken me a year to get to this point and possibly it could have gone faster with other tools, but not that much faster. I needed to understand how the AI models worked and if we truly are in a new Information Scaling Event. I’m impressed with the incredible information that I can access. I'm impressed with how AI has changed the way I work. I'm impressed with how small businesses can now compete better with big businesses. But, I’m not completely sold on how quickly and how big of an impact AI is going to have in the near term. Yes, it has improved leaps and bounds over the last year, but I work with AI every day, all day long, listen to podcasts, watch tutorials and I struggled to get it to do what I wanted it to do in the beginning. I just don’t think everyone is ready or willing to put in the time to do that. It’s like dropping off a cargo container on someone's property and telling them that the container has everything they need to build the house, so go do it! The majority of people won’t do that. Until you start teaching people how easy it is to build houses, they’re just going to think it’s another fad.
Wide adoption aside, this is also a massive opportunity. AI is definitely here to stay. The capabilities and improvements AI has already made are unprecedented. That genie is not going back in the bottle. Our lives will continue to be impacted by AI achievements and it’s in everyone's best interest to learn about AI and get involved with how it can help you, your families and your business. Those that get involved now and participate in the growth of AI will have a much easier time down the road adapting to it in their lives. Businesses that embrace, learn and build with AI will see a significant positive change in their growth. We are still very early with the rollout of AI, but where and how to use it effectively is getting clearer every day.