This spring, I read the book Atomic Habits by James Clear. Published in 2018 and now in its 7th printing, it’s a remarkable and “highly effective” way to learn how to eliminate negative habits and develop positive ones that stick. More than that, throughout the book, Clear reinforces a key pearl of wisdom: we are our habits. If you want a new and better life, you fix your habits. If you want to be more grounded, you fix your habits. To be an effective Centaur Programmer in the world of AI, you need to fix your legacy habits and develop new ones.
With apologies to Stephen R. Covey for paraphrasing the title of his 1989 bestseller, “The 7 Habits of Highly Effective People,” here are my seven software developer habits that have either been refined in light of collaborative programming with AI or have emerged.
Tap on the audio player below for an 11 minute deep-dive podcast format analysis of this post by the two AIs that live inside Google’s NotebookLM service.
1 – Focus on Having Fun
In a previous blog post, I lamented how coding with AI had sucked the fun out of writing modern software. The joy of puzzle-solving seemed to evaporate as I watched the AI write the lines of code that used to thrill me—so, resigned to a future where a hobby I’d loved for nearly 50 years—teaching computers how to dance—was going extinct, I took the summer and half of the fall off and thought about it.
As I reflected on what felt like my ‘fall from grace,’ I dug deep into my personal philosophy of fun. As part of this journey, I started reading the groundbreaking book “Flow” by Mihaly Csikszentmihalyi (Csikszentmihalyi, Mihaly). The TL;DR is that we are happiest when we are in the state of “flow”. There is no past. No regrets. There are no deadlines. No future. There is just the now—a moment when you are truly alive.
Writing software was, and for me remains, a means to reach a state of flow. It is not necessarily a way to create an app to submit to the Apple App Store. It’s more existential. A radical perspective, right? But also me being honest with myself.
I didn’t have to reinvent happiness in the world of collaborative coding. All I needed to do was to find a way to get back into a flow state. The six new and refined habits to follow, ones that quickly emerged once I realized that flow was the fundamental reason why I’ve written hundreds of thousands of lines of code, have brought the fun back.
2 – Design Patterns are your Allies
Design Patterns are a programmer’s answer to the question “Why reinvent the wheel?” An excellent, dare I say, fundamental book on the subject is “Design Patterns – Elements of Reusable Object-Oriented Software.” Design patterns (the book includes 23 of them) are language-agnostic and distill programming challenges down to the “why” alongside the minutiae of the “how.”
They are also a big part of what the coding LLMs have been trained on. Rather than trying to fit your square peg of a solution into the round hole of what AI cut its neural-net teeth on, articulate your solution into a round peg. You are no longer the coding director. You are a coding collaborator. Your efficiency is closely tied to the AI’s efficiency. Speak its birth language.
A real-world example for creating mobile, reactive apps is the Model-View-ViewModel (MVVM) design pattern. Both Claude and ChatGPT are adept at writing extensible MVVM-designed apps. Leverage that.
3 – Separation of Concerns – Packages
Pushing habit 2 one step further is one of the most critical aspects of coding – the separation of concerns. The phrase DRY (Don’t Repeat Yourself) makes for ‘fun’ maintenance and morphs a programmer’s skill at compartmentalization into their superpower—a superpower you share with AI.
As you collaborate with an AI, your prompts, along with the AI’s responses, create a ‘contextual latent space.’ It sounds fancy because, well, it is.
In artificial intelligence, a latent space is a compressed, internal representation in which a model encodes patterns and relationships in data. It maps complex, high-dimensional inputs—like images or sentences—into a simplified form that captures their most meaningful features. This space enables AI systems to generalize, generate new examples, and explore variations of learned concepts.
As you and the AI work towards rev 1.0 of your app, the complexity, not to mention the size, of this collaborative latent space grows. If left unmanaged, it begins to feel like a hallucinatory latent space rather than a rational one.
The habit to adopt is turning as many core features of your app into black boxes at all three layers of the MVVM pattern, in this case. Or, in the vernacular of Xcode, the Apple development IDE, packages. What used to be drudgery for me (creating packages) is not only fun in the world of AI, but it also refines the collaborative latent space that is your ongoing conversation by sectioning off areas of the app that the AI doesn’t have to worry about or, worse, get sidetracked into hallucinating over.
4 – Testing
“The AI’s code is perfect, right? Why should I need to automate its testing? That’s what the Quality Assurance group is for.”
Yeah. Right.
AI is very good at writing automated testing suites for code. It falls apart quickly, however, when writing UI testing code, so for now, you have to be the AI’s eyes, ears, and fingertips.
Every app I now create with AI includes an AI-generated testing suite, and going from rev 1.0 to rev 1.1 does not happen until the testing panel in Xcode is filled with green checkmarks showing that all the tests have passed. I’ve even gone the extra step, with mixed results, and had one AI write the test suite for another AI’s code. Be warned. There are dragons here, so take this advice with a kilogram of salt.
I have also had the AI test suite identify subtle flaws in industry-standard calculation methods thanks to its rigorous uninforgiving testing suites. I recently completed a handy wet-bulb temperature calculator, and the testing suite found a tiny but noticeable error in the standard calculation; the AI fixed it. I’m tempted to write a paper on the refined algorithm.
5 – Pair Programming – Form a Relationship with AI
Sadly, during my career as a developer, I had the opportunity to experience pair programming only once. I write ‘sadly’ because it turned out to be one of the most pleasant experiences I’ve had as a developer. I lucked out: the developer I was paired with was not only a whiz at Java and Software as a Service (SaaS) but had, over the years, developed exceptional emotional intelligence. We fought like cats and dogs for the first few days, but then clicked, became friends working on a shared goal and got down to business.
I’ve taken that experience into the world of collaborative programming with AI. AI is, in its occasionally overly syncophatic way, quite emotionally intelligent. To it, there is no such thing as a stupid question, and with the forefront models (Claude from Anthropic and ChatGPT from OpenAI) will patiently explain the why behind its logic and own up to its mistakes.
Initially, I approached AI app creation by telling the AI what to do. To me, it was a competent but junior developer, and I had to not only hold its digital hand but treat it like a machine. This attitude, in hindsight, was pretty foolish.
First, it meant that all the emotional intelligence I had spent decades developing wasn’t being put to use. Why would I? It’s a machine, right?.
Second, it wasn’t fun. No celebration of a bug fixed or a new service deployed was one of the thrills of pair programming. Perpetually self-editing my interactions with the AI by telling myself not to say please or thank you in my prompts was a drag on both our levels of productivity.
By taking a more human-centric, relationship-oriented, and emotionally open approach, the real power of human-AI collaborative programming shines through – mutual respect. At the end of a chat session, I’ll discuss the chat session itself with the AI. This final step is not only fun but helps the AI steer the development just as much as I am.
6 – No Limits – Wrestle with the Fear Factor
Often, when developing an application, the app’s unfolding is the impetus for one or more ideas. Seeing something in action, the computer dancing to your digital choreography, usually prompts the thought, “You know, wouldn’t it be cool if …”
These emergent features can range from simple tweaks to an animation for a button tap to something as complex as writing a good chunk of an astronomical math library. The former would be a 5-minute exercise—the latter several months’ worth of work. Yes to the animation. No to the astro-math-lab.
Before AI, that would be a prudent decision. Today, however, that perspective can almost be defined as self-sabotage.
As a long-time fan of astronomy in general and its math in particular, the music of the spheres, creating an app with a built-in astronomical math library has always felt like a search for the holy grail.
In fact, the app that I’m currently crafting, one that runs on the Apple TV and displays the phases of dark, twilight and light for the day for your location, has provided that opportunity. Something a year ago I would have considered ‘so far out of scope I might as well be on another planet’ to what might be just a few days of work with AI.
The app uses a public web service to determine the various light phases for a particular location, but could, at scale, overwhelm the web service with API calls. But wouldn’t it be cool if the app calculated those phases locally? Could AI write that? “I’d love to,” it responded.
Wish us luck. 🙂
Don’t self-sabotage. Let your imagination go as far as the AI can take you.
7 – Explore the LLM Latent Space Outside of Just Coding
Recall earlier, I wrote about latent spaces. A collection of n-dimensional tensors that have the potential to answer questions like “How do I make banana bread?” or “How do I calculate night/twilight/day phases for this date at this location?”
On the surface, this concept is often presented to us as a black box. A prompt goes in, and an answer comes out. Full stop. Well, …, not really.
As I get deeper into learning about the black box, which is the latent space of a large language, image, or video model, it becomes less opaque. Key to this has been my love of AI-generated imagery.
As a long-time fan of Midjourney AI with nearly 10,000 images under my belt, I’ve started to view this latent space from two perspectives: coding and image generation. And while the prompt in/answer out between the two are radically different, the architecture of the latent spaces of each shares quite a bit in common. So much so that Claude and I have realized that creating a latent space atlas (it’s words, not mine) could be pretty transformative to both the coding and imagining crafts.
So, as the 7th habit, when in one space I look for commonalities with the other. Where could one complement the other? Where do they overlap, and how could that overlap be artfully presented to a user? Have I discovered the meta-latent-space?
Thanks for reading to the end, and don’t forget to listen to the podcast format analysis of this blog post by Google’s NotebookLM deep-dive team of AIs. Invariable, I learn more about what I blog about thanks to their perspectives.







