How do I develop an application with my AI intern
The story begins one afternoon when I was scolded for missing a message. We typically use Apple's Messages for texting, but unfortunately, it doesn't provide a menu bar icon. As someone who usually hides the Dock, I find myself frequently opening Messages to check for new messages; otherwise, I risk missing notifications and, consequently, important messages.
After searching online, I discovered an app called Doll. It essentially adds the application icon to the menu bar and uses the Accessibility API to fetch the number of messages in the Dock and display them on the menu bar—a simple yet effective implementation. However, after using it for a while, I noticed that under different menu bar background colors, Doll merely inverts the icon colors, which doesn't look particularly appealing. This observation sparked the idea of creating my own improved version of the app.
(As of publishing this blog post, I've already developed and released the app: Badgeify. It can add any application icon you want to the menu bar, with perfectly displayed icons.)
This challenge ignited my creativity and motivated me to develop a superior solution.
Tech Stack and AI Sidekick
Given my tech stack and the app's non-cross-platform nature, I narrowed my choices down to either Electron or Tauri. For such a lightweight application, Electron seemed overly heavy, so I opted for Tauri. Tauri requires some Rust programming, a language I'm not well-versed in. Inspired by the recent AI trend, I decided to enlist Claude 3.5 sonnet as my development assistant. My approach was to treat it like an intern with broad knowledge but prone to occasional mistakes. And so began my journey of developing this small application alongside my AI intern.
Why use AI as an intern?
- AI can swiftly learn new programming languages and frameworks, which is invaluable when I'm unfamiliar with Rust.
- AI can efficiently complete large amounts of repetitive coding work, boosting development productivity.
- AI can tackle small tasks I assign, and although the process may involve errors, with my guidance, it can ultimately arrive at the correct solution.
The key to using AI for programming assistance is the active intervention to steer it in the desired direction. Hence, I view it solely as an AI intern—it may be right or wrong, and I don't blindly trust its solutions.
Human Lead, AI Follow
With several years of front-end development experience under my belt, I handled the UI implementation myself. For this small application, I primarily tasked the AI intern with implementing specific functions that interact with macOS APIs—tasks I'm less familiar with but within its capabilities. These included converting SVG to small PNG images for the macOS menu bar, retrieving Dock status and message counts from applications via the Accessibility API, and similar operations.
After implementation, I integrate the code into the project for testing. The provided code often throws errors, typically due to parameter mismatches or outdated API usage. At this point, I offer hints, research-related resources, or code snippets on GitHub and guide the AI to progressively fix issues until the code runs flawlessly.
On one occasion, I asked the AI to help implement code for monitoring menu bar background color changes. It proposed a seemingly clever solution using certain macOS APIs, resulting in concise code. However, it completely overlooked various edge cases we needed to address. Eventually, under my guidance, we implemented it through an alternative method. This experience underscored that while AI-generated code may be syntactically correct, it often lacks a deep understanding of real-world business requirements—an area where human expertise remains irreplaceable.
When the AI repeatedly makes mistakes or gets stuck in a loop, I step in. Despite my initial unfamiliarity with Rust, I learn on the fly to tackle emerging problems and assist my intern. Through this process, I've gained proficiency in Rust and can now write decent code. Ultimately, I implemented most of the Rust-dependent logic myself. In a sense, my AI intern became my Rust tutor.
After several weeks of diligent effort, we finally completed the MVP version of the application. This process not only allowed us to implement the desired functionality but also equipped me with valuable new skills.
From Code to Reality
A few weeks later, with my AI intern's assistance, I completed the MVP development. After setting up some services, I launched it on Reddit. This compact application includes SVG icons for various apps, leveraging macOS's template image feature to adapt icons to different background colors. My intern wrote the initial image processing logic, which, after some tweaks, now runs smoothly. I'm quite pleased with the result.
Post-launch, I immediately assigned new tasks to my AI intern, and together we iterated on additional features. We added functionality for uploading custom SVG menu bar icons, allowing users to display a wide array of unique icons. I also had the AI review my code and suggest improvements. While it occasionally offered valuable insights, I found most suggestions fell short of my standards, so I rarely implemented them.
Completing this project not only solved my initial problem but also deepened my understanding of AI's role in software development. This experience prompted me to contemplate AI's potential impact on the broader field of software engineering.
A Double-Edged Sword?
I'm skeptical of claims that AI will replace programmers, as it clearly couldn't replace me in this project. Had that been the case, I should have been able to develop this application rapidly with complete reliance on AI. In reality, I spent several weeks on development—over a week on core functionality alone, with the remaining time dedicated to related services and website development, areas where AI offered little assistance.
After an extended collaboration with my AI intern, I began to ponder the broader implications of AI in software development. While it excels in certain areas, it has evident limitations and can't function autonomously without human guidance. This realization leaves me both excited and cautious about AI's future in programming. As AI continues to evolve, we'll likely still need numerous programmers for coding work, but they'll have AI assistants to boost efficiency. Those less capable than the AI intern might face challenges in the industry.
I've come to recognize that AI isn't a cure-all but rather a powerful tool. Like a Swiss Army knife, it offers numerous functions, but knowing which tool to use when is crucial. Sometimes, the optimal solution might not involve AI at all.
The Future of Human-AI Collaboration
As technology advances, AI will play increasingly significant roles across various fields, but it's unlikely to completely supplant human programmers. Instead, we may witness the emergence of a new "human-machine collaboration" model, where AI handles repetitive tasks and low-level coding work while human programmers focus on high-level design, architecture, and innovation.
This narrative about developing an application with an AI intern isn't just about technology—it's a story of learning, adapting, and growth. I hope my experience inspires and provokes thought for other programmers venturing into AI-assisted development.
Through this journey, I not only created a useful application but also gained profound insights into AI's role in software development. I'm eager to see more programmers explore AI-assisted development, collectively advancing this exciting field.