Accelerating Software Development with AI: My Workflow Unveiled
The latest tools and how I use them
Throughout my career, I've maintained a deep connection to technology, software, and cloud-native development. As a business, product, and SaaS leader, I believe that credibility is paramount when leading software development teams. This means not just overseeing projects but actively engaging in code and architectural discussions—and sometimes even rolling up my sleeves to write code myself.
When software development is rapidly evolving, traditional coding practices often struggle to keep up with the pace of innovation. Over the past year, my advisory work has increasingly revolved around artificial intelligence (AI), particularly Generative AI (GenAI). I've immersed myself in various frameworks and libraries to develop applications leveraging Large Language Models (LLMs). Additionally, I've explored the numerous copilots and code generation tools emerging in this space. The culmination of this exploration is a workflow that has dramatically accelerated my development process.
In this post, my goal is to provide insights into how combining the right tools—and doing some crucial pre-work—can significantly enhance productivity and code quality. Whether you're a seasoned developer or just beginning to explore AI-assisted coding, I hope my experiences will provide valuable guidance.
The Power of Pre-Work
One lesson I've learned is that investing time upfront in architectural definitions, use cases, and UI designs pays dividends later. This pre-work not only accelerates the development process but also leads to better outcomes. By clearly defining what I want to build, I provide context that AI tools can leverage to generate more precise and functional code.
Architecture & Design
To establish my architecture, design, and overall requirements, I use the OpenAI o1-preview model to help me create comprehensive requirements documents. Through english prompting, I can generate detailed documents that include descriptions, architectural diagrams, tech stack choices, and code examples. This initial step sets a solid foundation for the project and adds valuable context when I move on to coding.
Example Prompt:
"Assist me in outlining the architecture for a cloud-native e-commerce platform that supports microservices, includes a recommendation engine, and provides RESTful APIs for front-end integration."
This all reminds me of Behavior Driven Development I was doing when I was a Rubyist in 2009. Using natural language as a part of your testing suite, better connecting your business users with how the tech works.
This is BDD on steroids.
UI
When it comes to generating the UI/front-end, I start with v0.dev. While I appreciate good design in applications, it's not my strongest suit, nor do I particularly enjoy coding the front-end as much as the systems side of things. v0.dev allows me to create amazing UIs based on simple prompts. I can then integrate these designs into my workflow to develop the full application.
Example Prompt:
"Design a responsive user interface for an e-commerce platform that features a product catalog, shopping cart, and user profile management."
Prompt Library
For coding prompts, I turn to the Cursor Directory. Although these prompts were initially created for the Cursor IDE, they work equally well for any code-related work. The directory offers great prompts for various programming languages and frameworks, effectively creating expertise in the LLM and the tools you're using. By crafting an agent persona specialized in your language and framework of choice, you can guide the AI to produce more accurate and efficient code.
Example:
Language: Go
Framework: Gin
Agent Persona Prompt: "You are an expert Go developer specializing in Gin Gonic. Provide code that sets up a basic Gin Gonic service with user authentication and a RESTful API."
Code Generation
For code generation, my go-to tool is Aider. Aider is a command-line tool that serves as both your code generator and copilot, diving deep into your codebase. With the right architecture, use cases, and UI designs, Aider does an amazing job of generating a functional codebase.
In a recent project, using Aider reduced my development time dramatically, allowing me to focus more on refining features rather than debugging code. It understands complex code structures and can generate boilerplate code, handle repetitive tasks, and even suggest improvements.
Example Command:
aider generate --project e-commerce-platform --features "user authentication, product catalog, shopping cart"
Test-Driven Development
One area I find lacking in these tools is the default adherence to a Quality Management Strategy that includes test-driven development (TDD). For example, I haven't found a framework yet that writes unit tests by default. This is an area for improvement. In the meantime, I incorporate TDD by explicitly prompting the AI to generate unit tests alongside the code.
Example Prompt:
"In addition to the code, provide unit tests using go unit tests for each function in the user authentication module."
IDE
While I stand on the shoulders of GenAI for much of the work I'm doing, there comes a time when LLMs struggle to create a complicated feature or fix a problem. At this point, I dive into the code myself to move the process forward.
For my IDE, I use Zed. Zed bills itself as "a next-generation code editor designed for high-performance collaboration with humans and AI." Developed in Rust, it's incredibly responsive. Zed gives me better insights across my codebase and works great as my copilot, with the ability to plug into multiple LLMs. Its collaborative features are a game-changer, especially when working with distributed teams or integrating AI assistance.
And Zed is open source.
Challenges and Considerations
While these tools have significantly improved my workflow, they're not without challenges:
Learning Curve: Mastering prompt crafting takes time and practice.
AI Limitations: LLMs may struggle with highly complex or niche coding problems.
Quality Assurance: AI-generated code still requires thorough review and testing to ensure reliability and security.
Results
By integrating these tools into my workflow, I've experienced tangible benefits:
Increased Productivity: Development time reduced dramatically, and I am not searching Stackoverflow like I use to
Improved Code Quality: The initial codebase often has fewer bugs and follows best practices more closely.
Enhanced Collaboration: Tools like Zed facilitate better teamwork, even when team members are remote.
Focus on Complex Problems: With AI handling routine coding tasks, I can focus on solving more complex challenges that require human intuition.
Interesting, Jason! Nice pictures, too.
Jason, your insights on leveraging AI tools for software development are truly enlightening! The way you emphasize the importance of pre-work resonates with my own experiences. I've found that using resources like (https://www.cursorrules.top/) has significantly improved my coding efficiency. It's fascinating how tools can enhance collaboration and streamline processes. Your mention of Aider as a code generator is particularly intriguing; I’m eager to explore how it can fit into my workflow. Thanks for sharing your valuable strategies!