As France transitions from the holiday season to La Rentrée, it’s an opportune time to revisit the concept of #IntentionBasedDevelopment. Six months after my initial conversation with Bryan Finster, my approach to development has evolved into two complementary methods:
- Chat Based Development
- Intention Based Development
Understanding the Two Approaches
Chat Based Development
This approach is ideal when the end goal is less defined. It allows me to:
- Flesh out ideas
- Experiment with code patterns
- Be critical
- Go “back in time” and edit the conversation to create another version
The typical outcome is a functional, albeit somewhat fragile, Proof of Concept. While this method can produce tests and industrial-grade code (especially when I’m familiar with the domain and framework), the intention behind the development often gets lost in the prompts. It certainly isn’t recorded for reference later.
Intention Based Development
This method involves documenting the ‘what’ and ‘how’ upfront. Clearly nothing new here, so it’s more formalising the plumbing:
- User Stories (I’ve yet to decide what I prefer here, lots of inspiration from Dave Farley’s 5 Common Mistakes)
- Technical specifications (I prefer Architecture Decision Records with implementation steps)
Then all you have to do is feed these into an LLM-based coder (e.g. Aider) and voilá perfect software, no bugs, security top level, and world peace…
Ha, it’s not that simple eh.
The “Replacing Software Developers” Hype
Let’s address one of the elephants in the room: the notion that AI will replace software developers. This idea misunderstands the core skills of software development:
- Ability to think in abstractions
- Management of different languages
- Troubleshooting
- Critical thinking
These skills are not only essential for traditional development but are perfect for Intention Based Development or other LLM integrated processes. In development, rather than replacement, we’re seeing a shift up the stack, similar to how:
- C shifted up from Assembler
- Java shifted up from C
- Python shifted up/across from C/Java/Perl
The Human-in-the-Loop Workflow
Regardless of the approach, human oversight remains crucial. Of course, this goes beyond just software development, increased autonomy means an increase of the right sort of oversight. This is something Tracy Bannon is a big champion of as well. It’s about responsibility and setting the right standards. #Human-in-the-Loop #HILT.
In this process,, we must verify the output is aligned to our intention, here are a few questions to ask:
- Has the software agent created the right tests?
- Is the chosen technology used correctly?
- Has it got caught in an infinite loop?
To fix issues downstream in the output from the LLM coder, I’ve found myself revisiting ADR implementation steps to clarify code from the proof of concept. Similarly, I’ve had to break down User Stories when the jumps between them were too large. This only became apparent during the run.
Version Control: A New Perspective
The hottest new programming language is English Andrey Karpathy
One beautiful aspect of this approach is that ADRs and User Stories are stored in version control. I view the documenting the system as “Natural language code” to produce the desired output, all tracked in version control. The output isn’t fully deterministic, that’s a battle for another day though.
Technology
Technology, along with People and Processes, forms a common triumvirate for anyone managing IT.
Here’s a brief note about Aider, note other coders are available, and this choice should be regularly reviewed. For now, my decision to use Aider was easy. I have always seen a tool that uses the Abstract Syntax Tree to be intuiatively more valuable than one using Retreival Augmented Generation (RAG).
When I discovered that Aider uses this approach, it solidified my decision to use it. However, maybe we are wrong about the AST, it’s crucial to regularly reassess its effectiveness in your workflow.
Brining it all together
Now that we’ve explored the components of Intention Based Development, let’s visualize how they come together in a typical IBD workflow:
There’s nothing that new here. Users Stories are a well discussed subject, Architecture Decision Records have been around a while, Test Driven Development as well. The key issue here is treating it as a system. Sure, you can successfully use the components seperately, using them together though can help build a well documented, understood system where modifications are done via stating the intent and providing Human oversight.
Caution: Excitement and Fatigue
While this approach is exciting, it can also be tiring. It is new, the neurons can fight to do what they already know. I often feel the pull to return to a more freestyle, manual code-review-amend approach, especially when the desired outcome is less clear. This reinforces the need for both Chat Based and Intention Based Development.
The Quest for Tangibility in Chat Based Development
As useful as it is I still feel that Chat Based Development should produce more tangible assets beyond just code. To address this, I’ve been experimenting with throwaway branches or separate projects to create better technical documentation and then return to IBD on the previous branch/project. While it works well for other projects, I’ve yet to actually throw away a “throwaway” branch! 🙊
Conclusion: The Future of AI-Assisted Development
Aider is becoming a valuable tool in my development process, though not a replacement for human expertise. It excels at producing high-quality output when given clear, intentional instructions. However, we’re still far from fully automated software development.
Of course a lot of money is being invested into this, maybe the big boys, girls, humans at Microsoft, Google, Amazon, Meta, etc… are finding a way to do that. I truly believe not, whilst LLMs are capable of a form of reasoning, it isn’t logic based. It’s a reasoning based on what you put into the context. We need a new architecture for high levels in both AI logic and language competence.
So, from my perspective, the role of skilled developers in managing and guiding these AI-assisted processes remains crucial. The human element – our ability to think critically, understand context, and make nuanced decisions – is still irreplaceable in software development.
What’s Your Take?
I’m curious about your experiences with AI-assisted development tools. Have you tried similar approaches or taken a different route altogether? Your insights could help shape our collective understanding of this rapidly evolving field.
Please share your thoughts:
- Email: [email protected]
- LinkedIn: https://www.linkedin.com/in/thompson-m
- Twitter: https://x.com/thompsonson
Let’s continue this important conversation about the future of software development.
Peace, Matt